Exports
Download your leads and calls as a file.
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.
List your exports
Section titled “List your exports”GET /exports
Needs leads:read and calls:read, on a key for every campaign. A test key has none.
curl -X GET 'https://v2-api.callview.ai/api/v1/external/exports' \ -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/exports', { 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/exports", 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/exports');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 Your exports
{ "data": [ { "id": "e4d3c2b1-a09f-4e8d-9c7b-6a5f4e3d2c1b", "exportType": "leads", "status": "string", "rowCount": 1, "createdAt": "2026-10-06T17:05:20Z", "expiresAt": "2026-10-06T17:05:20Z", "livemode": true } ]}Errors
| Status | Codes |
|---|---|
| 400 | invalid_request |
| 401 | authentication_failed |
| 403 | permission_denied |
| 429 | rate_limited, too_many_concurrent_requests |
| 500 | internal_error |
Make an export file
Section titled “Make an export file”POST /exports
Leads, call history or analytics as a file, with a download link. Needs leads:read and calls:read, on a key for every campaign. A test key gets a sample file.
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 |
|---|---|---|---|
exportType |
string | yes | One of leads / call_history / analytics. |
filters |
object | ||
filters.campaignId |
string (uuid) | ||
filters.startDate |
string | YYYY-MM-DD | |
filters.endDate |
string | YYYY-MM-DD |
curl -X POST 'https://v2-api.callview.ai/api/v1/external/exports' \ -u "$CALLVIEW_KEY_ID:$CALLVIEW_SECRET" \ -H 'Idempotency-Key: postExports-0001' \ -H 'Content-Type: application/json' \ -d '{ "exportType": "call_history", "filters": { "startDate": "2026-10-01", "endDate": "2026-10-06" }}'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/exports', { method: 'POST', headers: { Authorization: `Basic ${auth}`, 'Content-Type': 'application/json', 'Idempotency-Key': randomUUID() }, body: JSON.stringify({ "exportType": "call_history", "filters": { "startDate": "2026-10-01", "endDate": "2026-10-06" } }),});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/exports", auth=(os.environ["CALLVIEW_KEY_ID"], os.environ["CALLVIEW_SECRET"]), headers={"Idempotency-Key": str(uuid.uuid4())}, json={ "exportType": "call_history", "filters": { "startDate": "2026-10-01", "endDate": "2026-10-06", }, }, 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/exports');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'{ "exportType": "call_history", "filters": { "startDate": "2026-10-01", "endDate": "2026-10-06" }}JSON, CURLOPT_HEADER => false,]);$body = curl_exec($ch);echo curl_getinfo($ch, CURLINFO_HTTP_CODE), "\n", $body, "\n";200 The export and its download link
{ "data": { "export": { "id": "e4d3c2b1-a09f-4e8d-9c7b-6a5f4e3d2c1b", "exportType": "leads", "status": "string", "rowCount": 1, "createdAt": "2026-10-06T17:05:20Z", "expiresAt": "2026-10-06T17:05:20Z", "livemode": true }, "downloadUrl": "https://example.com", "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 |