# API reference

> The base URL, how to authenticate, what requests and answers look like, the headers BlueBot reads and sends, and every operation in the API.

The BlueBot API is JSON over HTTPS. You send texts, read every text in and out, look after your Mac and your sending rules, and manage webhooks. Each operation has its own page with its fields, an example in every language, its errors and a **Try it** panel that calls the API with a key you paste in.

The whole API is also one OpenAPI 3.1 file, [`/openapi.v1.json`](https://usebluebot.com/openapi.v1.json), which you can import into Postman or Insomnia or feed to a code generator. [OpenAPI, Postman and Insomnia](https://usebluebot.com/docs/openapi) says how.

## Base URL

`https://usebluebot.com/api`

The docs write each operation relative to `https://usebluebot.com/api`, so `POST /v1/messages` is `POST https://usebluebot.com/api/v1/messages`. Only HTTPS is answered.

## Authentication

Every operation but `GET /v1/status` needs an API key, sent as a bearer token:

```http
Authorization: Bearer bb_live_7Hq2LxW9cVbN3mKpRtYs0aQ4eT6uY8iO1pA3sD
```

Make keys in the dashboard under **Developers → API keys**. A key starts `bb_live_`, ends with a checksum, and is shown once when you make it; BlueBot keeps only a hash. A key carries scopes, and each operation needs one of them, named on its page. A key from a development copy of BlueBot starts `bb_test_`, and the live API refuses it. [API keys and scopes](https://usebluebot.com/docs/concepts/api-keys) covers making, scoping and revoking keys.

Check a key with `GET /v1/me`, which says which account and key a request acts as:

```bash
curl "https://usebluebot.com/api/v1/me" \
  -H "Authorization: Bearer $BLUEBOT_API_KEY"
```

```ts
import BlueBot from '@usebluebot/sdk';

const client = new BlueBot({ apiKey: process.env.BLUEBOT_API_KEY });

const me = await client.me();
console.log(me);
```

```python
import os
from bluebot import BlueBot

client = BlueBot(api_key=os.environ["BLUEBOT_API_KEY"])

me = client.me()
print(me)
```

| You got                                  | It means                                                                      | Do next                                                                                           |
| ---------------------------------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| `200` with your account and `key.scopes` | The key works, and these are its scopes.                                      | Call anything those scopes allow.                                                                 |
| `401 unauthorized`                       | No key, a mistyped key, a revoked key, or a header that isn't `Bearer <key>`. | Copy the key again or make a new one. [unauthorized](https://usebluebot.com/docs/errors/unauthorized)                   |
| `403 insufficient_scope`                 | The key works but lacks `account:read`.                                       | Any operation its scopes allow still works. [insufficient_scope](https://usebluebot.com/docs/errors/insufficient_scope) |

> **Keep keys on a server.** A key can send texts from your number. Never put one in a web page, a phone app or anything else you hand to other people. BlueBot sends no CORS headers, so a browser page can't call the API with a key anyway. For an AI assistant, connect through [MCP](https://usebluebot.com/docs/mcp), which signs in with OAuth.

## Requests

- **JSON in.** Send `Content-Type: application/json` with a JSON body of up to 1 MB. A body sent as anything else is refused with [`unsupported_media_type`](https://usebluebot.com/docs/errors/unsupported_media_type).
- **Uploads** are the one exception: `POST /v1/files` takes `multipart/form-data` with the file in a field named `file`, up to 25 MB.
- **Empty strings count as left out.** A field sent as `""` or only spaces is treated as if you hadn't sent it. Zapier and Make send `""` for every field a step leaves unmapped, so this keeps an unmapped field from failing a send.
- **Phone numbers** can be written the way people type them. `+15555550123`, `5555550123` and `(555) 555-0123` all mean the same US number, and BlueBot answers with E.164 (`+15555550123`). An email address works anywhere a person goes, for iMessage only.
- **Times** go in as ISO 8601 with a zone (`2026-11-14T09:30:00-06:00` or `2026-11-14T15:30:00Z`) and come back in UTC.
- **Ids** are prefixed by kind: `msg_` for a message, `chat_` for a chat, `file_` for a file, `wh_` for a webhook, `evt_` for an event. An id of the wrong kind in a path answers [`not_found`](https://usebluebot.com/docs/errors/not_found).
- **POSTs** take an `Idempotency-Key` header, so a retry never sends twice. [Idempotency](https://usebluebot.com/docs/concepts/idempotency)

## Answers

- **JSON out**, always. Every resource has an `object` field (`"message"`, `"chat"`, `"device"`), so a program can tell what it got.
- **Statuses:** `200` for a read or a change, `201` when something new was made (a text, a file, a webhook, a stop), and `202` for a webhook delivery replayed in the background.
- **Lists** are `{ "object": "list", "data": [...], "has_more": true, "next_cursor": "…" }`, newest first. Send `next_cursor` back as `cursor` for the next page. [Pagination](https://usebluebot.com/docs/concepts/pagination)
- **Refusals** are one shape, `{ "error": { "code", "message", "hint", "doc_url", "request_id" } }`, with a stable `code`. [Errors](https://usebluebot.com/docs/errors)
- **A held text is not a refusal.** A send that can't go yet answers `201` with the message `queued` and a `hold` saying why. [Holds](https://usebluebot.com/docs/concepts/holds)

## Headers

What BlueBot reads:

| Header            | When                               | What it does                                                                                       |
| ----------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------- |
| `Authorization`   | Every request but `GET /v1/status` | `Bearer <key>`.                                                                                    |
| `Content-Type`    | Every request with a body          | `application/json`, or `multipart/form-data` for an upload.                                        |
| `Idempotency-Key` | Any POST                           | 1 to 255 characters. The first answer is kept 24 hours and returned for a retry with the same key. |

What BlueBot sends back:

| Header                | On                                          | What it says                                                                               |
| --------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------ |
| `Request-Id`          | Every answer                                | This request's id, such as `req_1Hq2LxW9cVbN3mKpRtYs0a`.                                   |
| `RateLimit-Limit`     | Every answer to a key                       | Requests the key may make a minute: 120.                                                   |
| `RateLimit-Remaining` | Every answer to a key                       | Requests left this minute.                                                                 |
| `RateLimit-Reset`     | Every answer to a key                       | Seconds until the minute starts again.                                                     |
| `RateLimit-Policy`    | Every answer to a key                       | The limit and its window, `120;w=60`.                                                      |
| `Retry-After`         | A `429`, and a `409` for a key still in use | Seconds to wait before trying again.                                                       |
| `Idempotent-Replayed` | A replayed answer                           | `true` when this is the kept answer to an earlier request with the same `Idempotency-Key`. |
| `Cache-Control`       | Every answer                                | `no-store`.                                                                                |

BlueBot's own apps (Zapier, Make, n8n, Pipedream, the CLI) also send a `BlueBot-Client` header so a text they send records them as its `source`. Your own code doesn't need it, and texts it sends are `source: "api"`.

## Request ids

Every answer has a `Request-Id` header, and every refusal repeats it as `error.request_id`. Log it beside your own record of the call. When you write to support about a request, the id lets a person at BlueBot find it at once; BlueBot logs the route, the status and the time of each request, never its body.

The answer, `404`:

```json
{
  "error": {
    "code": "not_found",
    "message": "There’s no message with that id.",
    "hint": "Check the id. Ids are prefixed by kind, such as `msg_` for a message.",
    "doc_url": "https://usebluebot.com/docs/errors/not_found",
    "request_id": "req_1Hq2LxW9cVbN3mKpRtYs0a"
  }
}
```

## Versions

The version is in the path: this is `/v1`, and there is no version header to send. BlueBot adds to `/v1` without breaking it: new operations, new optional fields, new fields in answers, new event types and new values in lists such as `hold.reason`. Write your code to ignore fields it doesn't know and to treat an unknown value as "something else". A change that would break working code becomes `/v2`, with `/v1` kept running beside it.

Webhook payloads carry `api_version` (now `2026-11-13`), and each webhook keeps the version it was made with, so a new payload shape never surprises a handler you already wrote. [Versioning](https://usebluebot.com/docs/concepts/versioning)

## Before you build on it

- [Holds](https://usebluebot.com/docs/concepts/holds): a text that can't go yet is accepted and waits. Don't retry it.
- [Idempotency](https://usebluebot.com/docs/concepts/idempotency): send an `Idempotency-Key` on every POST.
- [Rate limits](https://usebluebot.com/docs/concepts/rate-limits): 120 requests a minute per key; poll less and listen to webhooks more.
- [Limits](https://usebluebot.com/docs/limits): every cap and what happens at it.
- [Errors](https://usebluebot.com/docs/errors): every code and whether to retry it.

## Every operation

## Messages

Send texts, read them, schedule them and cancel them.

| Operation                                                              | What it does                                                     | Scope           |
| ---------------------------------------------------------------------- | ---------------------------------------------------------------- | --------------- |
| [`GET /v1/messages`](https://usebluebot.com/docs/api/messages/list-messages)                 | [List texts](https://usebluebot.com/docs/api/messages/list-messages)                   | `messages:read` |
| [`POST /v1/messages`](https://usebluebot.com/docs/api/messages/send-message)                 | [Send a text](https://usebluebot.com/docs/api/messages/send-message)                   | `messages:send` |
| [`GET /v1/messages/{id}`](https://usebluebot.com/docs/api/messages/get-message)              | [Get a text](https://usebluebot.com/docs/api/messages/get-message)                     | `messages:read` |
| [`PATCH /v1/messages/{id}`](https://usebluebot.com/docs/api/messages/update-message)         | [Change a scheduled text](https://usebluebot.com/docs/api/messages/update-message)     | `messages:send` |
| [`POST /v1/messages/{id}/cancel`](https://usebluebot.com/docs/api/messages/cancel-message)   | [Cancel a text](https://usebluebot.com/docs/api/messages/cancel-message)               | `messages:send` |
| [`POST /v1/messages/{id}/resolve`](https://usebluebot.com/docs/api/messages/resolve-message) | [Settle an unconfirmed text](https://usebluebot.com/docs/api/messages/resolve-message) | `messages:send` |

## Files

Pictures, video, voice memos and other files to send, and the ones that arrive.

| Operation                                        | What it does                                 | Scope           |
| ------------------------------------------------ | -------------------------------------------- | --------------- |
| [`POST /v1/files`](https://usebluebot.com/docs/api/files/upload-file)  | [Upload a file](https://usebluebot.com/docs/api/files/upload-file) | `messages:send` |
| [`GET /v1/files/{id}`](https://usebluebot.com/docs/api/files/get-file) | [Get a file](https://usebluebot.com/docs/api/files/get-file)       | `messages:read` |

## Chats

Group chats and one-to-one chats the Mac has seen.

| Operation                                        | What it does                             | Scope           |
| ------------------------------------------------ | ---------------------------------------- | --------------- |
| [`GET /v1/chats`](https://usebluebot.com/docs/api/chats/list-chats)    | [List chats](https://usebluebot.com/docs/api/chats/list-chats) | `messages:read` |
| [`GET /v1/chats/{id}`](https://usebluebot.com/docs/api/chats/get-chat) | [Get a chat](https://usebluebot.com/docs/api/chats/get-chat)   | `messages:read` |

## Lookup

Whether a number is on iMessage, from your own history.

| Operation                                          | What it does                                                  | Scope           |
| -------------------------------------------------- | ------------------------------------------------------------- | --------------- |
| [`GET /v1/lookup`](https://usebluebot.com/docs/api/lookup/lookup-number) | [Is this number on iMessage?](https://usebluebot.com/docs/api/lookup/lookup-number) | `messages:read` |

## Device

Your Mac and BlueBot’s own status.

| Operation                                       | What it does                                    | Scope          |
| ----------------------------------------------- | ----------------------------------------------- | -------------- |
| [`GET /v1/device`](https://usebluebot.com/docs/api/device/get-device) | [Get the Mac](https://usebluebot.com/docs/api/device/get-device)      | `account:read` |
| [`GET /v1/status`](https://usebluebot.com/docs/api/device/get-status) | [BlueBot’s status](https://usebluebot.com/docs/api/device/get-status) | None           |

## Settings

The sending rules.

| Operation                                                  | What it does                                                   | Scope           |
| ---------------------------------------------------------- | -------------------------------------------------------------- | --------------- |
| [`GET /v1/settings`](https://usebluebot.com/docs/api/settings/get-settings)      | [Get the sending rules](https://usebluebot.com/docs/api/settings/get-settings)       | `account:read`  |
| [`PATCH /v1/settings`](https://usebluebot.com/docs/api/settings/update-settings) | [Change the sending rules](https://usebluebot.com/docs/api/settings/update-settings) | `messages:send` |

## Stops

People who asked not to be texted.

| Operation                                                  | What it does                                       | Scope            |
| ---------------------------------------------------------- | -------------------------------------------------- | ---------------- |
| [`GET /v1/stops`](https://usebluebot.com/docs/api/stops/list-stops)              | [List the stop list](https://usebluebot.com/docs/api/stops/list-stops)   | `contacts:read`  |
| [`POST /v1/stops`](https://usebluebot.com/docs/api/stops/add-stop)               | [Stop texting somebody](https://usebluebot.com/docs/api/stops/add-stop)  | `contacts:write` |
| [`DELETE /v1/stops/{person}`](https://usebluebot.com/docs/api/stops/remove-stop) | [Text somebody again](https://usebluebot.com/docs/api/stops/remove-stop) | `contacts:write` |

## Events

The last 30 days of events.

| Operation                                           | What it does                                | Scope           |
| --------------------------------------------------- | ------------------------------------------- | --------------- |
| [`GET /v1/events`](https://usebluebot.com/docs/api/events/list-events)    | [List events](https://usebluebot.com/docs/api/events/list-events) | `messages:read` |
| [`GET /v1/events/{id}`](https://usebluebot.com/docs/api/events/get-event) | [Get an event](https://usebluebot.com/docs/api/events/get-event)  | `messages:read` |

## Webhooks

Addresses BlueBot posts events to.

| Operation                                                                                      | What it does                                                          | Scope             |
| ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ----------------- |
| [`GET /v1/webhooks`](https://usebluebot.com/docs/api/webhooks/list-webhooks)                                         | [List webhooks](https://usebluebot.com/docs/api/webhooks/list-webhooks)                     | `webhooks:manage` |
| [`POST /v1/webhooks`](https://usebluebot.com/docs/api/webhooks/create-webhook)                                       | [Make a webhook](https://usebluebot.com/docs/api/webhooks/create-webhook)                   | `webhooks:manage` |
| [`GET /v1/webhooks/{id}`](https://usebluebot.com/docs/api/webhooks/get-webhook)                                      | [Get a webhook](https://usebluebot.com/docs/api/webhooks/get-webhook)                       | `webhooks:manage` |
| [`PATCH /v1/webhooks/{id}`](https://usebluebot.com/docs/api/webhooks/update-webhook)                                 | [Change a webhook](https://usebluebot.com/docs/api/webhooks/update-webhook)                 | `webhooks:manage` |
| [`DELETE /v1/webhooks/{id}`](https://usebluebot.com/docs/api/webhooks/delete-webhook)                                | [Delete a webhook](https://usebluebot.com/docs/api/webhooks/delete-webhook)                 | `webhooks:manage` |
| [`POST /v1/webhooks/{id}/test`](https://usebluebot.com/docs/api/webhooks/test-webhook)                               | [Send a test event](https://usebluebot.com/docs/api/webhooks/test-webhook)                  | `webhooks:manage` |
| [`POST /v1/webhooks/{id}/rotate-secret`](https://usebluebot.com/docs/api/webhooks/rotate-webhook-secret)             | [Rotate the signing secret](https://usebluebot.com/docs/api/webhooks/rotate-webhook-secret) | `webhooks:manage` |
| [`GET /v1/webhooks/{id}/deliveries`](https://usebluebot.com/docs/api/webhooks/list-deliveries)                       | [List deliveries](https://usebluebot.com/docs/api/webhooks/list-deliveries)                 | `webhooks:manage` |
| [`POST /v1/webhooks/{id}/deliveries/{delivery_id}/replay`](https://usebluebot.com/docs/api/webhooks/replay-delivery) | [Send a delivery again](https://usebluebot.com/docs/api/webhooks/replay-delivery)           | `webhooks:manage` |

## Account

Who a key belongs to.

| Operation                                | What it does                          | Scope          |
| ---------------------------------------- | ------------------------------------- | -------------- |
| [`GET /v1/me`](https://usebluebot.com/docs/api/account/get-me) | [Who am I?](https://usebluebot.com/docs/api/account/get-me) | `account:read` |

## Conversations

Your texts grouped by person or group chat, as the inbox shows them.

| Operation                                                                                   | What it does                                                                      | Scope           |
| ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------- |
| [`GET /v1/conversations`](https://usebluebot.com/docs/api/conversations/list-conversations)                       | [List conversations](https://usebluebot.com/docs/api/conversations/list-conversations)                  | `messages:read` |
| [`GET /v1/conversations/{id}`](https://usebluebot.com/docs/api/conversations/get-conversation)                    | [Get a conversation](https://usebluebot.com/docs/api/conversations/get-conversation)                    | `messages:read` |
| [`PATCH /v1/conversations/{id}`](https://usebluebot.com/docs/api/conversations/update-conversation)               | [Mark a conversation read or done](https://usebluebot.com/docs/api/conversations/update-conversation)   | `messages:send` |
| [`GET /v1/conversations/{id}/messages`](https://usebluebot.com/docs/api/conversations/list-conversation-messages) | [List a conversation’s texts](https://usebluebot.com/docs/api/conversations/list-conversation-messages) | `messages:read` |

## Analytics

Texting numbers and the conversations waiting on you.

| Operation                                                | What it does                                         | Scope           |
| -------------------------------------------------------- | ---------------------------------------------------- | --------------- |
| [`GET /v1/analytics`](https://usebluebot.com/docs/api/analytics/get-analytics) | [Get the numbers](https://usebluebot.com/docs/api/analytics/get-analytics) | `messages:read` |

## Contacts

The people you text, their tags and custom fields.

| Operation                                                       | What it does                                          | Scope            |
| --------------------------------------------------------------- | ----------------------------------------------------- | ---------------- |
| [`GET /v1/contacts`](https://usebluebot.com/docs/api/contacts/list-contacts)          | [List contacts](https://usebluebot.com/docs/api/contacts/list-contacts)     | `contacts:read`  |
| [`POST /v1/contacts`](https://usebluebot.com/docs/api/contacts/create-contact)        | [Add a contact](https://usebluebot.com/docs/api/contacts/create-contact)    | `contacts:write` |
| [`GET /v1/contacts/{id}`](https://usebluebot.com/docs/api/contacts/get-contact)       | [Get a contact](https://usebluebot.com/docs/api/contacts/get-contact)       | `contacts:read`  |
| [`PATCH /v1/contacts/{id}`](https://usebluebot.com/docs/api/contacts/update-contact)  | [Change a contact](https://usebluebot.com/docs/api/contacts/update-contact) | `contacts:write` |
| [`DELETE /v1/contacts/{id}`](https://usebluebot.com/docs/api/contacts/delete-contact) | [Delete a contact](https://usebluebot.com/docs/api/contacts/delete-contact) | `contacts:write` |

## Templates

Saved texts with variables.

| Operation                                                          | What it does                                             | Scope           |
| ------------------------------------------------------------------ | -------------------------------------------------------- | --------------- |
| [`GET /v1/templates`](https://usebluebot.com/docs/api/templates/list-templates)          | [List templates](https://usebluebot.com/docs/api/templates/list-templates)     | `messages:read` |
| [`POST /v1/templates`](https://usebluebot.com/docs/api/templates/create-template)        | [Make a template](https://usebluebot.com/docs/api/templates/create-template)   | `messages:send` |
| [`GET /v1/templates/{id}`](https://usebluebot.com/docs/api/templates/get-template)       | [Get a template](https://usebluebot.com/docs/api/templates/get-template)       | `messages:read` |
| [`PATCH /v1/templates/{id}`](https://usebluebot.com/docs/api/templates/update-template)  | [Change a template](https://usebluebot.com/docs/api/templates/update-template) | `messages:send` |
| [`DELETE /v1/templates/{id}`](https://usebluebot.com/docs/api/templates/delete-template) | [Delete a template](https://usebluebot.com/docs/api/templates/delete-template) | `messages:send` |

## Broadcasts

One text to a list of people who asked to hear from you, paced by your Mac.

| Operation                                                                              | What it does                                                                    | Scope           |
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | --------------- |
| [`GET /v1/broadcasts`](https://usebluebot.com/docs/api/broadcasts/list-broadcasts)                           | [List broadcasts](https://usebluebot.com/docs/api/broadcasts/list-broadcasts)                         | `messages:read` |
| [`POST /v1/broadcasts`](https://usebluebot.com/docs/api/broadcasts/create-broadcast)                         | [Send a broadcast](https://usebluebot.com/docs/api/broadcasts/create-broadcast)                       | `messages:send` |
| [`POST /v1/broadcasts/preview`](https://usebluebot.com/docs/api/broadcasts/preview-broadcast)                | [Check a broadcast before sending it](https://usebluebot.com/docs/api/broadcasts/preview-broadcast)   | `messages:read` |
| [`GET /v1/broadcasts/{id}`](https://usebluebot.com/docs/api/broadcasts/get-broadcast)                        | [Get a broadcast](https://usebluebot.com/docs/api/broadcasts/get-broadcast)                           | `messages:read` |
| [`GET /v1/broadcasts/{id}/recipients`](https://usebluebot.com/docs/api/broadcasts/list-broadcast-recipients) | [List a broadcast’s recipients](https://usebluebot.com/docs/api/broadcasts/list-broadcast-recipients) | `messages:read` |
| [`POST /v1/broadcasts/{id}/cancel`](https://usebluebot.com/docs/api/broadcasts/cancel-broadcast)             | [Cancel the rest of a broadcast](https://usebluebot.com/docs/api/broadcasts/cancel-broadcast)         | `messages:send` |

## Sequences

Texts with waits between them that stop when the person replies.

| Operation                                                                       | What it does                                                             | Scope           |
| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | --------------- |
| [`GET /v1/sequences`](https://usebluebot.com/docs/api/sequences/list-sequences)                       | [List sequences](https://usebluebot.com/docs/api/sequences/list-sequences)                     | `messages:read` |
| [`POST /v1/sequences`](https://usebluebot.com/docs/api/sequences/create-sequence)                     | [Make a sequence](https://usebluebot.com/docs/api/sequences/create-sequence)                   | `messages:send` |
| [`GET /v1/sequences/{id}`](https://usebluebot.com/docs/api/sequences/get-sequence)                    | [Get a sequence](https://usebluebot.com/docs/api/sequences/get-sequence)                       | `messages:read` |
| [`PATCH /v1/sequences/{id}`](https://usebluebot.com/docs/api/sequences/update-sequence)               | [Change a sequence](https://usebluebot.com/docs/api/sequences/update-sequence)                 | `messages:send` |
| [`GET /v1/sequences/{id}/enrollments`](https://usebluebot.com/docs/api/sequences/list-enrollments)    | [List a sequence’s people](https://usebluebot.com/docs/api/sequences/list-enrollments)         | `messages:read` |
| [`POST /v1/sequences/{id}/enrollments`](https://usebluebot.com/docs/api/sequences/enroll-in-sequence) | [Add a person to a sequence](https://usebluebot.com/docs/api/sequences/enroll-in-sequence)     | `messages:send` |
| [`GET /v1/enrollments/{id}`](https://usebluebot.com/docs/api/sequences/get-enrollment)                | [Get a person’s run](https://usebluebot.com/docs/api/sequences/get-enrollment)                 | `messages:read` |
| [`POST /v1/enrollments/{id}/cancel`](https://usebluebot.com/docs/api/sequences/cancel-enrollment)     | [Take a person out of a sequence](https://usebluebot.com/docs/api/sequences/cancel-enrollment) | `messages:send` |

## Text Hooks

Addresses that turn any app’s webhook post into a text.

| Operation                                                        | What it does                                                | Scope           |
| ---------------------------------------------------------------- | ----------------------------------------------------------- | --------------- |
| [`GET /v1/hooks`](https://usebluebot.com/docs/api/text-hooks/list-text-hooks)          | [List Text Hooks](https://usebluebot.com/docs/api/text-hooks/list-text-hooks)     | `messages:read` |
| [`POST /v1/hooks`](https://usebluebot.com/docs/api/text-hooks/create-text-hook)        | [Make a Text Hook](https://usebluebot.com/docs/api/text-hooks/create-text-hook)   | `messages:send` |
| [`GET /v1/hooks/{id}`](https://usebluebot.com/docs/api/text-hooks/get-text-hook)       | [Get a Text Hook](https://usebluebot.com/docs/api/text-hooks/get-text-hook)       | `messages:read` |
| [`PATCH /v1/hooks/{id}`](https://usebluebot.com/docs/api/text-hooks/update-text-hook)  | [Change a Text Hook](https://usebluebot.com/docs/api/text-hooks/update-text-hook) | `messages:send` |
| [`DELETE /v1/hooks/{id}`](https://usebluebot.com/docs/api/text-hooks/delete-text-hook) | [Delete a Text Hook](https://usebluebot.com/docs/api/text-hooks/delete-text-hook) | `messages:send` |

## Automations

Keyword auto-replies and the away message.

| Operation                                                                        | What it does                                                         | Scope           |
| -------------------------------------------------------------------------------- | -------------------------------------------------------------------- | --------------- |
| [`GET /v1/automations/rules`](https://usebluebot.com/docs/api/automations/list-keyword-rules)          | [List keyword rules](https://usebluebot.com/docs/api/automations/list-keyword-rules)       | `messages:read` |
| [`POST /v1/automations/rules`](https://usebluebot.com/docs/api/automations/create-keyword-rule)        | [Make a keyword rule](https://usebluebot.com/docs/api/automations/create-keyword-rule)     | `messages:send` |
| [`GET /v1/automations/rules/{id}`](https://usebluebot.com/docs/api/automations/get-keyword-rule)       | [Get a keyword rule](https://usebluebot.com/docs/api/automations/get-keyword-rule)         | `messages:read` |
| [`PATCH /v1/automations/rules/{id}`](https://usebluebot.com/docs/api/automations/update-keyword-rule)  | [Change a keyword rule](https://usebluebot.com/docs/api/automations/update-keyword-rule)   | `messages:send` |
| [`DELETE /v1/automations/rules/{id}`](https://usebluebot.com/docs/api/automations/delete-keyword-rule) | [Delete a keyword rule](https://usebluebot.com/docs/api/automations/delete-keyword-rule)   | `messages:send` |
| [`GET /v1/automations/away`](https://usebluebot.com/docs/api/automations/get-away-message)             | [Get the away message](https://usebluebot.com/docs/api/automations/get-away-message)       | `messages:read` |
| [`PATCH /v1/automations/away`](https://usebluebot.com/docs/api/automations/update-away-message)        | [Change the away message](https://usebluebot.com/docs/api/automations/update-away-message) | `messages:send` |
