{"openapi":"3.1.0","info":{"title":"Starfire Developer API","version":"2.0.0-alpha.1","description":"Starfire AI Alpha 1.6.3 NEXUS Developer Platform 2.0. Applications, service accounts and API keys are tenant/project scoped; sf_live_… and sf_test_… credentials are environment-separated."},"servers":[{"url":"/v1","description":"Current Starfire API"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"sf_live_… / sf_test_…"}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"Recommended for POST /runs, /research, and /builds. Replays the original response for the same key and request body."}},"headers":{"StarfireRequestId":{"description":"Stable Developer API request identifier used by logs and Control Center diagnostics.","schema":{"type":"string","example":"req_..."}},"StarfireOperationId":{"description":"Underlying AI/FORGE provider or run request identifier when an endpoint starts or executes an operation.","schema":{"type":"string","example":"req_..."}},"StarfireEnvironment":{"description":"Credential environment resolved from the authenticated API key.","schema":{"type":"string","enum":["test","live"]}}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["type","code","message","request_id"],"properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}}}},"RunAccepted":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"run"},"type":{"type":"string"},"status":{"type":"string"},"request_id":{"type":["string","null"]}}},"BuildAccepted":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"status":{"type":"string"},"run_id":{"type":["string","null"]}}},"EmbeddingList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"model":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string"},"index":{"type":"integer"},"embedding":{"type":"array","items":{"type":"number"}}}}}}}}},"security":[{"bearerAuth":[]}],"paths":{"/status":{"get":{"summary":"Read Starfire API/platform component status","security":[],"responses":{"200":{"description":"Platform status"}}}},"/models":{"get":{"summary":"List models accessible to the authenticated API key/account","security":[{"bearerAuth":[]}],"x-starfire-scopes":["models:read"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/chat/completions":{"post":{"summary":"OpenAI-compatible chat completion","security":[{"bearerAuth":[]}],"x-starfire-scopes":["chat:create"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["messages"],"properties":{"model":{"type":"string"},"messages":{"type":"array","items":{"type":"object"}},"stream":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/responses":{"post":{"summary":"Create a Starfire-native response with optional Starfire modes and streaming","security":[{"bearerAuth":[]}],"x-starfire-scopes":["responses:create"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input"],"properties":{"model":{"type":"string"},"input":{"type":"string"},"mode":{"type":"string"},"reasoning":{"type":"string"},"stream":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/runs":{"post":{"summary":"Queue a long-running response, research job, or FORGE build","security":[{"bearerAuth":[]}],"x-starfire-scopes":["runs:create"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"202":{"description":"Run queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunAccepted"}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/runs/{id}":{"get":{"summary":"Get a run and its persisted state","security":[{"bearerAuth":[]}],"x-starfire-scopes":["runs:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/runs/{id}/events":{"get":{"summary":"Stream persisted run events over Server-Sent Events","security":[{"bearerAuth":[]}],"x-starfire-scopes":["runs:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"after","in":"query","schema":{"type":"integer"},"description":"Resume after this event sequence."}],"responses":{"200":{"description":"SSE event stream","content":{"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/runs/{id}/cancel":{"post":{"summary":"Request cancellation of a running job","security":[{"bearerAuth":[]}],"x-starfire-scopes":["runs:cancel"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Cancellation requested"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/research":{"post":{"summary":"Queue Deep Research","security":[{"bearerAuth":[]}],"x-starfire-scopes":["research:create"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string"},"model":{"type":"string"},"depth":{"type":"string","enum":["standard","thorough"]},"source_limit":{"type":"integer","minimum":1},"project_id":{"type":["string","null"]}}}}}},"responses":{"202":{"description":"Research queued"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/research/{id}":{"get":{"summary":"Get a persisted research run, sources, claims, and status","security":[{"bearerAuth":[]}],"x-starfire-scopes":["research:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/research/{id}/sources":{"get":{"summary":"List normalized sources discovered by a research run","security":[{"bearerAuth":[]}],"x-starfire-scopes":["research:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/research/{id}/report":{"get":{"summary":"Get the synthesized report, claims, citations, and verification coverage for a research run","security":[{"bearerAuth":[]}],"x-starfire-scopes":["research:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/builds":{"get":{"summary":"List FORGE builds","security":[{"bearerAuth":[]}],"x-starfire-scopes":["builds:read"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}},"post":{"summary":"Queue a FORGE software build","security":[{"bearerAuth":[]}],"x-starfire-scopes":["builds:create"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string"},"model":{"type":"string"},"project_id":{"type":["string","null"]},"name":{"type":"string"}}}}}},"responses":{"202":{"description":"Build queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildAccepted"}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/builds/{id}":{"get":{"summary":"Get a FORGE build and artifact metadata","security":[{"bearerAuth":[]}],"x-starfire-scopes":["builds:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/builds/{id}/cancel":{"post":{"summary":"Cancel a queued or running FORGE build","security":[{"bearerAuth":[]}],"x-starfire-scopes":["runs:cancel"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/files":{"get":{"summary":"List uploaded files","security":[{"bearerAuth":[]}],"x-starfire-scopes":["files:read"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}},"post":{"summary":"Upload a file or repository archive","security":[{"bearerAuth":[]}],"x-starfire-scopes":["files:write"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/files/{id}":{"get":{"summary":"Get file metadata","security":[{"bearerAuth":[]}],"x-starfire-scopes":["files:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}},"delete":{"summary":"Delete a file","security":[{"bearerAuth":[]}],"x-starfire-scopes":["files:write"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/artifacts":{"get":{"summary":"List generated artifacts","security":[{"bearerAuth":[]}],"x-starfire-scopes":["artifacts:read"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/artifacts/{id}":{"get":{"summary":"Get artifact metadata","security":[{"bearerAuth":[]}],"x-starfire-scopes":["artifacts:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}},"delete":{"summary":"Delete an artifact","security":[{"bearerAuth":[]}],"x-starfire-scopes":["artifacts:create"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/artifacts/{id}/download":{"get":{"summary":"Download an artifact","security":[{"bearerAuth":[]}],"x-starfire-scopes":["artifacts:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/projects":{"get":{"summary":"List projects","security":[{"bearerAuth":[]}],"x-starfire-scopes":["projects:read"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}},"post":{"summary":"Create a project","security":[{"bearerAuth":[]}],"x-starfire-scopes":["projects:write"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/repositories/project/{projectId}":{"get":{"summary":"List ingested repository archives attached to a project","security":[{"bearerAuth":[]}],"x-starfire-scopes":["repositories:read"],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/repositories/{id}":{"get":{"summary":"Inspect repository languages, manifests, framework signals, and counts","security":[{"bearerAuth":[]}],"x-starfire-scopes":["repositories:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/repositories/{id}/tree":{"get":{"summary":"Read the indexed repository tree","security":[{"bearerAuth":[]}],"x-starfire-scopes":["repositories:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/repositories/{id}/search":{"get":{"summary":"Search indexed repository source with bounded retrieval","security":[{"bearerAuth":[]}],"x-starfire-scopes":["repositories:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"q","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/knowledge":{"get":{"summary":"List Knowledge Bases","security":[{"bearerAuth":[]}],"x-starfire-scopes":["knowledge:read"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}},"post":{"summary":"Create a Knowledge Base","security":[{"bearerAuth":[]}],"x-starfire-scopes":["knowledge:write"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/knowledge/{id}":{"get":{"summary":"Get a Knowledge Base and indexed documents","security":[{"bearerAuth":[]}],"x-starfire-scopes":["knowledge:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/knowledge/{id}/files":{"post":{"summary":"Index an uploaded text file into a Knowledge Base","security":[{"bearerAuth":[]}],"x-starfire-scopes":["knowledge:write"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/knowledge/{id}/query":{"post":{"summary":"Query a Knowledge Base using hybrid vector+lexical retrieval when embeddings are available, with lexical fallback","security":[{"bearerAuth":[]}],"x-starfire-scopes":["knowledge:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/webhooks":{"get":{"summary":"List webhook endpoints","security":[{"bearerAuth":[]}],"x-starfire-scopes":["webhooks:read"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}},"post":{"summary":"Create a signed webhook endpoint","security":[{"bearerAuth":[]}],"x-starfire-scopes":["webhooks:write"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/webhooks/{id}":{"delete":{"summary":"Delete a webhook endpoint","security":[{"bearerAuth":[]}],"x-starfire-scopes":["webhooks:write"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/webhooks/deliveries":{"get":{"summary":"List webhook delivery attempts","security":[{"bearerAuth":[]}],"x-starfire-scopes":["webhooks:read"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/webhooks/deliveries/{id}/retry":{"post":{"summary":"Retry a failed webhook delivery","security":[{"bearerAuth":[]}],"x-starfire-scopes":["webhooks:write"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/embeddings":{"post":{"summary":"Create OpenAI-style embeddings through a configured Starfire embeddings route","security":[{"bearerAuth":[]}],"x-starfire-scopes":["embeddings:create"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input"],"properties":{"model":{"type":"string"},"input":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"},"minItems":1}]}}}}}},"responses":{"200":{"description":"Embedding list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbeddingList"}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}},"/usage":{"get":{"summary":"Get usage and credit data for the authenticated account","security":[{"bearerAuth":[]}],"x-starfire-scopes":["usage:read"],"responses":{"200":{"description":"Successful response"},"400":{"description":"Bad request"},"401":{"description":"Invalid API key"},"403":{"description":"Insufficient scope or entitlement"},"409":{"description":"Idempotency conflict"},"429":{"description":"Rate or quota limit exceeded"}}}}},"x-starfire":{"apiVersion":"v1","apiVersionHeader":"x-starfire-api-version","deprecationHeaders":["Deprecation","Sunset"],"requestIdHeader":"x-starfire-request-id","rateLimitHeaders":["x-ratelimit-limit","x-ratelimit-remaining","x-ratelimit-reset"],"scopes":["models:read","chat:create","responses:create","runs:create","runs:read","runs:cancel","files:read","files:write","artifacts:read","artifacts:create","research:create","research:read","builds:create","builds:read","knowledge:read","knowledge:write","projects:read","projects:write","repositories:read","embeddings:create","webhooks:read","webhooks:write","usage:read"]}}