# Equipment

> Read the equipment installed at a customer's addresses.

- Canonical URL: https://couplrfsm.com/developers/api-reference/equipment
- Markdown: https://couplrfsm.com/developers/api-reference/equipment.md
- API version: v1 (base URL https://couplrfsm.com/api/v1)
- OpenAPI specification: https://couplrfsm.com/developers/openapi.yaml
- All documentation pages: https://couplrfsm.com/llms.txt

> **Flip:** This is what is installed at each address: the furnace, the A/C, the water heater, with the make, model and serial number a technician wrote down. Read-only. Technicians record equipment in the apps.

Base URL: `https://couplrfsm.com/api/v1`. Conventions shared by every endpoint (examples, ids, dates, money) are on the [API reference](https://couplrfsm.com/developers/api-reference) page. Errors, pagination and idempotency are in [Errors, limits and retries](https://couplrfsm.com/developers/errors-and-limits).

## List equipment

`GET /api/v1/equipment` · requires the `equipment:read` ability

Equipment recorded at customers' addresses, newest first. Filter by `customer_id` and `address_id` for one location.

**Query parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `page` | integer | No | Default: `1`. |
| `per_page` | integer | No | Values above 100 are served as 100. Default: `25`. |
| `updated_since` | string (date-time) | No | Only records changed at or after this time. ISO 8601, for example `2026-11-14T15:00:00Z`. |
| `customer_id` | integer | No |  |
| `address_id` | integer | No |  |
| `type` | string: `furnace`, `ac`, `water_heater`, `other` | No |  |

**Example request**

```bash
curl "https://couplrfsm.com/api/v1/equipment" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

**Example response** (`200`)

```json
{
    "data": [
        {
            "id": 610,
            "customer_id": 1842,
            "address_id": 2210,
            "type": "ac",
            "name": "Upstairs unit",
            "make": "TRANE",
            "model": "4TTR4036L",
            "serial": "21104XYZ3F",
            "install_year": 2019,
            "manufacture_year": 2018,
            "created_at": "2026-05-02T16:00:00+00:00",
            "updated_at": "2026-05-02T16:00:00+00:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 1,
        "last_page": 1
    }
}
```

**Errors**

| Status | When |
| --- | --- |
| `401` | No key (`api_key_missing`), the key is unknown or revoked (`api_key_invalid`), the key had an end date that has passed (`api_key_expired`), or the key belongs to a private trial sandbox whose access window has ended (`sandbox_expired`). |
| `403` | The key lacks the ability this endpoint needs (`ability_missing`), no admin user is left to act for the key (`no_acting_admin`), or the company's account is not yet verified. |
| `422` | A parameter or field is invalid (`validation_failed`). `errors` maps each field to its messages. |
| `429` | Too many requests (`rate_limited`). Wait `Retry-After` seconds. |

## Get a piece of equipment

`GET /api/v1/equipment/{id}` · requires the `equipment:read` ability

**Path parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | integer | Yes |  |

**Example request**

```bash
curl "https://couplrfsm.com/api/v1/equipment/1842" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

**Example response** (`200`)

```json
{
    "data": {
        "id": 610,
        "customer_id": 1842,
        "address_id": 2210,
        "type": "ac",
        "name": "Upstairs unit",
        "make": "TRANE",
        "model": "4TTR4036L",
        "serial": "21104XYZ3F",
        "install_year": 2019,
        "manufacture_year": 2018,
        "created_at": "2026-05-02T16:00:00+00:00",
        "updated_at": "2026-05-02T16:00:00+00:00"
    }
}
```

**Errors**

| Status | When |
| --- | --- |
| `401` | No key (`api_key_missing`), the key is unknown or revoked (`api_key_invalid`), the key had an end date that has passed (`api_key_expired`), or the key belongs to a private trial sandbox whose access window has ended (`sandbox_expired`). |
| `403` | The key lacks the ability this endpoint needs (`ability_missing`), no admin user is left to act for the key (`no_acting_admin`), or the company's account is not yet verified. |
| `404` | No such record in this company (`not_found`). |
| `429` | Too many requests (`rate_limited`). Wait `Retry-After` seconds. |
