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

## Assets — list, create, read, update

Manage physical assets tied to a **site** and **account**. Reads use project-service GraphQL; creates and updates call fleet-service.

### Endpoints

| Method  | Path                | Description                                              |
| ------- | ------------------- | -------------------------------------------------------- |
| `GET`   | `/assets`           | List assets (filters, pagination, optional `account_id`) |
| `POST`  | `/assets`           | Create an asset                                          |
| `GET`   | `/assets/{assetId}` | Get asset by id                                          |
| `PATCH` | `/assets/{assetId}` | Update asset fields, including archiving                 |

#### Query parameters (`GET /assets`)

| Parameter                         | Description                                     |
| --------------------------------- | ----------------------------------------------- |
| `page`, `page_size`               | Pagination (`page_size` max 100)                |
| `order_by`                        | `asc` or `desc` by `createdAt` (default `desc`) |
| `account_id`                      | Filter by account                               |
| `site_id`                         | Filter by site                                  |
| `status`, `type`                  | Exact match                                     |
| `manufacturer`                    | Case-insensitive contains                       |
| `is_archived`                     | `true` / `false` (default false)                |
| `updated_after`, `updated_before` | ISO date-time filters on `updatedAt`            |

#### Create body highlights

* Required: `accountId`, `siteId`, `type`, `manufacturer`, `model`, `serialNumber`.
* Optional: `status`, `labelIds`, dates, `description`, image file ids, `size`, `expectedLifetime`.

#### PATCH notes

* `siteId` and `accountId` cannot be changed after creation; PATCH requests that include either field are rejected by request validation with `400` rather than being silently ignored.
* Set `isArchived: true` to archive an asset, or `isArchived: false` to unarchive it.

---

## Invoice payments

### New: List, get, and create payments on an invoice

You can list payments for an invoice, fetch a single payment by id, and record manual payments. These paths are scoped under the invoice — update and delete a payment instead use its own id (see the 2026-08-27 release notes).

| Method | Path                                         | Description                             |
| ------ | -------------------------------------------- | --------------------------------------- |
| `GET`  | `/invoices/{invoiceId}/payments`             | List all payment records for an invoice |
| `GET`  | `/invoices/{invoiceId}/payments/{paymentId}` | Get one payment on an invoice           |
| `POST` | `/invoices/{invoiceId}/payments`             | Create a manual payment on an invoice   |

List returns a JSON array, get-by-id returns a single object, and create returns the payment service payload (amounts in dollars on reads; create accepts dollars and converts to cents for core).

#### Create a payment

```
POST /invoices/{invoiceId}/payments
```

```json
{
  "amount": 125.5,
  "paymentMethod": "CHECK",
  "paymentDate": "2026-04-28T18:00:00.000Z",
  "notes": "Deposit received",
  "paymentReference": "CHK-1042"
}
```

#### Notes

* `paymentReference` and `notes` are optional.
* `paymentMethod` must be one of: `CASH`, `ACH`, `CREDIT_CARD`, `KLARNA`, `AFFIRM`, `CHECK`.
* Core does not expose `GET /payment-records/:id`; get-by-id resolves the payment from the invoice’s nested payment records.