On this page: Keys
For workspaces
Workspace API
Read and change your workspace from your own software: everything the AI connector can do, one workspace per key.
Keys
An owner creates a key in the console under Settings → API and webhooks, and can turn the same right on for a manager. The key is shown once; only a fingerprint of it is kept. Revoke a key there and it stops working straight away. A key keeps only the rights of the person who made it: if they are removed, suspended or lose access to a page, the key loses it too.
Calling the API
Send the key as a bearer token, on your workspace's own address. A key from another workspace is refused.
curl https://your-workspace-address/api/workspace/v1/calls?limit=100 \
-H "Authorization: Bearer ixw_..."Read and write keys
Each key is Read, Write or Read and write, picked when it is made. A read key looks things up and cannot change anything. A write key makes changes and cannot read lists. Read and write does both, and is what a new key gets unless you pick another. Keys made before scopes existed are read keys. Making a write key needs someone who can change things in the console.
Endpoints
These three lists need a read key.
| Path | What it returns |
|---|---|
GET /api/workspace/v1/calls | Calls, newest first: when, status, campaign, whether an agent answered, length, whether billable, outcome, the caller's state and whether it sold. |
GET /api/workspace/v1/campaigns | Your campaigns: name, on or off, test or real, industry. |
GET /api/workspace/v1/stats | Totals for a window (default the last 7 days, at most 92): calls, answered, billable and sales. |
{
"data": [
{
"id": "6f1c…",
"created_at": "2026-11-03T14:02:11.482913+00:00",
"ended_at": "2026-11-03T14:09:40.112004+00:00",
"status": "completed",
"campaign_id": "a2d0…",
"duration_seconds": 449,
"billable": true,
"billable_seconds": 449,
"disposition": "Sold",
"ended_reason": "caller_hangup",
"caller_state": "TX",
"answered": true,
"sold": true
}
],
"next_cursor": "WyIyMDI2LTEx…"
}Tools: everything the AI connector can do
Every tool the AI connector has is also an endpoint: POST /api/workspace/v1/tools/TOOL_NAME, with the tool's input as a JSON body. GET /api/workspace/v1/tools lists the tools your key can call right now, each with its scope and input schema. A read tool needs a read key and a write tool a write key; the wrong one gets 403 with code scope.
Most changes are checked twice, as in the connector. Send one without an Idempotency-Key and you get a preview and a confirm_token; nothing changes until you send the same body again with confirm: true and that token. leave_call_feedback is the exception: it saves the review in the first request, with or without a key. Send an Idempotency-Key header (any unique value) and the change is applied in that one request. Retrying with the same key within 24 hours returns the first answer and never applies the change twice; the same key with a different body gets 422.
A tool that moves money also needs the Idempotency-Key and a key the owner made.
curl https://your-workspace-address/api/workspace/v1/tools/get_call \
-H "Authorization: Bearer ixw_..." \
-H "Content-Type: application/json" \
-d '{"id": "6f1c..."}'
curl https://your-workspace-address/api/workspace/v1/tools/pause_campaign \
-H "Authorization: Bearer ixw_..." \
-H "Idempotency-Key: 2b7c9a1e-pause-1" \
-H "Content-Type: application/json" \
-d '{"campaign_id": "a2d0..."}'| Path | Key | What it does |
|---|---|---|
POST /api/workspace/v1/tools/workspace_overview | Read | The workspace name, clock, subscription status, and whether agencies are on. |
POST /api/workspace/v1/tools/list_campaigns | Read | Campaigns in this workspace: name, price and whether each is active. |
POST /api/workspace/v1/tools/get_campaign | Read | One campaign: criteria, price, active flag and opening script. |
POST /api/workspace/v1/tools/list_publishers | Read | The publishers that exist today, without their ping keys. |
POST /api/workspace/v1/tools/get_publisher | Read | One publisher and its campaigns, with each campaign's ping URL. |
POST /api/workspace/v1/tools/list_agents | Read | Agents in this workspace: name, approval and whether they are suspended. |
POST /api/workspace/v1/tools/get_agent | Read | One agent's profile, as the owner sees it. |
POST /api/workspace/v1/tools/list_calls | Read | Recent calls. A null payout means it is not decided yet, not zero. |
POST /api/workspace/v1/tools/get_call | Read | One call, without its transcript. |
POST /api/workspace/v1/tools/search_calls | Read | Calls whose disposition or end reason contains the text you send. |
POST /api/workspace/v1/tools/get_transcript | Read | The transcript of one call, up to 200 turns. |
POST /api/workspace/v1/tools/list_rtb_pings | Read | Recent routing pings and why any was declined. |
POST /api/workspace/v1/tools/list_disputes | Read | Disputes in this workspace. |
POST /api/workspace/v1/tools/get_dispute | Read | One dispute, without staff notes. |
POST /api/workspace/v1/tools/list_wallets | Read | Agent wallet balances, in cents. |
POST /api/workspace/v1/tools/finance_summary | Read | The workspace call balance, overdraft and subscription status. |
POST /api/workspace/v1/tools/billing_and_plan | Read | The plan, subscription status, call balance and the payment processor the owner connected. |
POST /api/workspace/v1/tools/list_team | Read | The owner and managers of this workspace. |
POST /api/workspace/v1/tools/branding_and_domains | Read | The brand name and custom domain status. |
POST /api/workspace/v1/tools/list_audit_log | Read | Recent audit log rows for this workspace. |
POST /api/workspace/v1/tools/diagnose_agent | Read | Why an agent cannot take calls, and the fix. |
POST /api/workspace/v1/tools/team_status | Read | Every agent's state and the one reason each can't take calls, in one call. |
POST /api/workspace/v1/tools/diagnose_campaign | Read | Why a campaign is not receiving calls. |
POST /api/workspace/v1/tools/diagnose_publisher | Read | Why a publisher's pings are declined. Changes nothing. |
POST /api/workspace/v1/tools/search_help | Read | Search the how-to for every console and agent page. |
POST /api/workspace/v1/tools/request_feature | Read | Pass on something the owner asked for that the tools cannot do. Changes nothing. |
POST /api/workspace/v1/tools/leave_call_feedback | Write | Leave or edit your review on a call. It saves at once, with no preview. |
POST /api/workspace/v1/tools/get_call_feedback | Read | Read the review on a call and the agent's acknowledgement. |
POST /api/workspace/v1/tools/pause_campaign | Write | Pause a campaign so it stops receiving new calls. Calls in progress continue. |
POST /api/workspace/v1/tools/resume_campaign | Write | Resume a paused campaign so it receives calls again. |
POST /api/workspace/v1/tools/approve_agent | Write | Approve an agent so they can go live. This also lifts a suspension. |
POST /api/workspace/v1/tools/suspend_agent | Write | Suspend an agent so they cannot go live. Refused while they are on a call. |
POST /api/workspace/v1/tools/set_workspace_hours | Write | Set the workspace's opening hours, on its own clock, for every campaign. |
POST /api/workspace/v1/tools/set_campaign_states | Write | Set the full list of US states a campaign is open in. |
POST /api/workspace/v1/tools/add_publisher | Write | Add a publisher (company name, contact email, optional first and last name). Nothing is emailed. |
POST /api/workspace/v1/tools/set_publisher_settings | Write | Change a publisher's name, contact email, notes, on/off switch, report inclusion and portal visibility in one save. |
POST /api/workspace/v1/tools/remove_publisher | Write | Remove a publisher as the console does. Its history stays. |
POST /api/workspace/v1/tools/restore_publisher | Write | Restore a removed publisher. |
POST /api/workspace/v1/tools/set_publisher_offer_status | Write | Set the status of a publisher's offer on one campaign. Going live has the console's checks. |
POST /api/workspace/v1/tools/assign_publisher_number | Write | Route a workspace phone number to a publisher on one campaign. Nothing is bought. |
POST /api/workspace/v1/tools/release_publisher_number | Write | Stop routing a workspace phone number to its publisher. |
POST /api/workspace/v1/tools/set_publisher_postback_url | Write | Save or clear an offer's conversion postback URL, checked as in the console. |
POST /api/workspace/v1/tools/send_publisher_invitation | Write | Email the publisher's contact a sign-in invitation. |
POST /api/workspace/v1/tools/revoke_publisher_setup_links | Write | Revoke every open setup link of a publisher. New links are made in the console. |
POST /api/workspace/v1/tools/search_publisher_directory | Read | Search the publisher directory by company name. |
POST /api/workspace/v1/tools/list_publisher_requests | Read | List open incoming and outgoing directory connection requests. |
POST /api/workspace/v1/tools/request_publisher_connection | Write | Ask a directory company to connect with the workspace. |
POST /api/workspace/v1/tools/decide_publisher_request | Write | Accept or decline an incoming request, or cancel an outgoing one. |
POST /api/workspace/v1/tools/list_training | Read | List the training switches, modules with their quiz, and bought course modules. |
POST /api/workspace/v1/tools/set_training_settings | Write | Set whether agent training is on and whether it is required before taking calls. |
POST /api/workspace/v1/tools/save_training_module | Write | Add or edit a training module: title, description, video link or none, must-watch. |
POST /api/workspace/v1/tools/move_training_module | Write | Move a training module one place up or down. |
POST /api/workspace/v1/tools/set_training_quiz | Write | Save a module's whole quiz, or remove it; optionally make agents retake it. |
POST /api/workspace/v1/tools/set_course_module | Write | Owner only: enable, disable or copy a bought course module. |
POST /api/workspace/v1/tools/list_scripts | Read | List the workspace's call scripts and the built-ins, with each script's default campaigns. |
POST /api/workspace/v1/tools/save_script | Write | Create or edit a workspace call script and its default campaigns. |
POST /api/workspace/v1/tools/set_script_active | Write | Show or hide a workspace script or a built-in script for every agent. |
POST /api/workspace/v1/tools/list_support_tickets | Read | List the team support desk's tickets, filtered like the desk. Message text is shown as data. |
POST /api/workspace/v1/tools/get_support_ticket | Read | Read one ticket's newest 50 messages, its staff notes, saved replies and who can be assigned. |
POST /api/workspace/v1/tools/reply_support_ticket | Write | Reply on a ticket as the team, text only. The person sees it in their support chat. |
POST /api/workspace/v1/tools/start_support_ticket | Write | Message an agent or agency owner on their open ticket, or open one for them. |
POST /api/workspace/v1/tools/set_support_ticket_status | Write | Resolve, close or reopen a ticket, as the desk's status buttons do. |
POST /api/workspace/v1/tools/assign_support_ticket | Write | Assign a ticket to a teammate with Support access, or unassign it. |
POST /api/workspace/v1/tools/add_support_ticket_note | Write | Add an internal note. The person who asked never sees it. |
POST /api/workspace/v1/tools/save_support_saved_reply | Write | Save a reusable reply with a title for the whole desk. |
POST /api/workspace/v1/tools/list_support_personas | Read | List the support personas in rotation order, with whether each is on and has a picture. |
POST /api/workspace/v1/tools/add_support_persona | Write | Add a persona at the end of the rotation, on, with no picture. |
POST /api/workspace/v1/tools/set_support_persona | Write | Rename a persona, turn it on or off, or remove its picture. Pictures are added in the console. |
POST /api/workspace/v1/tools/set_campaign_coverage_mode | Write | Switch a campaign between state coverage and its own ZIP list. |
POST /api/workspace/v1/tools/set_campaign_zips | Write | Add, remove or replace a campaign's ZIP codes. |
POST /api/workspace/v1/tools/remove_campaign | Write | Remove a campaign. Refused while one of its calls is live. |
POST /api/workspace/v1/tools/restore_campaign | Write | Restore a removed campaign, on or off as it was when removed. |
POST /api/workspace/v1/tools/set_campaign_notes | Write | Set or clear a campaign's internal notes. |
POST /api/workspace/v1/tools/set_campaign_opening_script | Write | Set a campaign's opening script for agents. |
POST /api/workspace/v1/tools/block_signup_emails | Write | Block one or more email addresses from signing up. |
POST /api/workspace/v1/tools/unblock_signup_email | Write | Lift a signup block on one email address. |
POST /api/workspace/v1/tools/list_feature_requests | Read | List the workspace's feature requests, optionally by status. |
POST /api/workspace/v1/tools/set_feature_request | Write | Set a feature request's status or notes. |
POST /api/workspace/v1/tools/update_workspace_general | Write | Change the workspace name, its clock, sign-up approval and the sign-up alert email. |
POST /api/workspace/v1/tools/set_maintenance_banner | Write | Turn the notice banner on or off, or change its message and who sees it. |
POST /api/workspace/v1/tools/set_maintenance_mode | Write | Turn maintenance mode on or off, with its message and expected end time. |
POST /api/workspace/v1/tools/set_live_campaign_limit | Write | Set how many campaigns one agent may take calls on at once. |
POST /api/workspace/v1/tools/set_agent_onboarding_call | Write | Set the agents' onboarding call booking link and where it is shown. |
POST /api/workspace/v1/tools/set_support_alerts | Write | Turn support alert emails on or off and choose who gets them. |
POST /api/workspace/v1/tools/set_leaderboard_switch | Write | Turn the leaderboard, premium ranks or share cards on or off. |
POST /api/workspace/v1/tools/set_agency_leaderboard_mode | Write | Choose which leaderboard one agency's agents see. |
POST /api/workspace/v1/tools/save_brand_details | Write | Change the brand name, support email and sign-in tagline. |
POST /api/workspace/v1/tools/save_brand_theme | Write | Change the brand colours, font and corner radius. |
POST /api/workspace/v1/tools/set_brand_default_theme | Write | Choose light, dark or system mode as the default look. |
POST /api/workspace/v1/tools/save_brand_options | Write | Change the powered-by line and the terms and privacy links. |
POST /api/workspace/v1/tools/add_custom_domain | Write | Add a custom domain and get the DNS records to publish. |
POST /api/workspace/v1/tools/recheck_custom_domain | Write | Check a custom domain's DNS now and mark it verified when it is ready. |
POST /api/workspace/v1/tools/disable_custom_domain | Write | Stop a custom domain answering, until it is turned back on. |
POST /api/workspace/v1/tools/enable_custom_domain | Write | Turn a disabled custom domain back on. |
POST /api/workspace/v1/tools/delete_custom_domain | Write | Remove a custom domain for good. |
POST /api/workspace/v1/tools/add_email_domain | Write | Send emails from your own domain and get the DNS records to publish. |
POST /api/workspace/v1/tools/recheck_email_domain | Write | Check the email sending domain's DNS records now. |
POST /api/workspace/v1/tools/remove_email_domain | Write | Stop sending from your own email domain and go back to the default sender. |
POST /api/workspace/v1/tools/set_email_sender | Write | Set the sender name and address for emails from your own domain. |
POST /api/workspace/v1/tools/save_kb_section | Write | Add or edit a section of the support assistant's knowledge base. |
POST /api/workspace/v1/tools/disable_kb_section | Write | Take a section out of the support assistant's knowledge base, keeping its text. |
POST /api/workspace/v1/tools/review_kb_section | Write | Approve a knowledge-base section for the assistant to quote to chosen groups, or withdraw it. |
POST /api/workspace/v1/tools/create_vocabulary_set | Write | Create a transcription vocabulary set of words the calls use. |
POST /api/workspace/v1/tools/update_vocabulary_set | Write | Edit one of your transcription vocabulary sets. |
POST /api/workspace/v1/tools/copy_vocabulary_set | Write | Make an editable copy of a vocabulary set. |
POST /api/workspace/v1/tools/delete_vocabulary_set | Write | Delete one of your vocabulary sets. |
POST /api/workspace/v1/tools/set_default_vocabulary_set | Write | Choose the vocabulary set campaigns use by default. |
POST /api/workspace/v1/tools/save_sop_sheet | Write | Change the compliance sheet agents acknowledge before going live. |
POST /api/workspace/v1/tools/reset_sop_sheet | Write | Put the base compliance sheet back, under a fresh version. |
POST /api/workspace/v1/tools/set_compliance_enabled | Write | Turn the compliance acknowledgement on or off for the whole workspace. |
POST /api/workspace/v1/tools/set_campaign_sheet_mode | Write | Choose which compliance sheet one campaign's agents acknowledge. |
POST /api/workspace/v1/tools/save_campaign_sheet | Write | Change a campaign's own compliance sheet. |
POST /api/workspace/v1/tools/revoke_api_key | Write | Revoke an API key so it stops working at once. |
POST /api/workspace/v1/tools/set_webhook_enabled | Write | Switch an outgoing webhook on or off. |
POST /api/workspace/v1/tools/delete_webhook | Write | Delete an outgoing webhook for good. |
POST /api/workspace/v1/tools/list_api_keys | Read | List your API keys by name and last 4 characters. The key itself is never shown. |
POST /api/workspace/v1/tools/list_webhooks | Read | List your outgoing webhooks by host and events. Secrets are never shown. |
POST /api/workspace/v1/tools/propose_wallet_credit | Write (money, owner) | Prepare a credit to an agent's wallet. Nothing moves until the owner confirms it on the console page the answer links to. |
POST /api/workspace/v1/tools/propose_force_bill | Write (money, owner) | Prepare a bill for a call that should have been charged. Nothing moves until the owner confirms it on the console page the answer links to. |
POST /api/workspace/v1/tools/propose_dispute_decision | Write (money, owner) | Prepare a decision on a dispute, resolve or dismiss. Nothing changes until the owner confirms it on the console page the answer links to. |
POST /api/workspace/v1/tools/preview_invite_agents | Write | Check up to 50 email addresses before inviting them as agents. Sends nothing. |
POST /api/workspace/v1/tools/confirm_invite_agents | Write | Invite the agents a preview checked, from the workspace, through the console's invite. |
POST /api/workspace/v1/tools/invite_manager | Write | Invite one manager. Owner only. |
POST /api/workspace/v1/tools/set_campaign_roster | Write | Add or remove an agent on a campaign's roster, or set its default availability. Calls in progress continue. |
POST /api/workspace/v1/tools/set_campaign_availability | Write | Allow or deny one agent on a campaign, or clear that exception. |
POST /api/workspace/v1/tools/reject_agent | Write | Reject an agent. Refused while they are on a call or one is being connected. |
POST /api/workspace/v1/tools/unsuspend_agent | Write | Lift an agent's suspension. |
POST /api/workspace/v1/tools/review_kyc | Write | Approve or decline an identity check that is waiting for a person. |
POST /api/workspace/v1/tools/set_manager_page_access | Write | Set the console pages a manager can open. Owner only. |
POST /api/workspace/v1/tools/set_manager_mcp_access | Write | Turn a manager's assistant access and its write access on or off. Owner only. |
POST /api/workspace/v1/tools/set_coowner | Write | Make a manager a co-owner or turn a co-owner back into a manager. Owner only. |
POST /api/workspace/v1/tools/set_agent_referral_member | Write | Add an agent to the referral programme or remove them. Owner only. |
POST /api/workspace/v1/tools/retire_agent_referral_code | Write | Retire an agent's custom referral code. Owner only. |
Paging and filters
Lists return up to 100 rows (limit=1 to 500) and a next_cursor. Pass it back as cursor= to get the next page; it is null on the last page. Calls and stats take from= and to= (ISO times) and campaign_id=.
Errors
Every error is JSON: error.code, error.message and error.hint, plus error.reason when a change was refused. 400 means a bad value; 401 means no key, an unknown key or a revoked one; 403 means the key's scope does not allow it, the key belongs to another workspace, or its maker can no longer do this; 404 means no such tool or record; 409 means something changed meanwhile, or the same Idempotency-Key is still running; 422 means the change was refused (nothing changed) or the Idempotency-Key was used for another request; 429 means more than 60 requests a minute (wait for Retry-After).
Webhooks
An owner adds up to 5 https addresses in the console under Settings → API and webhooks and picks the events: call.completed when a call ends, call.converted when a call is marked sold. Each delivery is a POST with JSON: id, event, created_at and data.call (the same fields as a call above; call.converted adds sold_at). The Send test button sends a webhook.test event.
Every delivery carries X-Webhook-Signature: t=TIMESTAMP,v1=HEX. HEX is the HMAC-SHA256, with the endpoint's secret, of the timestamp, a dot and the raw body. The secret is shown once when you add the address. Refuse a timestamp more than five minutes off.
// Node: check X-Webhook-Signature over the raw body before you trust it.
const crypto = require("node:crypto");
function verifyWebhook(header, rawBody, secret) {
const parts = Object.fromEntries(String(header ?? "").split(",").map((p) => p.trim().split("=", 2)));
const t = parts.t, v1 = parts.v1;
if (!/^\d{1,12}$/.test(t ?? "") || !/^[0-9a-f]{64}$/.test(v1 ?? "")) return false;
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
return crypto.timingSafeEqual(Buffer.from(v1, "hex"), Buffer.from(expected, "hex"));
}Answer with any 2xx within 10 seconds. Anything else is tried again after 1, 5, 30, 120 and 360 minutes, then marked failed. The id is the same on every try, so drop repeats by id. The console shows each endpoint's recent deliveries and their result. Addresses on private networks are refused.
What it never does
A key never does more than the person who made it can do in the AI connector, and never reaches another workspace. The calls, campaigns and stats lists never return prices, payouts, who sent a call, the caller's number or recordings.