API reference
HTTP API for every Clanker Ship web action. Create a hashed API key on the website (Security settings), then send `Authorization: Bearer ctk_…` or `X-API-Key`. The web app does not call this API; it uses the same Effect services directly. MCP and `/agent/v1` use agent OAuth access tokens, not API keys.
Servers: https://api.clankertest.com (Production) · https://api.qa.clankership.net (QA) · http://127.0.0.1:3200 (Localhost)
Auth: hashed user API key as Authorization: Bearer ctk_… or X-API-Key. Create keys on the website Security settings. MCP uses agent OAuth, not API keys.
Machine-readable: openapi.json, llms.txt, llms-full.txt, index.json, AGENTS.md.
| Method | Path | Summary | Auth |
|---|---|---|---|
GET | /v1/workspaces/{slug}/products/{productSlug}/secrets | List product secrets and environment status | bearer |
POST | /v1/workspaces/{slug}/products/{productSlug}/secrets | Vault add | bearer |
GET | /v1/workspaces/{slug}/products/{productSlug}/secrets/{name} | Read secret metadata, each environment's current version and non-production values | bearer |
PATCH | /v1/workspaces/{slug}/products/{productSlug}/secrets/{name} | Vault edit | bearer |
DELETE | /v1/workspaces/{slug}/products/{productSlug}/secrets/{name} | Vault delete | bearer |
GET | /v1/workspaces/{slug}/vault | Vault list | bearer |
POST | /v1/workspaces/{slug}/vault/assignments | Vault bulkSet | bearer |
POST | /v1/workspaces/{slug}/vault/generations | Generate a value for each selected environment, shared by its selected products | bearer |
GET | /v1/workspaces/{slug}/products/{productSlug}/secrets/{name}/environments/{environmentSlug}/versions | Vault history | bearer |
POST | /v1/workspaces/{slug}/products/{productSlug}/secrets/{name}/environments/{environmentSlug}/restore | Vault restore | bearer |
GET | /v1/workspaces/{slug}/vault/keys | Vault keys | bearer |
POST | /v1/workspaces/{slug}/vault/keys | Vault createKey | bearer |
PATCH | /v1/workspaces/{slug}/vault/keys/{id} | Vault updateKey | bearer |
POST | /v1/workspaces/{slug}/vault/keys/{id}/revoke | Vault revokeKey | bearer |
GET | /v1/workspaces/{slug}/account-api-keys | Vault accountKeys | bearer |
POST | /v1/workspaces/{slug}/account-api-keys | Vault createAccountKey | bearer |
PATCH | /v1/workspaces/{slug}/account-api-keys/{id} | Update account API key name and role | bearer |
POST | /v1/workspaces/{slug}/account-api-keys/{id}/revoke | Vault revokeAccountKey | bearer |
GET | /v1/workspaces/{slug}/products/{productSlug}/environments/{environmentSlug}/secrets/pull | Pull current secrets with an environment-appropriate key | none |
GET | / | Liveness | none |
GET | /health | Liveness | none |
GET | /v1/api-keys | List API keys | bearer |
POST | /v1/api-keys | Create API key | bearer |
POST | /v1/api-keys/{apiKeyId}/revoke | Revoke API key | bearer |
GET | /v1/me | Get profile | bearer |
PATCH | /v1/me | Update profile name | bearer |
POST | /v1/me/photo | Upload profile photo | bearer |
GET | /v1/me/preferences | Get notification preferences | bearer |
PATCH | /v1/me/preferences | Update notification preferences | bearer |
GET | /v1/me/home | Home destination path | bearer |
GET | /v1/me/onboarding | Onboarding workspace | bearer |
GET | /v1/workspaces | List memberships | bearer |
POST | /v1/workspaces | Create workspace | bearer |
GET | /v1/slugs/{slug} | Check whether a workspace slug is available | bearer |
GET | /v1/workspaces/{slug} | Get workspace | bearer |
PATCH | /v1/workspaces/{slug} | Update workspace | bearer |
GET | /v1/workspaces/{slug}/slug-availability | Check a candidate slug against this workspace | bearer |
POST | /v1/workspaces/{slug}/icon | Upload workspace icon | bearer |
GET | /v1/workspaces/{slug}/members | List members | bearer |
PATCH | /v1/workspaces/{slug}/members/{userId} | Change member role | bearer |
DELETE | /v1/workspaces/{slug}/members/{userId} | Remove member | bearer |
GET | /v1/workspaces/{slug}/invites | List invites | bearer |
POST | /v1/workspaces/{slug}/invites | Create invites | bearer |
POST | /v1/workspaces/{slug}/invites/{inviteId}/revoke | Revoke invite | bearer |
PATCH | /v1/workspaces/{slug}/invites/{inviteId} | Change invite role | bearer |
POST | /v1/workspaces/{slug}/invites/{inviteId}/resend | Resend invite | bearer |
GET | /v1/workspaces/{slug}/events | List events | bearer |
GET | /v1/workspaces/{slug}/people | People page data | bearer |
GET | /v1/workspaces/{slug}/seeds | Seed workspaces | bearer |
POST | /v1/seeds/{workspaceId}/join | Join seed workspace | bearer |
POST | /v1/invites/{token}/accept | Accept invite | bearer |
GET | /v1/workspaces/{slug}/products | List products | bearer |
POST | /v1/workspaces/{slug}/products | Create a product | bearer |
GET | /v1/workspaces/{slug}/products/{product} | Get a product, archived or not | bearer |
PATCH | /v1/workspaces/{slug}/products/{product} | Change a product | bearer |
POST | /v1/workspaces/{slug}/products/{product}/archive | Archive a product | bearer |
POST | /v1/workspaces/{slug}/products/{product}/restore | Restore an archived product | bearer |
GET | /v1/workspaces/{slug}/environments | List environments | bearer |
POST | /v1/workspaces/{slug}/environments | Create an environment | bearer |
GET | /v1/workspaces/{slug}/environments/{environment} | Get an environment, archived or not | bearer |
PATCH | /v1/workspaces/{slug}/environments/{environment} | Change an environment | bearer |
POST | /v1/workspaces/{slug}/environments/{environment}/archive | Archive an environment | bearer |
POST | /v1/workspaces/{slug}/environments/{environment}/restore | Restore an archived environment | bearer |
GET | /v1/workspaces/{slug}/deployments | List deployments | bearer |
POST | /v1/workspaces/{slug}/deployments | Deploy a product to an environment | bearer |
GET | /v1/workspaces/{slug}/deployments/{product}/{environment} | Get a deployment | bearer |
PATCH | /v1/workspaces/{slug}/deployments/{product}/{environment} | Change a deployment | bearer |
DELETE | /v1/workspaces/{slug}/deployments/{product}/{environment} | Remove a deployment | bearer |
GET | /v1/workspaces/{slug}/teams | List teams | bearer |
POST | /v1/workspaces/{slug}/teams | Create a team | bearer |
GET | /v1/workspaces/{slug}/teams/{team} | Get a team | bearer |
PATCH | /v1/workspaces/{slug}/teams/{team} | Change a team | bearer |
DELETE | /v1/workspaces/{slug}/teams/{team} | Delete a team without tickets | bearer |
POST | /v1/workspaces/{slug}/teams/{team}/archive | Archive a team | bearer |
POST | /v1/workspaces/{slug}/teams/{team}/restore | Restore a team | bearer |
POST | /v1/workspaces/{slug}/teams/{team}/join | Join an open team | bearer |
POST | /v1/workspaces/{slug}/teams/{team}/members | Add a member to a team | bearer |
DELETE | /v1/workspaces/{slug}/teams/{team}/members/{person} | Remove a member from a team, or leave it | bearer |
GET | /v1/workspaces/{slug}/ticket-statuses | List ticket statuses | bearer |
POST | /v1/workspaces/{slug}/ticket-statuses | Add a ticket status | bearer |
PATCH | /v1/workspaces/{slug}/ticket-statuses/{status} | Rename a ticket status or make it the default | bearer |
DELETE | /v1/workspaces/{slug}/ticket-statuses/{status} | Delete a ticket status | bearer |
POST | /v1/workspaces/{slug}/ticket-statuses/{status}/reorder | Move a status within its category | bearer |
GET | /v1/workspaces/{slug}/tags | List tags | bearer |
POST | /v1/workspaces/{slug}/tags | Create a tag | bearer |
PATCH | /v1/workspaces/{slug}/tags/{tag} | Change a tag | bearer |
DELETE | /v1/workspaces/{slug}/tags/{tag} | Delete a tag | bearer |
GET | /v1/workspaces/{slug}/projects | List projects in priority order | bearer |
POST | /v1/workspaces/{slug}/projects | Create a project | bearer |
GET | /v1/workspaces/{slug}/projects/{project} | Get a project with its document | bearer |
PATCH | /v1/workspaces/{slug}/projects/{project} | Change a project | bearer |
POST | /v1/workspaces/{slug}/projects/{project}/reorder | Move a project in priority order | bearer |
POST | /v1/workspaces/{slug}/projects/{project}/archive | Archive a project | bearer |
POST | /v1/workspaces/{slug}/projects/{project}/restore | Restore a project | bearer |
POST | /v1/workspaces/{slug}/projects/{project}/milestones | Add a milestone to a project | bearer |
PATCH | /v1/workspaces/{slug}/projects/{project}/milestones/{milestone} | Change a milestone | bearer |
DELETE | /v1/workspaces/{slug}/projects/{project}/milestones/{milestone} | Delete a milestone | bearer |
GET | /v1/workspaces/{slug}/tickets | List tickets | bearer |
POST | /v1/workspaces/{slug}/tickets | Create a ticket | bearer |
GET | /v1/workspaces/{slug}/tickets/{ticket} | Get a ticket by its ID, such as WEB-31 | bearer |
PATCH | /v1/workspaces/{slug}/tickets/{ticket} | Change a ticket | bearer |
POST | /v1/workspaces/{slug}/tickets/{ticket}/move | Move a ticket to another team | bearer |
GET | /v1/workspaces/{slug}/teams/{team}/views | List a team's views | bearer |
POST | /v1/workspaces/{slug}/teams/{team}/views | Save a view for a team | bearer |
GET | /v1/workspaces/{slug}/teams/{team}/views/{view} | Get a view with its tickets | bearer |
PATCH | /v1/workspaces/{slug}/teams/{team}/views/{view} | Change a view, or make it the default | bearer |
DELETE | /v1/workspaces/{slug}/teams/{team}/views/{view} | Delete a view that is not the default | bearer |
GET | /v1/workspaces/{slug}/projects/{project}/views | List a project's views | bearer |
POST | /v1/workspaces/{slug}/projects/{project}/views | Save a view for a project | bearer |
GET | /v1/workspaces/{slug}/projects/{project}/views/{view} | Get a view with its tickets | bearer |
PATCH | /v1/workspaces/{slug}/projects/{project}/views/{view} | Change a view, or make it the default | bearer |
DELETE | /v1/workspaces/{slug}/projects/{project}/views/{view} | Delete a view that is not the default | bearer |
POST | /v1/workspaces/{slug}/tickets/{ticket}/reorder | Move a ticket in the one order every view ordered by hand uses | bearer |
GET | /v1/workspaces/{slug}/agent-instructions | Get the instructions a team's agents follow | bearer |
PUT | /v1/workspaces/{slug}/agent-instructions | Set a workspace's or team's instructions | bearer |
DELETE | /v1/workspaces/{slug}/agent-instructions | Go back to the inherited instructions | bearer |
GET | /v1/workspaces/{slug}/agents | List registered agents | bearer |
POST | /v1/workspaces/{slug}/agents/register | Register the plugin's agent on a computer | bearer |
POST | /v1/workspaces/{slug}/agents/{agent}/revoke | Revoke one of your agents | bearer |
POST | /v1/workspaces/{slug}/agent-messages | Send a ticket to an agent | bearer |
GET | /v1/workspaces/{slug}/tickets/{ticket}/messages | List the messages sent about a ticket | bearer |
GET | /v1/workspaces/{slug}/tickets/{ticket}/comments | List a ticket's comments | bearer |
POST | /v1/workspaces/{slug}/tickets/{ticket}/comments | Comment on a ticket, mentioning agents | bearer |
GET | /v1/workspaces/{slug}/notifications | List your notifications | bearer |
POST | /v1/workspaces/{slug}/notifications/read | Mark your notifications read | bearer |
GET | /v1/workspaces/{slug}/test-runs | List test runs, newest first | bearer |
POST | /v1/workspaces/{slug}/test-runs | Start a test run | bearer |
GET | /v1/workspaces/{slug}/test-runs/{run} | Get a test run with its tests and attempts | bearer |
POST | /v1/workspaces/{slug}/test-runs/{run}/finish | Finish a test run with every test's first attempt | bearer |
POST | /v1/workspaces/{slug}/test-runs/{run}/retries | Retry a test run's failed tests | bearer |
POST | /v1/workspaces/{slug}/test-runs/{run}/retries/{retry}/finish | Finish a retry and apply the flaky rule | bearer |
GET | /v1/invites/{token} | Get invite by token | none |