# CRM · Communications

Part of AppEngine API Documentation. Full index: https://appengine.appmint.io/documentation.md
## GET /crm/communications/sms

**List SMS messages**

`operationId: CommunicationsController_getSmsMessages`

SMS messages sent and received. Distinct from `twilio-sms`, which reads from the provider directly.

#### Signature

```http
GET /crm/communications/sms (startDate?: string, endDate?: string) -> SMS messages
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `GET /crm/communications/twilio-sms`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `offset` | query | number | — | Offset for pagination |
| `limit` | query | number | — | Number of results to return |
| `endDate` | query | string | — |  |
| `startDate` | query | string | — |  |
| `status` | query | any | — | Filter by status (sent, delivered, failed) |
| `to` | query | any | — | Filter by recipient phone number |
| `from` | query | any | — | Filter by sender phone number |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | SMS messages |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /crm/communications/recordings

**List call recordings**

`operationId: CommunicationsController_getVoiceRecordings`

The recordings held for calls.

Call recordings are personal data and in many jurisdictions require consent from both parties. Restrict access and retention accordingly — this endpoint enforces neither.

#### Signature

```http
GET /crm/communications/recordings (startDate?: string, endDate?: string) -> Call recordings
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- Recordings are sensitive personal data. No consent or retention policy is applied here.

#### Errors

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `GET /crm/communications/recordings/{recordingSid}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `offset` | query | number | — | Offset for pagination |
| `limit` | query | number | — | Number of results to return |
| `endDate` | query | string | — |  |
| `startDate` | query | string | — |  |
| `status` | query | any | — | Filter by status |
| `reference` | query | any | — | Filter by call SID reference |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Call recordings |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /crm/communications/twilio-sms

**List SMS from Twilio**

`operationId: CommunicationsController_getSmsMessagesLive`

Reads SMS records **directly from Twilio** rather than from the platform store. Use it to reconcile — to see what the provider recorded independently of what was saved here.

This is a live provider call and counts against Twilio's rate limits.

#### Signature

```http
GET /crm/communications/twilio-sms (startDate?: string, endDate?: string) -> SMS records as Twilio holds them
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- The shape is Twilio's, not the platform's.

#### Errors

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `GET /crm/communications/sms`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `limit` | query | number | — | Number of results to return |
| `to` | query | any | — | Filter by recipient phone number |
| `from` | query | any | — | Filter by sender phone number |
| `number` | query | any | — | Phone number — merges inbound + outbound |
| `startDate` | query | string | — |  |
| `endDate` | query | string | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | SMS records as Twilio holds them |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /crm/communications/voicemails

**List voicemails**

`operationId: CommunicationsController_getVoicemails`

Voicemail messages left for the org.

#### Signature

```http
GET /crm/communications/voicemails (startDate?: string, endDate?: string) -> Voicemails
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `GET /crm/communications/recordings`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `limit` | query | number | — | Number of results to return |
| `callSid` | query | any | — | Filter by call SID |
| `startDate` | query | string | — |  |
| `endDate` | query | string | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Voicemails |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /crm/communications/recordings/{recordingSid}

**Get a call recording**

`operationId: CommunicationsController_getRecording`

Metadata for one recording — duration, participants and whether it has been transcribed.

#### Signature

```http
GET /crm/communications/recordings/{recordingSid} (recordingSid: string) -> Recording metadata
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `404` | NOT_FOUND | Recording not found | No recording has that id. | Check the id against the corresponding list endpoint. |

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `GET /crm/communications/recordings/{recordingSid}/audio`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `recordingSid` | path | string | yes | Provider recording id. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Recording metadata |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Recording not found — No recording has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /crm/communications/recordings/{recordingSid}/audio

**Get recording audio**

`operationId: CommunicationsController_getRecordingAudio`

Streams the audio of a call recording. Handle it as sensitive personal data — do not cache it in a shared location or expose the URL more widely than the recording itself.

#### Signature

```http
GET /crm/communications/recordings/{recordingSid}/audio (recordingSid: string) -> The recording audio
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `404` | NOT_FOUND | Recording not found | No recording has that id. | Check the id against the corresponding list endpoint. |

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `POST /crm/communications/recordings/transcribe`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `recordingSid` | path | string | yes | Provider recording id. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The recording audio |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Recording not found — No recording has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /crm/communications/calls

**List call logs**

`operationId: CommunicationsController_getCallLogs`

Inbound and outbound call records, with duration and outcome.

#### Signature

```http
GET /crm/communications/calls (startDate?: string, endDate?: string) -> Call logs
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `GET /crm/communications/recordings`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `limit` | query | number | — | Number of results to return |
| `endDate` | query | string | — |  |
| `startDate` | query | string | — |  |
| `status` | query | any | — | Filter by call status |
| `to` | query | any | — | Filter by recipient phone number |
| `from` | query | any | — | Filter by caller phone number |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Call logs |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /crm/communications

