API reference / Track results
Proof of delivery
Every voice send that reaches a voicemail system gets proof of delivery: a recording of the whole call, from the voicemail greeting through your message. That covers ringless voicemail, voice broadcasts and AI calls, on every account, BYOC included. Use it to settle a dispute about whether a message was left, or to share it with a client.
The result carries it as proof_of_delivery_url. It's available for 7 days.
Which sends have it
| Send | Outcome | The recording contains |
|---|---|---|
| Ringless voicemail, voice broadcast or AI call | 0 (Success), when a voicemail system answered |
The recipient's voicemail greeting, then your message |
| Ringless voicemail, voice broadcast or AI call | 4001 (VoiceMail Not Setup) |
The carrier saying the mailbox isn't set up |
| Ringless voicemail, voice broadcast or AI call | 4002 (VoiceMail Full) |
The carrier saying the mailbox is full |
| AI call, when the agent's Record calls setting is on | 0, when a person answered |
The whole conversation |
Otherwise, when a person picks up a voice broadcast or AI call, there's no
recording, and the call's reason_code is your record of how it went. Texts
and emails report delivery through their own status events.
Recording is best effort. If no recording was saved, the result has no link, or its link never becomes ready.
Get a link that plays
The link can appear in three places:
| Where | When it plays |
|---|---|
contact.rvm.receipt webhook |
Always. It fires once per send, when the recording is saved. |
contact.rvm.status webhook, in data.proof_of_delivery_url |
Only if the recording was saved before the status was sent. Otherwise, wait for the receipt. |
callback_url body |
Same as the status webhook |
Ringless voicemail, voice broadcasts and AI calls all report on these same
events. To get a link that plays the first time, subscribe to
contact.rvm.receipt. It carries the same fields as the status event, plus
receipt_ready_at:
{
"event": "contact.rvm.receipt",
"data": {
"drop_id": "fe3face6-ab9d-40e8-bf24-7d911cbf4ce8",
"contact_id": "5a4b3c2d-1e0f-4a9b-8c7d-6e5f4a3b2c1d",
"to": "+13125550142",
"status": "failure",
"reason": "VoiceMail Full",
"reason_code": 4002,
"proof_of_delivery_url": "https://api-v2.dropcowboy.com/campaign/public/receipts/MmEX1fWLLQRmf68M1Yg82jkHN3-P7y8VyDxXhnyHA50",
"receipt_ready_at": "2026-03-20T15:05:12.000Z"
}
}
The example is trimmed. See Webhooks for every event.
Open a link
The link is GET /campaign/public/receipts/{token}. It needs no API key: the
URL is the credential, so share it only with people who should hear the
recording. A browser, curl or your CRM can open it. Each play is logged.
| Response | What to do |
|---|---|
302 |
Follow the redirect to the audio. The audio URL lasts a few minutes, so fetch it now and don't store it. |
404 with "error": "not_ready" |
The recording isn't saved yet. Wait the Retry-After seconds and try again. |
410 with "error": "expired" |
The link has expired. Within 7 days of the call you can get a new one. |
404 with "error": "not_found" |
No such link. An expired link also gives this a week after it expired. |
429 |
Too many requests. Wait and try again. |
Error bodies are {"error": "...", "message": "..."}. Every response has
Cache-Control: no-store and Referrer-Policy: no-referrer.
Keep the recording
Proof of delivery is available for 7 days after the call, for every account. After that no link plays it and no new link can be issued. To keep a recording, download the audio from the redirect within 7 days and store it in your own system.
Get a new link
A link lasts 7 days and never past the 7-day window. For a fresh one, call
GET /campaign/public/deliveries/{drop_id}/receipt with the campaigns:read
scope. This works for 7 days after the call.
curl https://api-v2.dropcowboy.com/campaign/public/deliveries/b3e7a1c9-8d5f-4b2e-9a6c-1f4d7b3e8a52/receipt \
-H "x-key: $DC_KEY" -H "x-secret: $DC_SECRET"
{
"data": {
"drop_id": "b3e7a1c9-8d5f-4b2e-9a6c-1f4d7b3e8a52",
"reason_code": 0,
"proof_of_delivery_url": "https://api-v2.dropcowboy.com/campaign/public/receipts/-YxvnF06aASt5iho2aZmGbb4l2ToOnZW1JI-1Bc8Bbg",
"expires_at": "2026-03-27T15:05:00.000Z",
"receipt_ready_at": "2026-03-20T15:05:12.000Z"
},
"meta": { "request_id": "10b2b730-6b5b-480d-8164-69b7f95e895e" }
}
Each call issues a new link, and earlier links keep working until they
expire. receipt_ready_at is null while the recording isn't saved yet. A
send with no proof of delivery, one more than 7 days old, or one on another
account answers 404.
Common problems
- The link answers
not_ready. Wait forcontact.rvm.receipt, or retry afterRetry-After. See The proof of delivery link answers 404. - A result has no link. Check it against Which sends have it. See A result has no proof of delivery.
- The greeting on the recording isn't your contact's. The number may now belong to someone else. See The voicemail shows success but the contact says they didn't get it.
Ringless voicemail technology delivers messages directly to voicemail inboxes. Delivery success depends on carrier compatibility, device type, and recipient settings. While designed for voicemail delivery, technical factors may affect performance. Drop Cowboy does not guarantee delivery rates or specific outcomes.