DNC
Your organization’s Do Not Call list.
Every example sends your key ID and secret as CALLVIEW_KEY_ID and CALLVIEW_SECRET (see Keys and authentication). The base address is https://v2-api.callview.ai/api/v1/external.
Is this number on the list?
Section titled “Is this number on the list?”GET /dnc/check
Needs dnc:read.
Parameters
| Name | In | Type | Required | Notes |
|---|---|---|---|---|
phone |
query | string | yes | The number to check, in any common format. URL-encode a leading plus (%2B); an unencoded one arrives as a space and is read as a plus. |
curl -X GET 'https://v2-api.callview.ai/api/v1/external/dnc/check?phone=%2B12125557812' \ -u "$CALLVIEW_KEY_ID:$CALLVIEW_SECRET"const auth = Buffer.from(`${process.env.CALLVIEW_KEY_ID}:${process.env.CALLVIEW_SECRET}`).toString('base64');
const res = await fetch('https://v2-api.callview.ai/api/v1/external/dnc/check?phone=%2B12125557812', { method: 'GET', headers: { Authorization: `Basic ${auth}` },});console.log(res.status, res.headers.get('request-id'));console.log(await res.text());import os
import requests
res = requests.request( "GET", "https://v2-api.callview.ai/api/v1/external/dnc/check?phone=%2B12125557812", auth=(os.environ["CALLVIEW_KEY_ID"], os.environ["CALLVIEW_SECRET"]), timeout=30,)print(res.status_code, res.headers.get("Request-Id"))print(res.text)<?php$ch = curl_init('https://v2-api.callview.ai/api/v1/external/dnc/check?phone=%2B12125557812');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_USERPWD => getenv('CALLVIEW_KEY_ID') . ':' . getenv('CALLVIEW_SECRET'), CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => false,]);$body = curl_exec($ch);echo curl_getinfo($ch, CURLINFO_HTTP_CODE), "\n", $body, "\n";200 The answer. normalizedPhone is the number in E.164 form, as the list stores it; null when the number couldn’t be read (the value as sent was then matched exactly, so onDncList false does not mean it is safe to call).
{ "data": { "phone": "+15550100001", "normalizedPhone": "string", "onDncList": true, "livemode": true }}Errors
| Status | Codes |
|---|---|
| 400 | invalid_request, invalid_phone |
| 401 | authentication_failed |
| 403 | permission_denied |
| 429 | rate_limited, too_many_concurrent_requests |
| 500 | internal_error |
Add a number to the list
Section titled “Add a number to the list”POST /dnc
No campaign of your organization dials it again. Your leads with this number get a lead.opted_out event. Needs dnc:write.
Parameters
| Name | In | Type | Required | Notes |
|---|---|---|---|---|
Idempotency-Key |
header | string | Any string you choose (1 to 255 visible characters), new for each new action. Send the same key again within 24 hours and you get the first answer back instead of a second lead or call. At most 255 characters. |
Body
| Field | Type | Required | Notes |
|---|---|---|---|
phone |
string | yes |
curl -X POST 'https://v2-api.callview.ai/api/v1/external/dnc' \ -u "$CALLVIEW_KEY_ID:$CALLVIEW_SECRET" \ -H 'Idempotency-Key: postDnc-0001' \ -H 'Content-Type: application/json' \ -d '{ "phone": "+12125557812"}'import { randomUUID } from 'node:crypto';
const auth = Buffer.from(`${process.env.CALLVIEW_KEY_ID}:${process.env.CALLVIEW_SECRET}`).toString('base64');
const res = await fetch('https://v2-api.callview.ai/api/v1/external/dnc', { method: 'POST', headers: { Authorization: `Basic ${auth}`, 'Content-Type': 'application/json', 'Idempotency-Key': randomUUID() }, body: JSON.stringify({ "phone": "+12125557812" }),});console.log(res.status, res.headers.get('request-id'));console.log(await res.text());import os, uuid
import requests
res = requests.request( "POST", "https://v2-api.callview.ai/api/v1/external/dnc", auth=(os.environ["CALLVIEW_KEY_ID"], os.environ["CALLVIEW_SECRET"]), headers={"Idempotency-Key": str(uuid.uuid4())}, json={ "phone": "+12125557812", }, timeout=30,)print(res.status_code, res.headers.get("Request-Id"))print(res.text)<?php$ch = curl_init('https://v2-api.callview.ai/api/v1/external/dnc');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_USERPWD => getenv('CALLVIEW_KEY_ID') . ':' . getenv('CALLVIEW_SECRET'), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Idempotency-Key: ' . bin2hex(random_bytes(16))], CURLOPT_POSTFIELDS => <<<'JSON'{ "phone": "+12125557812"}JSON, CURLOPT_HEADER => false,]);$body = curl_exec($ch);echo curl_getinfo($ch, CURLINFO_HTTP_CODE), "\n", $body, "\n";201 Added
{ "data": { "id": "9c8b7a6f-5e4d-4c3b-8a29-1f0e9d8c7b6a", "phone": "+12125557812", "source": "api", "createdAt": "2026-10-06T16:58:04.000Z", "livemode": true }}Errors
| Status | Codes |
|---|---|
| 400 | invalid_request, invalid_phone |
| 401 | authentication_failed |
| 403 | permission_denied |
| 409 | duplicate_dnc_entry, idempotency_mismatch, idempotency_in_progress |
| 429 | rate_limited, too_many_concurrent_requests |
| 500 | internal_error |
| 503 | service_unavailable |
Add up to 100 numbers to the list
Section titled “Add up to 100 numbers to the list”POST /dnc/batch
Each number is added on its own; errors lists the ones that weren’t (bad or already there). Needs dnc:write.
Parameters
| Name | In | Type | Required | Notes |
|---|---|---|---|---|
Idempotency-Key |
header | string | Any string you choose (1 to 255 visible characters), new for each new action. Send the same key again within 24 hours and you get the first answer back instead of a second lead or call. At most 255 characters. |
Body
| Field | Type | Required | Notes |
|---|---|---|---|
phones |
array of string | yes | At most 100 items. |
curl -X POST 'https://v2-api.callview.ai/api/v1/external/dnc/batch' \ -u "$CALLVIEW_KEY_ID:$CALLVIEW_SECRET" \ -H 'Idempotency-Key: postDncBatch-0001' \ -H 'Content-Type: application/json' \ -d '{ "phones": [ "+12125557812", "+13105557845" ]}'import { randomUUID } from 'node:crypto';
const auth = Buffer.from(`${process.env.CALLVIEW_KEY_ID}:${process.env.CALLVIEW_SECRET}`).toString('base64');
const res = await fetch('https://v2-api.callview.ai/api/v1/external/dnc/batch', { method: 'POST', headers: { Authorization: `Basic ${auth}`, 'Content-Type': 'application/json', 'Idempotency-Key': randomUUID() }, body: JSON.stringify({ "phones": [ "+12125557812", "+13105557845" ] }),});console.log(res.status, res.headers.get('request-id'));console.log(await res.text());import os, uuid
import requests
res = requests.request( "POST", "https://v2-api.callview.ai/api/v1/external/dnc/batch", auth=(os.environ["CALLVIEW_KEY_ID"], os.environ["CALLVIEW_SECRET"]), headers={"Idempotency-Key": str(uuid.uuid4())}, json={ "phones": [ "+12125557812", "+13105557845", ], }, timeout=30,)print(res.status_code, res.headers.get("Request-Id"))print(res.text)<?php$ch = curl_init('https://v2-api.callview.ai/api/v1/external/dnc/batch');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_USERPWD => getenv('CALLVIEW_KEY_ID') . ':' . getenv('CALLVIEW_SECRET'), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Idempotency-Key: ' . bin2hex(random_bytes(16))], CURLOPT_POSTFIELDS => <<<'JSON'{ "phones": [ "+12125557812", "+13105557845" ]}JSON, CURLOPT_HEADER => false,]);$body = curl_exec($ch);echo curl_getinfo($ch, CURLINFO_HTTP_CODE), "\n", $body, "\n";200 How many were added
{ "data": { "succeeded": 1, "failed": 1, "errors": [ "string" ], "livemode": true }}Errors
| Status | Codes |
|---|---|
| 400 | invalid_request |
| 401 | authentication_failed |
| 403 | permission_denied |
| 409 | idempotency_mismatch, idempotency_in_progress |
| 429 | rate_limited, too_many_concurrent_requests |
| 500 | internal_error |
| 503 | service_unavailable |
List your Do Not Call list
Section titled “List your Do Not Call list”GET /dnc
Page by page (cursor = the next_cursor you were given). Needs dnc:read.
Parameters
| Name | In | Type | Required | Notes |
|---|---|---|---|---|
cursor |
query | string | ||
limit |
query | integer | Default 50. 1 to 100. |
|
search |
query | string | Part of a phone number. At most 200 characters. |
curl -X GET 'https://v2-api.callview.ai/api/v1/external/dnc' \ -u "$CALLVIEW_KEY_ID:$CALLVIEW_SECRET"const auth = Buffer.from(`${process.env.CALLVIEW_KEY_ID}:${process.env.CALLVIEW_SECRET}`).toString('base64');
const res = await fetch('https://v2-api.callview.ai/api/v1/external/dnc', { method: 'GET', headers: { Authorization: `Basic ${auth}` },});console.log(res.status, res.headers.get('request-id'));console.log(await res.text());import os
import requests
res = requests.request( "GET", "https://v2-api.callview.ai/api/v1/external/dnc", auth=(os.environ["CALLVIEW_KEY_ID"], os.environ["CALLVIEW_SECRET"]), timeout=30,)print(res.status_code, res.headers.get("Request-Id"))print(res.text)<?php$ch = curl_init('https://v2-api.callview.ai/api/v1/external/dnc');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_USERPWD => getenv('CALLVIEW_KEY_ID') . ':' . getenv('CALLVIEW_SECRET'), CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => false,]);$body = curl_exec($ch);echo curl_getinfo($ch, CURLINFO_HTTP_CODE), "\n", $body, "\n";200 A page of entries
{ "data": [ { "id": "9c8b7a6f-5e4d-4c3b-8a29-1f0e9d8c7b6a", "phone": "+12125557812", "source": "api", "createdAt": "2026-10-06T16:58:04.000Z", "livemode": true } ], "meta": { "next_cursor": null, "has_more": false }}Errors
| Status | Codes |
|---|---|
| 400 | invalid_request |
| 401 | authentication_failed |
| 403 | permission_denied |
| 429 | rate_limited, too_many_concurrent_requests |
| 500 | internal_error |
Take a number off the list
Section titled “Take a number off the list”DELETE /dnc/{id}
Needs dnc:write. Be sure the person asked for it; we can call the number again after this.
Parameters
| Name | In | Type | Required | Notes |
|---|---|---|---|---|
id |
path | string (uuid) | yes |
curl -X DELETE 'https://v2-api.callview.ai/api/v1/external/dnc/9c8b7a6f-5e4d-4c3b-8a29-1f0e9d8c7b6a' \ -u "$CALLVIEW_KEY_ID:$CALLVIEW_SECRET"const auth = Buffer.from(`${process.env.CALLVIEW_KEY_ID}:${process.env.CALLVIEW_SECRET}`).toString('base64');
const res = await fetch('https://v2-api.callview.ai/api/v1/external/dnc/9c8b7a6f-5e4d-4c3b-8a29-1f0e9d8c7b6a', { method: 'DELETE', headers: { Authorization: `Basic ${auth}` },});console.log(res.status, res.headers.get('request-id'));console.log(await res.text());import os
import requests
res = requests.request( "DELETE", "https://v2-api.callview.ai/api/v1/external/dnc/9c8b7a6f-5e4d-4c3b-8a29-1f0e9d8c7b6a", auth=(os.environ["CALLVIEW_KEY_ID"], os.environ["CALLVIEW_SECRET"]), timeout=30,)print(res.status_code, res.headers.get("Request-Id"))print(res.text)<?php$ch = curl_init('https://v2-api.callview.ai/api/v1/external/dnc/9c8b7a6f-5e4d-4c3b-8a29-1f0e9d8c7b6a');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'DELETE', CURLOPT_USERPWD => getenv('CALLVIEW_KEY_ID') . ':' . getenv('CALLVIEW_SECRET'), CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => false,]);$body = curl_exec($ch);echo curl_getinfo($ch, CURLINFO_HTTP_CODE), "\n", $body, "\n";200 The entry that was removed
{ "data": { "id": "9c8b7a6f-5e4d-4c3b-8a29-1f0e9d8c7b6a", "phone": "+12125557812", "source": "api", "createdAt": "2026-10-06T16:58:04.000Z", "livemode": true }}Errors
| Status | Codes |
|---|---|
| 400 | invalid_request |
| 401 | authentication_failed |
| 403 | permission_denied |
| 404 | not_found |
| 429 | rate_limited, too_many_concurrent_requests |
| 500 | internal_error |