**List all communications**

`operationId: CommunicationsController_getAllCommunications`

Every communication across channels — SMS, calls and voicemails together. The unified telephony view.

#### Signature

```http
GET /crm/communications (startDate?: string, endDate?: string, page?: integer, pageSize?: integer) -> Communications
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `GET /crm/communications/stats`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `offset` | query | number | — | Offset for pagination |
| `limit` | query | number | — | Number of results to return |
| `endDate` | query | string | — |  |
| `startDate` | query | string | — |  |
| `to` | query | any | — | Filter by recipient phone number |
| `from` | query | any | — | Filter by sender phone number |
| `page` | query | integer | — |  |
| `pageSize` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Communications |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /crm/communications/stats

**Get communication statistics**

`operationId: CommunicationsController_getCommunicationStats`

Aggregate telephony figures — volumes by channel and direction over a period.

#### Signature

```http
GET /crm/communications/stats (startDate?: string, endDate?: string) -> Communication statistics
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `GET /crm/communications`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `endDate` | query | string | — |  |
| `startDate` | query | string | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Communication statistics |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /crm/communications/recordings/transcribe

**Request a transcription**

`operationId: CommunicationsController_requestTranscription`

Requests a transcription of a call recording. Transcription is asynchronous and usually billed per minute — request it deliberately rather than for every call.

#### Signature

```http
POST /crm/communications/recordings/transcribe (body) -> The transcription request result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- Asynchronous — poll the recording for the finished transcript rather than expecting it in this response.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `404` | NOT_FOUND | Recording not found | No recording has that id. | Check the id against the corresponding list endpoint. |

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `GET /crm/communications/recordings/{recordingSid}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

Which recording to transcribe.

```json
{
  "recordingSid": "RE9k2m4h1p7q"
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The transcription request result |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Recording not found — No recording has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /crm/communications/twilio/setup

**Set up a Twilio number**

`operationId: CommunicationsController_setupTwilioNumber`

Configures a phone number for the org — either claiming one you already hold, or **purchasing a new one** when `purchaseNew` is set.

Purchasing incurs a real, recurring charge from Twilio. Use `GET /crm/communications/twilio/available-numbers` to see what is available first, and set `purchaseNew` deliberately.

#### Signature

```http
POST /crm/communications/twilio/setup (body) -> The configured number
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- `purchaseNew: true` spends money and creates an ongoing monthly cost.

#### Errors

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `GET /crm/communications/twilio/available-numbers`
- `GET /crm/communications/twilio/verify`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

Which number to configure, or whether to buy one.

```json
{
  "phoneNumber": "+15551234567"
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Successfully setup Twilio phone number |
| `201` | The configured number |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /crm/communications/twilio/verify

**Verify Twilio setup**

`operationId: CommunicationsController_verifyTwilioSetup`

Checks that the org's Twilio configuration is complete and working. Run this after setup, and first when messages or calls stop arriving.

#### Signature

```http
GET /crm/communications/twilio/verify () -> Verification result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `POST /crm/communications/twilio/setup`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Verification result |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /crm/communications/twilio/available-numbers

**List available phone numbers**

`operationId: CommunicationsController_getAvailablePhoneNumbers`

Numbers available to purchase from Twilio, optionally filtered by area code. Listing costs nothing — buying happens through `twilio/setup`.

#### Signature

```http
GET /crm/communications/twilio/available-numbers (areaCode?: string, country?: string) -> Available numbers
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- Read-only — no number is reserved by listing it, so one shown here can be taken before you buy it.

#### Errors

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `POST /crm/communications/twilio/setup`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `limit` | query | number | — | Number of results to return (default: 20) |
| `contains` | query | any | — | Numbers containing specific digits (e.g., "555") |
| `state` | query | any | — | State/region code to search in (e.g., "TX", "CA", "NY") |
| `zipCode` | query | any | — | ZIP/Postal code to search in (e.g., "75252", "10001") |
| `city` | query | any | — | City name to search in (e.g., "Plano", "Austin") |
| `areaCode` | query | string | — | Preferred area code. |
| `countryCode` | query | any | — | Country code (default: US) |
| `country` | query | string | — | ISO country code. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Available numbers |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /crm/communications/twilio/system-phone

**Get the system phone number**

`operationId: CommunicationsController_getSystemPhone`

The platform-level phone number, as opposed to the org's own. Used where a message must come from the platform rather than the tenant.

#### Signature

```http
GET /crm/communications/twilio/system-phone () -> The system phone number
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

Plus the standard platform errors: `401`, `403`, `429`, `500`.

#### See also

- `GET /crm/communications/twilio/verify`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The system phone number |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

