Tu primera publicación
Obtener una clave de API1. Comprobar las redes conectadas
Una publicación sale por las cuentas conectadas al establecimiento. Lístalas; si falta alguna, crea un enlace de conexión.
curl https://api.sofia-post.com/api/v1/establishments/$ESTABLISHMENT_ID/accounts \
-H "Authorization: Bearer $SOFIA_API_KEY"2. Añadir un medio
Instagram y TikTok necesitan una foto o un vídeo. Importa uno desde una URL https pública; Sofia lo descarga en la biblioteca de medios y devuelve su id.
curl -X POST https://api.sofia-post.com/api/v1/media \
-H "Authorization: Bearer $SOFIA_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"establishmentId":"'$ESTABLISHMENT_ID'","url":"https://images.example.com/tarte-tatin.jpg"}'3. Comprobarla con una simulación
Añade ?dry_run=true: Sofia juzga cada red según sus reglas reales y la cuenta conectada, y no escribe nada.
curl -X POST 'https://api.sofia-post.com/api/v1/posts?dry_run=true' \
-H "Authorization: Bearer $SOFIA_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"establishmentId": "'$ESTABLISHMENT_ID'",
"targets": [
{ "platform": "instagram", "text": "Tarte tatin du jour", "media": [{ "id": "'$MEDIA_ID'" }] },
{ "platform": "facebook", "text": "Tarte tatin du jour", "media": [{ "id": "'$MEDIA_ID'" }] }
]
}'{
"status": "ready",
"dryRun": true,
"targets": [
{ "platform": "instagram", "accountId": "fecd0904-…", "handle": "sof_ia_officiel", "state": "ready" },
{ "platform": "facebook", "accountId": "a423b3a4-…", "handle": "Sofia post", "state": "ready" }
]
}4. Publicar
Envía el mismo cuerpo sin dry_run, con una Idempotency-Key para que un reintento nunca publique dos veces. Sin scheduledAt, la publicación sale ahora; con un scheduledAt futuro, queda programada.
curl -X POST https://api.sofia-post.com/api/v1/posts \
-H "Authorization: Bearer $SOFIA_API_KEY" \
-H 'Content-Type: application/json' \
-H "Idempotency-Key: $(uuidgen)" \
-d @post.json5. Seguirla
La publicación responde publishing, y luego cada red pasa a published con su enlace permanente, o a failed con su motivo. Léela con GET /v1/posts/{id}, o registra un webhook para que te avise.
{
"id": "efc578cc-ef79-40e9-876d-be1a33d3b8db",
"status": "published",
"targets": [
{
"platform": "instagram",
"state": "published",
"publishedAt": "2026-11-02T20:17:25.453Z",
"permalink": "https://www.instagram.com/p/DfQJVPGFfb_/"
}
]
}