> ## Documentation Index
> Fetch the complete documentation index at: https://usepike.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Open API

> REST API at api.usepike.com for workspace-scoped access to projects, tasks, customers, and members—authenticated with admin-issued secrets.

The Pike **Open API** is an HTTPS API for automation, internal tooling, and integrations. Responses are **JSON** with **`camelCase`** property names. Conceptually, the resources mirror what you manage in the product; see [Core concepts](/concepts), [Projects](/project/overview), [Task properties](/tasks/properties), [Customers](/customers/overview), and [Members](/members/overview).

**Base URL:** `https://api.usepike.com`\
**Versioning:** Pike **automatically routes** each request to the correct API version. **Do not** put a version segment in the path (for example `/v1`); the gateway selects the version from your request.

## Authentication

Every request must include a **workspace API secret** in the `Authorization` header:

```http theme={null}
Authorization: Bearer <secret>
```

Secrets are **opaque** strings issued per workspace. They are **not** user passwords and do not grant access to the Pike web app session.

### Scopes

Each secret is created with one or more **scopes**. Requests are rejected if the secret lacks permission for the operation. Examples:

| Scope            | Access                      |
| ---------------- | --------------------------- |
| `projects:read`  | List and retrieve projects  |
| `tasks:read`     | List and retrieve tasks     |
| `customers:read` | List and retrieve customers |
| `members:read`   | List and retrieve members   |

The API will grow over time. **Additional scopes** (for example write access or new resources) can be **provisioned on request** for your workspace—contact Pike when you need more than the defaults. When you receive a formal **OpenAPI** document from us, it can list the **full scope catalogue** available to you, including any extras agreed for your account. Documented endpoints on this page always state which scopes apply.

## Creating and managing API secrets (admins)

Only workspace **administrators** can create, rename, rotate, and revoke API secrets—same class of control as other sensitive [workspace settings](/settings/workspace).

1. Open **Workspace settings** → **Integrations** → **Open API**
2. Choose **Create secret**
3. Give the secret a **label** (for example `prod-etl`, `billing-cron`) so you can audit usage later
4. Select the **scopes** this integration needs (least privilege)
5. **Copy the secret value immediately** when it is shown. Pike does not display the full secret again after you leave the screen. Store it in a secrets manager (Vault, AWS Secrets Manager, Doppler, etc.)

**Rotation:** create a new secret with the same scopes, update your systems, then revoke the old secret. **Revocation** takes effect immediately.

<Tip>
  Treat secrets like production credentials: never commit them to git, never log
  them, and prefer environment variables or your platform’s secret injection.
</Tip>

## Conventions

