# 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

- `id` (string, required): Unique ID of the project.
- `slug` (string, required): Lowercase letters, digits and hyphens, unique in the workspace, such as docs-launch.
- `name` (string, required): The project's display name.
- `summary` (nullable string, required): One line on what the project delivers, or null.
- `status` (string, one of: `planned`, `active`, `paused`, `completed`, `canceled`, required): Where the project stands: planned, active, paused, completed or canceled.
- `lead` (nullable object, required): The member who leads the project, or null.
  - `id` (string, required): The person's user ID.
  - `name` (string, required): The person's display name.
  - `email` (string, required): The person's email address.
- `targetDate` (nullable string, required): The date the project should be done, as YYYY-MM-DD, or null.
- `teams` (array of objects, required): The teams whose tickets the project holds, sorted by name.
  - `id` (string, required): Unique ID of the team.
  - `key` (string, required): 2 to 5 capital letters that start the team's ticket IDs, such as WEB.
  - `name` (string, required): The team's display name.
  - `visibility` (string, one of: `open`, `private`, required): Who sees the team: open teams are listed for everyone in the workspace, private teams only for their members and for owners and admins.
- `products` (array of objects, required): The products the project changes, sorted by name.
  - `id` (string, required): Unique ID of the product.
  - `slug` (string, required): The product's slug, such as storefront.
  - `name` (string, required): The product's display name.
- `milestones` (array of objects, required): The project's milestones, in number order. See [the Milestone object](https://docs.qa.clankership.net/api/milestones/object.md).
  - `id` (string, required): Unique ID of the milestone.
  - `number` (number, required): The milestone's number within its project: 2 is M2.
  - `name` (string, required): The milestone's name.
  - `summary` (nullable string, required): A short summary, or null.
- `progress` (object, required): The project's tickets counted by status category.
  - `backlog` (number, required): How many of the project's tickets have a status in the backlog category.
  - `unstarted` (number, required): How many of the project's tickets have a status in the unstarted category.
  - `started` (number, required): How many of the project's tickets have a status in the started category.
  - `completed` (number, required): How many of the project's tickets have a status in the completed category.
  - `canceled` (number, required): How many of the project's tickets have a status in the canceled category.
- `archivedAt` (nullable string, required): When it was archived, as an ISO 8601 timestamp; null while active.
- `createdAt` (string, required): When it was created, as an ISO 8601 timestamp.
- `updatedAt` (string, required): When it last changed, as an ISO 8601 timestamp.
- `document` (nullable string, required): The project's document in Markdown, or null.

### Example

```json
{
  "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 /v1/workspaces/{slug}/projects`

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.

### Parameters

- `slug` (string, in path, required): The workspace's slug or ID, such as acme.
- `team` (string, in query): Only projects linked to this team, by key, such as WEB.
- `product` (string, in query): Only projects linked to this product, by slug, such as storefront.
- `archived` (string, one of: `exclude`, `include`, `only`, in query): Which archived projects to return: exclude (the default), include or only archived ones.

### Returns

Returns an object with these fields. The status is 200.

- `projects` (array of objects, required): The projects in priority order.
  - `id` (string, required): Unique ID of the project.
  - `slug` (string, required): Lowercase letters, digits and hyphens, unique in the workspace, such as docs-launch.
  - `name` (string, required): The project's display name.
  - `summary` (nullable string, required): One line on what the project delivers, or null.
  - `status` (string, one of: `planned`, `active`, `paused`, `completed`, `canceled`, required): Where the project stands: planned, active, paused, completed or canceled.
  - `lead` (nullable object, required): The member who leads the project, or null.
    - `id` (string, required): The person's user ID.
    - `name` (string, required): The person's display name.
    - `email` (string, required): The person's email address.
  - `targetDate` (nullable string, required): The date the project should be done, as YYYY-MM-DD, or null.
  - `teams` (array of objects, required): The teams whose tickets the project holds, sorted by name.
    - `id` (string, required): Unique ID of the team.
    - `key` (string, required): 2 to 5 capital letters that start the team's ticket IDs, such as WEB.
    - `name` (string, required): The team's display name.
    - `visibility` (string, one of: `open`, `private`, required): Who sees the team: open teams are listed for everyone in the workspace, private teams only for their members and for owners and admins.
  - `products` (array of objects, required): The products the project changes, sorted by name.
    - `id` (string, required): Unique ID of the product.
    - `slug` (string, required): The product's slug, such as storefront.
    - `name` (string, required): The product's display name.
  - `milestones` (array of objects, required): The project's milestones, in number order. See [the Milestone object](https://docs.qa.clankership.net/api/milestones/object.md).
    - `id` (string, required): Unique ID of the milestone.
    - `number` (number, required): The milestone's number within its project: 2 is M2.
    - `name` (string, required): The milestone's name.
    - `summary` (nullable string, required): A short summary, or null.
  - `progress` (object, required): The project's tickets counted by status category.
    - `backlog` (number, required): How many of the project's tickets have a status in the backlog category.
    - `unstarted` (number, required): How many of the project's tickets have a status in the unstarted category.
    - `started` (number, required): How many of the project's tickets have a status in the started category.
    - `completed` (number, required): How many of the project's tickets have a status in the completed category.
    - `canceled` (number, required): How many of the project's tickets have a status in the canceled category.
  - `archivedAt` (nullable string, required): When it was archived, as an ISO 8601 timestamp; null while active.
  - `createdAt` (string, required): When it was created, as an ISO 8601 timestamp.
  - `updatedAt` (string, required): When it last changed, as an ISO 8601 timestamp.

