Call setup recipes

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.

The fields, and where they come from

Only nonce is required. Everything else is standard call metadata you already have — send what you can; the seal degrades gracefully.

FieldWhere it comes fromEffort
noncePOST /api/call/nonce (we issue it)one call
directionyou know it — inbound / outbound / transfertrivial
anithe consumer number — carrier ANI (inbound) / dialed (outbound)trivial
dnisthe campaign / tracking number that was dialedtrivial
attestationSTIR/SHAKEN verstat from your carrier (A / B / C)platform-dependent
consent_script(_id)the language your IVR/agent presented, or a saved approved scripttrivial
affirmation_type/valueDTMF keypress, or verbal yes captured by the agenteasy
recording_urla URL to the audio we can fetch (we hash it for you)easy → medium
recording_hashor SHA-256 you compute locally (keeps audio private)one shasum
authorized_partiesthe sellers/buyers you disclosed on the calltrivial

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.

Getting the nonce into the call

The nonce is the anti-clone / liveness token — it has to land in the recording. Two patterns, pick whichever your platform supports:

  • IVR / TTS prompt (inbound & automated flows): after mint, speak it — “To confirm, please enter or repeat 4‑8‑1‑2‑0‑3.” The DTMF or spoken digits become your affirmation and the recording proves liveness.
  • Agent reads it (live-agent flows): pop the 6‑digit code on the agent screen; the agent says it and asks the consumer to confirm. Works on any dialer with no telephony changes.

Twilio / SignalWire

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.

Telnyx

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"]
})

VICIdial

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 / Ringba

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"]
})

Any other dialer

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.