Desarrolladores
API pública de publicación
Sube contenido, crea publicaciones y publica en Facebook, Instagram, TikTok, LinkedIn, Threads y Pinterest, todo limitado a un producto mediante una clave de API del espacio de trabajo. La forma recomendada de integrarse es la API Connect, una superficie plana en/api/connect/v1 que la mayoría de herramientas de programación pueden usar tal cual.
¿Necesitas control total, publicación explícita, consulta de ejecuciones, webhooks firmados, procesamiento por lotes, configuración por canal? La API avanzada /api/public/v1, más abajo, expone todo eso. Ambas comparten la misma autenticación, productos y flujo de publicación; usa únicamente estas rutas públicas versionadas (las rutas internas de la aplicación requieren autenticación de usuario de Firebase y no forman parte del contrato público).
Facebook, Instagram y TikTok son de publicación manual en la API por defecto. Las publicaciones para esos canales usan por defecto manual_reminder: Markaestro no llama a la API de la plataforma y mueve la publicación a la cola «Por publicar». Envía deliveryMode: "direct_publish" para usar la API oficial. En TikTok se usa por defecto el traspaso a la bandeja de entrada, salvo que settings.postMode sea direct_post. LinkedIn, Threads y Pinterest publican de forma programática por defecto.
Los espacios de trabajo pueden tener varios productos. Al crear una clave de API, o bien la vinculas a un producto, de modo que las llamadas apuntan a ese producto automáticamente y se rechazan las solicitudes para cualquier otro, o bien la conviertes en una clave de todas las marcas que indica el producto en cada solicitud.
¿Estás creando un agente de IA?
Empieza mejor con la guía para agentes de IA. Incluye esquemas de herramientas listos para copiar y pegar, un resumen para el system prompt, las reglas de reintento y gestión de errores que necesita un agente, y una guía rápida de cuatro comandos. Tu agente también puede leer /llms.txt directamente.
Especificación legible por máquinas
Cada endpoint, formato de petición y respuesta, y código de error, en OpenAPI 3.1. Se genera a partir de los mismos esquemas con los que valida la API, así que no puede describir una API que no servimos.
/api/connect/v1 que la mayoría de herramientas de programación pueden usar tal cual. Adapta la convención habitual create-upload-url → PUT → post al mismo espacio de trabajo, autenticación, productos y flujo de publicación que la API completa de más abajo. Configura la URL base del cliente en /api/connect y autentícate con una clave de API del espacio de trabajo limitada a un producto (permisos posts.read, posts.write, media.write)./api/connect/v1/social-accountsLista los destinos conectados de Facebook, Instagram, TikTok y LinkedIn como cuentas planas, cada una etiquetada con su producto para que los clientes puedan agrupar y distinguir. Cada canal tiene su propia ruta, sin distribución entre canales.
/api/connect/v1/productsLista las marcas (nombre en la API: products) con sus cuentas conectadas anidadas, un selector centrado en la marca.
/api/connect/v1/media/create-upload-urlDevuelve una URL de subida firmada, de un solo uso y de corta duración, además de un id de contenido.
<upload_url>Sube los bytes de la imagen sin procesar a la URL firmada. No hace falta clave de API, la firma autoriza la petición.
/api/connect/v1/postsCrea un borrador por cada cuenta seleccionada. Define is_draft=false con scheduled_at para programar la entrega; TikTok usa el traspaso a la bandeja de entrada del creador.
/api/connect/v1/postsLista las publicaciones del espacio de trabajo con estado, texto y URLs de contenido en formato plano.
# 1. List connected accounts
curl "$MARKAESTRO_URL/api/connect/v1/social-accounts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"
# 2. Request a signed upload url, then PUT the bytes
curl -X POST "$MARKAESTRO_URL/api/connect/v1/media/create-upload-url" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "mime_type": "image/png", "size_bytes": 184320, "name": "slide-1.png" }'
curl -X PUT "<upload_url>" -H "Content-Type: image/png" --data-binary @slide-1.png
# 3. Create a draft post for one or more accounts
curl -X POST "$MARKAESTRO_URL/api/connect/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"caption": "New drop",
"media": ["ast_111", "ast_222"],
"social_accounts": ["prod_123#instagram:instagram:ig_123"]
}'Cada cuenta de /social-accounts está etiquetada con su product, el nombre en formato API de una marca (la misma cuenta puede aparecer en varias marcas), y su id codifica productId#destinationId, pásalo de vuelta tal cual en social_accounts, y la solicitud se distribuye en una publicación por cuenta. Cada clave está limitada a una marca, así que solo ve y publica en esa marca. Las publicaciones de Facebook, Instagram y TikTok son de publicación manual, se crean como borradores y las publica de forma nativa el propietario del espacio de trabajo desde la cola «Por publicar» de Markaestro, nunca a través de la API de la plataforma. LinkedIn, Threads y Pinterest publican de forma programática tras una acción de publicación explícita. El estado de una publicación es uno de draft, processing, posted o failed. Facebook, Instagram, LinkedIn, TikTok y Threads son cada uno un destino dedicado propio, publicar en uno nunca se distribuye a otro. Consulta el estado de publicación mediante GET /api/connect/v1/posts.
Avanzado: API pública completa
La superficie completa de /api/public/v1, publicación explícita, ejecuciones asíncronas, webhooks firmados, creación por lotes y configuración por canal. Úsala cuando la API Connect no sea suficiente.
/api/public/v1/productsLista las marcas de la clave junto con los canales disponibles actualmente para cada una.
/api/public/v1/products/:id/destinationsLista los destinos de publicación de esa marca, incluyendo Instagram Login independiente, página de Facebook, Threads, perfil o página de LinkedIn, y destinos de TikTok conectados.
/api/public/v1/media/upload-sessionsCrea una sesión de subida directa de 15 minutos con nombre, tipo y tamaño exacto.
<uploadSession.uploadUrl>Sube los bytes directamente al almacenamiento con el Content-Type devuelto; no envíes la clave API.
/api/public/v1/media/upload-sessions/:id/finalizeVerifica tipo y tamaño y devuelve el activo multimedia; las sesiones completadas admiten reintentos seguros.
/api/public/v1/mediaSubida multipart de compatibilidad. Devuelve un id de activo y una URL alojada.
/api/public/v1/postsCrea un borrador en el espacio de trabajo. Facebook, Instagram y TikTok usan por defecto la publicación manual (deliveryMode manual_reminder); envía deliveryMode direct_publish para que la publicación use la API.
/api/public/v1/postsLista publicaciones, de más reciente a más antigua. Filtra con ?status=scheduled para ver lo programado, y ?productId= para limitar a una marca. Una clave limitada a una marca siempre está restringida a su propia marca y puede omitir productId.
/api/public/v1/posts/:idDevuelve el estado actual de la publicación, el modo de entrega y los resultados de publicación.
/api/public/v1/posts/:id/publishEncola una ejecución de publicación asíncrona. Las publicaciones manuales van a la cola «Por publicar» del espacio de trabajo para publicación nativa; LinkedIn, Threads y Pinterest publican directamente; las publicaciones de Meta que optaron por ello se publican vía API oficial, y las de TikTok que optaron por ello usan el traspaso a la bandeja de entrada.
/api/public/v1/posts/:idElimina la publicación de Markaestro. Usa el permiso existente posts.write. Devuelve 400 VALIDATION_POST_IS_PUBLISHING mientras una ejecución de publicación está en curso. Eliminar una publicación ya publicada no retira la copia activa en la plataforma.
/api/public/v1/job-runs/:idDevuelve queued, running, succeeded o failed.
/api/public/v1/webhook-endpointsRegistra un destino de webhook, hasta 25 endpoints activos por espacio de trabajo.
/api/public/v1/webhook-endpointsLista los destinos de webhook registrados para el alcance de esa clave de API.
/api/public/v1/webhook-endpoints/:idDesactiva un destino de webhook.
curl "$MARKAESTRO_URL/api/public/v1/products" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"destinationId devuelto cuando un producto tenga varios destinos, como un perfil de LinkedIn más páginas.curl "$MARKAESTRO_URL/api/public/v1/products/prod_123/destinations" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"# 1. Create a 15-minute upload session
UPLOAD=$(curl -s -X POST "$MARKAESTRO_URL/api/public/v1/media/upload-sessions" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fileName":"launch-1.jpg","contentType":"image/jpeg","sizeBytes":184320}')
# 2. PUT bytes directly to uploadSession.uploadUrl with its returned headers
curl -X PUT "<upload_url>" -H "Content-Type: image/jpeg" --data-binary @launch-1.jpg
# 3. Finalize; the response contains asset.id for mediaAssetIds
curl -X POST "$MARKAESTRO_URL/api/public/v1/media/upload-sessions/<session_id>/finalize" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY""deliveryMode": "direct_publish" para que esta publicación use la API oficial.curl -X POST "$MARKAESTRO_URL/api/public/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-001" \
-d '{
"channel": "instagram",
"caption": "Launch day carousel",
"mediaAssetIds": ["ast_123", "ast_124"],
"productId": "prod_123",
"destinationId": "instagram:instagram:ig_123"
}'deliveryMode: "platform_inbox" (o direct_publish), una publicación explícita envía el borrador a la bandeja de entrada del creador en TikTok.curl -X POST "$MARKAESTRO_URL/api/public/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-tt-001" \
-d '{
"channel": "tiktok",
"caption": "Spring drop teaser",
"mediaAssetIds": ["ast_vid_123"],
"productId": "prod_123",
"destinationId": "tiktok:tiktok:tt_open_123"
}'post.action_required; LinkedIn, Threads, Pinterest y las publicaciones de Meta que optaron por ello se publican directamente; las de TikTok que optaron por ello encolan el traspaso a la bandeja de entrada.curl -X POST "$MARKAESTRO_URL/api/public/v1/posts/pst_123/publish" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Idempotency-Key: publish-001"posts.read y posts.write.# The key is already bound to one brand
curl "$MARKAESTRO_URL/api/public/v1/posts?status=scheduled&limit=100" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"
# Cancel one
curl -X DELETE "$MARKAESTRO_URL/api/public/v1/posts/pst_123" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"{
"id": "evt_123",
"type": "post.action_required",
"createdAt": "2026-04-08T18:06:10.000Z",
"workspaceId": "ws_123",
"data": {
"postId": "pst_123",
"channel": "instagram",
"status": "platform_action_required",
"nextAction": "post_manually_from_reminder"
}
}Publicaciones de solo texto, imagen o vídeo. Hasta 10 imágenes o 1 vídeo por publicación. Publicación manual por defecto; publicación directa si se opta por ello.
Al menos una imagen o vídeo, hasta 10 elementos. Un solo vídeo se publica como Reel. Publicación manual por defecto; publicación directa si se opta por ello.
TikTok
Al menos una imagen o un vídeo. Hasta 35 imágenes o 1 vídeo. Publicación manual por defecto; las publicaciones activadas van a la bandeja de entrada de TikTok del creador, o directamente al perfil con postMode direct_post de TikTok.
Texto, imagen individual, vídeo individual, o publicaciones multiimagen orgánicas de hasta 20 imágenes. Dirígete al perfil conectado o a una página gestionada.
X
Texto, hasta cuatro imágenes, un GIF o un vídeo. Los controles de respuesta se aplican por publicación y la publicación se bloquea cuando se agota el presupuesto de costes de X del espacio de trabajo.