Where each /api/capture-call field comes from on the common dialing platforms, how to get the liveness nonce into the live call, and how to hand us the recording. Copy, adapt the placeholders, ship.
Only nonce is required. Everything else is standard call metadata you already have — send what you can; the seal degrades gracefully.
| Field | Where it comes from | Effort |
|---|---|---|
| nonce | POST /api/call/nonce (we issue it) | one call |
| direction | you know it — inbound / outbound / transfer | trivial |
| ani | the consumer number — carrier ANI (inbound) / dialed (outbound) | trivial |
| dnis | the campaign / tracking number that was dialed | trivial |
| attestation | STIR/SHAKEN verstat from your carrier (A / B / C) | platform-dependent |
| consent_script(_id) | the language your IVR/agent presented, or a saved approved script | trivial |
| affirmation_type/value | DTMF keypress, or verbal yes captured by the agent | easy |
| recording_url | a URL to the audio we can fetch (we hash it for you) | easy → medium |
| recording_hash | or SHA-256 you compute locally (keeps audio private) | one shasum |
| authorized_parties | the sellers/buyers you disclosed on the call | trivial |
Recording, two ways. Send recording_url and we fetch the audio and seal its SHA-256 for you — nothing to compute. Or, if you'd rather not share audio, compute the hash yourself and send recording_hash instead: shasum -a 256 call.mp3. Providing a URL additionally unlocks on-demand transcription for Confirm; hash-only Confirm falls back to your approved script.
The nonce is the anti-clone / liveness token — it has to land in the recording. Two patterns, pick whichever your platform supports:
ANI/DNIS: From / To on the call webhook. Attestation: StirVerstat (Twilio) on the inbound webhook. Recording: Twilio hosts it; the media URL is Basic-auth-gated, so either enable public recording URLs or generate a temporary/signed link, then send it as recording_url.
// after the call completes (recordingStatusCallback), in your server:
const nonce = (await fetch("https://www.leadproof.ai/api/call/nonce", {
method: "POST",
headers: { Authorization: "Bearer " + API_KEY }
}).then(r => r.json())).nonce; // (mint at call start; shown here for brevity)
await fetch("https://www.leadproof.ai/api/capture-call", {
method: "POST",
headers: { Authorization: "Bearer " + API_KEY, "content-type": "application/json" },
body: JSON.stringify({
nonce,
direction: "inbound",
ani: req.body.From,
dnis: req.body.To,
attestation: req.body.StirVerstat?.startsWith("TN-Validation-Passed-A") ? "A" : undefined,
consent_script_id: 12, // your approved script
affirmation_type: "dtmf", affirmation_value: req.body.Digits,
recording_url: req.body.RecordingUrl + ".mp3", // we hash it for you
authorized_parties: ["Acme Insurance"]
})
});If your Twilio recordings aren't publicly fetchable, download the media in your callback, shasum -a 256 it, and send recording_hash instead of recording_url.
ANI/DNIS: from / to on the call-control event. Attestation: verstat on the webhook. Recording: point call recording at your own S3 bucket — then recording_url is a URL you fully control (presign it if the bucket is private).
body: JSON.stringify({
nonce,
direction: "inbound",
ani: event.payload.from, dnis: event.payload.to,
attestation: event.payload.verstat === "TN-Validation-Passed-A" ? "A" : undefined,
consent_script_id: 12,
affirmation_type: "dtmf", affirmation_value: dtmfDigits,
recording_url: presignedS3Url, // your bucket → easy to expose
authorized_parties: ["Acme Insurance"]
})ANI/DNIS: phone_number / campaign DID from the dispo/agent API. Recording: lives on your own Asterisk box under the monitor path and is usually already served over Apache — so recording_url is trivial to expose. Attestation: typically unavailable; omit it.
# post-call hook (perl/bash) after the recording is mixed to MP3:
NONCE=$(curl -s -X POST https://www.leadproof.ai/api/call/nonce -H "Authorization: Bearer $API_KEY" | jq -r .nonce)
curl -s https://www.leadproof.ai/api/capture-call -H "Authorization: Bearer $API_KEY" \
-H "content-type: application/json" -d "{
\"nonce\": \"$NONCE\",
\"direction\": \"outbound\",
\"ani\": \"$PHONE_NUMBER\",
\"consent_script_id\": 12,
\"affirmation_type\": \"verbal\", \"affirmation_value\": \"yes\",
\"recording_url\": \"https://your-vici-host/RECORDINGS/$FILENAME.mp3\",
\"authorized_parties\": [\"Acme Insurance\"] }"
# or keep audio private: HASH=$(shasum -a 256 $FILE | cut -d' ' -f1) → send "recording_hash":"$HASH"Convoso: ANI/DNIS and a recording URL come back on the call webhook / reporting API — send the recording URL and we hash it. Ringba: ANI, DNIS, target, and recording URL are all tokens on the call event; a native LeadProof node is on the roadmap so these map with no code. Until then, fire the same capture-call from a Ringba webhook/tag, filling the fields from Ringba's call tokens.
body: JSON.stringify({
nonce,
direction: "inbound",
ani: "[tag:InboundNumber:Number]", // Ringba token
dnis: "[tag:Number:Number]",
consent_script_id: 12,
affirmation_type: "dtmf", affirmation_value: "1",
recording_url: "[tag:Call:RecordingUrl]",
authorized_parties: ["Acme Insurance"]
})The baseline needs only three universal capabilities: record the call, play a prompt or show the agent a code (for the nonce + affirmation), and fire a webhook / make an HTTP call after the call. Mint a nonce at the start, get it into the call, then POST the fields you have. Missing attestation or transcript never blocks a cert — it just lowers the trust score, exactly as designed.
Call API reference →·← back to Setup
LeadOpera™ is a trademark of LeadOpera LLC, a Colorado limited liability company. Its products and services — including LeadProof™ and TermsProof™ — are proprietary and operated through their independent websites; LeadProof™ and TermsProof™ are trademarks of LeadOpera LLC. Unauthorized use of these marks is strictly prohibited. The certification method used by LeadOpera’s products is patent pending. A certificate is a tamper-evident technical record — not a determination of legal or regulatory compliance, validity, or enforceability, and not legal advice.
TrustedForm, Jornaya, Boberdoo, Phonexa, LeadsPedia, Google, Meta, Facebook, Instagram, Twilio, DigiCert, and Sectigo are trademarks of their respective owners; their mention describes interoperability only and does not imply any affiliation with, endorsement by, or sponsorship from those companies.
Press, partnership, and general inquiries: inquiry@leadopera.com
© 2026 LeadOpera LLC. All rights reserved.