Editar una publicación
Cambia un borrador, una publicación programada o una fallida igual que lo hacen el editor y las herramientas MCP.
https://antwork.io/api/v1/posts/{id}Permisowrite · publishPetición
PATCH /api/v1/posts/{id} cambia solo los campos que envías. El texto y los hashtags se sustituyen y los medios y etiquetas de la publicación se mantienen; options se combina ajuste a ajuste. Una publicación ya publicada no se puede editar (409 post_already_published): el cambio no llegaría a la publicación en vivo.
curl -X PATCH https://antwork.io/api/v1/posts/pQ7x... \
-H "Authorization: Bearer $ANTWORK_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"text": "Shipping the new editor today",
"options": {
"privacyStatus": "unlisted"
},
"scheduledFor": "2026-11-05T10:00:00Z"
}'textstringhashtagsstring[]accountIdstringoptions se valida contra la nueva.optionsobject | null{"privacyStatus": "unlisted"}; en Pinterest {"boardId": "..."}). Un ajuste con null se elimina, y "options": null los elimina todos. Los de TikTok los elige el propietario (tiktok_settings_need_the_creator).newBoardNamestringpinterest_board_create_failed si Pinterest lo rechaza.scheduledForISO 8601publish. En un borrador o una fallida solo propone una hora; prográmala con POST /api/v1/posts/{id}/schedule.status'draft'"draft": devuelve una publicación programada a borrador y cancela su publicación en cola.Necesita el permiso write, y también publish cuando la edición mueve una publicación programada a otra hora, porque eso la vuelve a comprometer contra tu plan, el tope diario y las protecciones de publicación. La misma regla que la herramienta MCP update_post. Envía una Idempotency-Key: una petición repetida con newBoardName no debe crear un segundo tablero.
Respuesta
200 con la publicación tal como quedó guardada: la misma forma que GET /api/v1/posts/{id}, con readiness y los enlaces al editor, más pinterestBoardCreated si se creó un tablero. Un argumento rechazado o una regla de la plataforma (text_too_long, media_required…) es un 400 y no se escribe nada. Cuando el plan o la cuenta no tiene hueco a la nueva hora (quota_exceeded, daily_cap_reached, duplicate_post…), la respuesta es un 409, la edición SÍ se guarda y la publicación mantiene su hora anterior; post la trae tal como está.
{
"error": {
"type": "invalid_request_error",
"code": "daily_cap_reached",
"message": "This account has reached its daily cap ... The edit is saved; the post keeps its old time."
},
"post": { "object": "post", "id": "pQ7x...", "status": "scheduled", ... }
}POST /api/v1/posts da por destino, así que un mismo manejador sirve para ambos. Consulta Errores para la lista completa.Fijar los medios
PUT /api/v1/posts/{id}/media con {"media": [...]} deja los medios de la publicación exactamente en esa lista y en ese orden: reordénalos, quita alguno o envía [] para vaciarlos. Cada archivo debe estar en la biblioteca de medios del espacio de trabajo (si no, media_not_in_library); un archivo que ya está en la publicación siempre se acepta. Necesita el permiso media. Enviar la misma lista dos veces no cambia nada, así que no hace falta Idempotency-Key.
curl -X PUT https://antwork.io/api/v1/posts/pQ7x.../media \
-H "Authorization: Bearer $ANTWORK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"media": [
"https://firebasestorage.googleapis.com/v0/b/.../o/workspaces%2Fws_...%2Fmedia%2Fcover.jpg?alt=media"
]
}'200 con la publicación; su readiness dice si ya se cumple la regla de medios de la plataforma. En Instagram, originalityWarning lista las otras publicaciones de la cuenta que ya llevaban el mismo archivo: Instagram muestra a menos gente los medios repetidos.