Permissions & scopes

Scopes a key can carry.

A key carries a set of scopes. Each endpoint requires a specific scope; a call without it returns 403 forbidden with the missing scope named.

ScopeFriendly nameEndpoints it unlocks
ai_explainInterpret & explaininterpret, conversations, messages, embed tokens
ai_generateGenerate codegenerate (proposes code; never persists)
analysis_tabRun analysesstart & poll analyses
code_readRead coderead project source (/source)
code_writeEdit & save projectsave a new version (/versions)
export_plcExport to PLC formatstart & download a PLC export
export_pdfExport to PDFstart & download a PDF report
hmi_viewView HMIread live values & history; carried by read-only embed tokens
project_uploadUpload projectsingest (create a project identity)

Reading the project list (GET /projects) and one project's metadata (GET /projects/{id}) needs no extra scope — any valid key may discover the projects in its scope.

Generate and save are separate scopes on purpose. ai_generate only drafts a reviewable proposal; persisting it requires code_write. A generate-only key can never deploy a machine-bound version.

Project scope

A key may optionally be restricted to specific projects. When set, any project-targeted call to a project outside the scope returns 403 project_scope_forbidden.

A project-scoped key may add a version to an in-scope project, but can never create a new project identity via ingest. Creating new identities requires an unscoped key.