La recherche se charge uniquement lorsque vous l’utilisez. Parcourez toutes les catégories ci-dessous.

Référence API serveur

API de publication SosoAPI : authentification, requêtes et résultats

Créez une intégration de publication côté serveur autour d’un Scheduled Post par destination. Cette référence couvre le contrat API de publication vérifié le 20 octobre 2026. Les exemples contiennent des valeurs de remplacement et ne s’exécutent pas sur cette page.

Lire en Markdown

Vérifié par l’équipe SosoAPI ·

1. S’authentifier depuis votre serveur

Créez une clé API dans SosoAPI App → Settings → Agents & API Access. Stockez-la sous SOSOAPI_API_KEY dans l’environnement du serveur. Les requêtes utilisent Authorization: Bearer <your-key> et Content-Type: application/json. N’intégrez jamais la clé à un site, un bundle mobile, une URL ou un dépôt public.

Tous les points d’accès ci-dessous utilisent POST avec un corps JSON. Les clés et autorisations déléguées des agents sont limitées par leurs capacités, espaces autorisés et l’appartenance actuelle du propriétaire. Les lectures nécessitent agent:operate et au moins viewer ; les écritures de publication nécessitent agent:publish et au moins editor. Une autorisation ne peut élargir les droits du propriétaire.

Utilisez l’espace de travail actuel et les comptes connectés de l’application, ou appelez /identity-api/workspace/list et /identity-api/user/social-accounts/list pour trouver les identifiants autorisés. Ne devinez pas l’identifiant d’espace ou de compte d’un client.

// Node.js 20+; run only on your server.
const apiKey = process.env.SOSOAPI_API_KEY;
if (!apiKey) throw new Error("Set SOSOAPI_API_KEY on your server");
const apiBase = "https://gqeshlawtcexsapabaui.supabase.co/functions/v1";

async function sosoPost(path, body) {
  const response = await fetch(apiBase + path, {
    method: "POST",
    headers: {
      Authorization: "Bearer " + apiKey,
      "Content-Type": "application/json"
    },
    body: JSON.stringify(body)
  });
  const result = await response.json();
  if (!response.ok) {
    const requestId = result.request_id ?? response.headers.get("x-request-id");
    // Handler errors use code/message; schema-validation 400s instead use
    // success:false and error:{name:"ZodError",message:...}.
    // Preserve status, available code and requestId in server diagnostics.
    // Never log the key or an Authorization header.
    throw new Error("SosoAPI " + response.status + " (" +
      (requestId ?? "no request id") + ")");
  }
  return result;
}

2. Carte des points d’accès de publication

Ces chemins sont relatifs à la base API du helper serveur. Récupérez les détails du Scheduled Post pour obtenir sa version actuelle, les actions disponibles et le résultat de publication.

Points d’accès Scheduled Posts ; chaque requête est POST
CheminRequêteRéponse et limites
/studio-api/scheduled-posts/listworkspace_id ; project_id, status, paire de dates, limit et cursor facultatifs.posts, next_cursor, returned_count. Lecture limitée à l’espace de travail.
/studio-api/scheduled-posts/getid.post, delivery, actions, attempts, outcomes. Lisez la version actuelle ici.
/studio-api/scheduled-posts/eligibilityworkspace_id, targets ; include_quota facultatif.destinations et quota facultatif. Contrôle préalable en lecture seule, pas une réservation.
/studio-api/scheduled-posts/createworkspace_id, compte exact, provider_payload, contenu, scheduled_at, idempotency_key.post et deduped. 201 pour une nouvelle programmation ; 200 pour une répétition identique.
/studio-api/scheduled-posts/bulk-createworkspace_id et 1–50 targets, chacune avec sa propre idempotency_key.batch_id, successes, failures. 201 si au moins une cible réussit ; 422 si aucune ne réussit. Examinez les deux tableaux.
/studio-api/scheduled-posts/updateid, expected_version, patch ; provider_payload correspondant facultatif.post. Une version périmée est rejetée ; la destination est immuable.
/studio-api/scheduled-posts/publish-nowid et expected_version.post. Demande une exécution immédiate ; ne prouve pas la publication.
/studio-api/scheduled-posts/retryid, expected_version ; scheduled_at futur facultatif.post. Récupération limitée aux échecs et soumise aux preuves ; jamais un renvoi aveugle.
/studio-api/scheduled-posts/cancelid et expected_version.post. Annule le travail non publié ; l’annulation distante peut rester en attente.
/studio-api/scheduled-posts/deleteid et expected_version.post. Les appelants machine ne peuvent pas supprimer le contenu déjà publié chez le fournisseur.
/studio-api/scheduled-posts/withdraw-deleteid et expected_version.post. Retire une demande de suppression Instagram Login arrêtée et limitée à la vérification ; conserve le contenu fournisseur.

