Developer Guide: Navigating Exotel's Programmable Voice APIs
6 min
exotel offers three primary programmable voice api families— voice apis , exoml , and leadassist each suite caters to distinct execution patterns, control models, and ui dependencies this guide helps developers select the right integration path based on architectural requirements, call flow complexity, and privacy needs architectural overview api suite control model call flow definition core purpose voice apis server initiated (push) dashboard / app bazaar ui triggering outbound calls, pulling cdrs, simple click to call exoml event driven (webhooks) pure code (no ui dependency) programmatic call flows, dynamic ivrs, leg level manipulation leadassist managed proxy allocation managed rules privacy safe 2 party proxy calls, virtual number masking api selection decision tree flowchart td start(\["what is the core voice requirement?"]) start > outbound\["outbound call triggering"] start > flow\["ui free call flow construction"] start > privacy\["privacy & number masking"] outbound > voicev1\["voice api\<br/>• rest post calls\<br/>• ui/app bazaar triggers\<br/>• post call cdr syncing"] flow > exoml\["exoml \<br/>• code driven ivr flows\<br/>• leg level call manipulation\<br/>• dynamic branching & ai"] privacy > leadassist\["leadassist api\<br/>• proxy allocations\<br/>• expiry timers\<br/>• pin verification"] style start fill #2d3748,color #fff,stroke #1a202c style voicev1 fill #38a169,color #fff,stroke #2f855a style exoml fill #805ad5,color #fff,stroke #6b46c1 style leadassist fill #3182ce,color #fff,stroke #2b6cb0 1\ voice v1 apis rest driven triggering & reporting the voice v1 api suite provides a restful interface to trigger outbound calls and extract historical call data without maintaining active state on your backend during the call sequencediagram autonumber participant app as your application participant exotel as exotel platform participant pstn as customer / pstn participant webhook as your webhook endpoint app >>exotel rest http post (/calls/connect) activate exotel exotel >>app 200 ok (call sid) exotel >>pstn dial outbound call exotel >>webhook statuscallback webhook (in progress, completed) deactivate exotel key capabilities click to call programmatically initiates a connection between two phone numbers using an exophone virtual number flow triggering triggers outbound calls that drop recipients into pre configured graphical ivr flows created in exotel's app bazaar ui reporting & recordings synchronously fetches call detail records (cdrs), recording urls, and telecom circle metadata when to use outbound transactional calls, crm click to call buttons, and post call analytics ingestion when not to use when call routing needs to be constructed and altered dynamically in code during an active call 2\ exoml apis programmatic call flow engine exoml (exotel markup language) eliminates reliance on dashboard based visual ivr builders it allows developers to construct, version control, and execute entire call flows directly in code via webhooks and xml verbs sequencediagram autonumber participant caller as caller (leg a) participant exotel as exotel engine participant app as your backend (flow engine) participant destination as callee (leg b) caller >>exotel incoming call / event activate exotel exotel >>app http webhook request (call state / leg event) activate app note over app code constructs flow logic dynamically\<br/>without graphical ui rules app >>exotel exoml response (\<gather>, \<dial>, \<say>) deactivate app rect rgb(240, 248, 255) note over exotel, destination leg level manipulation exotel >>destination dial leg b / execute leg instructions exotel >>caller play audio / collect dtmf on leg a end deactivate exotel key capabilities ui free flow construction build complex multi stage ivrs completely within your application logic and git repositories leg level manipulation target instructions to specific call legs asynchronously—placing individual callers on hold, executing targeted audio prompts, or performing warm agent transfers dynamic runtime branching route calls conditionally based on live database lookups, customer state, or dynamic dtmf keypresses real time media & ai streaming pipe audio to external websocket streams for live transcription or generative ai voice assistant integration when to use dynamic ivrs built inside code, applications requiring granular leg level orchestration, and ai voicebot streaming when not to use basic outbound triggers where a fixed visual dashboard flow or standard 2 party connection is sufficient 3\ leadassist apis privacy proxy & masked communication leadassist is a domain specific api engine designed to manage masked communications between two parties without exposing personal phone numbers sequencediagram autonumber participant app as your server participant leadassist as leadassist engine participant driver as party a (driver) participant customer as party b (customer) app >>leadassist rest post /greenpin (create session allocation) leadassist >>app 200 ok (assigned exophone number) note over driver,customer call phase (active delivery window) driver >>leadassist dials assigned exophone number activate leadassist leadassist >>customer bridges call anonymously deactivate leadassist key capabilities dual sided masking hides phone numbers for both caller and recipient using a shared virtual exophone dynamic expiry sets custom lifespans on number mappings (e g , active only for a 30 minute delivery window) greenpin verification restricts connection access via optional dynamic pin verification prompts when to use rideshare apps, last mile delivery, and two sided buyer/seller marketplaces when not to use internal contact centers, general ivrs, or standard business telephony calls
