API & MCP docs
Sign inGet started

Pixio API & MCP

Everything you do in the Pixio app, your CRM, your scripts and Claude can do too: add leads, run campaigns, ring a number, and read every call.

1Get a key

Sign in, then Settings → Integrations → API keys → Create key. It's shown once; keep it on your server.

2Make a request

Send the key as a bearer token. Phone numbers are 10-digit Indian mobiles; times are IST, like 2026-10-06T18:00.

curl https://pixio.tech/v1/campaigns \
  -H "Authorization: Bearer pk_..."

3Put someone on a list and ring them

Add a lead to a campaign, then ring them now (or start the campaign and the dialer calls them inside its calling hours).

curl -X POST https://pixio.tech/v1/campaigns/3/members \
  -H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
  -d '{"phone": "9876543210", "name": "Rahul"}'

curl -X POST https://pixio.tech/v1/campaigns/3/members/9876543210/call-now \
  -H "Authorization: Bearer pk_..."

Claude (MCP)

Pixio is a remote MCP server: Claude can look up calls and leads, run campaigns and place calls, with the same key. In Claude Code:

claude mcp add --transport http pixio https://pixio.tech/mcp \
  --header "Authorization: Bearer pk_..."

In Claude Desktop, Cursor or any MCP client, add a remote server at https://pixio.tech/mcp with the same header. Then ask: "Who were today's hot leads?", "Read me the last call with 9876543210", or "Add these 20 numbers to the Diwali campaign and start it."

All 21 tools
  • list_callsRecent calls, newest first: who, when, what they want, score (hot/warm/cold), next step, cost.
  • get_callOne call in full: the lead's details, the transcript turn by turn, and timings.
  • search_leadsLeads (each one a deal): who called, was called or enquired on the website, with what they want and their stage (enquiry, callback, follow_up, qualified, won, lost).
  • get_leadOne person: everything they've told us, every call, and the campaigns they're on.
  • update_leadChange a person's name or notes, or move their deal to a stage (won, lost…; "" goes back to automatic).
  • set_opt_outStop (opted_out: true) or allow again (false) every call to this person.
  • list_agentsThe agents (each with its own script and voice) a campaign can use.
  • get_agentOne agent's setup: its business details (name, agent's name, who calls back and how soon, what it offers, cities…), its instructions to the LLM (prompt, with {words} filled in from the details), its fixed lines (greeting, goodbye…) and call settings.
  • update_agent_detailsChange an agent's business details; pass only what changes. Lists (services, cities, events) are replaced whole: read them first with get_agent.
  • update_agent_settingsChange an agent's fixed lines (GREETING_TEXT, FORM_GREETING_TEXT, GOODBYE_TEXT, HEARD_TEXT, HOLD_TEXT, SILENCE_PROMPT_TEXT…; keep their {words}) or call settings (MAX_SENTENCES, VOICE_PACE, USER_AWAY_SEC, MAX_CALL_SEC…), by the names get_agent part=settings lists. Applies from the next call.
  • update_agent_promptReplace an agent's instructions to the LLM with new text (read the current one with get_agent first; keep its {words in braces}). Refused if a {word} can't be filled.
  • set_agent_styleScripted (recorded lines in a set order, the LLM only for odd questions: fastest and cheapest; weddings & events agents only) or free conversation (the LLM writes every reply).
  • get_integrationsThe connected Facebook & Instagram Pages, their lead forms and which campaign each feeds.
  • list_campaignsEvery campaign with its counts (how many queued, called back, qualified...).
  • get_campaignOne campaign: its agent, status, calling hours, retries and counts.
  • create_campaignA new campaign (a draft until you start it). agent: an id from list_agents; default the active one.
  • update_campaignRename a campaign, move it along (draft, testing on its test numbers, running, paused, done), or change when and how often it calls.
  • add_to_campaignPut a person on a campaign's list (they're called once it's running). values: the agent's variables, e.g. {city: 'Delhi'}.
  • list_campaign_leadsThe people on a campaign and what happens next for each.
  • schedule_callWhen a campaign calls someone on its list: at a time (ISO, IST if no zone), or now if no time is given.
  • call_nowRing a number right now (outside any schedule). campaign_id: which campaign's agent and list it's for.

API reference

JSON in, JSON out, under https://pixio.tech/v1, with your key on every request.

Calls

  • GET/callsCall history, newest first: {calls, total}. Filter with ?q, score, direction, agent, campaign, since, until; page with limit and offset
  • GET/calls/{room}One call: what they want, the transcript turn by turn, timings, cost
  • GET/calls/{room}/recordingThe recording (OGG)
  • GET/calls/statsTotals, per day, per agent and per campaign. ?since=&until= (YYYY-MM-DD, IST)
  • POST/callsRing a number now
    Example
    curl -X POST https://pixio.tech/v1/calls \
      -H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
      -d '{"phone": "9876543210", "campaign": 3}'

