For developers and CRM teams

Connect TaskVox to your CRM, website or app

Two things do all the work: the API lets your system start AI calls, and a webhook brings the result of every call back to your system. This page shows when to use each, where to set them up in your dashboard, and exactly what to paste where.

The idea in 30 seconds

Your system and TaskVox talk in both directions. The API is the request you send; the webhook is the reply TaskVox sends back when the call is over.

API or webhook? Pick by what you want to happen

If the action starts on your side, use the API. If you want to know when something has happened on TaskVox, use a webhook.

I want to…UseHow
Call every new website / ad lead automaticallyAPIPOST /api/campaigns with the lead’s number and "autoStart": true
Send today’s list from my CRM for callingAPIOne POST /api/campaigns with all the numbers
Update the lead in my CRM after every callWebhookSubscribe to call.completed
Know when a whole campaign has finishedWebhookSubscribe to campaign.completed
Alert my team when a call failsWebhookSubscribe to call.failed
Pull call history into a report or BI toolAPIGET /api/calls (with campaignId and limit)
Check a number against my do-not-call list firstAPIDo Not Call endpoints in the API reference
Upload a CSV by hand and see results on screenDashboardNo API needed — use Campaigns and Leads in the dashboard

Before you start

Step-by-step setup

1 Create your API key

Dashboard → Account → API Keys
  1. Type a name for the key, for example “CRM production”.
  2. Click + Generate Key.
  3. Copy the key straight away — it is shown only once. It starts with tvx_.

Store it on your server or in your no-code tool’s secret settings. Never put it in website JavaScript or a mobile app: anyone who sees it can place calls on your credits. You can Revoke a key on the same page at any time.

2 Copy the agent ID

Dashboard → Agents → “ID” column

Every call is made by one of your agents. Copy the value in the ID column for the agent that should call (for example sales-agent-01). You can also list them with the API:

curl https://taskvox.in/api/agents \
  -H "X-API-Key: tvx_your_key_here"

3 Start calls with the API

Your system → POST https://taskvox.in/api/campaigns

Send the agent ID and the numbers. Add "autoStart": true so calling begins immediately — without it the campaign is only created and nothing is dialled.

curl -X POST https://taskvox.in/api/campaigns \
  -H "X-API-Key: tvx_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: lead-48213" \
  -d '{
    "name": "Website lead 48213",
    "agentId": "sales-agent-01",
    "numbers": [{ "number": "9198XXXXXXXX", "variables": { "name": "Rahul" } }],
    "autoStart": true
  }'
  • numbers can be plain numbers ("9198XXXXXXXX") or objects with variables — such as the lead’s name — that your agent’s script can use.
  • Idempotency-Key (optional, recommended): use your lead ID, so if your system retries the request the person is not called twice.
  • The response includes the campaign id and "started": true. If it says "started": false, read startError — see Troubleshooting.
  • Calls go out only between 8 am and 8 pm IST, and numbers on your do-not-call list are skipped. A campaign created outside those hours is not started and does not start by itself later — queue such leads and start the campaign after 8 am with POST /api/campaigns/{id}/start.

4 Add your webhook

Dashboard → Account → Webhooks → + Add Webhook
  1. Name — anything, for example “CRM integration”.
  2. Endpoint URL — paste the public address (use https://) where you want results delivered (your server route, or the URL your Zapier / Make step gives you).
  3. Events — tick what you need: call.completed (ticked by default), call.failed, campaign.started, campaign.completed.
  4. Click Create Webhook and copy the secret that appears — you need it to check that deliveries really come from TaskVox.
  5. Click Test next to the webhook. TaskVox sends a sample event ("event": "test") to your URL and shows whether it got through.

5 Receive the result and update your CRM

TaskVox → POST to your Endpoint URL after every call

Each delivery is a JSON POST like this:

{
  "event": "call.completed",
  "timestamp": "2026-10-09T09:57:09.405Z",
  "data": {
    "call_id": "564a5b3e-95db-4e2c-8f73-5a8c35dcf39d",
    "agent_id": "sales-agent-01",
    "campaign_id": "a1b2c3d4",
    "from": "07447154662",
    "to": "9198XXXXXXXX",
    "duration_seconds": 75,
    "turns": 6,
    "status": "answered",
    "transcript": [ { "role": "assistant", "text": "Namaste! …" }, { "role": "user", "text": "…" } ],
    "lead": {
      "label": "hot",
      "score": 82,
      "summary": "Interested in a 2 BHK, budget ₹80 lakh, wants a site visit on Saturday.",
      "collected_fields": { "budget": "₹80 lakh", "timeline": "2–3 months" }
    },
    "recording_url": "https://taskvox.in/api/calls/564a5b3e-95db-4e2c-8f73-5a8c35dcf39d/recording"
  }
}

Before trusting it, check the X-TaskVox-Signature header: it is an HMAC-SHA256 of the raw request body, made with your webhook secret. Then reply 200 quickly and update the CRM:

// Node.js + Express
const crypto = require('crypto');
app.post('/taskvox/webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const expected = crypto.createHmac('sha256', process.env.TASKVOX_WEBHOOK_SECRET)
    .update(req.body).digest('hex');
  const got = req.get('X-TaskVox-Signature') || '';
  if (got.length !== expected.length ||
      !crypto.timingSafeEqual(Buffer.from(got), Buffer.from(expected))) {
    return res.status(401).send('bad signature');
  }
  res.sendStatus(200);                       // reply first…
  const evt = JSON.parse(req.body);          // …then do the work
  if (evt.event === 'call.completed') {
    // find the lead by evt.data.to or by your own ID, save the transcript,
    // and create a follow-up task
  }
});

