Projects
A project is a body of work with a goal, kept in one priority order per workspace. It links the teams whose tickets it holds and the products it changes, and splits into milestones (M1, M2). Anyone who sees one of its teams can open it.
The Project object
A body of work with a goal. It links the teams whose tickets it holds and the products it changes, and has numbered milestones.
Attributes
idstringRequiredUnique ID of the project.
slugstringRequiredLowercase letters, digits and hyphens, unique in the workspace, such as docs-launch.
namestringRequiredThe project's display name.
summarynullable stringRequiredOne line on what the project delivers, or null.
statusstringRequiredWhere the project stands: planned, active, paused, completed or canceled.
plannedactivepausedcompletedcanceledleadnullable objectRequiredThe member who leads the project, or null.
targetDatenullable stringRequiredThe date the project should be done, as YYYY-MM-DD, or null.
teamsarray of objectsRequiredThe teams whose tickets the project holds, sorted by name.
productsarray of objectsRequiredThe products the project changes, sorted by name.
The project's milestones, in number order.
progressobjectRequiredThe project's tickets counted by status category.
archivedAtnullable stringRequiredWhen it was archived, as an ISO 8601 timestamp; null while active.
createdAtstringRequiredWhen it was created, as an ISO 8601 timestamp.
updatedAtstringRequiredWhen it last changed, as an ISO 8601 timestamp.
documentnullable stringRequiredThe project's document in Markdown, or null.
{ "id": "Pj2KsV8dRf4N", "slug": "docs-launch", "name": "Docs launch", "summary": "Ship the public docs site with search and the API reference.", "status": "active", "lead": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev" }, "targetDate": "2026-11-20", "teams": [ { "id": "Tm6PzN3kWq1J", "key": "WEB", "name": "Web", "visibility": "open" } ], "products": [ { "id": "Pr4GtY9sLm3B", "slug": "storefront", "name": "Storefront" } ], "milestones": [ { "id": "Ms1RfP5kXn8B", "number": 1, "name": "Reference pages", "summary": "Every API resource has a generated page." }, { "id": "Ms2SrC9vLm4D", "number": 2, "name": "Search", "summary": "Readers find any page from the docs header." } ], "progress": { "backlog": 2, "unstarted": 3, "started": 2, "completed": 6, "canceled": 1 }, "archivedAt": null, "createdAt": "2026-10-01T16:20:00.000Z", "updatedAt": "2026-10-14T09:05:12.000Z", "document": "## Goal\nEvery Acme developer finds the answer in the docs before asking in chat.\n\n## Scope\nThe API reference, guides and search."}List projects
GET/Returns the projects the caller can open, in priority order and without their documents. A project opens for anyone who sees one of its teams. Archived projects are left out unless archived asks for them.
Path parameters
slugstringRequiredThe workspace's slug or ID, such as acme.
Query parameters
teamstringOnly projects linked to this team, by key, such as WEB.
productstringOnly projects linked to this product, by slug, such as storefront.
archivedstringWhich archived projects to return: exclude (the default), include or only archived ones.
excludeincludeonlyReturns
Returns an object with these fields. Status 200.
projectsarray of objectsRequiredThe projects in priority order.
Errors
- 400
InvalidInputThe request is malformed, or a value is not allowed.- 401
UnauthorizedThe request has no valid API key.- 403
ForbiddenThe key's user or role may not do this.- 404
NotFoundThe workspace or object does not exist, or the caller cannot see it.- 409
ConflictThe change conflicts with current data, such as a slug that is already in use.- 500
InternalClanker Ship failed to handle the request. Retry, or report the response's x-request-id.
curl https://api.qa.clankership.net/v1/workspaces/acme/projects \ -H "Authorization: Bearer $CLANKER_API_KEY"{ "projects": [ { "id": "Pj2KsV8dRf4N", "slug": "docs-launch", "name": "Docs launch", "summary": "Ship the public docs site with search and the API reference.", "status": "active", "lead": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev" }, "targetDate": "2026-11-20", "teams": [ { "id": "Tm6PzN3kWq1J", "key": "WEB", "name": "Web", "visibility": "open" } ], "products": [ { "id": "Pr4GtY9sLm3B", "slug": "storefront", "name": "Storefront" } ], "milestones": [ { "id": "Ms1RfP5kXn8B", "number": 1, "name": "Reference pages", "summary": "Every API resource has a generated page." }, { "id": "Ms2SrC9vLm4D", "number": 2, "name": "Search", "summary": "Readers find any page from the docs header." } ], "progress": { "backlog": 2, "unstarted": 3, "started": 2, "completed": 6, "canceled": 1 }, "archivedAt": null, "createdAt": "2026-10-01T16:20:00.000Z", "updatedAt": "2026-10-14T09:05:12.000Z" } ]}Create a project
POST/Adds a project at the end of the priority order, with the default views. Viewers cannot create projects, and the slug and name must be unused, archived projects included.
Path parameters
slugstringRequiredThe workspace's slug or ID, such as acme.
Body parameters
namestringRequiredThe project's display name, up to 100 characters, unique in the workspace.
slugstringRequiredLowercase letters, digits and hyphens, unique in the workspace, such as docs-launch.
summarynullable stringOne line on what the project delivers, up to 200 characters.
statusstringWhere the project stands. Defaults to planned.
plannedactivepausedcompletedcanceledleadnullable stringThe member who leads the project, by user ID or email address.
targetDatenullable stringThe date the project should be done, as YYYY-MM-DD.
teamsarray of stringsRequiredThe teams whose tickets the project holds, by key. At least one, and each one the caller sees.
productsarray of stringsThe products the project changes, by slug.
documentnullable stringThe project's document in Markdown.
Returns
Returns the Project object. Status 201.
Errors
- 400
InvalidInputThe request is malformed, or a value is not allowed.- 401
UnauthorizedThe request has no valid API key.- 403
ForbiddenThe key's user or role may not do this.- 404
NotFoundThe workspace or object does not exist, or the caller cannot see it.- 409
ConflictThe change conflicts with current data, such as a slug that is already in use.- 500
InternalClanker Ship failed to handle the request. Retry, or report the response's x-request-id.
curl -X POST https://api.qa.clankership.net/v1/workspaces/acme/projects \ -H "Authorization: Bearer $CLANKER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Docs launch", "slug": "docs-launch", "summary": "Ship the public docs site with search and the API reference.", "status": "active", "lead": "maya@acme.dev", "targetDate": "2026-11-20", "teams": [ "WEB" ], "products": [ "storefront" ] }'{ "id": "Pj2KsV8dRf4N", "slug": "docs-launch", "name": "Docs launch", "summary": "Ship the public docs site with search and the API reference.", "status": "active", "lead": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev" }, "targetDate": "2026-11-20", "teams": [ { "id": "Tm6PzN3kWq1J", "key": "WEB", "name": "Web", "visibility": "open" } ], "products": [ { "id": "Pr4GtY9sLm3B", "slug": "storefront", "name": "Storefront" } ], "milestones": [ { "id": "Ms1RfP5kXn8B", "number": 1, "name": "Reference pages", "summary": "Every API resource has a generated page." }, { "id": "Ms2SrC9vLm4D", "number": 2, "name": "Search", "summary": "Readers find any page from the docs header." } ], "progress": { "backlog": 2, "unstarted": 3, "started": 2, "completed": 6, "canceled": 1 }, "archivedAt": null, "createdAt": "2026-10-01T16:20:00.000Z", "updatedAt": "2026-10-14T09:05:12.000Z", "document": "## Goal\nEvery Acme developer finds the answer in the docs before asking in chat.\n\n## Scope\nThe API reference, guides and search."}Get a project
GET/Returns one project, archived or not, with its document and milestones.
Path parameters
slugstringRequiredThe workspace's slug or ID, such as acme.
projectstringRequiredThe project's slug, such as docs-launch.
Returns
Returns the Project object. Status 200.
Errors
- 400
InvalidInputThe request is malformed, or a value is not allowed.- 401
UnauthorizedThe request has no valid API key.- 403
ForbiddenThe key's user or role may not do this.- 404
NotFoundThe workspace or object does not exist, or the caller cannot see it.- 409
ConflictThe change conflicts with current data, such as a slug that is already in use.- 500
InternalClanker Ship failed to handle the request. Retry, or report the response's x-request-id.
curl https://api.qa.clankership.net/v1/workspaces/acme/projects/{project} \ -H "Authorization: Bearer $CLANKER_API_KEY"{ "id": "Pj2KsV8dRf4N", "slug": "docs-launch", "name": "Docs launch", "summary": "Ship the public docs site with search and the API reference.", "status": "active", "lead": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev" }, "targetDate": "2026-11-20", "teams": [ { "id": "Tm6PzN3kWq1J", "key": "WEB", "name": "Web", "visibility": "open" } ], "products": [ { "id": "Pr4GtY9sLm3B", "slug": "storefront", "name": "Storefront" } ], "milestones": [ { "id": "Ms1RfP5kXn8B", "number": 1, "name": "Reference pages", "summary": "Every API resource has a generated page." }, { "id": "Ms2SrC9vLm4D", "number": 2, "name": "Search", "summary": "Readers find any page from the docs header." } ], "progress": { "backlog": 2, "unstarted": 3, "started": 2, "completed": 6, "canceled": 1 }, "archivedAt": null, "createdAt": "2026-10-01T16:20:00.000Z", "updatedAt": "2026-10-14T09:05:12.000Z", "document": "## Goal\nEvery Acme developer finds the answer in the docs before asking in chat.\n\n## Scope\nThe API reference, guides and search."}Update a project
PATCH/Changes only the fields sent. Viewers cannot change projects, and an archived project takes no changes until it is restored. A new slug or name must be unused.
Path parameters
slugstringRequiredThe workspace's slug or ID, such as acme.
projectstringRequiredThe project's slug, such as docs-launch.
Body parameters
namestringThe project's display name, up to 100 characters, unique in the workspace.
slugstringLowercase letters, digits and hyphens, unique in the workspace, such as docs-launch.
summarynullable stringOne line on what the project delivers, up to 200 characters. null clears it.
statusstringWhere the project stands.
plannedactivepausedcompletedcanceledleadnullable stringThe member who leads the project, by user ID or email address. null clears it.
targetDatenullable stringThe date the project should be done, as YYYY-MM-DD. null clears it.
teamsarray of stringsReplaces the linked teams, by key. At least one; a team stays linked while the project holds its tickets.
productsarray of stringsReplaces the linked products, by slug. An empty list unlinks them all.
documentnullable stringThe project's document in Markdown. null clears it.
Returns
Returns the Project object. Status 200.
Errors
- 400
InvalidInputThe request is malformed, or a value is not allowed.- 401
UnauthorizedThe request has no valid API key.- 403
ForbiddenThe key's user or role may not do this.- 404
NotFoundThe workspace or object does not exist, or the caller cannot see it.- 409
ConflictThe change conflicts with current data, such as a slug that is already in use.- 500
InternalClanker Ship failed to handle the request. Retry, or report the response's x-request-id.
curl -X PATCH https://api.qa.clankership.net/v1/workspaces/acme/projects/{project} \ -H "Authorization: Bearer $CLANKER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "status": "active", "targetDate": "2026-11-27" }'{ "id": "Pj2KsV8dRf4N", "slug": "docs-launch", "name": "Docs launch", "summary": "Ship the public docs site with search and the API reference.", "status": "active", "lead": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev" }, "targetDate": "2026-11-20", "teams": [ { "id": "Tm6PzN3kWq1J", "key": "WEB", "name": "Web", "visibility": "open" } ], "products": [ { "id": "Pr4GtY9sLm3B", "slug": "storefront", "name": "Storefront" } ], "milestones": [ { "id": "Ms1RfP5kXn8B", "number": 1, "name": "Reference pages", "summary": "Every API resource has a generated page." }, { "id": "Ms2SrC9vLm4D", "number": 2, "name": "Search", "summary": "Readers find any page from the docs header." } ], "progress": { "backlog": 2, "unstarted": 3, "started": 2, "completed": 6, "canceled": 1 }, "archivedAt": null, "createdAt": "2026-10-01T16:20:00.000Z", "updatedAt": "2026-10-14T09:05:12.000Z", "document": "## Goal\nEvery Acme developer finds the answer in the docs before asking in chat.\n\n## Scope\nThe API reference, guides and search."}Reorder a project
POST/Moves the project in the workspace's priority order, right before or right after another project. Send before or after, not both. Viewers cannot reorder projects.
Path parameters
slugstringRequiredThe workspace's slug or ID, such as acme.
projectstringRequiredThe project's slug, such as docs-launch.
Body parameters
beforestringThe slug of the project to go right before.
afternullable stringThe slug of the project to go right after, or null to go first.
Returns
Returns the Project object. Status 200.
Errors
- 400
InvalidInputThe request is malformed, or a value is not allowed.- 401
UnauthorizedThe request has no valid API key.- 403
ForbiddenThe key's user or role may not do this.- 404
NotFoundThe workspace or object does not exist, or the caller cannot see it.- 409
ConflictThe change conflicts with current data, such as a slug that is already in use.- 500
InternalClanker Ship failed to handle the request. Retry, or report the response's x-request-id.
curl -X POST https://api.qa.clankership.net/v1/workspaces/acme/projects/{project}/reorder \ -H "Authorization: Bearer $CLANKER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "before": "checkout-v2" }'{ "id": "Pj2KsV8dRf4N", "slug": "docs-launch", "name": "Docs launch", "summary": "Ship the public docs site with search and the API reference.", "status": "active", "lead": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev" }, "targetDate": "2026-11-20", "teams": [ { "id": "Tm6PzN3kWq1J", "key": "WEB", "name": "Web", "visibility": "open" } ], "products": [ { "id": "Pr4GtY9sLm3B", "slug": "storefront", "name": "Storefront" } ], "milestones": [ { "id": "Ms1RfP5kXn8B", "number": 1, "name": "Reference pages", "summary": "Every API resource has a generated page." }, { "id": "Ms2SrC9vLm4D", "number": 2, "name": "Search", "summary": "Readers find any page from the docs header." } ], "progress": { "backlog": 2, "unstarted": 3, "started": 2, "completed": 6, "canceled": 1 }, "archivedAt": null, "createdAt": "2026-10-01T16:20:00.000Z", "updatedAt": "2026-10-14T09:05:12.000Z", "document": "## Goal\nEvery Acme developer finds the answer in the docs before asking in chat.\n\n## Scope\nThe API reference, guides and search."}Archive a project
POST/Archived projects leave lists and take no changes; their tickets stay on their teams. Viewers cannot archive projects, and archiving an archived project changes nothing.
Path parameters
slugstringRequiredThe workspace's slug or ID, such as acme.
projectstringRequiredThe project's slug, such as docs-launch.
Returns
Returns the Project object. Status 200.
Errors
- 400
InvalidInputThe request is malformed, or a value is not allowed.- 401
UnauthorizedThe request has no valid API key.- 403
ForbiddenThe key's user or role may not do this.- 404
NotFoundThe workspace or object does not exist, or the caller cannot see it.- 409
ConflictThe change conflicts with current data, such as a slug that is already in use.- 500
InternalClanker Ship failed to handle the request. Retry, or report the response's x-request-id.
curl -X POST https://api.qa.clankership.net/v1/workspaces/acme/projects/{project}/archive \ -H "Authorization: Bearer $CLANKER_API_KEY"{ "id": "Pj2KsV8dRf4N", "slug": "docs-launch", "name": "Docs launch", "summary": "Ship the public docs site with search and the API reference.", "status": "active", "lead": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev" }, "targetDate": "2026-11-20", "teams": [ { "id": "Tm6PzN3kWq1J", "key": "WEB", "name": "Web", "visibility": "open" } ], "products": [ { "id": "Pr4GtY9sLm3B", "slug": "storefront", "name": "Storefront" } ], "milestones": [ { "id": "Ms1RfP5kXn8B", "number": 1, "name": "Reference pages", "summary": "Every API resource has a generated page." }, { "id": "Ms2SrC9vLm4D", "number": 2, "name": "Search", "summary": "Readers find any page from the docs header." } ], "progress": { "backlog": 2, "unstarted": 3, "started": 2, "completed": 6, "canceled": 1 }, "archivedAt": null, "createdAt": "2026-10-01T16:20:00.000Z", "updatedAt": "2026-10-14T09:05:12.000Z", "document": "## Goal\nEvery Acme developer finds the answer in the docs before asking in chat.\n\n## Scope\nThe API reference, guides and search."}Restore a project
POST/Brings an archived project back, so it takes changes again. Viewers cannot restore projects, and restoring an active project changes nothing.
Path parameters
slugstringRequiredThe workspace's slug or ID, such as acme.
projectstringRequiredThe project's slug, such as docs-launch.
Returns
Returns the Project object. Status 200.
Errors
- 400
InvalidInputThe request is malformed, or a value is not allowed.- 401
UnauthorizedThe request has no valid API key.- 403
ForbiddenThe key's user or role may not do this.- 404
NotFoundThe workspace or object does not exist, or the caller cannot see it.- 409
ConflictThe change conflicts with current data, such as a slug that is already in use.- 500
InternalClanker Ship failed to handle the request. Retry, or report the response's x-request-id.
curl -X POST https://api.qa.clankership.net/v1/workspaces/acme/projects/{project}/restore \ -H "Authorization: Bearer $CLANKER_API_KEY"{ "id": "Pj2KsV8dRf4N", "slug": "docs-launch", "name": "Docs launch", "summary": "Ship the public docs site with search and the API reference.", "status": "active", "lead": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev" }, "targetDate": "2026-11-20", "teams": [ { "id": "Tm6PzN3kWq1J", "key": "WEB", "name": "Web", "visibility": "open" } ], "products": [ { "id": "Pr4GtY9sLm3B", "slug": "storefront", "name": "Storefront" } ], "milestones": [ { "id": "Ms1RfP5kXn8B", "number": 1, "name": "Reference pages", "summary": "Every API resource has a generated page." }, { "id": "Ms2SrC9vLm4D", "number": 2, "name": "Search", "summary": "Readers find any page from the docs header." } ], "progress": { "backlog": 2, "unstarted": 3, "started": 2, "completed": 6, "canceled": 1 }, "archivedAt": null, "createdAt": "2026-10-01T16:20:00.000Z", "updatedAt": "2026-10-14T09:05:12.000Z", "document": "## Goal\nEvery Acme developer finds the answer in the docs before asking in chat.\n\n## Scope\nThe API reference, guides and search."}