Compliance
Manage your Do-Not-Call (DNC) registry. Numbers on this list are automatically rejected when PSTN participants are queued through the Calls or Batch API.
Add to DNC List
POST /v1/dncRequest Body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
phone_number | string | Yes | — | Phone number to blocklist. Normalized to E.164 on write — +1 (555) 000-9999 is stored as +15550009999 |
reason | string | No | "API request" | Human-readable reason for blocklisting |
Example Request
curl -X POST https://api.rymi.live/v1/dnc \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number": "+15550009999",
"reason": "Customer opted out via email"
}'Response 201
{
"status": "blocklisted",
"phone_number": "+15550009999"
}Adding a number that is already blocklisted succeeds (the entry is upserted) — the operation is idempotent, so retries are safe.
Errors
| Status | Meaning |
|---|---|
400 | phone_number is missing or not a valid E.164 number |
401 | Missing or invalid API key |
List DNC Entries
GET /v1/dncRetrieve a paginated list of blocklisted phone numbers.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer | 50 | Max records to return (max 500) |
offset | integer | 0 | Records to skip |
Example Request
curl "https://api.rymi.live/v1/dnc?limit=20&offset=0" \
-H "Authorization: Bearer YOUR_API_KEY"Response 200
{
"dnc_entries": [
{
"phone": "+15550009999",
"reason": "Customer opted out via email",
"opt_out_at": "2026-03-01T10:00:00Z"
}
],
"total": 1,
"offset": 0,
"limit": 20
}Response Fields
| Field | Type | Description |
|---|---|---|
phone | string | Blocklisted phone number in E.164 format |
reason | string | Reason for blocklisting |
opt_out_at | string | ISO 8601 timestamp when the entry was added |
Errors
| Status | Meaning |
|---|---|
401 | Missing or invalid API key |
Remove from DNC
DELETE /v1/dnc/:phonePath Parameters
| Parameter | Type | Description |
|---|---|---|
phone | string | Phone number to remove from the DNC list (E.164 format) |
Example Request
curl -X DELETE https://api.rymi.live/v1/dnc/+15550009999 \
-H "Authorization: Bearer YOUR_API_KEY"Response 200
{
"status": "removed",
"phone": "+15550009999"
}Removal is idempotent — deleting a number that isn't on the list still returns 200. The input is normalized to E.164 before matching, so format differences don't prevent removal.
Errors
| Status | Meaning |
|---|---|
401 | Missing or invalid API key |
Bulk Import
POST /v1/dnc/batchAdd up to 1,000 phone numbers to the DNC list in a single request.
Request Body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
phone_numbers | string[] | Yes | — | Array of phone numbers in E.164 format (max 1,000) |
reason | string | No | "Bulk API import" | Shared reason applied to all entries |
Example Request
curl -X POST https://api.rymi.live/v1/dnc/batch \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_numbers": ["+15550009999", "+15550008888", "+15550007777"],
"reason": "Customer opt-out list from CRM export"
}'Response 201
{
"status": "blocklisted",
"count": 3,
"invalid_count": 0,
"invalid": []
}| Field | Type | Description |
|---|---|---|
count | integer | Numbers blocklisted after normalization and de-duplication |
invalid_count | integer | Inputs that failed E.164 validation and were skipped |
invalid | string[] | The skipped inputs, verbatim, so you can correct and resubmit them |
Numbers that fail validation are skipped, not fatal — the batch never fails as a whole. Duplicates (already on the DNC list, or the same number in two formats) are upserted once, so the operation is idempotent.
Errors
| Status | Meaning |
|---|---|
400 | Empty phone_numbers array, more than 1,000 entries, or no valid E.164 numbers in the batch |
401 | Missing or invalid API key |
Check DNC Status
POST /v1/dnc/checkCheck whether one or more phone numbers are on the DNC list without adding them. Useful for pre-flight validation before queuing outbound calls.
Request Body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
phone_numbers | string[] | Yes | — | Array of phone numbers to check (max 500) |
Example Request
curl -X POST https://api.rymi.live/v1/dnc/check \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_numbers": ["+15550009999", "+15551234567"]
}'Response 200
{
"results": [
{ "phone_number": "+15550009999", "normalized": "+15550009999", "blocked": true, "valid": true },
{ "phone_number": "+1 (555) 123-4567", "normalized": "+15551234567", "blocked": false, "valid": true }
],
"blocked_count": 1,
"total_checked": 2
}Response Fields
| Field | Type | Description |
|---|---|---|
results | array | Per-number check results, in input order |
results[].phone_number | string | The phone number exactly as you sent it |
results[].normalized | string | null | E.164 form used for the lookup; null if the input couldn't be parsed |
results[].blocked | boolean | true if the number is on the DNC list |
results[].valid | boolean | false if the input is not a valid phone number (blocked is always false in that case) |
blocked_count | integer | Total numbers found on the DNC list |
total_checked | integer | Total numbers checked |
Errors
| Status | Meaning |
|---|---|
400 | Empty phone_numbers array or exceeds 500 limit |
401 | Missing or invalid API key |
How DNC Filtering Works
When you call POST /v1/calls or POST /v1/calls/batch with PSTN participants, Rymi cross-references the requested numbers against the DNC registry for the authenticated tenant. Both sides are compared in normalized E.164 form, so format differences can't slip past the check. Matching numbers are rejected before queueing with a 400 error stating that one or more (or all) requested numbers are on your Do-Not-Call list.
Bulk Operations
Use POST /v1/dnc/batch to blocklist up to 1,000 numbers at once, and POST /v1/dnc/check to verify numbers before queuing calls.

