Erreurs

Obtenir une clé API

Chaque erreur répond avec un statut HTTP et la même enveloppe JSON. code est le contrat que lit votre code ; message est écrit pour un humain et peut changer.

json
{
  "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"
  }
}
  • details en dit plus : le champ refusé, la raison d’un réseau, la fenêtre de limite épuisée.
  • docUrl mène à l’explication du code sur cette page.
  • requestId identifie la requête : communiquez-le au support.

Codes d’erreur

StatutCodeSignification
400invalid_requestLe corps, la requête ou un paramètre est invalide. Un détail par champ refusé : field, code (required, is_string, max…) et message.
400invalid_jsonLe corps n’est pas du JSON valide.
400invalid_cursorLe curseur n’a pas été renvoyé par Sofia API.
400webhook_url_invalidL’adresse du webhook n’est pas en https, ou mène à une adresse privée.
400webhook_event_invalidÉvénement de webhook inconnu.
400application_name_invalidRéglages › API : le nom du client est absent ou trop long.
400application_profile_invalidRéglages › API : un champ du profil du client est invalide ; le détail le nomme.
400logo_invalidRéglages › API : le logo est refusé (au moins 180×180 px, PNG, JPEG ou WebP, 2 Mo au plus).
401invalid_tokenLe jeton est absent, inconnu, expiré ou révoqué, ou la personne derrière a perdu les droits qu’il porte. Voir l’en-tête WWW-Authenticate.
401unauthorizedUne authentification est requise.
402subscription_requiredUne écriture réelle (simulation comprise) exige un abonnement actif ou un essai.
403insufficient_scopeLe jeton n’a pas le scope de l’endpoint ; le détail le nomme.
403insufficient_roleVotre rôle dans ce Workspace n’autorise pas cette action.
403live_mode_requiredUne écriture réelle avec un jeton de test.
403route_closed_to_applicationsCet endpoint n’est pas ouvert aux applications.
403forbiddenL’accès est refusé.
403session_requiredRéglages › API : cette action demande une session Sofia, pas un jeton.
403impersonation_forbiddenRéglages › API : cette action est refusée dans une session empruntée.
403workspace_owner_requiredSeul le propriétaire du Workspace peut faire cela.
403workspace_member_requiredVous n’êtes pas membre de ce Workspace.
404route_not_foundAucun endpoint ne répond à cette méthode et ce chemin.
404establishment_not_foundÉtablissement inconnu, ou hors de portée du jeton.
404media_not_foundMédia inconnu, ou hors de portée du jeton.
404post_not_foundPublication inconnue, ou hors de portée du jeton.
404webhook_not_foundWebhook inconnu, ou appartenant à une autre application.
404not_foundLa ressource n’existe pas.
404application_not_foundRéglages › API : client inconnu.
404grant_not_foundAutorisation inconnue, ou déjà révoquée.
404personal_key_not_foundRéglages › API : clé personnelle inconnue.
405method_not_allowedCette méthode n’est pas autorisée sur cet endpoint.
409post_in_flightUn réseau est en train d’envoyer la publication : réessayez la suppression un instant plus tard.
409post_not_editableUn réseau a déjà envoyé la publication : elle ne peut plus être modifiée.
409account_already_connectedCe réseau est déjà connecté à l’établissement.
409webhook_limit_reachedL’application a déjà 10 webhooks.
409idempotency_in_progressLa première requête avec cette Idempotency-Key est encore en cours.
409conflictLa requête entre en conflit avec l’état actuel de la ressource.
409scope_removal_forbiddenRéglages › API : une permission d’un client peut être ajoutée mais pas retirée.
409public_client_has_no_secretRéglages › API : un client public n’a pas de secret.
413payload_too_largeLe fichier dépasse la limite de téléversement.
415unsupported_media_typeType de contenu non pris en charge.
422post_refusedUn réseau, l’établissement ou votre forfait refuserait la publication. Un détail par raison, chacun avec son message.
422media_import_refusedLe média n’a pas pu être importé depuis cette URL ; le détail donne la raison.
422media_upload_refusedLe fichier téléversé n’est pas une image ou une vidéo prise en charge.
422platform_not_offeredCe réseau n’est pas proposé à la connexion.
422idempotency_key_reusedCette Idempotency-Key a servi avec un corps différent.
422unprocessable_entityLa requête est comprise mais ne peut pas être traitée.
429rate_limit_exceededUne fenêtre de limite est pleine : attendez Retry-After.

Raisons d’une publication refusée

Un post_refused liste chaque raison dans details[].code :

CodeSignification
unsupported_platformCe réseau n’est pas pris en charge.
duplicate_platformLe même réseau est nommé deux fois.
unsupported_formatCe réseau ne propose pas ce format.
caption_too_longLe texte est trop long (max, actual).
too_many_hashtagsTrop de hashtags (max, actual).
too_many_mentionsTrop de mentions (max, actual).
too_many_thread_postsLe fil est trop long (max, actual).
too_many_mediaTrop de médias (max, actual).
media_mix_refusedPhotos et vidéos ne peuvent pas être mélangées sur ce réseau.
media_requiredCe réseau exige une photo ou une vidéo.
media_type_refusedCe réseau n’accepte pas ce type de média.
scheduled_in_pastscheduledAt est dans le passé.
scheduled_at_invalidUne publication programmée exige un scheduledAt futur.
account_not_connectedAucun compte connecté sur ce réseau pour cet établissement.
account_ambiguousPlusieurs comptes sont connectés sur ce réseau : nommez-en un avec accountId.
media_not_foundLe média n’est pas dans la médiathèque de cet établissement.
media_url_invalidL’URL du média doit être une adresse https publique.
platform_unavailableCe réseau n’est pas encore ouvert sur Sofia.
publication_quota_exceededLe quota de publications de votre forfait est atteint.

Gérer les erreurs

  • Branchez votre logique sur code, jamais sur message.
  • Réessayez un 429 après Retry-After, et un 5xx avec un backoff exponentiel.
  • Ne réessayez jamais un 4xx à l’identique : corrigez d’abord la requête.
  • Journalisez requestId à chaque échec.