---
title: "Send a test RCS message to a workspace's test device (workspace admin)"
description: "Self-serve validation: a workspace admin sends a test RCS to their test device. Because RCS always sends to a contact's own phone (so consent gates + history stay bound to one identity), the device phone is resolved to an EXISTING contact in the workspace — no contact is created (the contacts table has webhook/badge triggers, so auto-create would have side effects). If no contact matches the number, returns sent:false with a clear reason so the admin can add it as a contact first. The send runs the full guardrail chain (RCS_MESSAGING flag, workspace_rcs_config enabled+status, sandbox, DNC, opted_in_sms and configured eligibility tag) via the shared sendRcsTextDirectly path. Non-RCS devices fall back to SMS automatically.\n"
---

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

Path: Channel Automation API › RCS

`POST /api/rcs/workspaces/{workspaceId}/client-test-send`

Self-serve validation: a workspace admin sends a test RCS to their test device. Because RCS always sends to a contact's own phone (so consent gates + history stay bound to one identity), the device phone is resolved to an EXISTING contact in the workspace — no contact is created (the contacts table has webhook/badge triggers, so auto-create would have side effects). If no contact matches the number, returns sent:false with a clear reason so the admin can add it as a contact first. The send runs the full guardrail chain (RCS_MESSAGING flag, workspace_rcs_config enabled+status, sandbox, DNC, opted_in_sms and configured eligibility tag) via the shared sendRcsTextDirectly path. Non-RCS devices fall back to SMS automatically.

## Authentication

- `BearerAuth`, http, header `Authorization`, format `JWT`

## Path parameters

- `workspaceId` (`post/api/rcs/workspaces/workspaceId/client-test-send.path.workspaceId`; string, required)

## Request body

_Optional._

- `phone` (`post/api/rcs/workspaces/workspaceId/client-test-send.phone`; string, optional) — E.164 test device number. Defaults to the saved test_device_phone.
- `body` (`post/api/rcs/workspaces/workspaceId/client-test-send.body`; string, optional) — Message text (max 1600). Defaults to a standard test message.

## Example request

```json
{
  "phone": "string",
  "body": "string"
}
```

## Code samples

### cURL

```bash
curl --request POST \
  --url 'https://api.channelautomation.com/api/rcs/workspaces/<workspaceId>/client-test-send' \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "phone": "string",
  "body": "string"
}
'
```

### TypeScript

```typescript
const url = 'https://api.channelautomation.com/api/rcs/workspaces/<workspaceId>/client-test-send';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json', Authorization: 'Bearer <token>'},
  body: JSON.stringify({phone: 'string', body: 'string'})
};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "https://api.channelautomation.com/api/rcs/workspaces/<workspaceId>/client-test-send"

payload = {
    "phone": "string",
    "body": "string"
}
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer <token>"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
```

## Responses

### 200

Always 200 on a well-formed request. sent:true with a messageSid when sent; sent:false with a reason (no_contact, no_test_phone, dnc, sms_opt_out, rcs_not_approved, etc.) otherwise.

### 400

Invalid phone format.

### 401

Authentication required

#### Example

```json
{
  "error": "Authentication required",
  "success": false
}
```

- `error` (`post/api/rcs/workspaces/workspaceId/client-test-send.response.401.error`; string, optional)
  - example `"Authentication required"`
- `success` (`post/api/rcs/workspaces/workspaceId/client-test-send.response.401.success`; boolean, optional)
  - example `false`

### 403

Workspace admin access required.

### 500

Internal server error

#### Example

```json
{
  "error": "Internal server error",
  "details": "string",
  "success": false
}
```

- `error` (`post/api/rcs/workspaces/workspaceId/client-test-send.response.500.error`; string, optional)
  - example `"Internal server error"`
- `details` (`post/api/rcs/workspaces/workspaceId/client-test-send.response.500.details`; string, optional)
- `success` (`post/api/rcs/workspaces/workspaceId/client-test-send.response.500.success`; boolean, optional)
  - example `false`

### 503

Identity or workspace access verification is temporarily unavailable.


Source: https://developer.channelautomations.com/api/post-api-rcs-workspaces-workspace-id-client-test-send/index.md
