> ## Documentation Index
> Fetch the complete documentation index at: https://docs.outboundlegal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Introduction

> Connect Zapier, your case system or your own scripts to OutboundLegal.

The OutboundLegal API lets your tools do three things:

1. **Keep your Clients list up to date** from your case system — add and update clients ([`POST /clients`](/api-reference/clients/add-or-update-clients)) and read them back ([`GET /clients`](/api-reference/clients/list-clients)).
2. **Mark a case settled** ([`POST /cases/settled`](/api-reference/clients/mark-a-case-settled)), which is what case-settled [client letters](/help/client-letters) wait for.
3. **Send our prospects to your CRM as cold leads** ([`GET /prospects`](/api-reference/prospects/list-prospects-cold-leads)). Digital bundle only.

Prefer not to write code? See [Connect with Zapier](/api/zapier).

<Info>
  The API is in early access, turned on together with the [Clients list](/help/clients). Until it's on for your account, every request returns `403 not_enabled`. Email [support@outboundlegal.com](mailto:support@outboundlegal.com) to turn it on.
</Info>

## Base URL

```
https://app.outboundlegal.com/api/v1
```

All requests and responses are JSON. Responses are never cached.

## Authentication

Create a key in **Settings → Integrations → API keys** (see [API keys](/help/api-keys)). The account owner creates keys; teammate logins can't. The key is shown once.

Send it on every request as a Bearer token:

```bash theme={null}
curl https://app.outboundlegal.com/api/v1/me \
  -H "Authorization: Bearer obl_your_key_here"
```

A key looks like `obl_` followed by 43 letters, numbers, `-` or `_`.

A key stops working when:

* it's revoked in Settings,
* the account's access is suspended, or
* the login that made it becomes a view-only teammate login.

Use [`GET /me`](/api-reference/account/check-your-key) to check a key. It returns the account the key belongs to.

## Rate limit

**120 requests per minute per key.** Over that, you get `429 rate_limited` with a `Retry-After` header: the number of seconds to wait before trying again.

## Errors

Every error has the same shape:

```json theme={null}
{ "error": { "code": "invalid_request", "message": "limit must be a whole number from 1 to 100." } }
```

Branch on `code`; it doesn't change. `message` is a sentence for a person and may change.

| HTTP | `code` | What it means |
| - | - | - |
| 400 | `invalid_request` | A parameter or the body isn't right. The message says what to fix. |
| 401 | `unauthorized` | No key, a badly formed key, or a key that isn't valid or was revoked. |
| 403 | `forbidden` | The account's access is suspended, or the key belongs to a view-only login. |
| 403 | `not_enabled` | The API isn't turned on for this account yet. |
| 403 | `bundle_required` | `GET /prospects` needs the digital bundle. |
| 404 | `not_found` | `POST /cases/settled`: no client has that `external_id`, and no name was sent to add one. |
| 409 | `conflict` | `POST /cases/settled`: the client matched by name and address has a different `external_id`, or there's no ZIP to tell same-name clients apart. |
| 409 | `cursor_stale` | `GET /prospects`: your county access changed since this cursor was issued. Start again without a cursor. |
| 429 | `rate_limited` | Over 120 requests a minute. Wait `Retry-After` seconds. |
| 500 | `internal` | Something went wrong on our side. Try again shortly. |

`POST /clients` handles a batch, so problems with single clients don't fail the request. Each client gets its own result with a `status` of `created`, `updated`, `conflict` or `error` (with a `message`).

## Matching clients

A client is found by `external_id` (the client's id in your case system), otherwise by **name + street address + ZIP** — all three. Send `external_id` whenever you have it.

* Blank or missing fields never erase what's saved.
* `do_not_mail` can be turned on through the API, never off. Turning it off is done by a person, on the client's record.
* A client who already has a *different* `external_id` (the same person, another matter) is reported as a `conflict` instead of being merged.
* When a client's `settled_on` changes, `new_settlement` says whether it's a new settlement (may get another thank-you letter) or a correction. It defaults to `false` on `POST /clients` and `true` on `POST /cases/settled`.

## Paging

`GET /clients` and `GET /prospects` (with `order=oldest`) return a page of results and a `next_cursor`. Pass `next_cursor` back as `cursor` until it's `null`. Treat cursors as opaque strings.

* A client change shows up in `GET /clients` about a minute after it's saved.
* A prospect shows up in `GET /prospects` about an hour after it's added. This delay is what lets paging never skip a row.

## Prospects are cold leads

`GET /prospects` returns the same prospects you see on your Prospects pages: your counties and your dates. Each one is a **cold lead** — a person who **has not contacted your firm**. Every record says so with `"lead_type": "cold"` and `"source": "OutboundLegal"`. Keep them separate from people who reached out to you.

* `email` and `phone` are included only if your account also has contact enrichment.
* Fields you can't see in the app are left out of the API too.
* If your county access changes (a county added, earlier dates opened), an old cursor gets `409 cursor_stale`. Start again without a cursor.
* Re-syncing from the start about once a week is a good habit. Matching on `id` keeps it from creating duplicates.
* `order=newest` returns the newest prospects from the last 30 days, up to 500 at once, with no cursor. It's meant for polling tools, like Zapier, that skip ids they've already seen.

### The digital bundle

`GET /prospects` is part of the **digital bundle**. Without it, the request returns `403 bundle_required`. The client endpoints don't need the bundle. To add it, email [support@outboundlegal.com](mailto:support@outboundlegal.com).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.