Campañas
Crea campañas, elige sus listas de contactos y envíalas o prográmalas.
Crear una campaña
Crea una campaña con estado draft. Requiere una clave de API con el permiso full. Emite un evento campaign.created.
Una campaña nueva no tiene destinatarios. Elige sus listas de contactos con Actualizar una campaña y después envíala o prográmala. Los créditos se cobran cuando se envía la campaña: 2 créditos por email.
/campaignsParámetros del cuerpo
namestringobligatoriosubjectstring{{first_name}}.from_emailstringnews@acme.com.from_namestringAcme. El mensaje se envía desde Acme <news@acme.com>.reply_tostringfrom_email cuando se envía la campaña.htmlstring{{first_name}}, {{last_name}}, {{email}}, {{unsubscribe_url}} y {{cf.<key>}} para los campos personalizados. Define el cuerpo al crear la campaña.textstringhtml.preview_textstringhtml.contentstringhtml y text, no content.content_typestringpor defecto: htmlcontent: html, text o mjml. Emailit no compila MJML; envía el HTML compilado en html.Devuelve
Devuelve 201 Created con el objeto de campaña. status es draft. La respuesta no incluye html, text ni content.
Devuelve 400 si falta name y 403 si la clave de API no tiene el permiso full.
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "draft",
"subject": "October news for {{first_name}}",
"from_email": "news@acme.com",
"from_name": "Acme",
"reply_to": "support@acme.com",
"preview_text": null,
"content_type": "html",
"created_at": "2026-10-01T09:30:12.482193Z",
"updated_at": "2026-10-01T09:30:12.482193Z"
}{
"error": "Bad Request"
}{
"statusCode": 403,
"error": "Forbidden",
"message": "Permission denied: campaigns:create"
}Obtener una campaña
Obtiene una campaña por su ID o su nombre. Requiere una clave de API con el permiso full.
/campaigns/{id}Parámetros de ruta
idstringobligatoriocmp_…) o el nombre de la campaña. Codifica para URL los nombres que contengan espacios o caracteres especiales.Devuelve
Devuelve el objeto de campaña.
objectstringcampaign.idstringcmp_.statusstringdraft, scheduled, queued, sending, sent, canceled o archived. queued significa que una campaña programada ha llegado a su hora de envío y espera a que la procese un worker.namestringsubjectstringfrom_emailstring"" hasta que se define.from_namestring"" hasta que se define.reply_tostring"" significa que las respuestas van a from_email.preview_textstring | nullcontent_typestringhtml, text o mjml en las campañas creadas con la API.scheduled_atstring | nullsent_atstring | nullrecipientsobject[]audience_id (aud_…) y exclude (true para una lista excluida).El cuerpo (html, text y content) no se incluye en la respuesta. Las estadísticas de interacción están disponibles en el panel, en Email MarketingCampaigns.
Devuelve 404 si ninguna campaña del espacio de trabajo coincide con id.
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "scheduled",
"subject": "October news for {{first_name}}",
"from_email": "news@acme.com",
"from_name": "Acme",
"reply_to": "support@acme.com",
"preview_text": null,
"content_type": "html",
"sent_at": null,
"scheduled_at": "2026-10-08 09:00:00+00",
"created_at": "2026-10-01 09:30:12.482193+00",
"updated_at": "2026-10-01 10:02:47.118204+00",
"recipients": [
{ "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV", "exclude": false },
{ "audience_id": "aud_3hRmYTSQ4ca6y9tbPI0IQPjVTL9", "exclude": true }
]
}{
"error": "Campaign not found"
}Actualizar una campaña
Actualiza los campos que pasas y deja los demás sin cambios. Úsalo para elegir las listas de contactos de la campaña antes de enviarla. Requiere una clave de API con el permiso full. Emite un evento campaign.updated.
Una campaña programada envía lo que esté guardado a su hora de envío, así que puedes seguir editándola después de programarla.
/campaigns/{id}Parámetros de ruta
idstringobligatoriocmp_…) o el nombre de la campaña.Parámetros del cuerpo
namestringsubjectstringfrom_emailstringfrom_namestringreply_tostringfrom_email.preview_textstringcontentstringcontent_typestringcontent: html, text o mjml.recipientsobject[]Las listas de contactos a las que se dirige. Sustituye las listas actuales. Incluye al menos una lista con exclude en false.
audience_id(cadena, obligatorio): el ID de una lista de contactos (aud_…) de este espacio de trabajo.exclude(booleano, por defectofalse):trueguarda la lista como exclusión. El panel resta las listas excluidas de su estimación de destinatarios, pero de momento el envío no aplica las exclusiones, así que quita también esos contactos de las listas incluidas.
Los ID de lista duplicados se ignoran. Al enviar, Emailit envía un email a cada contacto suscrito de las listas incluidas una sola vez y omite los contactos dados de baja y las direcciones bloqueadas.
El cuerpo HTML y el de texto se definen al crear la campaña. Los campos desconocidos del cuerpo se ignoran.
Devuelve
Devuelve el objeto de campaña actualizado, con recipients.
Devuelve 422 si recipients no tiene ninguna lista incluida o hace referencia a una lista de otro espacio de trabajo, y 404 si la campaña no existe.
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "draft",
"subject": "Your October update, {{first_name}}",
"from_email": "news@acme.com",
"from_name": "Acme",
"reply_to": "support@acme.com",
"preview_text": null,
"content_type": "html",
"scheduled_at": null,
"created_at": "2026-10-01 09:30:12.482193+00",
"updated_at": "2026-10-01 10:02:47.118204+00",
"recipients": [
{ "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV", "exclude": false },
{ "audience_id": "aud_3hRmYTSQ4ca6y9tbPI0IQPjVTL9", "exclude": true }
]
}{
"message": "Validation failed.",
"errors": {
"recipients": ["One or more audiences are invalid."]
}
}{
"error": "Campaign not found"
}Listar campañas
Devuelve las campañas del espacio de trabajo, de la más reciente a la más antigua. Requiere una clave de API con el permiso full.
/campaignsParámetros de consulta
pageintegerpor defecto: 1limitintegerpor defecto: 10searchstringstatusstringdraft, scheduled, sending (también incluye queued), sent, canceled, archived o all.matchstringall (por defecto) exige que se cumplan todos los filtros. or coincide con cualquier filtro. Consulta Filtrado.
orderstringClave de ordenación de esta lista. Consulta las claves de ordenación más abajo.
directionstringasc o desc.
Claves de filtro
Los filtros usan parámetros de consulta key.condition=value, por ejemplo status.exact=sent o created_at.after=2026-09-01. Para las condiciones de cada tipo, consulta Filtrado y ordenación.
| Clave | Tipo | Notas |
|---|---|---|
name |
string | |
subject |
string | |
status |
enum | draft, scheduled, queued, sending, sent, archived |
created_at |
date | |
sent_at |
date |
Claves de orden para order: name, subject, status, created_at, sent_at.
Devuelve
Devuelve una página de objetos de campaña sin reply_to, preview_text, content_type ni recipients. Para obtenerlos, usa Obtener una campaña.
dataobject[]total_recordsintegernext_page_urlstring | nullnull en la última página. Solo incluye page y limit, así que vuelve a añadir tu búsqueda y tus filtros cuando la sigas.previous_page_urlstring | nullnull en la primera página.{
"data": [
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "sent",
"subject": "Your October update, {{first_name}}",
"from_email": "news@acme.com",
"from_name": "Acme",
"sent_at": "2026-10-08 09:00:04+00",
"scheduled_at": "2026-10-08 09:00:00+00",
"created_at": "2026-10-01 09:30:12.482193+00",
"updated_at": "2026-10-08 09:00:31+00"
}
],
"total_records": 34,
"next_page_url": "/v2/campaigns?page=2&limit=20",
"previous_page_url": null
}Enviar o programar una campaña
Envía la campaña ahora o la programa si pasas un scheduled_at futuro. Requiere una clave de API con el permiso full y un espacio de trabajo verificado: los espacios de trabajo sin verificar no pueden enviar campañas y reciben 403.
Antes de enviarla, comprueba que la campaña tiene un from_email de un dominio verificado, un asunto, un cuerpo html o text y al menos una lista de contactos incluida (se define con Actualizar una campaña). Cada email cuesta 2 créditos.
/campaigns/{id}/sendParámetros de ruta
idstringobligatoriocmp_…) o el nombre de la campaña.Parámetros del cuerpo
scheduled_atstringCuándo enviarla. Acepta ISO 8601 (2026-10-08T09:00:00Z), una marca de tiempo Unix en segundos o lenguaje natural como tomorrow at 9am (interpretado en UTC). La hora debe ser futura y la campaña debe estar en draft.
Omítelo para enviarla ahora. Para enviar antes de tiempo una campaña programada, llama a este endpoint sin scheduled_at.
Devuelve
Enviar ahora: el estado cambia a sending y Emailit emite campaign.sending. Después, Emailit crea un email por destinatario: todos los contactos suscritos de las listas incluidas, sin direcciones duplicadas y sin los contactos dados de baja ni las direcciones bloqueadas. Cuando todos los destinatarios han pasado al proceso de envío, el estado cambia a sent y Emailit emite campaign.sent. Sigue la entrega en el panel o con los eventos de email.
Programar: el estado cambia a scheduled y Emailit emite campaign.scheduled. A la hora programada, la campaña pasa a queued (campaign.queued) y después se envía como se describe arriba.
La respuesta contiene object, id, name y el nuevo status, además de scheduled_at si la programas.
| Código | Cuándo |
|---|---|
403 |
El espacio de trabajo no está verificado o la clave de API no tiene el permiso full. |
404 |
Ninguna campaña coincide con id. |
422 |
scheduled_at no se puede interpretar o no es una hora futura, o intentaste programar una campaña que no es un borrador. |
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "scheduled",
"scheduled_at": "2026-10-08T09:00:00.000000Z"
}{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "sending"
}{
"code": "unverified_workspace_recipient",
"error": "Workspace not verified",
"message": "Unverified workspaces cannot send campaigns. You can send individual emails only to workspace members' account emails."
}{
"error": "Campaign cannot be scheduled",
"message": "Campaign status is 'sent'. Only draft campaigns can be scheduled."
}Cancelar una campaña
Cambia el estado de la campaña a canceled y emite un evento campaign.canceled. Requiere una clave de API con el permiso full.
Solo se pueden cancelar las campañas con estado draft o sending; cualquier otro estado devuelve 422. Si cancelas una campaña que se está enviando, los emails que ya están en cola para su entrega no se recuperan.
/campaigns/{id}/cancelParámetros de ruta
idstringobligatoriocmp_…) o el nombre de la campaña.Devuelve
Devuelve object, id, name y status (canceled).
Devuelve 422 si el estado de la campaña no es draft ni sending, y 404 si la campaña no existe.
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "canceled"
}{
"error": "Campaign cannot be canceled",
"message": "Campaign status is 'scheduled'. Only 'draft' or 'sending' campaigns can be canceled."
}{
"error": "Campaign not found"
}Eliminar una campaña
Elimina una campaña de forma permanente. Requiere una clave de API con el permiso full. Emite un evento campaign.deleted.
Eliminar una campaña no afecta a los emails que ya se enviaron o se pusieron en cola. Para detener una campaña que se está enviando, primero cancélala.
/campaigns/{id}Parámetros de ruta
idstringobligatoriocmp_…) o el nombre de la campaña.Devuelve
Devuelve object, id, name y deleted: true. Devuelve 404 si la campaña no existe.
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"deleted": true
}{
"error": "Campaign not found"
}