3. Lister et paginer en conservant le périmètre

limit vaut 50 par défaut et accepte 1–200. status facultatif prend une valeur parmi scheduled, publishing, published, failed, expired, needs_reschedule, cancelled ou deleted. scheduled_from et scheduled_to doivent être fournis ensemble comme instants ISO-8601 avec décalage ; la fin doit suivre le début.

next_cursor vaut null ou est un objet contenant scheduled_at et id. Renvoyez cet objet entier comme cursor avec les mêmes espace de travail et filtres. Ce point d’accès n’accepte pas les filtres page, offset, platform ou social_account_id.

await sosoPost("/studio-api/scheduled-posts/list", {
  "workspace_id": "<workspace-uuid>",
  "limit": 50
});
const first = await sosoPost("/studio-api/scheduled-posts/list", {
  workspace_id: "<workspace-uuid>", limit: 50
});
if (first.next_cursor) {
  const next = await sosoPost("/studio-api/scheduled-posts/list", {
    workspace_id: "<workspace-uuid>", limit: 50, cursor: first.next_cursor
  });
  // Consume next.posts; continue only while next_cursor is not null.
}

4. Valider et créer une publication relue

Remplacez chaque valeur de remplacement par des valeurs de votre périmètre autorisé et une heure future. Cet exemple programme une véritable publication texte Threads à l’exécution. Obtenez la confirmation du compte, du contenu et de l’heure par la personne avant l’appel de création.

Définissez provider_payload.platform et les publish_options de cette plateforme. Le serveur vérifie leur correspondance avec le compte sélectionné. Vous pouvez inclure project_id pour enregistrer la provenance de la publication ; le projet n’accorde aucun accès de publication et ne contrôle pas la programmation.

Champs et valeurs par défaut de la requête de création
ChampContrat
workspace_id / social_account_idUUID requis pour l’espace autorisé et la destination exacte.
provider_payloadDiscriminant de plateforme et publish_options propres à la plateforme requis.
scheduled_at / display_timezoneInstant ISO-8601 avec décalage requis ; fuseau IANA d’affichage valide, UTC par défaut.
idempotency_keyChaîne requise sans espaces superflus, de 8–160 caractères, stable pour cette intention.
caption / hashtagsCaption peut être null, maximum 5,000 caractères ; null par défaut. Hashtags vaut [] par défaut ; au plus 100 chaînes de 100 caractères. Les limites du fournisseur peuvent être plus strictes.
media[] par défaut ; au plus 20 références de médias enregistrés. Chacune a un kind image/video et une url canonique ; incluez son asset_id prêt. Les règles des plateformes peuvent être plus strictes.
link_urlURL facultative ou null. La destination et le type de publication doivent la prendre en charge.
local_scheduled_at / schedule_dst_disambiguationPaire facultative : heure locale sans décalage et exact/earlier/later. Fournir les deux ou aucun ; ils doivent correspondre à l’instant et au fuseau prévus.
expires_at / automatic_retry_enabledExpiration facultative après scheduled_at ; null signifie aucune expiration. La nouvelle tentative automatique vaut true par défaut et reste soumise à la sécurité du fournisseur.
project_id / source_refUUID Project facultatif pouvant être null et objet de provenance de l’appelant. Aucun ne modifie les droits.
await sosoPost("/studio-api/scheduled-posts/eligibility", {
  "workspace_id": "<workspace-uuid>",
  "include_quota": true,
  "targets": [
    {
      "social_account_id": "<threads-account-uuid>",
      "media": [],
      "provider_payload": {
        "platform": "threads",
        "publish_options": {
          "post_type": "TEXT"
        }
      },
      "draft": {
        "caption": "A reviewed update from our team.",
        "hashtags": [],
        "scheduled_at": "<future-ISO-8601-instant-with-offset>",
        "display_timezone": "Asia/Hong_Kong"
      }
    }
  ]
});
await sosoPost("/studio-api/scheduled-posts/create", {
  "workspace_id": "<workspace-uuid>",
  "social_account_id": "<threads-account-uuid>",
  "caption": "A reviewed update from our team.",
  "hashtags": [],
  "media": [],
  "provider_payload": {
    "platform": "threads",
    "publish_options": {
      "post_type": "TEXT"
    }
  },
  "scheduled_at": "<future-ISO-8601-instant-with-offset>",
  "display_timezone": "Asia/Hong_Kong",
  "idempotency_key": "<stable-key-for-this-one-intent>"
});

5. Lire le résultat et annuler en sécurité

