Crear una serie

POST /api/v1/series Crea la serie y su borrador de versión 1, en una sola transacción. Responde 201. Esta es la ruta que POST /api/v1/sequences rechaza: allí, triggerType: "fixed_date" devuelve 400, porque una serie necesita su audiencia y su fecha de inicio en la misma llamada. Aquí el disparador es impuesto: enviar otro triggerType en el cuerpo no cambia nada.

Autorización

RolAcceso
OWNERPermitido
ADMINPermitido
MEMBERRechazado — 403

Cuerpo de la solicitud

CampoTipoObligatorioDescripción
namestringSíDe 1 a 100 caracteres
listIdstring (uuid)SíLa lista a la que envía la serie
startsAtstring (ISO 8601)NoEl día 1. Opcional aquí —una serie se crea y luego se programa— y obligatorio al publicar
audienceSegmentIdstring (uuid)NoAcota la lista
audienceTagIdstring (uuid)NoLa acota aún más
json
{
  "name": "March launch",
  "listId": "9f8e7d6c-1111-4bbb-8ccc-ddddeeeeffff",
  "startsAt": "2026-03-15T08:00:00.000Z",
  "audienceSegmentId": null,
  "audienceTagId": null
}

Ejemplo

bash
curl -s -X POST 'https://www.agentsmail.io/api/v1/series' \
  -H "x-api-key: $AGENTMAIL_API_KEY" \
  -H 'content-type: application/json' \
  -d '{
    "name": "March launch",
    "listId": "9f8e7d6c-1111-4bbb-8ccc-ddddeeeeffff",
    "startsAt": "2026-03-15T08:00:00.000Z"
  }'

Respuesta

CódigoCuándo
201La serie y su borrador de versión 1 existen
400Cuerpo no válido, o startsAt no es una fecha legible
401Clave ausente o no válida
403El rol de la clave es MEMBER

Campos de la respuesta

La misma forma que listar series, para el objeto único en data.

Ejemplo de respuesta

json
{
  "success": true,
  "data": {
    "id": "7d7d7d7d-8888-4ccc-9ddd-eeee00001111",
    "name": "March launch",
    "status": "paused",
    "startsAt": "2026-03-15T08:00:00.000Z",
    "listId": "9f8e7d6c-1111-4bbb-8ccc-ddddeeeeffff",
    "audienceSegmentId": null,
    "audienceTagId": null,
    "topicId": null,
    "createdAt": "2026-03-01T10:00:00.000Z",
    "updatedAt": "2026-03-01T10:00:00.000Z"
  }
}

Receta para agentes

Crear la serie es el primero de cuatro pasos: por sí solo no envía nada. El id que recibes es un id de secuencia, y los pasos se añaden a través de la API de secuencias.
js
const headers = {
  'x-api-key': process.env.AGENTMAIL_API_KEY,
  'content-type': 'application/json',
}
const api = 'https://www.agentsmail.io/api/v1'

// 1. La serie, con su audiencia y su fecha de inicio
const {data: series} = await fetch(`${api}/series`, {
  method: 'POST',
  headers,
  body: JSON.stringify({name: 'March launch', listId, startsAt: '2026-03-15T08:00:00.000Z'}),
}).then((r) => r.json())

// 2. Su borrador de versión 1 ya existe: búscalo
const {data: versions} = await fetch(`${api}/sequences/${series.id}/versions`, {
  headers,
}).then((r) => r.json())
const draft = versions.find((v) => v.status === 'draft')

// 3. Los pasos, en la API de secuencias, en DOS llamadas cada uno para un envío.
//    Crear un nodo solo recibe su `type` (más `waitHours` en una espera, o
//    `templateId` para partir de una plantilla): un paso de envío nuevo nace con
//    el contenido por defecto y sin asunto. El asunto, el contenido y la hora de
//    envío se escriben con un PATCH sobre el nodo devuelto.
const nodes = `${api}/sequences/${series.id}/versions/${draft.id}/nodes`

const addNode = (body) =>
  fetch(nodes, {method: 'POST', headers, body: JSON.stringify(body)})
    .then((r) => r.json())
    .then((r) => r.data)

const editNode = (id, body) =>
  fetch(`${nodes}/${id}`, {method: 'PATCH', headers, body: JSON.stringify(body)})
    .then((r) => r.json())
    .then((r) => r.data)

// Un PATCH por FAMILIA: el asunto y el contenido son una familia, la hora de
// envío es otra, y enviar dos familias en una sola llamada se rechaza.
const teaser = await addNode({type: 'send_email'})
await editNode(teaser.id, {subject: 'Something is coming', content: html})
// La hora del día, en minutos desde medianoche. Si la omites, el paso sale
// en cuanto termina la espera anterior.
await editNode(teaser.id, {sendTimeMinutes: 540})

// Una espera da la DURACIÓN entre dos envíos.
await addNode({type: 'wait', waitHours: 72})

const launch = await addNode({type: 'send_email'})
await editNode(launch.id, {subject: 'It is here', content: html2})
await editNode(launch.id, {sendTimeMinutes: 540})

// 4. Publicar. Aquí es donde una serie sin fecha de inicio se rechaza, con su motivo.
await fetch(`${api}/sequences/${series.id}/versions/${draft.id}/publish`, {
  method: 'POST',
  headers,
}).then((r) => r.json())

Notas

Una serie nueva está en paused. Activarla es un PATCH con {"status": "active"}, y se rechaza mientras no haya una versión publicada.

Relacionado