# Reaching clients

Some requests put something in front of a client: an email, a text, a booking, a form to sign. The
API does these at once, as the broker your key acts as, through the same steps BrokerPlus uses when
the broker clicks the button. The response is the record that the request made or changed, with
`200` or `201`.

A key acts as its broker, so a request from your key is the broker's own request. Make sure your
integration, or the AI assistant that uses it, sends only what the broker wants sent.

## Keep a key from reaching clients

Give the key the [`no_sending` limit](/authentication#limits-on-a-key) when you create it. A key
with that limit gets `403` on every request in the table below, and it can still read and write
everything else. Use it for an integration that has no reason to contact clients, such as a
reporting tool or a sync.

An MCP client sees each of these tools marked as one that reaches people outside BrokerPlus and
cannot be undone, so the client asks its user before it calls one. A key with the `no_sending` limit
doesn't see these tools at all. See [MCP](/mcp).

## What reaches a client

| Request                                                     | What happens                                                      |
| ----------------------------------------------------------- | ----------------------------------------------------------------- |
| `POST /v1/contacts/{id}/messages`                           | One email or text goes to one contact.                            |
| `POST /v1/drafts/{id}/send`                                 | A draft goes out, exactly as it is written now.                   |
| `POST /v1/campaigns/{id}/schedule`                          | A campaign is scheduled for the time you give.                    |
| `POST /v1/automation-runs/{id}/start`                       | A waiting automation run starts now instead of at its time.       |
| `POST /v1/automations/{id}/turn-on`                         | An automation turns on and messages everybody it matches.         |
| `POST /v1/automations/canvases/{id}/turn-on`                | Each automation in the group turns on.                            |
| `POST /v1/lead-forms/{id}/turn-on-auto-reply`               | The form replies to each person who fills it in.                  |
| `POST /v1/automations/stops/{id}/lift`                      | Automations can message the client again.                         |
| `POST /v1/appointments/book`                                | A meeting is booked, and the client gets the confirmation email.  |
| `POST /v1/appointments/{id}/reschedule`                     | A meeting moves to a new time, and the client gets an email.      |
| `POST /v1/appointments/{id}/cancel`                         | A meeting is cancelled, and the client gets an email.             |
| `POST /v1/intakes` with `delivery: "email"`                 | A new intake is emailed to each applicant.                        |
| `POST /v1/intakes/{id}/request-changes`                     | Intake answers are reopened, and the client gets an email.        |
| `POST /v1/deals/{id}/document-requests`                     | Documents are added to the client's portal, with an email.        |
| `POST /v1/deals/{id}/condition-requests`                    | A plain-language letter about conditions goes to one person.      |
| `POST /v1/deals/{id}/generated-documents/{documentId}/send` | A generated letter is emailed to one person on the deal.          |
| `POST /v1/deals/{id}/signing-documents/send`                | Each signer gets one link to the documents to sign.               |
| `POST /v1/deals/{id}/signing-documents/{documentId}/resend` | One signer gets a new signing link.                               |
| `POST /v1/deals/{id}/funding-package/send`                  | The funding package goes out in one envelope.                     |
| `POST /v1/equity-reports/enroll`                            | Recurring equity reports start for each client.                   |
| `POST /v1/equity-reports/resume`                            | Paused equity reports start again.                                |
| `POST /v1/equity-reports/send`                              | One equity report goes to each client now.                        |
| `POST /v1/nps-surveys`                                      | One NPS survey is emailed to one client.                          |
| `POST /v1/pep-forms`                                        | The PEP declaration form is emailed to one client.                |
| `POST /v1/deals/{id}/consent-forms`                         | A consent form is emailed to one borrower on the deal.            |
| `POST /v1/mail-merges`                                      | A separate copy of one email goes to each address on a list.      |
| `POST /v1/deals/{id}/tracker/{stageId}/reach`               | The client sees the stage as reached, and its automations start.  |
| `POST /v1/tracker-stages`                                   | Every client of the team sees the new stage.                      |
| `PATCH /v1/tracker-stages/{id}`                             | Every client of the team sees the changed stage.                  |
| `POST /v1/tracker-stages/reorder`                           | Every client of the team sees the stages in the new order.        |
| `POST /v1/tracker-stages/seed`                              | Every client of the team sees the standard stages.                |
| `PATCH /v1/tracker-stages/note`                             | Clients see the new tracker note.                                 |
| `POST /v1/hub-resources`                                    | One client, or every client, sees the PDF in their hub.           |

Stopping something reaches nobody, so a `no_sending` key can do it: cancelling an automation run,
pausing a campaign, turning an automation off, pausing or stopping equity reports, and stopping
automations for a client.

## Send safely

- **Send an `Idempotency-Key`** with every one of these requests. A retry with the same key returns
  the first result and sends nothing a second time. See [Idempotency](/idempotency).
- **Read the error.** A request that BrokerPlus refuses sends nothing. `412 EMAIL_NOT_CONNECTED` and
  `412 SMS_NOT_CONNECTED` mean the broker has no connected mailbox or phone number. `409 NOT_SENT`
  means the request could not go out as it stands, for example because the time is no longer open.
  `403 FORBIDDEN` means the person your key acts as cannot send this in BrokerPlus either.
  `403 POLICY_BLOCKED` means your brokerage's automation policy does not allow messages to clients
  to be asked for this way.
- **Test in a sandbox first.** A sandbox key sends nothing to anybody, and you can read what it
  would have sent. See [Sandbox](/sandbox).
