> 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.

## List forms across your company

### New: `GET /forms`

Lists your company's forms across every project and opportunity, including forms on account work orders, paginated. Use it to sync forms incrementally instead of listing them one record at a time.

**Query parameters**

| Parameter                         | Description                                                                          |
| --------------------------------- | ------------------------------------------------------------------------------------ |
| `page`, `page_size`               | Pagination. `page_size` defaults to 20, max 100.                                     |
| `updated_after`, `updated_before` | ISO 8601 date or date-time.                                                          |
| `project_id`                      | Forms on this project.                                                               |
| `opportunity_id`                  | Forms on this opportunity.                                                           |
| `account_id`                      | Forms on this account's work orders. Forms can't be added to an account directly.    |
| `work_order_id`                   | Forms attached to this work order.                                                   |
| `template_id`                     | Forms created from this template.                                                    |
| `status`                          | `UNASSIGNED`, `ASSIGNED`, `REVIEW`, `CHANGES_REQUESTED`, `COMPLETED` or `CANCELLED`. |
| `include_archived`                | `true` to include archived forms. Default `false`.                                   |
| `order_by`                        | `updated_at` (default) or `created_at`. Ties are broken by id.                       |
| `order`                           | `asc` (default) or `desc`.                                                           |

Send only one of `project_id`, `opportunity_id` or `account_id`; more than one returns `400`.

**Each form returns** `id`, `name`, `templateId`, `projectId`, `opportunityId` or `accountId` (whichever record the form is on; the other two are `null`), `workOrderId` (`null` if it isn't on a work order), `status`, `isCompleted`, `completedAt`, `isArchived`, `createdAt` and `updatedAt`. Field values are not included; fetch them with `GET /forms/{form_id}`.

> **Note:** Archiving a form doesn't update its `updatedAt`, so `updated_after` doesn't pick up archive changes.

### Docs: work-order `collaborators` replaces the full list

On `PATCH` work orders, `collaborators` sets the full collaborator list. Include everyone who should remain, send `[]` to remove all collaborators, or omit the field to leave them unchanged. The behavior hasn't changed; the docs now say so.

### Updated: work orders return `createdBy`

Work orders now include a read-only `createdBy` field showing who created them, the same person the Coperniq UI shows as "Created by".

```json
"createdBy": { "id": 123, "firstName": "Jane", "lastName": "Doe" }
```

* Returned by `GET /work-orders`, `GET /work-orders/{id}`, and the work-order lists and gets under projects, opportunities, requests, accounts and clients.
* `null` when the creator is unknown.
* Update responses return the same shape as a `GET`. Create responses return `{ "id": 123 }` only.
* It's the equivalent of `createdByUser` on forms.