openapi: 3.2.0 info: title: Dokki Core API version: v1 summary: 'The programmatic interface to Dokki workspaces: documents, tables, artifacts, files, search, agents, automations, organizations, publishing and account endpoints under https://dokki.one/api/v1.' description: Dokki (UEVNS PTE. contact: name: Dokki support email: support@dokki.one url: https://dokki.one/pub/docs/faq termsOfService: https://dokki.one/terms x-generated-from: documentation x-generated-by: API Evangelist enrichment pipeline x-generated: '2026-09-19' x-source: https://dokki.one/pub/api x-provider: dokki-one servers: - url: https://dokki.one/api/v1 description: Production. "All public endpoints use https://dokki.one/api/v1" (https://dokki.one/pub/api/api-conventions); the reference pages state Base URL https://dokki.one with every path prefixed /api/v1, which this document folds into the server URL. security: - BearerAuth: [] tags: - name: Core description: Identity, capability discovery, API keys, notifications and workspace templates. paths: /api-keys: post: operationId: createApiKey summary: Create api keys tags: - Core description: 'Create api keys. Documented at https://dokki.one/pub/api/create-api-keys (required scope: api_key:write).' externalDocs: url: https://dokki.one/pub/api/create-api-keys x-required-scope: api_key:write x-route-source: app/api/v1/api-keys/route.ts requestBody: required: false content: application/json: schema: type: object properties: name: type: string org_id: type: string format: uuid description: Omit for a Personal-scope key. scopes: type: array items: type: string description: New public API keys default to read scopes. description: Fields as documented at https://dokki.one/pub/api/api-keys-and-scopes. responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' get: operationId: listApiKeys summary: Get api keys tags: - Core description: 'Get api keys. Documented at https://dokki.one/pub/api/get-api-keys (required scope: api_key:read).' externalDocs: url: https://dokki.one/pub/api/get-api-keys x-required-scope: api_key:read x-route-source: app/api/v1/api-keys/route.ts parameters: - name: limit in: query required: false schema: type: integer description: Number of items, bounded by the server. The reference states "most list endpoints accept limit/offset"; verify against GET /api/v1/capabilities. - name: offset in: query required: false schema: type: integer description: Zero-based offset. See limit. responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' /api-keys/{key_id}: delete: operationId: deleteApiKey summary: Delete api keys tags: - Core description: 'Delete api keys. Documented at https://dokki.one/pub/api/delete-api-keys (required scope: api_key:write).' externalDocs: url: https://dokki.one/pub/api/delete-api-keys x-required-scope: api_key:write x-route-source: app/api/v1/api-keys/[keyId]/route.ts parameters: - name: key_id in: path required: true schema: type: string format: uuid description: Path identifier. responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' /capabilities: get: operationId: getCapabilities summary: List API capabilities tags: - Core description: 'List API capabilities. Documented at https://dokki.one/pub/api/list-api-capabilities (required scope: none).' externalDocs: url: https://dokki.one/pub/api/list-api-capabilities x-required-scope: none x-route-source: app/api/v1/capabilities/route.ts responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' /me: get: operationId: getMe summary: Get current user tags: - Core description: 'Get current user. Documented at https://dokki.one/pub/api/get-current-user (required scope: none).' externalDocs: url: https://dokki.one/pub/api/get-current-user x-required-scope: none x-route-source: app/api/v1/me/route.ts responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' /notifications: delete: operationId: deleteNotifications summary: Delete notifications tags: - Core description: 'Delete notifications. Documented at https://dokki.one/pub/api/delete-notifications (required scope: notification:write).' externalDocs: url: https://dokki.one/pub/api/delete-notifications x-required-scope: notification:write x-route-source: app/api/v1/notifications/route.ts responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' get: operationId: listNotifications summary: Get notifications tags: - Core description: 'Get notifications. Documented at https://dokki.one/pub/api/get-notifications (required scope: notification:read).' externalDocs: url: https://dokki.one/pub/api/get-notifications x-required-scope: notification:read x-route-source: app/api/v1/notifications/route.ts parameters: - name: limit in: query required: false schema: type: integer description: Number of items, bounded by the server. The reference states "most list endpoints accept limit/offset"; verify against GET /api/v1/capabilities. - name: offset in: query required: false schema: type: integer description: Zero-based offset. See limit. responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' patch: operationId: updateNotifications summary: Update notifications tags: - Core description: 'Update notifications. Documented at https://dokki.one/pub/api/update-notifications (required scope: notification:write).' externalDocs: url: https://dokki.one/pub/api/update-notifications x-required-scope: notification:write x-route-source: app/api/v1/notifications/route.ts requestBody: required: false content: application/json: schema: type: object additionalProperties: true description: The published reference does not enumerate this body's fields ("Send a JSON request body with only supported fields"); discover them from GET /api/v1/capabilities and the live contract. responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' /workspace-templates: post: operationId: createWorkspaceTemplate summary: Create workspace templates tags: - Core description: 'Create workspace templates. Documented at https://dokki.one/pub/api/create-workspace-templates (required scope: workspace_template:write).' externalDocs: url: https://dokki.one/pub/api/create-workspace-templates x-required-scope: workspace_template:write x-route-source: app/api/v1/workspace-templates/route.ts requestBody: required: false content: application/json: schema: type: object additionalProperties: true description: The published reference does not enumerate this body's fields ("Send a JSON request body with only supported fields"); discover them from GET /api/v1/capabilities and the live contract. responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' get: operationId: listWorkspaceTemplates summary: Get workspace templates tags: - Core description: 'Get workspace templates. Documented at https://dokki.one/pub/api/get-workspace-templates (required scope: workspace_template:read).' externalDocs: url: https://dokki.one/pub/api/get-workspace-templates x-required-scope: workspace_template:read x-route-source: app/api/v1/workspace-templates/route.ts parameters: - name: limit in: query required: false schema: type: integer description: Number of items, bounded by the server. The reference states "most list endpoints accept limit/offset"; verify against GET /api/v1/capabilities. - name: offset in: query required: false schema: type: integer description: Zero-based offset. See limit. responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' /workspace-templates/{template_id}: delete: operationId: deleteWorkspaceTemplate summary: Delete workspace templates tags: - Core description: 'Delete workspace templates. Documented at https://dokki.one/pub/api/delete-workspace-templates (required scope: workspace_template:write).' externalDocs: url: https://dokki.one/pub/api/delete-workspace-templates x-required-scope: workspace_template:write x-route-source: app/api/v1/workspace-templates/[templateId]/route.ts parameters: - name: template_id in: path required: true schema: type: string format: uuid description: Path identifier. responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' get: operationId: getWorkspaceTemplate summary: Get workspace templates tags: - Core description: 'Get workspace templates. Documented at https://dokki.one/pub/api/get-workspace-templates-1 (required scope: workspace_template:read).' externalDocs: url: https://dokki.one/pub/api/get-workspace-templates-1 x-required-scope: workspace_template:read x-route-source: app/api/v1/workspace-templates/[templateId]/route.ts parameters: - name: template_id in: path required: true schema: type: string format: uuid description: Path identifier. responses: '200': description: Successful response. JSON; preserve request_id values and treat resource identifiers as opaque UUIDs. content: application/json: schema: $ref: '#/components/schemas/SuccessEnvelope' '400': description: Invalid request content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '401': description: Missing or invalid authentication (error.code unauthorized) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: Insufficient scope or tenant access (error.code insufficient_scope or forbidden) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: Resource not found (also returned when revealing existence would leak information) content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '409': description: Conflicting state content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' components: schemas: ErrorEnvelope: type: object description: Errors use one stable shape (https://dokki.one/pub/api/pagination-errors-and-rate-limits). required: - error properties: error: type: object required: - code - message properties: code: type: string description: Stable machine code, e.g. unauthorized, insufficient_scope, forbidden. examples: - unauthorized - insufficient_scope - forbidden message: type: string request_id: type: string format: uuid examples: - error: code: forbidden message: Resource access denied request_id: uuid SuccessEnvelope: type: object description: 'Documented success shape: "Successful responses are JSON. Preserve request_id values and treat resource identifiers as opaque UUIDs."' properties: data: type: object additionalProperties: true request_id: type: string description: Request identifier (req_...). Log it and quote it in support tickets. securitySchemes: BearerAuth: type: http scheme: bearer description: 'Authorization: Bearer . Accepted credentials per https://dokki.one/pub/api/authentication: a Dokki API key (prefix dk_, tenant-bound to Personal or one Org, carrying the x-required-scope of each operation), a Supabase bearer access token, or a browser session. Scopes are API-key scopes, not OAuth scopes; see scopes/dokki-one-scopes.yml.' externalDocs: description: Dokki API documentation url: https://dokki.one/pub/api