Crear publicaciones
Una petición crea una publicación por cada cuenta de destino. Cada una es independiente, con su propia programación y su propio resultado; solo comparten un id de campaña.
https://antwork.io/api/v1/postsPermisowrite · publishPetición
curl https://antwork.io/api/v1/posts \
-H "Authorization: Bearer $ANTWORK_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"accounts": ["acc_linkedin", "acc_x"],
"text": "Shipped the API today.",
"scheduledFor": "2026-10-01T09:00:00Z"
}'Respuesta
La respuesta es 202 Accepted, nunca 200. Nada se publica dentro de la petición: la publicación se encola y un worker la envía, así que la respuesta dice qué se ha aceptado, no qué se ha publicado.
{
"object": "post_batch",
"campaignId": "b3f1...",
"posts": [
{
"object": "post_result",
"id": "pQ7x...",
"accountId": "acc_linkedin",
"platform": "linkedin",
"status": "accepted",
"reason": null,
"message": null
},
{
"object": "post_result",
"id": null,
"accountId": "acc_x",
"platform": "x",
"status": "rejected",
"reason": "text_too_long",
"message": "@antwork: Text exceeds x character limit"
}
]
}202 puede contener rechazos. Lee todas las entradas de posts, no solo el código de estado. Solo cuando no se acepta ninguna la respuesta es un 400, y el array viaja igualmente con ella.Qué significa cada estado
accepted— creada y programada (o guardada, si es un borrador). Consulta el id para ver qué pasa.rejected— rechazada antes de escribir nada. No existe; corrigereasony vuelve a enviar.failed— se creó pero no se pudo programar. Existe y no va a salir.
Programación
Omite scheduledFor para publicar de inmediato. Indica una hora ISO 8601 para programar, como máximo a 30 días. La cola que hay detrás no acepta tareas más lejanas, y el error indica la última hora que admite. Una hora en el pasado se rechaza con scheduled_for_in_past.
Cuerpo de la petición
accountsstring[]obligatorioGET /api/v1/accounts, como máximo 25. Se crea una publicación por cuenta.textstringtexts.textsobjecttext para esa cuenta. Úsalo cuando una plataforma necesite una versión más corta.mediastring[]media_not_hosted en lugar de aceptarse y fallar al publicar. Todavía no se pueden subir archivos por la API.scheduledForISO 8601draftbooleantrue crea un borrador y no envía nada, y solo necesita el permiso write. Cualquier otro valor crea una publicación que se enviará, lo que necesita publish.optionsobjectworkspaceIdstringworkspace_required. Todas las cuentas deben pertenecer a él.campaignIdstringplatform_not_available, y el resto de la petición sigue adelante. GET /api/v1/accounts lista todas las cuentas conectadas, así que comprueba platform antes de enviar.Opciones por plataforma
Todo lo específico de una plataforma va en options, indexado por plataforma y aplicado a todas las cuentas de esa plataforma en la petición. Solo las plataformas de esta tabla aceptan opciones por la API.
| Plataforma | Acepta |
|---|---|
| no acepta opciones | |
| x | communityId, shareWithFollowers |
{
"accounts": ["acc_x"],
"text": "Shipped the API today.",
"options": {
"x": { "communityId": "1493446837214", "shareWithFollowers": true }
}
}400 que nombra el campo, no una publicación que sale sin el ajuste que pediste.Idempotencia
Envía una cabecera Idempotency-Key en cada creación, para que un reintento no publique dos veces. Cómo se comporta la clave está en la página de Idempotencia. Idempotencia →