Konton och arbetsytor
Skapa API-nyckel
Skapa en personlig åtkomstnyckel med valda funktioner (agent:operate, agent:publish, agent:engage), valfri workspace_ids-gräns och en livslängd på upp till 365 dagar; hemligheten returneras en gång och kan inte läsas igen. En agent kan bara tilldela det som dess egen auktorisering omfattar, i högst 30 dagar, och nyckeln slutar fungera när behörigheten upphör. Kräver behörigheten Hantera API-nycklar; en PAT kan inte använda den.
POST /identity-api/api-keys/createKontrakt granskat: · sha256:563d2d581da0ad29
Översikt
Skapa en personlig åtkomstnyckel med valda funktioner (agent:operate, agent:publish, agent:engage), valfri workspace_ids-gräns och en livslängd på upp till 365 dagar; hemligheten returneras en gång och kan inte läsas igen. En agent kan bara tilldela det som dess egen auktorisering omfattar, i högst 30 dagar, och nyckeln slutar fungera när behörigheten upphör. Kräver behörigheten Hantera API-nycklar; en PAT kan inte använda den.
Varje delegerad auktorisering kan ha upp till 25 aktiva nycklar. Begäranden över gränsen returnerar API_KEY_GRANT_KEY_LIMIT.
Ett lyckat HTTP-svar kan betyda att en begäran accepterats snarare än slutförts. Spara returnerat ID för bakgrundsarbete och kontrollera samma åtgärd tills den är klar. Ett schemalagt eller accepterat inlägg är publicerat först när plattformen bekräftar det; en klienttimeout fastställer inte resultatet.
Autentisering och behörigheter
En token får endast använda ägarens rättigheter. Varje anrop kontrollerar arbetsytemedlemskap, resursägarskap, valda arbetsytor och beviljade funktioner. Profilerna core och full ändrar vilka verktyg som visas; de ger ingen åtkomst.
Anropsfält
Obligatoriskt betyder obligatoriskt inom sitt överordnade objekt och vald gren. Ett obligatoriskt underfält gör inte ett valfritt överordnat objekt obligatoriskt. Regler och fältnamn nedan kopieras från kontraktet.
| Fält / gren | Typ / obligatoriskt | Begränsningar |
|---|---|---|
$ | objectObligatoriskt i överordnat objekt |
|
name | stringObligatoriskt i överordnat objekt |
|
lifetime_days | integerValfritt / objekt | Dagar tills nyckeln löper ut (1-365, standard 365). En nyckel skapad av en delegerad agent gäller aldrig längre än 30 dagar.
|
capabilities | arrayValfritt / objekt | Vad nyckeln får göra. Standard för en inloggad användare är operate, publish och engage. En delegerad agent kan endast tilldela det som dess egen auktorisering omfattar (aldrig nyckelhantering).
|
capabilities[] | stringValfritt / objekt |
|
workspace_ids | arrayValfritt / objekt | Begränsa nyckeln till dessa arbetsytor. Utelämna för alla arbetsytor användaren får komma åt. En begränsad nyckel måste ange sin arbetsyta (workspace_id) på rutter som annars använder aktiv arbetsyta och kan inte göra organisationsövergripande läsningar.
|
workspace_ids[] | stringValfritt / objekt |
|
scopes | arrayValfritt / objekt | Utfasat alias för capabilities. Det följs exakt; en tom lista ignoreras.
|
scopes[] | stringValfritt / objekt |
|
idempotency_key | stringValfritt / objekt | Valfritt. Återanvänd samma nyckel för ett säkert nytt försök. Hemligheten visas en gång: ett nytt försök som hittar en redan skapad nyckel svarar 409 IDEMPOTENT_REPLAY (details.existing_key anger den) i stället för att visa den igen. Återkalla den nyckeln och skapa en ny med en ny idempotency_key.
|
Fullständigt JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"lifetime_days": {
"default": 365,
"description": "Days until the key expires (1-365, default 365). A key created by a delegated agent never lives longer than 30 days.",
"type": "integer",
"minimum": 1,
"maximum": 365
},
"capabilities": {
"description": "What the key may do. Defaults to operate, publish and engage for a signed-in user. A delegated agent can only grant what its own authorization holds (never key management).",
"minItems": 1,
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"enum": [
"agent:operate",
"agent:publish",
"agent:engage"
]
}
},
"workspace_ids": {
"description": "Limit the key to these Workspaces. Omit it for every Workspace the user can access. A limited key must name its Workspace (workspace_id) on routes that would otherwise use the active Workspace, and cannot call organization-wide reads.",
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"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)$"
}
},
"scopes": {
"description": "Deprecated alias of capabilities. It is honoured exactly; an empty list is ignored.",
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"enum": [
"agent:operate",
"agent:publish",
"agent:engage"
]
}
},
"idempotency_key": {
"description": "Optional. Reuse the same key to retry safely. The secret is shown once: a retry that finds the key already created answers 409 IDEMPOTENT_REPLAY (details.existing_key names it) instead of showing it again. Revoke that key and create a new one with a new idempotency_key.",
"type": "string",
"minLength": 8,
"maxLength": 160,
"pattern": "^[!-~]+$"
}
},
"required": [
"name"
],
"additionalProperties": false
}Svar och slutförande
HTTP-status vid framgång: 200. När åtgärden är klar: synchronous_http_response.
Ett lyckat HTTP-svar kan betyda att en begäran accepterats snarare än slutförts. Spara returnerat ID för bakgrundsarbete och kontrollera samma åtgärd tills den är klar. Ett schemalagt eller accepterat inlägg är publicerat först när plattformen bekräftar det; en klienttimeout fastställer inte resultatet.
Obligatoriskt betyder obligatoriskt inom sitt överordnade objekt och vald gren. Ett obligatoriskt underfält gör inte ett valfritt överordnat objekt obligatoriskt. Regler och fältnamn nedan kopieras från kontraktet.
| Fält / gren | Typ / obligatoriskt | Begränsningar |
|---|---|---|
$ | objectObligatoriskt i överordnat objekt | — |
apiKey | objectObligatoriskt i överordnat objekt | — |
apiKey.id | stringObligatoriskt i överordnat objekt |
|
apiKey.name | stringObligatoriskt i överordnat objekt | — |
apiKey.last_4 | stringObligatoriskt i överordnat objekt | — |
apiKey.scopes | arrayObligatoriskt i överordnat objekt | — |
apiKey.scopes[] | stringValfritt / objekt | — |
apiKey.created_at | stringObligatoriskt i överordnat objekt |
|
apiKey.expires_at | string | nullObligatoriskt i överordnat objekt | — |
apiKey.expires_atanyOf 1 | stringObligatoriskt i överordnat objekt |
|
apiKey.expires_atanyOf 2 | nullObligatoriskt i överordnat objekt | — |
apiKey.last_used_at | string | nullObligatoriskt i överordnat objekt | — |
apiKey.last_used_atanyOf 1 | stringObligatoriskt i överordnat objekt |
|
apiKey.last_used_atanyOf 2 | nullObligatoriskt i överordnat objekt | — |
apiKey.revoked_at | string | nullObligatoriskt i överordnat objekt | — |
apiKey.revoked_atanyOf 1 | stringObligatoriskt i överordnat objekt |
|
apiKey.revoked_atanyOf 2 | nullObligatoriskt i överordnat objekt | — |
apiKey.status | stringObligatoriskt i överordnat objekt |
|
apiKey.replaces | object | nullObligatoriskt i överordnat objekt | — |
apiKey.replacesanyOf 1 | objectObligatoriskt i överordnat objekt | — |
apiKey.replaces.idanyOf 1 | stringObligatoriskt i överordnat objekt |
|
apiKey.replaces.nameanyOf 1 | stringObligatoriskt i överordnat objekt | — |
apiKey.replaces.last_4anyOf 1 | stringObligatoriskt i överordnat objekt | — |
apiKey.replaces.statusanyOf 1 | stringObligatoriskt i överordnat objekt |
|
apiKey.replacesanyOf 2 | nullObligatoriskt i överordnat objekt | — |
apiKey.replaced_by | arrayObligatoriskt i överordnat objekt | — |
apiKey.replaced_by[] | objectValfritt / objekt | — |
apiKey.replaced_by[].id | stringObligatoriskt i överordnat objekt |
|
apiKey.replaced_by[].name | stringObligatoriskt i överordnat objekt | — |
apiKey.replaced_by[].last_4 | stringObligatoriskt i överordnat objekt | — |
apiKey.replaced_by[].status | stringObligatoriskt i överordnat objekt |
|
apiKey.capabilities | arrayValfritt / objekt | — |
apiKey.capabilities[] | stringValfritt / objekt |
|
apiKey.workspace_ids | array | nullValfritt / objekt | — |
apiKey.workspace_idsanyOf 1 | arrayValfritt / objekt | — |
apiKey.workspace_ids[]anyOf 1 | stringValfritt / objekt |
|
apiKey.workspace_idsanyOf 2 | nullValfritt / objekt | — |
apiKey.created_by_delegated_grant_id | string | nullValfritt / objekt | — |
apiKey.created_by_delegated_grant_idanyOf 1 | stringValfritt / objekt |
|
apiKey.created_by_delegated_grant_idanyOf 2 | nullValfritt / objekt | — |
secret | stringObligatoriskt i överordnat objekt |
|
Fullständigt JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"apiKey": {
"type": "object",
"properties": {
"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)$"
},
"name": {
"type": "string"
},
"last_4": {
"type": "string"
},
"scopes": {
"type": "array",
"items": {
"type": "string"
}
},
"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)))$"
},
"expires_at": {
"anyOf": [
{
"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)))$"
},
{
"type": "null"
}
]
},
"last_used_at": {
"anyOf": [
{
"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)))$"
},
{
"type": "null"
}
]
},
"revoked_at": {
"anyOf": [
{
"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)))$"
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"active",
"expired",
"revoked"
]
},
"replaces": {
"anyOf": [
{
"type": "object",
"properties": {
"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)$"
},
"name": {
"type": "string"
},
"last_4": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"active",
"expired",
"revoked"
]
}
},
"required": [
"id",
"name",
"last_4",
"status"
]
},
{
"type": "null"
}
]
},
"replaced_by": {
"type": "array",
"items": {
"type": "object",
"properties": {
"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)$"
},
"name": {
"type": "string"
},
"last_4": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"active",
"expired",
"revoked"
]
}
},
"required": [
"id",
"name",
"last_4",
"status"
]
}
},
"capabilities": {
"type": "array",
"items": {
"type": "string",
"enum": [
"agent:operate",
"agent:publish",
"agent:engage"
]
}
},
"workspace_ids": {
"anyOf": [
{
"type": "array",
"items": {
"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_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"
}
]
}
},
"required": [
"id",
"name",
"last_4",
"scopes",
"created_at",
"expires_at",
"last_used_at",
"revoked_at",
"status",
"replaces",
"replaced_by"
]
},
"secret": {
"type": "string",
"minLength": 1
}
},
"required": [
"apiKey",
"secret"
]
}Fel och säkra nya försök
Kontrollera HTTP-status och svarskropp. Ett valideringsfel med 400 kan innehålla ZodError; hanterarfel använder fälten error, message och code. Spara request_id eller x-request-id för felsökning, utan inloggningsuppgifter. Åtgärda åtkomstfel med 401/403 innan du försöker igen och följ Retry-After vid 429. Om en skrivning är osäker eller returnerar 5xx, läs först det befintliga resultatet. Återanvänd en idempotensnyckel endast där det stöds; försöksbeteendet varierar mellan åtgärder och garanterar inte leverans exakt en gång.
FelsökningsguideExempel
Exemplen använder fiktiva värden som kontrollerats mot schemana. Ersätt ID:n med sådana du får använda, medier med färdiga mediefiler och datum med din bekräftade publiceringstid. Kontrollera kontots behörighet före en skrivning. Denna sida skickar inga API-anrop.
Sätt SOSOAPI_ACCESS_TOKEN på servern till en autentiseringsuppgift som åtgärden godtar och håll den borta från webbläsarkod. För en agent använder du sosoapi auth login för att logga in via webbläsaren och låter CLI förnya sina uppgifter.
request.json
{
"name": "example"
}cURL
curl --request POST \
"https://gqeshlawtcexsapabaui.supabase.co/functions/v1/identity-api/api-keys/create" \
-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/identity-api/api-keys/create", {
method: "POST",
headers: { "Content-Type": "application/json", Authorization: "Bearer " + token },
body: JSON.stringify({
"name": "example"
})
});
const result = await response.json();
// Check response.ok, the operation-specific body and completion state before continuing.CLI
npx sosoapi api post /identity-api/api-keys/create < request.jsonSyntetiskt svarsexempel
{
"apiKey": {
"id": "11111111-1111-4111-8111-111111111111",
"name": "example",
"last_4": "example",
"scopes": [],
"created_at": "2099-01-15T09:00:00Z",
"expires_at": null,
"last_used_at": null,
"revoked_at": null,
"status": "active",
"replaces": null,
"replaced_by": []
},
"secret": "example"
}