Create renvoie { post, deduped }. List renvoie { posts, next_cursor, returned_count }. Get renvoie { post, delivery, actions, attempts, outcomes }. Un post inclut id, status, version, destination, programmation et identité/permalien fournisseur disponibles ; delivery et actions expliquent la progression et les suites autorisées.

Une publication avec status scheduled ou publishing reste en attente. Un résultat final avec status published confirme la publication et inclut les preuves fournisseur disponibles ; le permalien peut manquer. Si le client se déconnecte ou si une réponse tarde, lisez la publication existante avant d’annoncer un résultat.

Avant d’annuler, récupérez les détails et fournissez la version numérique actuelle. Le résultat peut être cancellation_pending pendant que SosoAPI annule une programmation détenue par le fournisseur. Annuler une programmation ne supprime pas une publication déjà diffusée.

await sosoPost("/studio-api/scheduled-posts/get", {
  "id": "<scheduled-post-uuid>"
});
const detail = await sosoPost("/studio-api/scheduled-posts/get", {
  id: "<scheduled-post-uuid>"
});
// Run only after the person confirms cancelling this unpublished post.
await sosoPost("/studio-api/scheduled-posts/cancel", {
  id: detail.post.id, expected_version: detail.post.version
});

6. Idempotence, conflits et écritures incertaines

Utilisez la même idempotency_key pour répéter la même requête de création. Une répétition identique renvoie la publication existante avec deduped=true. Modifier le contenu avec la même clé crée un conflit. Cela empêche les créations en double dans SosoAPI ; cela ne garantit pas une diffusion exactement une fois par le fournisseur.

Pour les mises à jour et actions, fournissez expected_version depuis la dernière réponse détaillée. En cas de conflit, relisez la publication et confrontez votre modification à la nouvelle version. Une réponse perdue justifie de vérifier l’état existant, pas de créer une autre publication avec une nouvelle clé.

Le contrôle de contenu dupliqué peut rejeter une requête distincte ayant le même contenu public normalisé, le même compte et une heure proche. Consultez la référence de publication existante si vous y êtes autorisé et interrogez l’utilisateur avant de modifier la requête. Les lots renvoient un résultat par destination ; certaines peuvent réussir et d’autres échouer.

7. Erreurs, limites de débit et d’intégration

Les erreurs des gestionnaires utilisent une enveloppe avec error, message, code facultatif, retryable, request_id, details facultatif et retry_after_seconds. Les 400 de validation de schéma ont une autre forme : { success: false, error: { name: "ZodError", message: "…" } }. Le message contient actuellement les problèmes de champs sérialisés avec leurs chemins ; ne supposez pas la présence des champs de l’enveloppe du gestionnaire.

Pour diagnostiquer un échec, conservez le statut HTTP, le code d’erreur et l’identifiant de corrélation issu de result.request_id ?? response.headers.get("x-request-id"). Corrigez la requête grâce aux chemins des champs de validation. Pour les erreurs d’authentification ou d’autorisation, corrigez l’identifiant ou l’accès avant de réessayer.

La limite actuelle de studio-api est de 240 requêtes par minute par utilisateur humain et 480 par minute dans le compartiment distinct des identifiants machine de cet utilisateur. Ce sont des plafonds de requêtes, pas un débit de publication ni des quotas de forfait. Les autres points d’accès et fournisseurs ont leurs propres limites. Respectez l’en-tête Retry-After actuel sur 429 ou 503 réessayable ; pas de boucle intensive.

Lisez le statut à intervalles bornés pendant que l’utilisateur suit la publication, ou utilisez la vue d’état en direct de l’application. Cette API ne promet ni webhooks sortants, ni SLA d’abonné, ni fonctionnalités identiques entre plateformes, ni heure de publication fixe.

Réponses HTTP et suites utiles
StatutSignification et réponse
400La validation de schéma peut renvoyer success:false avec un ZodError dans error au lieu de l’enveloppe du gestionnaire. Corrigez les problèmes de champs ; utilisez x-request-id si le corps n’a pas de request_id. Les requêtes invalides ou non prises en charge au niveau du gestionnaire peuvent aussi renvoyer 400.
401 / 403Identifiant absent/expiré ou capacité, rôle, espace ou accès au compte refusé. Corrigez l’autorisation ou l’appartenance précise.
404La ressource est indisponible dans le périmètre autorisé. Vérifiez son identité.
409Conflit d’état/version, d’idempotence, de contenu dupliqué ou d’éligibilité. Relisez ; ne renvoyez pas aveuglément.
422 pour bulk-createAucune destination n’a réussi. Examinez failures ; une réussite partielle utilise plutôt 201.
429Limitation des requêtes. Respectez Retry-After et gardez la même identité d’intention.
503 / autres 5xxÉchec temporaire du service ou erreur interne. Conservez request_id ; examinez l’état existant avant de réessayer une écriture incertaine.