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
| Rol | Acceso |
|---|---|
OWNER | Permitido |
ADMIN | Permitido |
MEMBER | Rechazado — 403 |
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
name | string | Sí | De 1 a 100 caracteres |
listId | string (uuid) | Sí | La lista a la que envía la serie |
startsAt | string (ISO 8601) | No | El día 1. Opcional aquí —una serie se crea y luego se programa— y obligatorio al publicar |
audienceSegmentId | string (uuid) | No | Acota la lista |
audienceTagId | string (uuid) | No | La 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ódigo | Cuándo |
|---|---|
201 | La serie y su borrador de versión 1 existen |
400 | Cuerpo no válido, o startsAt no es una fecha legible |
401 | Clave ausente o no válida |
403 | El rol de la clave es MEMBER |
Campos de la respuesta
La misma forma que listar series, para el objeto único endata.
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á enpaused. Activarla es un PATCH con {"status": "active"}, y se rechaza mientras no haya una versión publicada.