### Request

```bash
curl https://api.qa.clankership.net/v1/workspaces/{slug}/projects \
  -H "Authorization: Bearer $CLANKER_API_KEY"
```

### Response

```json
{
  "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"
    }
  ]
}
```

### Errors

- `400` `InvalidInput`: The request is malformed, or a value is not allowed.
- `401` `Unauthorized`: The request has no valid API key.
- `403` `Forbidden`: The key's user or role may not do this.
- `404` `NotFound`: The workspace or object does not exist, or the caller cannot see it.
- `409` `Conflict`: The change conflicts with current data, such as a slug that is already in use.
- `500` `Internal`: Clanker Ship failed to handle the request. Retry, or report the response's x-request-id.

## Create a project

`POST /v1/workspaces/{slug}/projects`

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.

### Parameters

- `slug` (string, in path, required): The workspace's slug or ID, such as acme.
- `name` (string, required): The project's display name, up to 100 characters, unique in the workspace.
- `slug` (string, required): Lowercase letters, digits and hyphens, unique in the workspace, such as docs-launch.
- `summary` (nullable string): One line on what the project delivers, up to 200 characters.
- `status` (string, one of: `planned`, `active`, `paused`, `completed`, `canceled`): Where the project stands. Defaults to planned.
- `lead` (nullable string): The member who leads the project, by user ID or email address.
- `targetDate` (nullable string): The date the project should be done, as YYYY-MM-DD.
- `teams` (array of strings, required): The teams whose tickets the project holds, by key. At least one, and each one the caller sees.
- `products` (array of strings): The products the project changes, by slug.
- `document` (nullable string): The project's document in Markdown.

### Returns

