פרויקטים ותוכן
עדכון פרופיל פרויקט
עדכון חלקי של שדות פרופיל המותג של פרויקט. שדות שהושמטו נשארים ללא שינוי. נדרשים expected_profile_version מהקריאה האחרונה ו-idempotency_key (תפקיד editor).
POST /studio-api/projects/profile/updateהחוזה נבדק: · sha256:563d2d581da0ad29
סקירה
עדכון חלקי של שדות פרופיל המותג של פרויקט. שדות שהושמטו נשארים ללא שינוי. נדרשים expected_profile_version מהקריאה האחרונה ו-idempotency_key (תפקיד editor).
תגובת HTTP מוצלחת עשויה לציין שבקשה התקבלה, ולא שהושלמה. בעבודת רקע, שמרו את המזהה שהוחזר ובדקו את אותה פעולה עד שתסתיים. פוסט שתוזמן או התקבל נחשב שפורסם רק כשהפלטפורמה מאשרת זאת; חריגה מזמן ההמתנה אצל הלקוח אינה קובעת מה התוצאה.
אימות והרשאות
אסימון יכול להשתמש רק בזכויות שיש לבעליו. כל בקשה בודקת חברות בסביבת העבודה, בעלות על משאבים, סביבות עבודה נבחרות ויכולות שהוענקו. הפרופילים core ו-full משנים אילו כלים מוצגים; הם אינם מעניקים גישה.
שדות הבקשה
שדה חובה נדרש בתוך אובייקט האב והענף הנבחר שלו. צאצא נדרש אינו הופך אב אופציונלי לנדרש. הכללים ושמות השדות שלהלן מועתקים מהחוזה.
| שדה / ענף | סוג / חובה | אילוצים |
|---|---|---|
$ | objectחובה באובייקט האב |
|
project_id | stringחובה באובייקט האב |
|
expected_profile_version | integerחובה באובייקט האב |
|
idempotency_key | stringחובה באובייקט האב |
|
patch | objectחובה באובייקט האב |
|
patch.tagline | string | nullרשות / פריט | — |
patch.taglineanyOf 1 | stringרשות / פריט |
|
patch.taglineanyOf 2 | nullרשות / פריט | — |
patch.description | string | nullרשות / פריט | — |
patch.descriptionanyOf 1 | stringרשות / פריט |
|
patch.descriptionanyOf 2 | nullרשות / פריט | — |
patch.voice | string | nullרשות / פריט | — |
patch.voiceanyOf 1 | stringרשות / פריט |
|
patch.voiceanyOf 2 | nullרשות / פריט | — |
patch.target_audience | string | nullרשות / פריט | — |
patch.target_audienceanyOf 1 | stringרשות / פריט |
|
patch.target_audienceanyOf 2 | nullרשות / פריט | — |
patch.color_palette | arrayרשות / פריט |
|
patch.color_palette[] | stringרשות / פריט |
|
patch.goals | arrayרשות / פריט |
|
patch.goals[] | stringרשות / פריט |
|
patch.no_go_topics | arrayרשות / פריט |
|
patch.no_go_topics[] | stringרשות / פריט |
|
patch.language_primary | stringרשות / פריט |
|
patch.positioning | string | nullרשות / פריט | — |
patch.positioninganyOf 1 | stringרשות / פריט |
|
patch.positioninganyOf 2 | nullרשות / פריט | — |
patch.usp | string | nullרשות / פריט | — |
patch.uspanyOf 1 | stringרשות / פריט |
|
patch.uspanyOf 2 | nullרשות / פריט | — |
patch.visual_identity | object | nullרשות / פריט | — |
patch.visual_identityanyOf 1 | objectרשות / פריט |
|
patch.visual_identity.*anyOf 1 | any JSON valueרשות / פריט | — |
patch.visual_identityanyOf 2 | nullרשות / פריט | — |
patch.forbidden_claims | arrayרשות / פריט |
|
patch.forbidden_claims[] | stringרשות / פריט |
|
patch.north_star_metric | string | nullרשות / פריט | — |
patch.north_star_metricanyOf 1 | stringרשות / פריט |
|
patch.north_star_metricanyOf 2 | nullרשות / פריט | — |
patch.posting_cadence | object | nullרשות / פריט | — |
patch.posting_cadenceanyOf 1 | objectרשות / פריט |
|
patch.posting_cadence.*anyOf 1 | any JSON valueרשות / פריט | — |
patch.posting_cadenceanyOf 2 | nullרשות / פריט | — |
patch.app_store_url_ios | string | nullרשות / פריט | — |
patch.app_store_url_iosanyOf 1 | stringרשות / פריט |
|
patch.app_store_url_iosanyOf 2 | nullרשות / פריט | — |
patch.app_store_url_android | string | nullרשות / פריט | — |
patch.app_store_url_androidanyOf 1 | stringרשות / פריט |
|
patch.app_store_url_androidanyOf 2 | nullרשות / פריט | — |
patch.app_metadata | objectרשות / פריט |
|
patch.app_metadata.* | any JSON valueרשות / פריט | — |
JSON Schema מלא
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expected_profile_version": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"idempotency_key": {
"type": "string",
"minLength": 8,
"maxLength": 160
},
"patch": {
"type": "object",
"properties": {
"tagline": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
]
},
"description": {
"anyOf": [
{
"type": "string",
"maxLength": 4000
},
{
"type": "null"
}
]
},
"voice": {
"anyOf": [
{
"type": "string",
"maxLength": 1000
},
{
"type": "null"
}
]
},
"target_audience": {
"anyOf": [
{
"type": "string",
"maxLength": 1000
},
{
"type": "null"
}
]
},
"color_palette": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"maxLength": 64
}
},
"goals": {
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"maxLength": 160
}
},
"no_go_topics": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 160
}
},
"language_primary": {
"type": "string",
"minLength": 2,
"maxLength": 35
},
"positioning": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"usp": {
"anyOf": [
{
"type": "string",
"maxLength": 1000
},
{
"type": "null"
}
]
},
"visual_identity": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
]
},
"forbidden_claims": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 240
}
},
"north_star_metric": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
]
},
"posting_cadence": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
]
},
"app_store_url_ios": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"app_store_url_android": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"app_metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"additionalProperties": false
}
},
"required": [
"project_id",
"expected_profile_version",
"idempotency_key",
"patch"
],
"additionalProperties": false
}תגובה והשלמה
סטטוסי HTTP להצלחה: 200. מתי הפעולה הושלמה: synchronous_http_response.
תגובת HTTP מוצלחת עשויה לציין שבקשה התקבלה, ולא שהושלמה. בעבודת רקע, שמרו את המזהה שהוחזר ובדקו את אותה פעולה עד שתסתיים. פוסט שתוזמן או התקבל נחשב שפורסם רק כשהפלטפורמה מאשרת זאת; חריגה מזמן ההמתנה אצל הלקוח אינה קובעת מה התוצאה.
שדה חובה נדרש בתוך אובייקט האב והענף הנבחר שלו. צאצא נדרש אינו הופך אב אופציונלי לנדרש. הכללים ושמות השדות שלהלן מועתקים מהחוזה.
| שדה / ענף | סוג / חובה | אילוצים |
|---|---|---|
$ | objectחובה באובייקט האב | — |
contract_version | stringחובה באובייקט האב |
|
profile | objectחובה באובייקט האב | — |
profile.project_id | stringחובה באובייקט האב |
|
profile.workspace_id | stringחובה באובייקט האב |
|
profile.tagline | string | nullחובה באובייקט האב | — |
profile.taglineanyOf 1 | stringחובה באובייקט האב | — |
profile.taglineanyOf 2 | nullחובה באובייקט האב | — |
profile.description | string | nullחובה באובייקט האב | — |
profile.descriptionanyOf 1 | stringחובה באובייקט האב | — |
profile.descriptionanyOf 2 | nullחובה באובייקט האב | — |
profile.voice | string | nullחובה באובייקט האב | — |
profile.voiceanyOf 1 | stringחובה באובייקט האב | — |
profile.voiceanyOf 2 | nullחובה באובייקט האב | — |
profile.target_audience | string | nullחובה באובייקט האב | — |
profile.target_audienceanyOf 1 | stringחובה באובייקט האב | — |
profile.target_audienceanyOf 2 | nullחובה באובייקט האב | — |
profile.color_palette | arrayחובה באובייקט האב | — |
profile.color_palette[] | stringרשות / פריט | — |
profile.goals | arrayחובה באובייקט האב | — |
profile.goals[] | stringרשות / פריט | — |
profile.no_go_topics | arrayחובה באובייקט האב | — |
profile.no_go_topics[] | stringרשות / פריט | — |
profile.language_primary | stringחובה באובייקט האב | — |
profile.positioning | string | nullחובה באובייקט האב | — |
profile.positioninganyOf 1 | stringחובה באובייקט האב | — |
profile.positioninganyOf 2 | nullחובה באובייקט האב | — |
profile.usp | string | nullחובה באובייקט האב | — |
profile.uspanyOf 1 | stringחובה באובייקט האב | — |
profile.uspanyOf 2 | nullחובה באובייקט האב | — |
profile.visual_identity | object | nullחובה באובייקט האב | — |
profile.visual_identityanyOf 1 | objectחובה באובייקט האב |
|
profile.visual_identity.*anyOf 1 | any JSON valueרשות / פריט | — |
profile.visual_identityanyOf 2 | nullחובה באובייקט האב | — |
profile.forbidden_claims | arrayחובה באובייקט האב | — |
profile.forbidden_claims[] | stringרשות / פריט | — |
profile.north_star_metric | string | nullחובה באובייקט האב | — |
profile.north_star_metricanyOf 1 | stringחובה באובייקט האב | — |
profile.north_star_metricanyOf 2 | nullחובה באובייקט האב | — |
profile.posting_cadence | object | nullחובה באובייקט האב | — |
profile.posting_cadenceanyOf 1 | objectחובה באובייקט האב |
|
profile.posting_cadence.*anyOf 1 | any JSON valueרשות / פריט | — |
profile.posting_cadenceanyOf 2 | nullחובה באובייקט האב | — |
profile.app_store_url_ios | string | nullחובה באובייקט האב | — |
profile.app_store_url_iosanyOf 1 | stringחובה באובייקט האב | — |
profile.app_store_url_iosanyOf 2 | nullחובה באובייקט האב | — |
profile.app_store_url_android | string | nullחובה באובייקט האב | — |
profile.app_store_url_androidanyOf 1 | stringחובה באובייקט האב | — |
profile.app_store_url_androidanyOf 2 | nullחובה באובייקט האב | — |
profile.app_metadata | objectחובה באובייקט האב |
|
profile.app_metadata.* | any JSON valueרשות / פריט | — |
profile.profile_version | integerחובה באובייקט האב |
|
profile.updated_by | string | nullחובה באובייקט האב | — |
profile.updated_byanyOf 1 | stringחובה באובייקט האב |
|
profile.updated_byanyOf 2 | nullחובה באובייקט האב | — |
profile.updated_by_kind | stringחובה באובייקט האב |
|
profile.updated_by_api_key_id | string | nullחובה באובייקט האב | — |
profile.updated_by_api_key_idanyOf 1 | stringחובה באובייקט האב |
|
profile.updated_by_api_key_idanyOf 2 | nullחובה באובייקט האב | — |
profile.updated_by_delegated_grant_id | string | nullחובה באובייקט האב | — |
profile.updated_by_delegated_grant_idanyOf 1 | stringחובה באובייקט האב |
|
profile.updated_by_delegated_grant_idanyOf 2 | nullחובה באובייקט האב | — |
profile.created_at | stringחובה באובייקט האב |
|
profile.updated_at | stringחובה באובייקט האב |
|
receipt_id | stringחובה באובייקט האב |
|
applied | booleanחובה באובייקט האב | — |
deduped | booleanחובה באובייקט האב | — |
JSON Schema מלא
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contract_version": {
"type": "string",
"const": "project/v1"
},
"profile": {
"type": "object",
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"workspace_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"tagline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"voice": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"target_audience": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"color_palette": {
"type": "array",
"items": {
"type": "string"
}
},
"goals": {
"type": "array",
"items": {
"type": "string"
}
},
"no_go_topics": {
"type": "array",
"items": {
"type": "string"
}
},
"language_primary": {
"type": "string"
},
"positioning": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"usp": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"visual_identity": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
]
},
"forbidden_claims": {
"type": "array",
"items": {
"type": "string"
}
},
"north_star_metric": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"posting_cadence": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
]
},
"app_store_url_ios": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"app_store_url_android": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"app_metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"profile_version": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"updated_by": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"updated_by_kind": {
"type": "string",
"enum": [
"jwt",
"api_key",
"delegated_ai",
"migration"
]
},
"updated_by_api_key_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"updated_by_delegated_grant_id": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"updated_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"project_id",
"workspace_id",
"tagline",
"description",
"voice",
"target_audience",
"color_palette",
"goals",
"no_go_topics",
"language_primary",
"positioning",
"usp",
"visual_identity",
"forbidden_claims",
"north_star_metric",
"posting_cadence",
"app_store_url_ios",
"app_store_url_android",
"app_metadata",
"profile_version",
"updated_by",
"updated_by_kind",
"updated_by_api_key_id",
"updated_by_delegated_grant_id",
"created_at",
"updated_at"
]
},
"receipt_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"applied": {
"type": "boolean"
},
"deduped": {
"type": "boolean"
}
},
"required": [
"contract_version",
"profile",
"receipt_id",
"applied",
"deduped"
]
}שגיאות וניסיונות חוזרים בטוחים
בדקו את סטטוס ה-HTTP ואת גוף התגובה. שגיאת אימות 400 עשויה להכיל ZodError; שגיאות מטפל משתמשות בשדות error, message ו-code. שמרו request_id או x-request-id לאבחון, ללא אמצעי גישה. תקנו שגיאות גישה 401/403 לפני ניסיון חוזר, ופעלו לפי Retry-After עבור 429. אם תוצאת כתיבה אינה ודאית או שמוחזר 5xx, קראו תחילה את התוצאה הקיימת. השתמשו שוב במפתח אידמפוטנטיות רק במקומות הנתמכים; התנהגות הניסיון החוזר משתנה בין פעולות ואינה מבטיחה מסירה בדיוק פעם אחת.
מדריך לפתרון בעיותדוגמאות
הדוגמאות משתמשות בערכים בדויים שנבדקו מול הסכמות. החליפו את המזהים בכאלה שאתם מורשים להשתמש בהם, את המדיה בנכסים מוכנים ואת התאריכים במועד הפרסום שאישרתם. בדקו את התאמת החשבון לפני שליחת כתיבה. העמוד הזה אינו שולח בקשות API.
הגדירו בשרת שלכם SOSOAPI_ACCESS_TOKEN לאמצעי גישה שהפעולה הזו מקבלת, והשאירו אותו מחוץ לקוד הדפדפן. עבור סוכן, השתמשו ב-sosoapi auth login כדי להיכנס דרך הדפדפן ולאפשר ל-CLI לרענן את אמצעי הגישה שלו.
request.json
{
"project_id": "11111111-1111-4111-8111-111111111111",
"expected_profile_version": 1,
"idempotency_key": "example-intent-0001",
"patch": {
"tagline": "A fictional project for the documentation example."
}
}cURL
curl --request POST \
"https://gqeshlawtcexsapabaui.supabase.co/functions/v1/studio-api/projects/profile/update" \
-H "Authorization: Bearer $SOSOAPI_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
--data-binary @request.jsonJavaScript
// Server-side JavaScript. Do not print tokens or credential-bearing responses.
const token = process.env.SOSOAPI_ACCESS_TOKEN;
if (!token) throw new Error("Set an accepted credential for this operation");
const response = await fetch("https://gqeshlawtcexsapabaui.supabase.co/functions/v1/studio-api/projects/profile/update", {
method: "POST",
headers: { "Content-Type": "application/json", Authorization: "Bearer " + token },
body: JSON.stringify({
"project_id": "11111111-1111-4111-8111-111111111111",
"expected_profile_version": 1,
"idempotency_key": "example-intent-0001",
"patch": {
"tagline": "A fictional project for the documentation example."
}
})
});
const result = await response.json();
// Check response.ok, the operation-specific body and completion state before continuing.CLI
npx sosoapi api post /studio-api/projects/profile/update < request.jsonדוגמת תגובה סינתטית
{
"contract_version": "project/v1",
"profile": {
"project_id": "11111111-1111-4111-8111-111111111111",
"workspace_id": "11111111-1111-4111-8111-111111111111",
"tagline": null,
"description": null,
"voice": null,
"target_audience": null,
"color_palette": [],
"goals": [],
"no_go_topics": [],
"language_primary": "example",
"positioning": null,
"usp": null,
"visual_identity": null,
"forbidden_claims": [],
"north_star_metric": null,
"posting_cadence": null,
"app_store_url_ios": null,
"app_store_url_android": null,
"app_metadata": {},
"profile_version": 1,
"updated_by": null,
"updated_by_kind": "jwt",
"updated_by_api_key_id": null,
"updated_by_delegated_grant_id": null,
"created_at": "2099-01-15T09:00:00Z",
"updated_at": "2099-01-15T09:00:00Z"
},
"receipt_id": "11111111-1111-4111-8111-111111111111",
"applied": false,
"deduped": false
}