Tata Smartflo
Connect Tata Teleservices Smartflo as your telephony provider for domestic Indian outbound and inbound voice calls with zoxaAI.
What you'll learn
How to connect a Tata Smartflo account to zoxaAI — the two credentials you bring, the one-time setup in the Tata portal, and how outbound and inbound agent calls stream audio to your agent.
Tata Smartflo
Tata Smartflo is Tata Teleservices' cloud telephony platform and a licensed Indian operator. zoxaAI integrates with Smartflo for both outbound and inbound calling using Smartflo's Voice Bot bidirectional audio streaming channel.
Why Smartflo for India
Twilio and other international carriers cannot originate domestic calls within India (DoT/TRAI regulations). Smartflo is a licensed Indian operator, so it is the right choice for calling Indian numbers. If your calls are outside India, use Twilio or another provider instead.
Provider Details
| Feature | Value |
|---|---|
| Provider name | smartflo |
| Audio format | mulaw (G.711 µ-law) |
| Sample rate | 8,000 Hz |
| Media transport | Voice Bot WebSocket (static URL) |
| Outbound API | Click-to-Call Support |
| Call transfer | Blind (cold) transfer — to a registered Smartflo agent (mobile/extension) or department |
| Auto-provisioning | No (configured in the Tata portal) |
How it works
Smartflo streams call audio to a single static WebSocket URL — your agent's "Voice Bot" endpoint — for both directions:
- Outbound: zoxaAI dials your customer through Smartflo's Click-to-Call Support API. When the customer answers, Smartflo bridges the call to your Voice Bot and streams the audio to zoxaAI, which runs your agent.
- Inbound: You point a Smartflo phone number (DID) at your Voice Bot. Incoming calls stream to zoxaAI, which resolves the agent assigned to that number.
zoxaAI gives you one Voice Bot streaming URL per configuration. You paste it into the Tata portal once.
Prerequisites
- A Tata Smartflo account with at least one phone number (DID).
- The following features enabled on your account by your Tata account manager (they are gated by Tata support):
- Channels Hub / Voice Streaming (required for the Voice Bot channel)
- Webhooks (for call lifecycle events)
Support-gated features
Voice Streaming and Webhooks must be turned on by Tata for your account before setup will work. Raise a request with your Tata account manager first. This is the main onboarding step that takes time.
Credentials
| Field | Where to Find It | Sensitive | Required | Description |
|---|---|---|---|---|
| Auth Token | Tata portal → API Connect → API Tokens | Yes | Yes | A portal-generated lifetime API token. Powers number listing, credential validation, and call cost/records. |
| API Key | Tata portal → API Connect → Click to Call Support API | Yes | No | The Click-to-Call Support key whose Destination is your Voice Bot. Required only for outbound calls — leave blank if this account only answers inbound calls. |
Use a portal (lifetime) token
Generate your Auth Token from the Tata portal, not via the login API. Portal tokens do not expire; API-generated tokens expire after 60 minutes.
Setup
Why the order matters
The one thing that trips people up: the API Key (for outbound) can only be created after your Voice Streaming endpoint exists in Tata — and that endpoint needs a URL that zoxaAI only shows after you save the config. So you create the config with just the Auth Token first, then come back and add the key. Follow the steps in order and it's smooth.
Generate your Auth Token (Tata portal)
In the Tata portal: API Connect → API Tokens → Generate token. Copy it. (This is a lifetime token — it does not expire.)
Create the configuration in zoxaAI
Go to Telephony → Add Configuration and select Tata Smartflo. Paste the token into Auth Token, give the configuration a name, and click Save. Leave API Key blank for now.
Copy your Voice Bot streaming URL (zoxaAI)
Open the configuration you just saved and copy the Voice Bot streaming URL shown on the page:
wss://your-domain.com/api/v1/telephony/smartflo/ws?token=<config-token>Add the Voice Streaming endpoint (Tata portal)
Go to Channels → Voice Streaming → Add an Endpoint and fill in:
- Endpoint Name: anything recognizable, e.g.
zoxaAI - Endpoint Type: Static
- Endpoint: the URL you copied in the previous step
- Failover Destination: hangup
- Status: Enabled → Proceed
Generate the Click-to-Call key (Tata portal)
Go to API Connect → Click to Call Support API → Add API Key:
- My Number: select all your DIDs (or just the relevant ones)
- Destination Type: Voice Streaming
- Destination: the endpoint you just created (
zoxaAI)
Click Generate and copy the key.
Add the key to zoxaAI (enables outbound)
Back in zoxaAI: open the config → Edit credentials → paste the key into API Key → Save. Leave the Auth Token untouched.
Add numbers and set a default caller ID (zoxaAI)
Right after you save, zoxaAI opens the new config and fetches the DIDs on your Tata account (you can fetch again any time with Fetch from Tata Smartflo in the Phone Numbers section). Click Add next to the DIDs you want, or Add all. Star one as the default caller ID (used for outbound). To answer inbound calls on a number, edit it and assign an inbound agent.
Route inbound DIDs to the endpoint (Tata portal)
For each number that should be answered by an agent: My Numbers → the DID → Configure Destination → Voice Streaming → your endpoint (zoxaAI). This is what makes Tata stream incoming calls to your agent.
Add lifecycle webhooks (Tata portal) — recommended
Go to API Connect → Webhook and add "Call hangup (Answered)" and "Call hangup (Missed)" pointing to:
https://your-domain.com/api/v1/telephony/smartflo/status-callbackInclude custom_identifier, $call_id, $hangup_cause, $billsec, $recording_url, and $direction in the variable template so call outcomes and cost are recorded (and never-answered outbound calls are closed out).
Done — that's a fully working setup
Outbound: place a call from the agent editor — Tata dials the customer, and on answer your agent speaks. Inbound: call a routed DID — the assigned agent answers.
Outbound Calls
Outbound calls use Smartflo's Click-to-Call Support API. zoxaAI dials the customer; when they answer, the call bridges to your Voice Bot and audio streams to your agent.
| Source | Description |
|---|---|
| Test calls | Place a test call from the agent editor |
| API calls | Use POST /api/v1/call/phone with your API key |
API Key required for outbound
Outbound calls require the Click-to-Call Support API Key on the configuration. Without it, outbound attempts return a clear error. Inbound-only accounts do not need it.
Inbound Calls
Point a DID's Destination at your Voice Streaming endpoint in the Tata portal (My Numbers → Configure Destination → Voice Streaming), then assign an inbound agent to that number in zoxaAI. Incoming calls stream to your agent automatically.
See Inbound Calling for details.
Call transfers
Smartflo supports blind (cold) transfers via the standard transferCall tool. The AI plays your optional custom message, then hands the caller directly to the destination and leaves the call.
| Transfer detail | Value |
|---|---|
| Transfer type | Blind (cold) — no warm/attended transfer available on Smartflo |
| Destination | A registered Smartflo agent (mobile number, extension) or department ID |
record_transfer flag | No effect — Smartflo does not expose per-transfer recording control |
| Portal requirement | The destination must exist as a user/agent (or department) in your Smartflo account |
Mobile destinations are registered automatically
Tata only transfers calls to entities registered in your Smartflo account. For 10-digit mobile destinations, zoxaAI handles this for you: on the first transfer to a new number it automatically creates a phone-only user/agent in your Smartflo account (named zoxa-transfer-<number>, web login blocked) and completes the transfer — later transfers to the same number reuse it. Extensions and department IDs must already exist in your account. If auto-registration fails, the transfer returns destination_not_registered.
Seat limits are managed automatically
Smartflo accounts have a hard agent-seat cap (for example, "Number of Agents for calling: 2/5"). zoxaAI keeps auto-registered destinations ephemeral: entries named Zoxa Transfer <number> are deleted automatically when a call ends (a destination still on a live bridged call is kept and reclaimed by a later sweep), and if a registration ever hits the seat limit, idle entries are swept and the registration retried. Users you created yourself are never touched.
Blind transfer
With a blind transfer the caller is connected to the destination immediately after the AI plays its message. The AI bot leg drops once the transfer is initiated. If the destination is unavailable, the Tata platform handles the failure — the AI is no longer on the call.
Call events & recordings
zoxaAI receives call lifecycle events from the webhooks you configured. Hangup events carry the outcome (answered, missed, busy, failed), duration, hangup cause, and a recording URL, which zoxaAI records against the call. Calls that are never answered (busy / no answer) are captured from these webhook events.
Limitations
| Limitation | Detail |
|---|---|
| Audio format | Fixed at 8 kHz µ-law (Smartflo constraint) |
| Campaign streaming | Not supported by Smartflo yet — bulk outbound campaigns cannot stream to the Voice Bot |
| Number purchase | DIDs are provisioned by Tata; there is no purchase API |
| DID routing | Pointing a DID at the Voice Bot is done in the Tata portal (no API) |
| Warm/attended transfer | Not supported — Smartflo has no attended-transfer primitive |
record_transfer flag | No effect on Smartflo (transfer-recording is not controllable via the Smartflo API) |
Troubleshooting
| Issue | Cause | Solution |
|---|---|---|
| "Fetch from Tata Smartflo" fails | Invalid Auth Token, or API Tokens not enabled | Verify the Auth Token was generated in the Tata portal (API Connect → API Tokens); add numbers manually as a fallback |
Outbound fails with caller_id error | No default caller ID set | In the config's Phone numbers section, star one of your DIDs as the default caller ID |
| Outbound calls fail immediately | No Click-to-Call Support API Key on the configuration | Add the API Key whose Destination is your Voice Bot |
| Call connects but no audio | Voice Bot URL wrong, or Voice Streaming not enabled | Re-copy the exact Voice Bot streaming URL from zoxaAI; confirm Tata enabled Channels Hub / Voice Streaming |
| Inbound calls don't reach the agent | DID not routed to the Voice Bot, or no agent assigned | In the Tata portal set the number's Destination to the Voice Bot; in zoxaAI assign an agent to that number |
| Call outcomes / cost missing | Webhooks not configured or missing custom_identifier | Add the status-callback webhook with the full variable template including custom_identifier |