Create a voice token
Mints a short-lived token for one of your app users. Call this from your backend and return the token to your app, which passes it to the voice client SDK to register. The identity is bound to the given number, or to your default app-call number when omitted, and calls placed by that identity are routed through the bound number. Minting again re-binds the identity, so an identity can move between numbers.
Idempotency-Key?stringUnique key to ensure idempotent request processing. Must be 1-255 alphanumeric characters, hyphens, or underscores. Responses are cached for 24 hours per key per customer.
^[a-zA-Z0-9_-]+$length <= 255x-profile-id?stringProfile UUID to scope the request to a child profile. Only organization API keys can use this header. The profile must belong to the calling organization.
uuidapplication/json- body
Request to mint a voice token for one of your app users
sandbox?booleanSandbox flag - when true, the operation is simulated without side effects Useful for testing integrations without actual execution
identity?stringYour identifier for the app user, such as an agent or account id. Letters, digits, hyphens and underscores only, up to 200 characters.
number?|One of your voice-enabled phone numbers in E.164 format. Calls placed by this identity are routed through that number. Omit to use your default app-call number.
ttl?|Token lifetime in seconds. Defaults to 600 and cannot exceed 3600.
int321 <= value <= 3600Token minted and identity bound to the number
application/json- response
Standard API response envelope for all v3 endpoints
success?booleanIndicates whether the request was successful
data?|nullThe response data (null if error)
error?|nullError details (null if successful)
meta?Metadata about the request and response
curl -X POST 'https://api.sent.dm/v3/voice/tokens' \ -H 'Idempotency-Key: req_abc123_retry1' \ -H 'Content-Type: application/json' \ -d '{ "identity": "agent-42", "number": "+12025550123", "ttl": 600, "sandbox": false}'{ "success": true, "data": { "token": "vt_eyJ2IjoxLCJjaWQiOiIzZjJlMWQwYy05YjhhLTRmN2UtOGQ2Yy01YjRhM2YyZTFkMGMiLCJzdWIiOiJhZ2VudC00MiIsIm51bSI6IiszODM0OTExMTIyMiIsImlhdCI6MTc4NDcyMzA5NiwiZXhwIjoxNzg0NzIzNjk2fQ.0za4u7CrKet0zI8VRUTnpq_rrw0ZxwMCwnC7hXURGWI", "identity": "agent-42", "number": "+12025550123", "expires_at": "2026-07-22T12:34:56+00:00" }, "error": null, "meta": { "request_id": "req_7X9zKp2jDw", "timestamp": "2026-11-12T15:32:26.3040204+00:00", "version": "v3" }}Test a voice number's callback URL POST
Sends a synthetic call.request question, flagged "test": true, to the number's callback URL, signed with that number's real secret, and reports what came back. Use it to build and debug your callback endpoint without placing calls: no call is placed, nothing is billed, and nothing is stored. One attempt with the same deadline as a live call, no retry. The outcome is ok when your endpoint answered 2xx with a valid answer; otherwise it is timeout, connection_failed, http_error or invalid_answer, with the reason and, for an invalid answer, the field at fault. The number is the E.164 value in the path with the plus sign URL-encoded (`%2B`). With `sandbox: true` nothing is sent: the verdict comes back ok with `202` and no request or response in it.
List calls GET
Retrieves a paginated list of your calls, most recent first. Filter by direction, status, the owning number, the mode (inapp, or agent for calls your voice agents answered), the agent that answered, and the time the call started (from and to are inclusive). Use the call webhooks for real-time updates; this list is for looking calls up afterwards.