> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.coperniq.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.coperniq.io/_mcp/server.

## API key management for superadmins, and calls updates

### New: List and delete API keys, and archive API users

Superadmins can now manage their company's API keys through the API. These endpoints authenticate with Basic Auth (your Coperniq email and password), the same as `POST /api-keys`, not with an API key. Each one takes an optional `company_id` for logins that belong to more than one company.

| Endpoint                            | What it does                                                                                                                                                  |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET /api-keys`                     | Lists the company's API keys.                                                                                                                                 |
| `DELETE /api-keys/{key_id}`         | Deletes an API key. It stops working immediately.                                                                                                             |
| `GET /api-users`                    | Lists the company's API users, the service accounts API keys are issued to, with `lastSeenAt`, when each one last made a request (accurate to about an hour). |
| `POST /api-users/{user_id}/archive` | Deletes all of an API user's keys, then deactivates the API user.                                                                                             |

* Key values are never returned. Each key's `id` is a non-secret identifier (`key_…`) used to delete it, and `keyPreview` shows the key's last 4 characters so you can recognize it. If you've lost a key, create a new one with `POST /api-keys`, or contact support.
* To retire an API user, use `POST /api-users/{user_id}/archive` instead of archiving it in the Coperniq UI. Archiving it in the UI doesn't delete its keys.
* Archiving doesn't block future keys: if the person who created the API user calls `POST /api-keys` again, the API user is reactivated with a new key.
* These endpoints are for superadmins only. Other users get a `403`.

## Calls: custom reasons and dispositions, AI summary and transcript

### Updated: `reason` and `disposition` are company-defined

A call's `reason` and `disposition` now hold the name of one of your company's call reasons or dispositions, set up in Coperniq. They're plain strings of up to 255 characters instead of a fixed list.

* Calls logged before custom options existed keep their legacy uppercase values, such as `SERVICE` or `INFO_PROVIDED`. Newer calls hold the option's name, such as `Service` or `Info provided`.
* `outcome` can now also be `VOICEMAIL`.

### New: `GET /calls`

Lists calls across your whole company, paginated with `page` and `page_size` (max 100). Filter by `updated_after`/`updated_before`, `outcome`, `reason` or `disposition`, and sort by creation time with `order_by` (newest first by default). Each call includes `projectId`, `opportunityId` or `accountId` for the record it's logged on.

### New: `GET /calls/classification-options`

Lists your company's call reasons and dispositions. Pass `type=REASON` or `type=DISPOSITION` to get one kind.

### New call fields

`GET` and `POST` call responses now include:

| Field                | What it holds                                                                      |
| -------------------- | ---------------------------------------------------------------------------------- |
| `summary`            | The AI-generated summary of the call.                                              |
| `transcriptText`     | The AI transcript as plain text, one sentence per line.                            |
| `classificationNote` | For calls classified by Coperniq AI, why it chose the reason and disposition.      |
| `resolution`         | For calls handled by a Coperniq AI agent: `RESOLVED`, `ESCALATED` or `UNRESOLVED`. |

`note` is the human-editable note. The per-record call lists (`GET /projects/{project_id}/calls` and the opportunity and account equivalents) now return calls newest first, and return `502` if Coperniq's backend errors.