* **Encoding:** UTF-8 JSON bodies and responses.
* **Timestamps:** ISO 8601 strings in **UTC** (for example `2026-04-09T14:30:00.000Z`).
* **IDs:** opaque string identifiers.
* **Pagination:** list endpoints return a paginated envelope; use `cursor` from the previous response to fetch the next page.
* **Errors:** structured JSON with a stable shape for support and logging (see [Errors](#errors)).

## Pagination

List endpoints accept:

| Query    | Description                                                                                          |
| -------- | ---------------------------------------------------------------------------------------------------- |
| `limit`  | Max items per page (default and maximum are implementation-defined; typical default `50`, max `200`) |
| `cursor` | Opaque cursor from the previous response’s `nextCursor`                                              |

```json theme={null}
{
  "items": [],
  "nextCursor": "eyJ...",
  "hasMore": true
}
```

When `hasMore` is `false`, omit `nextCursor` or set it to `null`.

## Errors

Failed requests return JSON with HTTP **4xx** or **5xx** and a body like:

```json theme={null}
{
  "error": {
    "code": "forbidden",
    "message": "Insufficient scope for this resource.",
    "requestId": "6ba7b810-9dad-41d1-80b4-00c04fd430c8"
  }
}
```

Include **`requestId`** when contacting support. Common `code` values include `unauthorized`, `forbidden`, `not_found`, `rate_limited`, `invalid_request`, and `internal_error`.

## Rate limits

Requests are rate-limited per secret and workspace. Responses may include **`Retry-After`** when throttled. Integrations should use **exponential backoff** and respect `429` responses.

## Resources

### Projects

Projects are the container for delivery work in Pike; see [Project overview](/project/overview).

**Scopes:** `projects:read`

**List:** `GET /projects`

| Query             | Description                                      |
| ----------------- | ------------------------------------------------ |
| `limit`, `cursor` | Pagination                                       |
| `status`          | Filter by project status key (workspace-defined) |
| `teamId`          | Filter by team id                                |

**Retrieve:** `GET /projects/{projectId}`

**Example: list response**

```json theme={null}
{
  "items": [
    {
      "id": "8f2a1c9e-3b7d-4f60-9a2b-1c9e3b7d4f60",
      "projectNumber": "2026-0142",
      "title": "Acme — Phase 2 rollout",
      "status": "inProgress",
      "statusCategory": "inProgress",
      "teamId": "91ab2c3d-4e5f-4a6b-8c1d-2c3d4e5f6a7b",
      "customerId": "7d2e1f9a-4b8c-4e1d-9f2a-1f9a4b8c7d2e",
      "description": "Delivery and training for regional offices.",
      "createdAt": "2026-03-01T09:15:22.000Z",
      "updatedAt": "2026-04-08T16:42:11.000Z"
    }
  ],
  "nextCursor": "eyJwcm9qZWN0SWQiOiI4ZjJhMWM5ZS0zYjdkLTRmNjAtOWEyYi0xYzllM2I3ZDRmNjAifQ",
  "hasMore": false
}
```

**Example: single project**

```json theme={null}
{
  "id": "8f2a1c9e-3b7d-4f60-9a2b-1c9e3b7d4f60",
  "projectNumber": "2026-0142",
  "title": "Acme — Phase 2 rollout",
  "status": "inProgress",
  "statusCategory": "inProgress",
  "teamId": "91ab2c3d-4e5f-4a6b-8c1d-2c3d4e5f6a7b",
  "customerId": "7d2e1f9a-4b8c-4e1d-9f2a-1f9a4b8c7d2e",
  "description": "Delivery and training for regional offices.",
  "phases": [
    {
      "id": "a1b2c3d4-e5f6-4789-a012-3456789abcde",
      "name": "Discovery",
      "startDate": "2026-03-01",
      "endDate": "2026-03-21"
    }
  ],
  "createdAt": "2026-03-01T09:15:22.000Z",
  "updatedAt": "2026-04-08T16:42:11.000Z"
}
```

`status` reflects your workspace’s configured project statuses; `statusCategory` maps to the fixed buckets (for example `backlog`, `planned`, `inProgress`, `completed`, `cancelled`).

### Tasks

Tasks are work items with status, priority, assignees, and dates; see [Task properties](/tasks/properties).

**Scopes:** `tasks:read`

**List:** `GET /tasks`

| Query             | Description                                                                                           |
| ----------------- | ----------------------------------------------------------------------------------------------------- |
| `limit`, `cursor` | Pagination                                                                                            |
| `projectId`       | Filter by project                                                                                     |
| `status`          | Filter by task status (`toDo`, `inProgress`, `inReview`, `done`, `cancelled`, `duplicate`, `backlog`) |
| `teamId`          | Filter by team                                                                                        |

**Retrieve:** `GET /tasks/{taskId}`

**Example: list response**

```json theme={null}
{
  "items": [
    {
      "id": "4e9a1b2c-3d4e-5f60-a4e9-1b2c3d4e5f60",
      "title": "Configure SSO for Acme",
      "description": "<p>Enable SAML and test IdP metadata.</p>",
      "status": "inProgress",
      "priority": "high",
      "projectId": "8f2a1c9e-3b7d-4f60-9a2b-1c9e3b7d4f60",
      "teamId": "91ab2c3d-4e5f-4a6b-8c1d-2c3d4e5f6a7b",
      "assigneeIds": [
        "c3d4e5f6-a7b8-4901-c234-56789abcdef0",
        "d4e5f6a7-b8c9-4012-d345-6789abcdef01"
      ],
      "startDate": "2026-04-01",
      "dueDate": "2026-04-15",
      "billableStatus": "billable",
      "customerId": "7d2e1f9a-4b8c-4e1d-9f2a-1f9a4b8c7d2e",
      "phaseId": "a1b2c3d4-e5f6-4789-a012-3456789abcde",
      "labelIds": ["b2c3d4e5-f6a7-4890-b123-456789abcdef"],
      "createdAt": "2026-03-28T11:00:00.000Z",
      "updatedAt": "2026-04-09T08:20:33.000Z"
    }
  ],
  "nextCursor": null,
  "hasMore": false
}
```

**Status values** match [task statuses](/tasks/properties) in the app (for example **To Do** → `toDo`, **In Progress** → `inProgress`, **In Review** → `inReview`, **Done** → `done`, **Cancelled** → `cancelled`, **Duplicate** → `duplicate`, **Backlog** → `backlog`). **Priority** matches [task priority](/tasks/properties): `none`, `low`, `medium`, `high`, `urgent`. `billableStatus` may be `billable`, `nonBillable`, or `null` when the project has no customer.

### Customers

Customer records used across projects and finance; see [Customers overview](/customers/overview).

**Scopes:** `customers:read`

**List:** `GET /customers`

| Query             | Description                         |
| ----------------- | ----------------------------------- |
| `limit`, `cursor` | Pagination                          |
| `q`               | Search by name or number (optional) |

**Retrieve:** `GET /customers/{customerId}`

**Example: list response**

```json theme={null}
{
  "items": [
    {
      "id": "7d2e1f9a-4b8c-4e1d-9f2a-1f9a4b8c7d2e",
      "customerName": "Acme Corporation",
      "customerNumber": "C-10492",
      "taxVatId": "GB123456789",
      "mainCurrency": "GBP",
      "createdAt": "2025-11-10T10:00:00.000Z",
      "updatedAt": "2026-02-01T14:30:00.000Z"
    }
  ],
  "nextCursor": null,
  "hasMore": false
}
```

`mainCurrency` is an ISO 4217 code (for example `USD`, `EUR`, `DKK`).

### Members

Workspace members (users and invitations); see [Members](/members/overview).

**Scopes:** `members:read`

**List:** `GET /members`

| Query             | Description                                |
| ----------------- | ------------------------------------------ |
| `limit`, `cursor` | Pagination                                 |
| `status`          | `active`, `invited`, `inactive` (optional) |

**Retrieve:** `GET /members/{memberId}`

**Example: list response**

```json theme={null}
{
  "items": [
    {
      "id": "c3d4e5f6-a7b8-4901-c234-56789abcdef0",
      "email": "jane@example.com",
      "displayName": "Jane Doe",
      "status": "active",
      "workspaceRole": "member",
      "teamIds": [
        "91ab2c3d-4e5f-4a6b-8c1d-2c3d4e5f6a7b",
        "e5f6a7b8-c9d0-4123-e456-789abcdef012"
      ],
      "positionId": "f6a7b8c9-d0e1-4234-f567-89abcdef0123",
      "invitedAt": null,
      "joinedAt": "2025-06-01T12:00:00.000Z",
      "createdAt": "2025-06-01T12:00:00.000Z",
      "updatedAt": "2026-04-01T09:00:00.000Z"
    },
    {
      "id": "d4e5f6a7-b8c9-4012-d345-6789abcdef01",
      "email": "alex@example.com",
      "displayName": "Alex Kim",
      "status": "invited",
      "workspaceRole": "member",
      "teamIds": [],
      "positionId": null,
      "invitedAt": "2026-04-08T15:00:00.000Z",
      "joinedAt": null,
      "createdAt": "2026-04-08T15:00:00.000Z",
      "updatedAt": "2026-04-08T15:00:00.000Z"
    }
  ],
  "nextCursor": null,
  "hasMore": false
}
```

`workspaceRole` reflects coarse access (for example `admin`, `member`). Use `teamIds` to see which teams a member belongs to.

## Example request

```bash theme={null}
curl -sS \
  -H "Authorization: Bearer $PIKE_API_SECRET" \
  -H "Accept: application/json" \
  "https://api.usepike.com/projects?limit=10"
```

## Request lifecycle

```mermaid theme={null}
sequenceDiagram
  participant Client
  participant API as api_usepike_com
  Client->>API: GET /tasks Authorization Bearer
  API-->>Client: 200 JSON items nextCursor
  Client->>API: GET /tasks invalid_secret
  API-->>Client: 401 error requestId
```

## OpenAPI specification

A machine-readable **OpenAPI 3.x** document for this API can be provided on request. It can include your **full scope catalogue**, including **additional scopes** provisioned for your workspace. Contact [usepike.com/contact](https://usepike.com/contact) or your Pike customer contact if you need a formal spec for procurement or gateway tooling.
