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.

OperationMethod and pathMinimum role
Get compliance settingsGET /compliance/settingsviewer
Update compliance settingsPATCH /compliance/settingsadmin
List suppressed numbersGET /suppression-listviewer
Add suppressed numbersPOST /suppression-listadmin
Upload suppressed numbersPOST /suppression-list/uploadadmin
Remove a suppressed numberDELETE /suppression-list/{phone_number}admin
Get do-not-disturb statusGET /compliance/dndviewer
Upload a do-not-disturb listPOST /compliance/dnd/uploadadmin
Clear the do-not-disturb listDELETE /compliance/dndadmin
Check numbers against the registryPOST /compliance/dnd/checkadmin
Get account settingsGET /user/settingsviewer
Update account settingsPATCH /user/settingsadmin

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

text
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

bash
curl https://api.sevennadi.si/compliance/settings \
  -H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"

Response 200 OK

json
{
  "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"
}
FieldMeaning
require_ai_disclosureOutbound calls that have no disclosure of their own get a default "this is an automated call from an AI assistant" line.
require_consentBatch rows need a truthy consent column, or they are not called.
max_daily_attempts_per_numberOutbound attempts per number per day in the workspace's time zone. 0 means no cap. The default is operator-configured.
pii_redactionDefault for agents that do not set their own: off, mask or strict.
timezoneIANA name, used for the daily cap and for calling hours when the number's country does not decide.
dnd_checkoff, block (registered numbers are not called) or warn (they are called and the call carries a warning).
dnd_registryRead-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.

ParameterInTypeRequiredDescription
require_ai_disclosurebodybooleannoSee above.
require_consentbodybooleannoSee above.
max_daily_attempts_per_numberbodyintegerno0 (no cap) to 50.
pii_redactionbodystringnooff, mask or strict.
timezonebodystringnoAn IANA time zone name.
dnd_checkbodystringnooff, block or warn. Anything but off needs a configured registry.

Request

bash
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

StatusMessage
400Unknown setting foo: one of require_ai_disclosure, require_consent, max_daily_attempts_per_number, pii_redaction, timezone, dnd_check
400require_consent must be true or false (also for require_ai_disclosure)
400max_daily_attempts_per_number must be an integer from 0 (no cap) to 50
400pii_redaction must be off, mask or strict
400dnd_check must be off, block or warn
400No do-not-disturb registry is configured on this platform (DND_REGISTRY)
400timezone 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.

ParameterInTypeRequiredDescription
page_numberqueryintegernoFrom 1. Default 1.
page_sizequeryintegerno1 to 500. Default 50.

Request

bash
curl "https://api.sevennadi.si/suppression-list?page_size=50" \
  -H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"

Response 200 OK

json
{
  "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

StatusMessage
400page_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.

ParameterInTypeRequiredDescription
phone_numberbodystringone ofA single number.
phone_numbersbodyarray of stringsone ofSeveral numbers. Takes precedence over phone_number.
reasonbodystringnoStored with every number in the request.

Request

bash
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

json
{"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

StatusMessage
400phone_number or phone_numbers is required
400Invalid 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.

ParameterInTypeRequiredDescription
filebody (multipart form)fileyesA UTF-8 CSV.

Request

bash
curl -X POST https://api.sevennadi.si/suppression-list/upload \
  -H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef" \
  -F "file=@do-not-call.csv"

Response 201 Created

json
{"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

StatusMessage
400The file must be a UTF-8 CSV
400The 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.

ParameterInTypeRequiredDescription
phone_numberpathstringyesThe number. URL-encode the + as %2B.

Request

bash
curl -X DELETE https://api.sevennadi.si/suppression-list/%2B919876500000 \
  -H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"

Response 200 OK

json
{"message": "success", "phone_number": "+919876500000"}

Errors

StatusMessage
404Number 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:

RegistryWhat it checks
mockDevelopment only: numbers ending 9999 count as registered. In production it counts as no registry.
fileThe numbers this workspace uploaded, plus an optional operator-wide list.
noneNo 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

bash
curl https://api.sevennadi.si/compliance/dnd \
  -H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"

Response 200 OK

json
{"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.

ParameterInTypeRequiredDescription
filebody (multipart form)fileyesUTF-8 text, at most 20 MB and 500,000 numbers.
replacequerybooleannotrue replaces the whole list. Default false (numbers are added).

Request

bash
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

json
{"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

StatusMessage
400The file must be a UTF-8 CSV
400At most 500000 numbers per upload
413The 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

bash
curl -X DELETE https://api.sevennadi.si/compliance/dnd \
  -H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"

Response 200 OK

json
{"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.

ParameterInTypeRequiredDescription
phone_numbersbodyarray of stringsyes1 to 1000 numbers.

Request

bash
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

json
{
  "registry": "mock",
  "results": {"+919876500000": "clear", "+919876509999": "registered"}
}

The keys of results are the normalised numbers.

Errors

StatusMessage
400phone_numbers must be a list of 1 to 1000 numbers
503No 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

bash
curl https://api.sevennadi.si/user/settings \
  -H "Authorization: Bearer vk-0123456789abcdef0123456789abcdef"

Response 200 OK

json
{"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.

ParameterInTypeRequiredDescription
restrict_to_verified_numbersbodybooleanyestrue to allow calls only to verified numbers.

Request

bash
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

json
{"restrict_to_verified_numbers": true}

Errors

StatusMessage
400Unknown setting foo
400restrict_to_verified_numbers must be true or false