lead carries the lead label (hot, warm, cold or not_a_lead), score, summary and the answers collected; recording_url downloads the recording with your API key. Its values are null when there was no conversation to analyse, and recording_url is null when no recording exists. The same labels and summaries are on the Leads page in your dashboard, where you can also download them as CSV.

6 Go-live checklist

  • The API key lives only on your server or in your no-code tool.
  • Your webhook replies 200 within a few seconds. A failed delivery is retried after about 1, 5 and 15 minutes; after that it is dropped.
  • You ignore repeats by the X-TaskVox-Delivery header or data.call_id.
  • If you must never miss a result, you also check GET /api/calls on a schedule.
  • You queue leads that arrive after 8 pm and start them after 8 am.

No code? Use Zapier or Make

You do not need a developer to connect TaskVox to Google Sheets, a CRM or WhatsApp alerts. Any automation tool with webhook and HTTP steps works.

Receive results (webhook)

  1. In Zapier, start a Zap with Webhooks by Zapier → Catch Hook (in Make: a Custom webhook trigger). Copy the URL it gives you.
  2. In TaskVox: Account → Webhooks → + Add Webhook, paste that URL as the Endpoint URL, tick call.completed, create it.
  3. Click Test in TaskVox so the tool sees a sample, then map fields such as data.to and data.status into your sheet or CRM.

Start calls (API)

  1. Add a step Webhooks by Zapier → POST (in Make: HTTP → Make a request).
  2. URL https://taskvox.in/api/campaigns, method POST, header X-API-Key with your key, body type JSON.
  3. Body fields: name, agentId, numbers (the lead’s phone) and autoStart = true.

Troubleshooting

What you seeWhyFix
Campaign created, no callsCreated without autoStartSend "autoStart": true, or call POST /api/campaigns/{id}/start
"started": false at nightOutside 8 am – 8 pm ISTStart it after 8 am
startError mentions KYCKYC not approved yetComplete KYC in the dashboard
401Missing or wrong API keySend X-API-Key with a key that is not revoked
402Credit balance is emptyRecharge, then retry
403Read-only key, or an agent from another accountUse a read-write key and your own agent ID
429More than 200 requests a minute on one keySlow down; retry after RateLimit-Reset seconds
Webhook never arrivesURL not reachable from the internet (private or local addresses are blocked), or your server did not answer within 10 secondsUse the Test button; reply 200 first, process after. Failed events are retried after about 1, 5 and 15 minutes
Signature does not matchBody was parsed before checkingCompute the HMAC on the raw body bytes

Questions

What is the difference between the API and a webhook?

The API is how your system talks to TaskVox — for example “call this number now”. A webhook is how TaskVox talks back to your system — “that call just finished, here is what was said”. Most integrations use both: the API to start calls, a webhook to receive results.

Do I need to know coding?

Not necessarily. You can start calls and receive results with no-code tools such as Zapier or Make, using their webhook and HTTP steps. For a custom CRM or website, a developer can connect it in a few hours using the examples on this page.

Where do I get my API key?

In the TaskVox dashboard: Account → API Keys → type a name → Generate Key. The key is shown only once, so copy it straight away and keep it on your server, never in website or app code.

Where do I paste my webhook URL?

In the TaskVox dashboard: Account → Webhooks → + Add Webhook. Enter a name, paste your endpoint URL (a public web address — https:// strongly recommended), choose the events, and click Create Webhook. Copy the secret shown after creation.

Why are my API calls not going out?

The usual reasons: the campaign was created without "autoStart": true; it is outside 8 am – 8 pm IST; your credit balance is empty (error 402); or your account’s KYC is not approved yet. The API response tells you which.

Will I get a webhook if my server is down?

Yes, within limits. If your endpoint does not answer with a 2xx within 10 seconds, TaskVox sends the same event again after about 1, 5 and 15 minutes — 4 attempts in total. Every attempt carries the same X-TaskVox-Delivery ID, so you can ignore repeats. Reply quickly with a 2xx status; for a longer outage, also check GET /api/calls to fill any gaps.

Ready to connect?

Create a key in your dashboard, or read the full endpoint reference.