# Deleted records

> Learn which customers, jobs, invoices and estimates were removed, to keep a copy in step.

- Canonical URL: https://couplrfsm.com/developers/api-reference/deleted-records
- Markdown: https://couplrfsm.com/developers/api-reference/deleted-records.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:** When someone removes a customer, a job, an invoice or an estimate in Couplr, it just stops showing up in my lists. Ask me here and I tell you which ones went, so you can tidy your own copy. I only report what was removed. I never delete anything because an API call asked.

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 deleted records

`GET /api/v1/deleted` · any valid key

The ids of customers, jobs, invoices and estimates that were removed
in Couplr at or after `since`, most recently removed first. Lists and
`updated_since` only return records that still exist, so use this to
remove them from your own copy.

It needs no ability of its own. A key is shown removals for the kinds
of record it can read: `customers:read`, `jobs:read`, `invoices:read`
and `estimates:read`. Asking for a `type` the key cannot read, or
holding none of the four, is a `403`.

A removed record is reported for as long as Couplr keeps it in its
Trash. One that is restored stops being listed and comes back in its
own list with a new `updated_at`. This endpoint only reports. Nothing
can be deleted through the API.

**Query parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `page` | integer | No | Default: `1`. |
| `per_page` | integer | No | Values above 100 are served as 100. Default: `25`. |
| `since` | string (date-time) | Yes | Only records removed at or after this time. ISO 8601. |
| `type` | string: `customer`, `job`, `invoice`, `estimate` | No |  |

**Example request**

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

**Example response** (`200`)

```json
{
    "data": [
        {
            "type": "job",
            "id": "9312",
            "deleted_at": "2026-11-14T15:02:11+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. |