Leads

  • GET/leadsEveryone who called, was called or enquired, with their deal stage. ?q=, show=hot|warm|cold, source=
  • GET/leads/{phone}One person: every call, their campaigns, what they told us
  • POST/leads/{phone}Name, notes, or the deal's stage (enquiry, callback, follow_up, qualified, won, lost)
    Example
    curl -X POST https://pixio.tech/v1/leads/{phone} \
      -H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
      -d '{"stage": "won", "notes": "Signed for December"}'
  • POST/leads/{phone}/opt-outNever call them again
  • DELETE/leads/{phone}Delete them and their calls

Campaigns

  • GET/campaignsEvery campaign with its counts
  • POST/campaignsNew campaign; it starts as a draft
    Example
    curl -X POST https://pixio.tech/v1/campaigns \
      -H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
      -d '{"name": "Website leads Oct", "agent": "priya-sales"}'
  • GET/campaigns/{cid}One campaign: counts, settings, its agent's number
  • POST/campaigns/{cid}Start or pause it (status: running, paused, done), rename it, or change when it calls
    Example
    curl -X POST https://pixio.tech/v1/campaigns/{cid} \
      -H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
      -d '{"status": "running", "settings": {"calling_hours": ["10:00", "20:00"], "retry_hours": [2, 24, 72], "max_attempts": 3}}'
  • DELETE/campaigns/{cid}Delete it (people and calls stay)

Leads on a campaign

  • POST/campaigns/{cid}/membersAdd one person
    Example
    curl -X POST https://pixio.tech/v1/campaigns/{cid}/members \
      -H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
      -d '{"phone": "9876543210", "name": "Rahul", "values": {"city": "Jaipur"}}'
  • POST/campaigns/{cid}/importUpload a CSV or Excel file (multipart: file; preview=1 to check it first)
  • GET/campaigns/{cid}/membersThe list. ?status=due|callback|qualified…, q=, limit=
  • POST/campaigns/{cid}/members/{phone}/call-nowRing them now
  • POST/campaigns/{cid}/members/{phone}Reschedule, or set their status
    Example
    curl -X POST https://pixio.tech/v1/campaigns/{cid}/members/{phone} \
      -H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
      -d '{"next_call_at": "2026-10-06T18:00", "status": "callback"}'
  • DELETE/campaigns/{cid}/members/{phone}Take them off the list

Agents

  • GET/agentsEvery agent, and the industry templates a new one can start from
  • POST/agentsNew agent from a template (events, real_estate, hotel, travel)
    Example
    curl -X POST https://pixio.tech/v1/agents \
      -H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
      -d '{"name": "Ghar · Noida", "template": "real_estate"}'
  • GET/agents/{agent}One agent: its list columns, keywords and webhooks
  • POST/agents/{agent}/metaRename it, or set its list columns and webhooks
    Example
    curl -X POST https://pixio.tech/v1/agents/{agent}/meta \
      -H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
      -d '{"webhooks": [{"url": "https://crm.example.com/pixio", "events": ["call.ended"], "secret": "s3cret"}]}'

Phone numbers

  • GET/numbersYour numbers and the agent that answers each
  • POST/numbersAdd a number you've bought on Vobiz
    Example
    curl -X POST https://pixio.tech/v1/numbers \
      -H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
      -d '{"number": "8065353925", "label": "Main line", "agent": "priya-sales"}'
  • POST/numbers/{number}Attach a different agent (null detaches), or relabel it
    Example
    curl -X POST https://pixio.tech/v1/numbers/{number} \
      -H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
      -d '{"agent": "ghar-noida"}'
  • DELETE/numbers/{number}Remove it from Pixio

Webhooks & errors

Each agent can post to your URLs when a call ends. Add them on the agent's Advanced tab, or with POST /v1/agents/{agent}/meta. Each event is one POST; X-Pixio-Secret carries the secret you set, so you can check it came from Pixio.

POST https://crm.example.com/pixio
X-Pixio-Event: call.ended
X-Pixio-Secret: s3cret

{
  "event": "call.ended",
  "agent": {"id": "priya-sales", "name": "Priya · Sales"},
  "campaign": {"id": 3, "name": "Website leads Oct"},
  "call": {"room": "call-9876543210-1728291600", "direction": "out", "at": "2026-10-07T11:20:04+05:30"},
  "lead": {
    "phone": "9876543210", "name": "Rahul",
    "status": "qualified", "score": "hot", "next_call_at": null,
    "summary": "Rahul (9876543210): sister's wedding, 12 December, Jaipur, 300 guests",
    "next": "Planner to call within 1 hour",
    "details": {"occasion": "wedding", "event_date": "2026-12-12", "city": "Jaipur", "guests": 300}
  }
}

details holds what the call learnt, in the agent's industry's own fields (a real-estate agent sends bhk and location, not a wedding date).

Errors

Errors come back as {"error": "…"} with a status that says what to fix: 400 a bad value, 401 a missing or revoked key, 403 admin only (keys can't manage keys), 404 not found.