API reference
Compliance
Outbound-calling compliance settings, the do-not-call list, the do-not-disturb list and the verified-numbers restriction.
These endpoints control what the platform checks before it places an outbound call: the workspace's compliance settings, its own do-not-call (suppression) list, an uploaded do-not-disturb list, and the account setting that restricts calls to verified numbers. The compliance guide explains how the checks apply to calls, batches and campaigns.
Reading needs the viewer role. Every change, and the do-not-disturb lookup, needs admin. An API key acts as an admin.
| Operation | Method and path | Minimum role |
|---|---|---|
| Get compliance settings | GET /compliance/settings | viewer |
| Update compliance settings | PATCH /compliance/settings | admin |
| List suppressed numbers | GET /suppression-list | viewer |
| Add suppressed numbers | POST /suppression-list | admin |
| Upload suppressed numbers | POST /suppression-list/upload | admin |
| Remove a suppressed number | DELETE /suppression-list/{phone_number} | admin |
| Get do-not-disturb status | GET /compliance/dnd | viewer |
| Upload a do-not-disturb list | POST /compliance/dnd/upload | admin |
| Clear the do-not-disturb list | DELETE /compliance/dnd | admin |
| Check numbers against the registry | POST /compliance/dnd/check | admin |
| Get account settings | GET /user/settings | viewer |
| Update account settings | PATCH /user/settings | admin |
Limitation: No official do-not-disturb registry is integrated. There is no connection to any regulator's registry or scrubbing service. The do-not-disturb check works only against a list the workspace uploads itself (plus an optional list the operator provides), or against a development mock. Keeping an uploaded list current is your responsibility.
Phone number format
Numbers are normalised before they are stored or compared: digits are kept, a leading + is kept, a 10-digit number gets +91, an 11-digit number starting with 0 becomes +91 plus the rest, and a 12-digit number starting with 91 gets a +. Send E.164 (+919876500000) to avoid surprises.
Role errors
Your role (member) can't change compliance settings. It needs admin access; ask an owner or admin of the workspace.
Your role (member) can't change the do-not-call list. It needs admin access; ask an owner or admin of the workspace.
Your role (member) can't change account settings. It needs admin access; ask an owner or admin of the workspace.Compliance settings
Get compliance settings
GET /compliance/settings
Returns the workspace's outbound-calling settings with defaults filled in, plus the name of the do-not-disturb registry the platform can ask.
Auth: API key or session token. Role: viewer and up.
Request
curl https://api.sevennadi.si/compliance/settings \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"Response 200 OK
{
"require_ai_disclosure": false,
"require_consent": false,
"max_daily_attempts_per_number": 3,
"pii_redaction": "mask",
"timezone": "Asia/Kolkata",
"dnd_check": "off",
"dnd_registry": "mock"
}| Field | Meaning |
|---|---|
require_ai_disclosure | Outbound calls that have no disclosure of their own get a default "this is an automated call from an AI assistant" line. |
require_consent | Batch rows need a truthy consent column, or they are not called. |
max_daily_attempts_per_number | Outbound attempts per number per day in the workspace's time zone. 0 means no cap. The default is operator-configured. |
pii_redaction | Default for agents that do not set their own: off, mask or strict. |
timezone | IANA name, used for the daily cap and for calling hours when the number's country does not decide. |
dnd_check | off, block (registered numbers are not called) or warn (they are called and the call carries a warning). |
dnd_registry | Read-only: mock, file, or null when no registry is configured. |
Update compliance settings
PATCH /compliance/settings
Updates the settings you send. dnd_registry is accepted and ignored, so you can send back what you read.
Auth: API key or session token. Role: admin and up.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
require_ai_disclosure | body | boolean | no | See above. |
require_consent | body | boolean | no | See above. |
max_daily_attempts_per_number | body | integer | no | 0 (no cap) to 50. |
pii_redaction | body | string | no | off, mask or strict. |
timezone | body | string | no | An IANA time zone name. |
dnd_check | body | string | no | off, block or warn. Anything but off needs a configured registry. |
Request
curl -X PATCH https://api.sevennadi.si/compliance/settings \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef" \
-H "Content-Type: application/json" \
-d '{"require_consent": true, "max_daily_attempts_per_number": 2}'Response 200 OK
The full settings, as in Get compliance settings.
Errors
| Status | Message |
|---|---|
| 400 | Unknown setting foo: one of require_ai_disclosure, require_consent, max_daily_attempts_per_number, pii_redaction, timezone, dnd_check |
| 400 | require_consent must be true or false (also for require_ai_disclosure) |
| 400 | max_daily_attempts_per_number must be an integer from 0 (no cap) to 50 |
| 400 | pii_redaction must be off, mask or strict |
| 400 | dnd_check must be off, block or warn |
| 400 | No do-not-disturb registry is configured on this platform (DND_REGISTRY) |
| 400 | timezone must be an IANA name, e.g. Asia/Kolkata |
Do-not-call list
The suppression list is the workspace's own do-not-call list. A number on it is never dialled by a call, a batch, a campaign or a website callback.
List suppressed numbers
GET /suppression-list
Lists suppressed numbers, newest first.
Auth: API key or session token. Role: viewer and up.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
page_number | query | integer | no | From 1. Default 1. |
page_size | query | integer | no | 1 to 500. Default 50. |
Request
curl "https://api.sevennadi.si/suppression-list?page_size=50" \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"Response 200 OK
{
"page_number": 1,
"page_size": 50,
"total": 1,
"has_more": false,
"data": [
{"phone_number": "+919876500000", "reason": "asked not to be called", "source": "api", "created_at": "2026-10-13T09:00:00Z"}
]
}source is api or csv for entries added through these endpoints.
Errors
| Status | Message |
|---|---|
| 400 | page_number must be >= 1 and page_size between 1 and 500 |
Add suppressed numbers
POST /suppression-list
Adds one number or a list. Numbers already on the list are skipped.
Auth: API key or session token. Role: admin and up.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
phone_number | body | string | one of | A single number. |
phone_numbers | body | array of strings | one of | Several numbers. Takes precedence over phone_number. |
reason | body | string | no | Stored with every number in the request. |
Request
curl -X POST https://api.sevennadi.si/suppression-list \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef" \
-H "Content-Type: application/json" \
-d '{"phone_numbers": ["+919876500000", "+919876500001"], "reason": "asked not to be called"}'Response 201 Created
{"message": "success", "added": 2, "total_given": 2}added counts the numbers that were new. If any number is invalid the whole request is refused.
Errors
| Status | Message |
|---|---|
| 400 | phone_number or phone_numbers is required |
| 400 | Invalid phone number 12345: use E.164, e.g. +919876543210 |
Upload suppressed numbers
POST /suppression-list/upload
Adds numbers from a CSV file. The file needs a phone_number column (contact_number and mobile_number are accepted too) and may have a reason column. Invalid numbers are reported and skipped; the valid ones are added.
Auth: API key or session token. Role: admin and up.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
file | body (multipart form) | file | yes | A UTF-8 CSV. |
Request
curl -X POST https://api.sevennadi.si/suppression-list/upload \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef" \
-F "file=@do-not-call.csv"Response 201 Created
{"message": "success", "added": 2, "rows": 3, "invalid": ["12345"]}rows counts the non-empty rows read; invalid lists the values that are not valid numbers.
Errors
| Status | Message |
|---|---|
| 400 | The file must be a UTF-8 CSV |
| 400 | The CSV must have a phone_number column |
Remove a suppressed number
DELETE /suppression-list/{phone_number}
Takes a number off the list.
Auth: API key or session token. Role: admin and up.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
phone_number | path | string | yes | The number. URL-encode the + as %2B. |
Request
curl -X DELETE https://api.sevennadi.si/suppression-list/%2B919876500000 \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"Response 200 OK
{"message": "success", "phone_number": "+919876500000"}Errors
| Status | Message |
|---|---|
| 404 | Number is not on the suppression list |
Do-not-disturb list
The do-not-disturb check answers registered or clear for a number. It is used before outbound calls when dnd_check is block or warn. The operator chooses the registry:
| Registry | What it checks |
|---|---|
mock | Development only: numbers ending 9999 count as registered. In production it counts as no registry. |
file | The numbers this workspace uploaded, plus an optional operator-wide list. |
| none | No check is possible; dnd_check cannot be switched on. |
Get do-not-disturb status
GET /compliance/dnd
Returns which registry the platform checks and how many numbers the workspace has uploaded.
Auth: API key or session token. Role: viewer and up.
Request
curl https://api.sevennadi.si/compliance/dnd \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"Response 200 OK
{"registry": "mock", "official_registry": false, "uploaded_numbers": 0, "dnd_check": "off"}official_registry is always false.
Upload a do-not-disturb list
POST /compliance/dnd/upload
Uploads the numbers that are registered do-not-disturb, typically the result of your own scrubbing run. The file is a CSV with a phone_number column (contact_number, mobile_number and number are accepted too), or a plain list with one number per line. The uploaded list is used when the operator's registry is file.
Auth: API key or session token. Role: admin and up.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
file | body (multipart form) | file | yes | UTF-8 text, at most 20 MB and 500,000 numbers. |
replace | query | boolean | no | true replaces the whole list. Default false (numbers are added). |
Request
curl -X POST "https://api.sevennadi.si/compliance/dnd/upload?replace=true" \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef" \
-F "file=@dnd-registered.csv"Response 201 Created
{"message": "success", "added": 1200, "rows": 1203, "invalid": 3, "total": 1200}added counts new numbers, invalid counts values that are not plausible numbers, and total is the size of the list afterwards.
Errors
| Status | Message |
|---|---|
| 400 | The file must be a UTF-8 CSV |
| 400 | At most 500000 numbers per upload |
| 413 | The file is larger than 20 MB |
Clear the do-not-disturb list
DELETE /compliance/dnd
Deletes every number the workspace uploaded.
Auth: API key or session token. Role: admin and up.
Request
curl -X DELETE https://api.sevennadi.si/compliance/dnd \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"Response 200 OK
{"message": "success", "removed": 1200}Check numbers against the registry
POST /compliance/dnd/check
Looks up to 1000 numbers in the configured registry. It changes nothing, but because it is a POST under /compliance it needs the admin role.
Auth: API key or session token. Role: admin and up.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
phone_numbers | body | array of strings | yes | 1 to 1000 numbers. |
Request
curl -X POST https://api.sevennadi.si/compliance/dnd/check \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef" \
-H "Content-Type: application/json" \
-d '{"phone_numbers": ["+919876500000", "+919876509999"]}'Response 200 OK
{
"registry": "mock",
"results": {"+919876500000": "clear", "+919876509999": "registered"}
}The keys of results are the normalised numbers.
Errors
| Status | Message |
|---|---|
| 400 | phone_numbers must be a list of 1 to 1000 numbers |
| 503 | No do-not-disturb registry is configured on this platform (DND_REGISTRY) |
Account settings
Get account settings
GET /user/settings
Returns the account setting that restricts outbound calls to verified numbers.
Auth: API key or session token. Role: viewer and up.
Request
curl https://api.sevennadi.si/user/settings \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"Response 200 OK
{"restrict_to_verified_numbers": false}Update account settings
PATCH /user/settings
Switches the restriction on or off. While it is on, a call to a number that is not verified is refused with 403 and a message that names the numbers to verify.
Auth: API key or session token. Role: admin and up.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
restrict_to_verified_numbers | body | boolean | yes | true to allow calls only to verified numbers. |
Request
curl -X PATCH https://api.sevennadi.si/user/settings \
-H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef" \
-H "Content-Type: application/json" \
-d '{"restrict_to_verified_numbers": true}'Response 200 OK
{"restrict_to_verified_numbers": true}Errors
| Status | Message |
|---|---|
| 400 | Unknown setting foo |
| 400 | restrict_to_verified_numbers must be true or false |