תיעוד API לשרת
API הפרסום של SosoAPI: אימות, בקשות ותוצאות
בנו שילוב פרסום בצד השרת סביב Scheduled Post אחד לכל יעד. תיעוד העזר מכסה את חוזה API הפרסום שנבדק ב-20 באוקטובר 2026. הדוגמאות כוללות מצייני מקום ואינן רצות בעמוד הזה.
קריאה בפורמט Markdownנבדק על ידי צוות SosoAPI ·
1. בצעו אימות מהשרת שלכם
צרו מפתח API באפליקציית SosoAPI ← הגדרות ← סוכנים וגישת API. שמרו אותו בתור SOSOAPI_API_KEY בסביבת השרת. בקשות משתמשות ב-Authorization: Bearer <your-key> וב-Content-Type: application/json. לעולם אין להטמיע את המפתח באתר, בחבילת אפליקציה לנייד, ב-URL או במאגר ציבורי.
כל נקודות הקצה שלהלן משתמשות ב-POST עם גוף JSON. מפתחות והרשאות סוכן מואצל מוגבלים על ידי היכולות, סביבות העבודה המותרות והחברות העדכנית של הבעלים. קריאות דורשות agent:operate וגישה ברמת viewer לפחות; שינויי פרסום דורשים agent:publish וגישה ברמת editor לפחות. הרשאה אינה יכולה להרחיב את זכויות הבעלים.
השתמשו בסביבת העבודה ובחשבונות המחוברים הנוכחיים באפליקציה, או קראו ל-/identity-api/workspace/list ול-/identity-api/user/social-accounts/list כדי למצוא מזהים שאתם מורשים להשתמש בהם. אין לנחש מזהה סביבת עבודה או חשבון של לקוח.
// 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. מפת נקודות קצה לפרסום
הנתיבים יחסיים לכתובת בסיס ה-API המשמשת בעזר השרת. קראו את פרטי Scheduled Post כדי לקבל את הגרסה הנוכחית, הפעולות הזמינות ותוצאת הפרסום שלו.
| נתיב | בקשה | תגובה וגבולות |
|---|---|---|
| /studio-api/scheduled-posts/list | workspace_id; project_id, status, זוג זמנים, limit ו-cursor אופציונליים. | posts, next_cursor, returned_count. קריאה בהיקף סביבת עבודה. |
| /studio-api/scheduled-posts/get | id. | post, delivery, actions, attempts, outcomes. קראו כאן את הגרסה הנוכחית. |
| /studio-api/scheduled-posts/eligibility | workspace_id, targets; include_quota אופציונלי. | destinations ו-quota אופציונלי. בדיקה מקדימה לקריאה בלבד, ללא שמירת קיבולת. |
| /studio-api/scheduled-posts/create | workspace_id, חשבון מדויק, provider_payload, content, scheduled_at, idempotency_key. | post ו-deduped. 201 לתזמון חדש; 200 לבקשה חוזרת תואמת. |
| /studio-api/scheduled-posts/bulk-create | workspace_id ו-1–50 targets, כל אחד עם idempotency_key משלו. | batch_id, successes, failures. 201 כשיש לפחות הצלחה אחת; 422 כשאף יעד לא מצליח. בדקו את שני המערכים. |
| /studio-api/scheduled-posts/update | id, expected_version, patch; provider_payload תואם אופציונלי. | post. גרסה מיושנת נדחית; היעד אינו ניתן לשינוי. |
| /studio-api/scheduled-posts/publish-now | id ו-expected_version. | post. בקשת ביצוע מיידי; אינה מוכיחה פרסום. |
| /studio-api/scheduled-posts/retry | id, expected_version; scheduled_at עתידי אופציונלי. | post. שחזור לכישלונות בלבד ובכפוף לראיות; לעולם לא שליחה חוזרת עיוורת. |
| /studio-api/scheduled-posts/cancel | id ו-expected_version. | post. מבטל עבודה שלא פורסמה; ביטול מרוחק עשוי להישאר בהמתנה. |
| /studio-api/scheduled-posts/delete | id ו-expected_version. | post. גורמים קוראים מכונתיים אינם יכולים למחוק תוכן שכבר פורסם אצל הספק. |
| /studio-api/scheduled-posts/withdraw-delete | id ו-expected_version. | post. משיכת בקשת מחיקה שנעצרה ב-Instagram Login ומיועדת לאימות בלבד; תוכן הספק נשמר. |
3. הציגו ודפדפו בלי לאבד את ההיקף
ברירת המחדל של limit היא 50 והטווח המתקבל הוא 1–200. status אופציונלי הוא אחד מ-scheduled, publishing, published, failed, expired, needs_reschedule, cancelled או deleted. יש לספק scheduled_from ו-scheduled_to יחד כרגעי ISO-8601 עם היסטי זמן; הסיום חייב להיות אחרי ההתחלה.
next_cursor הוא null או אובייקט עם scheduled_at ו-id. שלחו את כל האובייקט הזה חזרה בתור cursor יחד עם אותה סביבת עבודה ואותם מסננים. נקודת הקצה אינה מקבלת מסנני page, offset, platform או 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. אמתו וצרו פוסט אחד שנבדק
החליפו כל מציין מקום בערכים מההיקף המורשה שלכם ובמועד עתידי. הדוגמה מתזמנת פוסט טקסט אמיתי ב-Threads כשהיא מורצת. קבלו אישור מהאדם לחשבון, לתוכן ולשעה לפני קריאת create.
הגדירו provider_payload.platform ואת publish_options של הפלטפורמה. השרת בודק שהם תואמים לחשבון הנבחר. אפשר לכלול project_id כדי לתעד את מקור הפוסט; הפרויקט אינו מעניק גישת פרסום ואינו שולט בתזמון.
| שדה | חוזה |
|---|---|
| workspace_id / social_account_id | מזהי UUID נדרשים לסביבת העבודה המורשית וליעד המדויק. |
| provider_payload | מבחין פלטפורמה נדרש ו-publish_options ייחודיים לפלטפורמה. |
| scheduled_at / display_timezone | רגע ISO-8601 נדרש עם היסט זמן; אזור זמן תצוגה תקף של IANA, ברירת מחדל UTC. |
| idempotency_key | מחרוזת חובה ללא רווחים בקצוות, 8–160 תווים, יציבה לכוונה האחת הזו. |
| caption / hashtags | Caption יכול להיות null, עד 5,000 תווים; ברירת מחדל null. ברירת המחדל של hashtags היא []; עד 100 מחרוזות בנות 100 תווים. מגבלות הספק עשויות להיות מצומצמות יותר. |
| media | ברירת מחדל []; עד 20 הפניות מדיה רשומות. לכל אחת kind מסוג image/video ו-url קנוני; כללו את asset_id המוכן שלה. כללי הפלטפורמה עשויים להיות מצומצמים יותר. |
| link_url | URL אופציונלי או null. היעד וסוג הפוסט חייבים לתמוך בו. |
| local_scheduled_at / schedule_dst_disambiguation | זוג אופציונלי: זמן מקומי ללא היסט ו-exact/earlier/later. ספקו את שניהם או אף אחד; הם חייבים להתאים לרגע ולאזור הזמן המיועדים. |
| expires_at / automatic_retry_enabled | תפוגה אופציונלית לאחר scheduled_at; null פירושו ללא תפוגה. ברירת המחדל של ניסיון חוזר אוטומטי היא true והוא נשאר כפוף לבטיחות אצל הספק. |
| project_id / source_ref | UUID פרויקט אופציונלי שיכול להיות null ואובייקט מקור של הגורם הקורא. אף אחד מהם אינו משנה הרשאה. |
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. קראו את התוצאה ובטלו בבטחה
Create מחזיר { post, deduped }. List מחזיר { posts, next_cursor, returned_count }. Get מחזיר { post, delivery, actions, attempts, outcomes }. פוסט כולל id, status, version, יעד, תזמון וזהות/קישור קבוע זמינים אצל הספק; delivery ו-actions מסבירים התקדמות נוכחית וצעדים הבאים שמותרים.
פוסט עם status של scheduled או publishing עדיין ממתין. תוצאת פרסום סופית עם status של published מאשרת פרסום וכוללת את ראיות הספק הזמינות לפוסט; ייתכן שחסר קישור קבוע. אם הלקוח מתנתק או התגובה מתעכבת, קראו את הפוסט הקיים לפני דיווח תוצאה.
לפני ביטול, קראו את פרטי הפוסט והעבירו את הגרסה המספרית הנוכחית שלו. התוצאה עשויה להיות cancellation_pending בזמן ש-SosoAPI מבטל תזמון המוחזק אצל הספק. ביטול תזמון אינו מוחק פוסט שכבר פורסם.
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. אידמפוטנטיות, התנגשויות וכתיבות לא ודאיות
השתמשו באותו idempotency_key בחזרה על אותה בקשת create. בקשה חוזרת תואמת מחזירה את הפוסט הקיים עם deduped=true. שינוי התוכן תוך שימוש חוזר במפתח גורם להתנגשות. כך נמנעת יצירה כפולה ב-SosoAPI; אין בכך הבטחה למסירה בדיוק פעם אחת אצל הספק.
לעדכונים ולפעולות, העבירו expected_version מתגובת הפרטים האחרונה. אם יש התנגשות, קראו שוב את הפוסט ובדקו את השינוי שלכם מול הגרסה החדשה. תגובה שאבדה היא סיבה לבדוק מצב קיים, ולא ליצור פוסט נוסף עם מפתח חדש.
מנגנון מניעת תוכן כפול עשוי לדחות בקשה נפרדת עם אותו תוכן ציבורי מנורמל, חשבון ומועד פרסום סמוך. בדקו את ההפניה לפוסט הקיים אם אתם מורשים לקרוא אותו, ושאלו את המשתמש לפני שינוי הבקשה. בקשות אצווה מחזירות תוצאה לכל יעד; חלק יכולים להצליח ואחרים להיכשל.
7. שגיאות, מגבלות קצב ומגבלות שילוב
שגיאות מטפל משתמשות במעטפת עם error, message, code אופציונלי, retryable, request_id, details אופציונלי ו-retry_after_seconds. תגובות 400 לאימות סכמה מחזירות מבנה אחר: { success: false, error: { name: "ZodError", message: "…" } }. הודעת האימות כוללת כעת את בעיות השדות המסודרות, כולל הנתיבים שלהן; אין להניח ששדות מעטפת המטפל קיימים.
באבחון כשל, שמרו את סטטוס ה-HTTP, קוד השגיאה ומזהה הקישור מ-result.request_id ?? response.headers.get("x-request-id"). השתמשו בנתיבי שדות האימות לתיקון הבקשה. לשגיאות אימות או הרשאה, תקנו את אמצעי הגישה או ההרשאה לפני ניסיון נוסף.
מגבלת studio-api הנוכחית היא 240 בקשות לדקה למשתמש אנושי ו-480 לדקה במכסה המכונתית הנפרדת של אותו משתמש. אלה תקרות בקשות, ולא תפוקת פרסום או מכסות מסלול. לנקודות קצה אחרות ולספקים החברתיים יש מגבלות נפרדות. פעלו לפי כותרת Retry-After העדכנית ב-429 או ב-503 שניתן לנסות שוב; אין לבצע לולאה רציפה.
קראו סטטוס במרווחים מוגבלים בזמן שהמשתמש עוקב אחר הפוסט, או השתמשו בתצוגת הסטטוס החיה באפליקציה. ה-API אינו מבטיח webhooks יוצאים, SLA למנויים, יכולות זהות בכל הפלטפורמות או מועד פרסום קבוע.
| סטטוס | משמעות ותגובה |
|---|---|
| 400 | אימות סכמה עשוי להחזיר success:false עם ZodError בתוך error, במקום מעטפת המטפל. תקנו את בעיות השדות; השתמשו ב-x-request-id אם בגוף אין request_id. גם בקשות לא תקינות או לא נתמכות ברמת המטפל עשויות להחזיר 400. |
| 401 / 403 | אמצעי גישה חסר/פג תוקף או דחיית יכולת, תפקיד, גישה לסביבת עבודה או לחשבון. תקנו את ההרשאה או החברות המדויקות. |
| 404 | המשאב אינו זמין בהיקף המורשה. אמתו את הזהות. |
| 409 | התנגשות מצב/גרסה, אידמפוטנטיות, תוכן כפול או התאמה. קראו שוב; אין לשלוח מחדש באופן עיוור. |
| 422 עבור bulk-create | אף יעד לא הצליח. בדקו failures; בהצלחה חלקית משתמשים ב-201. |
| 429 | הגבלת קצב בקשות. כבדו Retry-After ושמרו על אותה זהות כוונה. |
| 503 / שגיאות 5xx אחרות | כשל שירות זמני או תקלה פנימית. שמרו request_id; בדקו את המצב הקיים לפני ניסיון חוזר לשינוי שתוצאתו אינה ודאית. |