Szerver-API-referencia
SosoAPI közzétételi API: hitelesítés, kérések és eredmények
Építs szerveroldali közzétételi integrációt célhelyenként egy Scheduled Post köré. Ez a referencia a 2026. október 20-án ellenőrzött közzétételi API-szerződést fedi le. A példák helyőrzőket tartalmaznak, és ezen az oldalon nem futnak.
Olvasás Markdown formátumbanEllenőrizte a SosoAPI csapata ·
1. Hitelesíts a szerveredről
Hozz létre API-kulcsot itt: SosoAPI alkalmazás → Beállítások → Ügynökök és API-hozzáférés. Tárold SOSOAPI_API_KEY néven a szerverkörnyezetben. A kérések Authorization: Bearer <your-key> és Content-Type: application/json értéket használnak. Soha ne ágyazd a kulcsot webhelybe, mobilalkalmazás-csomagba, URL-be vagy nyilvános adattárba.
Minden alábbi végpont POST-ot használ JSON-törzzsel. A kulcsokat és delegált ügynökengedélyeket a képességek, engedélyezett munkaterületek és a tulajdonos aktuális tagsága korlátozza. Olvasáshoz agent:operate és legalább viewer hozzáférés, közzétételi módosításhoz agent:publish és legalább editor hozzáférés kell. Az engedély nem bővítheti a tulajdonos jogait.
Használd az alkalmazás aktuális munkaterületét és összekapcsolt fiókjait, vagy hívd meg a /identity-api/workspace/list és /identity-api/user/social-accounts/list végpontokat az engedélyezett azonosítókhoz. Ne találj ki ügyfél-munkaterület- vagy fiókazonosítót.
// 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. Közzétételi végponttérkép
Ezek az útvonalak a szerversegéd API-alapcíméhez relatívak. Kérd le a Scheduled Post részleteit az aktuális verzióhoz, elérhető műveletekhez és közzétételi eredményhez.
| Útvonal | Kérés | Válasz és hatókör |
|---|---|---|
| /studio-api/scheduled-posts/list | workspace_id; opcionális project_id, status, időpár, limit, cursor. | posts, next_cursor, returned_count. Munkaterületi hatókörű olvasás. |
| /studio-api/scheduled-posts/get | id. | post, delivery, actions, attempts, outcomes. Itt olvasd az aktuális verziót. |
| /studio-api/scheduled-posts/eligibility | workspace_id, targets; opcionális include_quota. | destinations és opcionális quota. Csak olvasási előellenőrzés, nem foglalás. |
| /studio-api/scheduled-posts/create | workspace_id, pontos fiók, provider_payload, content, scheduled_at, idempotency_key. | post és deduped. Új időzítésnél 201; egyező ismétlésnél 200. |
| /studio-api/scheduled-posts/bulk-create | workspace_id és 1–50 targets, mindegyik saját idempotency_key értékkel. | batch_id, successes, failures. Legalább egy sikernél 201; ha egyik sem sikerül, 422. Mindkét tömböt vizsgáld meg. |
| /studio-api/scheduled-posts/update | id, expected_version, patch; opcionális egyező provider_payload. | post. Az elavult verziót elutasítja; a célhely nem módosítható. |
| /studio-api/scheduled-posts/publish-now | id és expected_version. | post. Azonnali végrehajtást kér; nem bizonyítja a közzétételt. |
| /studio-api/scheduled-posts/retry | id, expected_version; opcionális jövőbeli scheduled_at. | post. Csak sikertelen állapotnál, bizonyítékhoz kötött helyreállítás; soha nem vak újraküldés. |
| /studio-api/scheduled-posts/cancel | id és expected_version. | post. Visszavonja a még közzé nem tett munkát; a távoli visszavonás függőben maradhat. |
| /studio-api/scheduled-posts/delete | id és expected_version. | post. A gépi hívók nem törölhetnek már közzétett szolgáltatói tartalmat. |
| /studio-api/scheduled-posts/withdraw-delete | id és expected_version. | post. Visszavon egy leállt, csak ellenőrzésre szolgáló Instagram Login törlési kérést; megtartja a szolgáltatói tartalmat. |
3. Listázz és lapozz a hatókör megtartásával
A limit alapértéke 50, megengedett tartománya 1–200. Az opcionális status értéke scheduled, publishing, published, failed, expired, needs_reschedule, cancelled vagy deleted. A scheduled_from és scheduled_to értékét együtt, időeltolást tartalmazó ISO-8601 időpontként kell megadni; a záró időpontnak későbbinek kell lennie a kezdőnél.
A next_cursor null vagy scheduled_at és id mezőt tartalmazó objektum. A teljes objektumot küldd vissza cursor értékként, ugyanazzal a munkaterülettel és szűrőkkel. Ez a végpont nem fogad page, offset, platform vagy social_account_id szűrőt.
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. Ellenőrizz és hozz létre egy jóváhagyott bejegyzést
Minden helyőrzőt cserélj az engedélyezett hatókörből származó értékre és jövőbeli időpontra. Végrehajtáskor ez a példa valódi Threads-szöveges bejegyzést időzít. A létrehozási hívás előtt kérd a személy megerősítését a fiókról, tartalomról és időpontról.
Állítsd be a provider_payload.platform és a platformhoz tartozó publish_options értékét. A szerver ellenőrzi, hogy egyeznek-e a kiválasztott fiókkal. A project_id megadásával rögzítheted a bejegyzés eredetét; a projekt nem ad közzétételi hozzáférést és nem vezérli az időzítést.
| Mező | Szerződés |
|---|---|
| workspace_id / social_account_id | Kötelező UUID-k az engedélyezett munkaterülethez és pontos célhelyhez. |
| provider_payload | Kötelező platformmegkülönböztető és platformspecifikus publish_options. |
| scheduled_at / display_timezone | Kötelező, időeltolást tartalmazó ISO-8601 időpont; érvényes IANA megjelenítési időzóna, alapértéke UTC. |
| idempotency_key | Kötelező, környező szóközök nélküli, 8–160 karakteres karakterlánc, amely ennél a szándéknál állandó. |
| caption / hashtags | A caption lehet null, legfeljebb 5,000 karakter; alapértéke null. A hashtags alapértéke []; legfeljebb 100 darab, 100 karakteres karakterlánc. A szolgáltatói korlátok szigorúbbak lehetnek. |
| media | Alapérték []; legfeljebb 20 regisztrált médiahivatkozás. Mindegyik kind értéke image/video, és kanonikus url értéke van; add meg a kész asset_id értékét. A platformszabályok szigorúbbak lehetnek. |
| link_url | Opcionális URL vagy null. A célhelynek és bejegyzéstípusnak támogatnia kell. |
| local_scheduled_at / schedule_dst_disambiguation | Opcionális pár: helyi idő időeltolás nélkül és exact/earlier/later. Mindkettőt add meg, vagy egyiket sem; a kívánt időponttal és időzónával egyezniük kell. |
| expires_at / automatic_retry_enabled | Opcionális lejárat a scheduled_at után; a null azt jelenti, nincs lejárat. Az automatikus újrapróbálás alapértéke true, és továbbra is a szolgáltatói biztonsági feltételektől függ. |
| project_id / source_ref | Opcionális, null értéket is elfogadó projekt-UUID és hívói származási objektum. Egyik sem változtat jogosultságot. |
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. Olvasd el az eredményt, és vond vissza biztonságosan
A Create { post, deduped }, a List { posts, next_cursor, returned_count }, a Get { post, delivery, actions, attempts, outcomes } értéket ad vissza. A post tartalmazza az id, status, version, destination, schedule és elérhető szolgáltatói azonosság/permalink adatait; a delivery és actions a haladást és engedélyezett következő lépéseket ismerteti.
A scheduled vagy publishing status értékű bejegyzés még függőben van. A published status értékű végleges közzétételi eredmény igazolja a megjelenést, és tartalmazza az elérhető szolgáltatói bizonyítékot; permalink hiányozhat. Kliensszétkapcsolás vagy késő válasz esetén eredményjelentés előtt olvasd a meglévő bejegyzést.
Visszavonás előtt kérd le a bejegyzés részleteit, és add meg aktuális numerikus version értékét. Az eredmény cancellation_pending lehet, amíg a SosoAPI visszavonja a szolgáltatónál lévő időzítést. Időzítés visszavonása nem töröl már közzétett bejegyzést.
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. Idempotencia, ütközések és bizonytalan írások
Ugyanazon létrehozási kérés megismétlésekor ugyanazt az idempotency_key értéket használd. Egyező ismétléskor a meglévő bejegyzést adja vissza deduped=true értékkel. Ha a kulcs újrafelhasználásakor megváltoztatod a tartalmat, ütközés keletkezik. Ez a SosoAPI-ban megelőzi az ismételt létrehozást; a szolgáltatónál nem garantál pontosan egyszeri kézbesítést.
Frissítésekhez és műveletekhez a legfrissebb részletes válasz expected_version értékét add meg. Ütközésnél kérd le újra a bejegyzést, és vesd össze módosításodat az új verzióval. Elveszett válasz esetén a meglévő állapotot ellenőrizd; ne hozz létre másik bejegyzést új kulccsal.
A duplikált tartalom elleni védelem elutasíthat egy másik kérést, ha a normalizált nyilvános tartalom, a fiók és a közeli közzétételi idő megegyezik. Vizsgáld meg a meglévő bejegyzés hivatkozását, ha olvashatod, és a kérés módosítása előtt kérdezd meg a felhasználót. A tömeges kérések célhelyenként adnak eredményt; egyesek sikerülhetnek, míg mások meghiúsulnak.
7. Hibák, hívási és integrációs korlátok
A kezelőhibák error, message, opcionális code, retryable, request_id, opcionális details és retry_after_seconds mezőket tartalmazó burkot használnak. A sémaellenőrzési 400-as hibák alakja eltérő: { success: false, error: { name: "ZodError", message: "…" } }. Az ellenőrzési üzenet jelenleg a szerializált mezőhibákat és útvonalaikat tartalmazza; ne feltételezd, hogy a kezelőburok mezői jelen vannak.
Hibadiagnóziskor őrizd meg a HTTP-állapotot, hibakódot és korrelációs azonosítót innen: result.request_id ?? response.headers.get("x-request-id"). Az ellenőrzési mezőútvonalakkal javítsd a kérést. Hitelesítési vagy engedélyhibánál újrapróbálás előtt javítsd a hitelesítő adatot vagy engedélyt.
A studio-api jelenlegi korlátja emberi felhasználónként percenként 240 kérés, külön gépihitelesítőadat-keretében percenként 480. Ezek kérési plafonok, nem közzétételi teljesítmény vagy csomagkvóták. Más végpontok és közösségi szolgáltatók külön korlátokat használnak. 429 vagy újrapróbálható 503 esetén kövesd az élő Retry-After fejlécet; ne futtass folyamatos újrapróbálási ciklust.
Korlátozott időközönként olvasd az állapotot, amíg a felhasználó követi a bejegyzést, vagy használd az alkalmazás élő állapotnézetét. Ez az API nem ígér kimenő webhookokat, előfizetői SLA-t, platformonként azonos funkciókat vagy rögzített közzétételi időt.
| Állapot | Jelentés és válasz |
|---|---|
| 400 | A sémaellenőrzés a kezelőburok helyett success:false értéket és ZodError hibát adhat az error mezőben. Javítsd a mezőhibákat; ha a törzsben nincs request_id, használd az x-request-id értékét. A kezelő szintjén érvénytelen vagy nem támogatott kérések is használhatnak 400-at. |
| 401 / 403 | Hiányzó/lejárt hitelesítő adat vagy megtagadott képesség-, szerepkör-, munkaterület- vagy fiókhozzáférés. A pontos engedélyt vagy tagságot javítsd. |
| 404 | Az erőforrás nem érhető el az engedélyezett hatókörben. Ellenőrizd az azonosságot. |
| 409 | Állapot-/verzió-, idempotencia-, duplikálttartalom- vagy jogosultságütközés. Olvasd újra; ne küldd be vakon ismét. |
| 422 bulk-create esetén | Egyetlen célhely sem sikerült. Vizsgáld meg a failures listát; részleges siker esetén 201 a válasz. |
| 429 | Kérésszám-korlátozás. Kövesd a Retry-After értékét, és tartsd meg ugyanannak a szándéknak az azonosságát. |
| 503 / egyéb 5xx | Átmeneti szolgáltatási vagy belső hiba. Őrizd meg a request_id értéket; bizonytalan módosítás újrapróbálása előtt vizsgáld meg a meglévő állapotot. |