Errores
Obtener una clave de APICada error responde con un estado HTTP y el mismo envoltorio JSON. code es el contrato que lee tu código; message está escrito para una persona y puede cambiar.
{
"error": {
"code": "invalid_request",
"message": "The request is invalid",
"details": [
{ "field": "targets[0].text", "code": "required", "message": "targets[0].text is required" }
],
"docUrl": "https://www.sofia-post.com/developers/errors#invalid_request",
"requestId": "2aab5943-6333-4caf-8478-25a85ebd4abf"
}
}detailsdice más: el campo rechazado, el motivo de una red, la ventana de límite agotada.docUrllleva a la explicación del código en esta página.requestIdidentifica la petición: facilítalo al soporte.
Códigos de error
| Estado | Código | Significado |
|---|---|---|
| 400 | invalid_request | El cuerpo, la consulta o un parámetro no es válido. Un detalle por campo rechazado: field, code (required, is_string, max…) y message. |
| 400 | invalid_json | El cuerpo no es JSON válido. |
| 400 | invalid_cursor | El cursor no lo devolvió Sofia API. |
| 400 | webhook_url_invalid | La dirección del webhook no es https, o lleva a una dirección privada. |
| 400 | webhook_event_invalid | Evento de webhook desconocido. |
| 400 | application_name_invalid | Ajustes › API: falta el nombre del cliente o es demasiado largo. |
| 400 | application_profile_invalid | Ajustes › API: un campo del perfil del cliente no es válido; el detalle lo indica. |
| 400 | logo_invalid | Ajustes › API: el logotipo se rechaza (mínimo 180×180 px, PNG, JPEG o WebP, 2 MB como máximo). |
| 401 | invalid_token | El token falta, es desconocido, ha caducado o está revocado, o la persona que hay detrás perdió los derechos que lleva. Consulta la cabecera WWW-Authenticate. |
| 401 | unauthorized | Se requiere autenticación. |
| 402 | subscription_required | Una escritura real (simulación incluida) exige una suscripción activa o una prueba. |
| 403 | insufficient_scope | Al token le falta el scope del endpoint; el detalle lo nombra. |
| 403 | insufficient_role | Tu rol en este Workspace no permite esta acción. |
| 403 | live_mode_required | Una escritura real con un token de prueba. |
| 403 | route_closed_to_applications | Este endpoint no está abierto a aplicaciones. |
| 403 | forbidden | Acceso denegado. |
| 403 | session_required | Ajustes › API: esta acción requiere una sesión de Sofia, no un token. |
| 403 | impersonation_forbidden | Ajustes › API: esta acción se rechaza en una sesión prestada. |
| 403 | workspace_owner_required | Solo el propietario del Workspace puede hacerlo. |
| 403 | workspace_member_required | No eres miembro de este Workspace. |
| 404 | route_not_found | Ningún endpoint responde a este método y esta ruta. |
| 404 | establishment_not_found | Establecimiento desconocido, o fuera del alcance del token. |
| 404 | media_not_found | Medio desconocido, o fuera del alcance del token. |
| 404 | post_not_found | Publicación desconocida, o fuera del alcance del token. |
| 404 | webhook_not_found | Webhook desconocido, o de otra aplicación. |
| 404 | not_found | El recurso no existe. |
| 404 | application_not_found | Ajustes › API: cliente desconocido. |
| 404 | grant_not_found | Autorización desconocida o ya revocada. |
| 404 | personal_key_not_found | Ajustes › API: clave personal desconocida. |
| 404 | consent_not_found | La solicitud de autorización ha caducado o no existe: empieza de nuevo desde el endpoint de autorización. |
| 405 | method_not_allowed | Este método no está permitido en este endpoint. |
| 409 | post_in_flight | Una red está enviando la publicación: reintenta la eliminación un momento después. |
| 409 | post_not_editable | Una red ya envió la publicación: ya no se puede editar. |
| 409 | account_already_connected | Esta red ya está conectada al establecimiento. |
| 409 | webhook_limit_reached | La aplicación ya tiene 10 webhooks. |
| 409 | idempotency_in_progress | La primera petición con esta Idempotency-Key sigue en curso. |
| 409 | conflict | La solicitud entra en conflicto con el estado actual del recurso. |
| 409 | scope_removal_forbidden | Ajustes › API: a un cliente se le puede añadir un permiso, pero no quitárselo. |
| 409 | public_client_has_no_secret | Ajustes › API: un cliente público no tiene secreto. |
| 413 | payload_too_large | El archivo supera el límite de subida. |
| 415 | unsupported_media_type | Tipo de contenido no admitido. |
| 422 | post_refused | Una red, el establecimiento o tu plan rechazaría la publicación. Un detalle por motivo, cada uno con su message. |
| 422 | media_import_refused | No se pudo importar el medio desde esta URL; el detalle da el motivo. |
| 422 | media_upload_refused | El archivo subido no es una imagen o un vídeo admitido. |
| 422 | platform_not_offered | Esta red no se ofrece para conectar. |
| 422 | idempotency_key_reused | Esta Idempotency-Key se usó con un cuerpo distinto. |
| 422 | unprocessable_entity | La solicitud se entiende, pero no se puede procesar. |
| 429 | rate_limit_exceeded | Una ventana de límite está llena: espera el tiempo de Retry-After. |
Motivos de una publicación rechazada
Un post_refused enumera cada motivo en details[].code:
| Código | Significado |
|---|---|
unsupported_platform | Esta red no es compatible. |
duplicate_platform | La misma red aparece dos veces. |
unsupported_format | Esta red no ofrece este formato. |
caption_too_long | El texto es demasiado largo (max, actual). |
too_many_hashtags | Demasiados hashtags (max, actual). |
too_many_mentions | Demasiadas menciones (max, actual). |
too_many_thread_posts | El hilo es demasiado largo (max, actual). |
too_many_media | Demasiados medios (max, actual). |
media_mix_refused | No se pueden mezclar fotos y vídeos en esta red. |
media_required | Esta red necesita una foto o un vídeo. |
media_type_refused | Esta red no acepta este tipo de medio. |
scheduled_in_past | scheduledAt está en el pasado. |
scheduled_at_invalid | Una publicación programada necesita un scheduledAt futuro. |
account_not_connected | No hay ninguna cuenta conectada en esta red para este establecimiento. |
account_ambiguous | Hay varias cuentas conectadas en esta red: indica una con accountId. |
media_not_found | El medio no está en la biblioteca de este establecimiento. |
media_url_invalid | La URL del medio debe ser una dirección https pública. |
platform_unavailable | Esta red todavía no está abierta en Sofia. |
publication_quota_exceeded | Se alcanzó la cuota de publicaciones de tu plan. |
Gestionar los errores
- Bifurca según
code, nunca segúnmessage. - Reintenta un
429trasRetry-After, y un5xxcon un backoff exponencial. - Nunca reintentes un
4xxsin cambios: corrige primero la petición. - Registra
requestIden cada fallo.