Returns the [Project](https://docs.qa.clankership.net/api/projects/object.md) object. The status is 201.

### Request

```bash
curl -X POST https://api.qa.clankership.net/v1/workspaces/{slug}/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"
    ]
  }'
```

### Response

```json
{
  "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."
}
```

### Errors

- `400` `InvalidInput`: The request is malformed, or a value is not allowed.
- `401` `Unauthorized`: The request has no valid API key.
- `403` `Forbidden`: The key's user or role may not do this.
- `404` `NotFound`: The workspace or object does not exist, or the caller cannot see it.
- `409` `Conflict`: The change conflicts with current data, such as a slug that is already in use.
- `500` `Internal`: Clanker Ship failed to handle the request. Retry, or report the response's x-request-id.

## Get a project

`GET /v1/workspaces/{slug}/projects/{project}`

Returns one project, archived or not, with its document and milestones.

### Parameters

- `slug` (string, in path, required): The workspace's slug or ID, such as acme.
- `project` (string, in path, required): The project's slug, such as docs-launch.

### Returns

Returns the [Project](https://docs.qa.clankership.net/api/projects/object.md) object. The status is 200.

### Request

```bash
curl https://api.qa.clankership.net/v1/workspaces/{slug}/projects/{project} \
  -H "Authorization: Bearer $CLANKER_API_KEY"
```

### Response

```json
{
  "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."
}
```

### Errors

- `400` `InvalidInput`: The request is malformed, or a value is not allowed.
- `401` `Unauthorized`: The request has no valid API key.
- `403` `Forbidden`: The key's user or role may not do this.
- `404` `NotFound`: The workspace or object does not exist, or the caller cannot see it.
- `409` `Conflict`: The change conflicts with current data, such as a slug that is already in use.
- `500` `Internal`: Clanker Ship failed to handle the request. Retry, or report the response's x-request-id.

## Update a project

`PATCH /v1/workspaces/{slug}/projects/{project}`

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.

### Parameters

- `slug` (string, in path, required): The workspace's slug or ID, such as acme.
- `project` (string, in path, required): The project's slug, such as docs-launch.
- `name` (string): The project's display name, up to 100 characters, unique in the workspace.
- `slug` (string): Lowercase letters, digits and hyphens, unique in the workspace, such as docs-launch.
- `summary` (nullable string): One line on what the project delivers, up to 200 characters. `null` clears it.
- `status` (string, one of: `planned`, `active`, `paused`, `completed`, `canceled`): Where the project stands.
- `lead` (nullable string): The member who leads the project, by user ID or email address. `null` clears it.
- `targetDate` (nullable string): The date the project should be done, as YYYY-MM-DD. `null` clears it.
- `teams` (array of strings): Replaces the linked teams, by key. At least one; a team stays linked while the project holds its tickets.
- `products` (array of strings): Replaces the linked products, by slug. An empty list unlinks them all.
- `document` (nullable string): The project's document in Markdown. `null` clears it.

### Returns

Returns the [Project](https://docs.qa.clankership.net/api/projects/object.md) object. The status is 200.

### Request

```bash
curl -X PATCH https://api.qa.clankership.net/v1/workspaces/{slug}/projects/{project} \
  -H "Authorization: Bearer $CLANKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "active",
    "targetDate": "2026-11-27"
  }'
```

### Response

```json
{
  "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."
}
```

### Errors

- `400` `InvalidInput`: The request is malformed, or a value is not allowed.
- `401` `Unauthorized`: The request has no valid API key.
- `403` `Forbidden`: The key's user or role may not do this.
- `404` `NotFound`: The workspace or object does not exist, or the caller cannot see it.
- `409` `Conflict`: The change conflicts with current data, such as a slug that is already in use.
- `500` `Internal`: Clanker Ship failed to handle the request. Retry, or report the response's x-request-id.

## Reorder a project

`POST /v1/workspaces/{slug}/projects/{project}/reorder`

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.

### Parameters

- `slug` (string, in path, required): The workspace's slug or ID, such as acme.
- `project` (string, in path, required): The project's slug, such as docs-launch.
- `before` (string): The slug of the project to go right before.
- `after` (nullable string): The slug of the project to go right after, or null to go first.

### Returns

Returns the [Project](https://docs.qa.clankership.net/api/projects/object.md) object. The status is 200.

### Request

```bash
curl -X POST https://api.qa.clankership.net/v1/workspaces/{slug}/projects/{project}/reorder \
  -H "Authorization: Bearer $CLANKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "before": "checkout-v2"
  }'
```

### Response

```json
{
  "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."
}
```

### Errors

- `400` `InvalidInput`: The request is malformed, or a value is not allowed.
- `401` `Unauthorized`: The request has no valid API key.
- `403` `Forbidden`: The key's user or role may not do this.
- `404` `NotFound`: The workspace or object does not exist, or the caller cannot see it.
- `409` `Conflict`: The change conflicts with current data, such as a slug that is already in use.
- `500` `Internal`: Clanker Ship failed to handle the request. Retry, or report the response's x-request-id.

## Archive a project

`POST /v1/workspaces/{slug}/projects/{project}/archive`

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.

### Parameters

- `slug` (string, in path, required): The workspace's slug or ID, such as acme.
- `project` (string, in path, required): The project's slug, such as docs-launch.

### Returns

Returns the [Project](https://docs.qa.clankership.net/api/projects/object.md) object. The status is 200.

### Request

```bash
curl -X POST https://api.qa.clankership.net/v1/workspaces/{slug}/projects/{project}/archive \
  -H "Authorization: Bearer $CLANKER_API_KEY"
```

### Response

```json
{
  "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."
}
```

### Errors

- `400` `InvalidInput`: The request is malformed, or a value is not allowed.
- `401` `Unauthorized`: The request has no valid API key.
- `403` `Forbidden`: The key's user or role may not do this.
- `404` `NotFound`: The workspace or object does not exist, or the caller cannot see it.
- `409` `Conflict`: The change conflicts with current data, such as a slug that is already in use.
- `500` `Internal`: Clanker Ship failed to handle the request. Retry, or report the response's x-request-id.

## Restore a project

`POST /v1/workspaces/{slug}/projects/{project}/restore`

Brings an archived project back, so it takes changes again. Viewers cannot restore projects, and restoring an active project changes nothing.

### Parameters

- `slug` (string, in path, required): The workspace's slug or ID, such as acme.
- `project` (string, in path, required): The project's slug, such as docs-launch.

### Returns

Returns the [Project](https://docs.qa.clankership.net/api/projects/object.md) object. The status is 200.

### Request

```bash
curl -X POST https://api.qa.clankership.net/v1/workspaces/{slug}/projects/{project}/restore \
  -H "Authorization: Bearer $CLANKER_API_KEY"
```

### Response

```json
{
  "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."
}
```

### Errors

- `400` `InvalidInput`: The request is malformed, or a value is not allowed.
- `401` `Unauthorized`: The request has no valid API key.
- `403` `Forbidden`: The key's user or role may not do this.
- `404` `NotFound`: The workspace or object does not exist, or the caller cannot see it.
- `409` `Conflict`: The change conflicts with current data, such as a slug that is already in use.
- `500` `Internal`: Clanker Ship failed to handle the request. Retry, or report the response's x-request-id.
