InboundXWorkspace help

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.

Example request
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.

PathWhat it returns
GET /api/workspace/v1/callsCalls, 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/campaignsYour campaigns: name, on or off, test or real, industry.
GET /api/workspace/v1/statsTotals for a window (default the last 7 days, at most 92): calls, answered, billable and sales.
200
{
  "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.

One read, one change
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..."}'
PathKeyWhat it does
POST /api/workspace/v1/tools/workspace_overviewReadThe workspace name, clock, subscription status, and whether agencies are on.
POST /api/workspace/v1/tools/list_campaignsReadCampaigns in this workspace: name, price and whether each is active.
POST /api/workspace/v1/tools/get_campaignReadOne campaign: criteria, price, active flag and opening script.
POST /api/workspace/v1/tools/list_publishersReadThe publishers that exist today, without their ping keys.
POST /api/workspace/v1/tools/get_publisherReadOne publisher and its campaigns, with each campaign's ping URL.
POST /api/workspace/v1/tools/list_agentsReadAgents in this workspace: name, approval and whether they are suspended.
POST /api/workspace/v1/tools/get_agentReadOne agent's profile, as the owner sees it.
POST /api/workspace/v1/tools/list_callsReadRecent calls. A null payout means it is not decided yet, not zero.
POST /api/workspace/v1/tools/get_callReadOne call, without its transcript.
POST /api/workspace/v1/tools/search_callsReadCalls whose disposition or end reason contains the text you send.
POST /api/workspace/v1/tools/get_transcriptReadThe transcript of one call, up to 200 turns.
POST /api/workspace/v1/tools/list_rtb_pingsReadRecent routing pings and why any was declined.
POST /api/workspace/v1/tools/list_disputesReadDisputes in this workspace.
POST /api/workspace/v1/tools/get_disputeReadOne dispute, without staff notes.
POST /api/workspace/v1/tools/list_walletsReadAgent wallet balances, in cents.
POST /api/workspace/v1/tools/finance_summaryReadThe workspace call balance, overdraft and subscription status.
POST /api/workspace/v1/tools/billing_and_planReadThe plan, subscription status, call balance and the payment processor the owner connected.
POST /api/workspace/v1/tools/list_teamReadThe owner and managers of this workspace.
POST /api/workspace/v1/tools/branding_and_domainsReadThe brand name and custom domain status.
POST /api/workspace/v1/tools/list_audit_logReadRecent audit log rows for this workspace.
POST /api/workspace/v1/tools/diagnose_agentReadWhy an agent cannot take calls, and the fix.
POST /api/workspace/v1/tools/team_statusReadEvery agent's state and the one reason each can't take calls, in one call.
POST /api/workspace/v1/tools/diagnose_campaignReadWhy a campaign is not receiving calls.
POST /api/workspace/v1/tools/diagnose_publisherReadWhy a publisher's pings are declined. Changes nothing.
POST /api/workspace/v1/tools/search_helpReadSearch the how-to for every console and agent page.
POST /api/workspace/v1/tools/request_featureReadPass on something the owner asked for that the tools cannot do. Changes nothing.
POST /api/workspace/v1/tools/leave_call_feedbackWriteLeave or edit your review on a call. It saves at once, with no preview.
POST /api/workspace/v1/tools/get_call_feedbackReadRead the review on a call and the agent's acknowledgement.
POST /api/workspace/v1/tools/pause_campaignWritePause a campaign so it stops receiving new calls. Calls in progress continue.
POST /api/workspace/v1/tools/resume_campaignWriteResume a paused campaign so it receives calls again.
POST /api/workspace/v1/tools/approve_agentWriteApprove an agent so they can go live. This also lifts a suspension.
POST /api/workspace/v1/tools/suspend_agentWriteSuspend an agent so they cannot go live. Refused while they are on a call.
POST /api/workspace/v1/tools/set_workspace_hoursWriteSet the workspace's opening hours, on its own clock, for every campaign.
POST /api/workspace/v1/tools/set_campaign_statesWriteSet the full list of US states a campaign is open in.
POST /api/workspace/v1/tools/add_publisherWriteAdd a publisher (company name, contact email, optional first and last name). Nothing is emailed.
POST /api/workspace/v1/tools/set_publisher_settingsWriteChange a publisher's name, contact email, notes, on/off switch, report inclusion and portal visibility in one save.
POST /api/workspace/v1/tools/remove_publisherWriteRemove a publisher as the console does. Its history stays.
POST /api/workspace/v1/tools/restore_publisherWriteRestore a removed publisher.
POST /api/workspace/v1/tools/set_publisher_offer_statusWriteSet the status of a publisher's offer on one campaign. Going live has the console's checks.
POST /api/workspace/v1/tools/assign_publisher_numberWriteRoute a workspace phone number to a publisher on one campaign. Nothing is bought.
POST /api/workspace/v1/tools/release_publisher_numberWriteStop routing a workspace phone number to its publisher.
POST /api/workspace/v1/tools/set_publisher_postback_urlWriteSave or clear an offer's conversion postback URL, checked as in the console.
POST /api/workspace/v1/tools/send_publisher_invitationWriteEmail the publisher's contact a sign-in invitation.
POST /api/workspace/v1/tools/revoke_publisher_setup_linksWriteRevoke every open setup link of a publisher. New links are made in the console.
POST /api/workspace/v1/tools/search_publisher_directoryReadSearch the publisher directory by company name.
POST /api/workspace/v1/tools/list_publisher_requestsReadList open incoming and outgoing directory connection requests.
POST /api/workspace/v1/tools/request_publisher_connectionWriteAsk a directory company to connect with the workspace.
POST /api/workspace/v1/tools/decide_publisher_requestWriteAccept or decline an incoming request, or cancel an outgoing one.
POST /api/workspace/v1/tools/list_trainingReadList the training switches, modules with their quiz, and bought course modules.
POST /api/workspace/v1/tools/set_training_settingsWriteSet whether agent training is on and whether it is required before taking calls.
POST /api/workspace/v1/tools/save_training_moduleWriteAdd or edit a training module: title, description, video link or none, must-watch.
POST /api/workspace/v1/tools/move_training_moduleWriteMove a training module one place up or down.
POST /api/workspace/v1/tools/set_training_quizWriteSave a module's whole quiz, or remove it; optionally make agents retake it.
POST /api/workspace/v1/tools/set_course_moduleWriteOwner only: enable, disable or copy a bought course module.
POST /api/workspace/v1/tools/list_scriptsReadList the workspace's call scripts and the built-ins, with each script's default campaigns.
POST /api/workspace/v1/tools/save_scriptWriteCreate or edit a workspace call script and its default campaigns.
POST /api/workspace/v1/tools/set_script_activeWriteShow or hide a workspace script or a built-in script for every agent.
POST /api/workspace/v1/tools/list_support_ticketsReadList the team support desk's tickets, filtered like the desk. Message text is shown as data.
POST /api/workspace/v1/tools/get_support_ticketReadRead one ticket's newest 50 messages, its staff notes, saved replies and who can be assigned.
POST /api/workspace/v1/tools/reply_support_ticketWriteReply on a ticket as the team, text only. The person sees it in their support chat.
POST /api/workspace/v1/tools/start_support_ticketWriteMessage an agent or agency owner on their open ticket, or open one for them.
POST /api/workspace/v1/tools/set_support_ticket_statusWriteResolve, close or reopen a ticket, as the desk's status buttons do.
POST /api/workspace/v1/tools/assign_support_ticketWriteAssign a ticket to a teammate with Support access, or unassign it.
POST /api/workspace/v1/tools/add_support_ticket_noteWriteAdd an internal note. The person who asked never sees it.
POST /api/workspace/v1/tools/save_support_saved_replyWriteSave a reusable reply with a title for the whole desk.
POST /api/workspace/v1/tools/list_support_personasReadList the support personas in rotation order, with whether each is on and has a picture.
POST /api/workspace/v1/tools/add_support_personaWriteAdd a persona at the end of the rotation, on, with no picture.
POST /api/workspace/v1/tools/set_support_personaWriteRename 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_modeWriteSwitch a campaign between state coverage and its own ZIP list.
POST /api/workspace/v1/tools/set_campaign_zipsWriteAdd, remove or replace a campaign's ZIP codes.
POST /api/workspace/v1/tools/remove_campaignWriteRemove a campaign. Refused while one of its calls is live.
POST /api/workspace/v1/tools/restore_campaignWriteRestore a removed campaign, on or off as it was when removed.
POST /api/workspace/v1/tools/set_campaign_notesWriteSet or clear a campaign's internal notes.
POST /api/workspace/v1/tools/set_campaign_opening_scriptWriteSet a campaign's opening script for agents.
POST /api/workspace/v1/tools/block_signup_emailsWriteBlock one or more email addresses from signing up.
POST /api/workspace/v1/tools/unblock_signup_emailWriteLift a signup block on one email address.
POST /api/workspace/v1/tools/list_feature_requestsReadList the workspace's feature requests, optionally by status.
POST /api/workspace/v1/tools/set_feature_requestWriteSet a feature request's status or notes.
POST /api/workspace/v1/tools/update_workspace_generalWriteChange the workspace name, its clock, sign-up approval and the sign-up alert email.
POST /api/workspace/v1/tools/set_maintenance_bannerWriteTurn the notice banner on or off, or change its message and who sees it.
POST /api/workspace/v1/tools/set_maintenance_modeWriteTurn maintenance mode on or off, with its message and expected end time.
POST /api/workspace/v1/tools/set_live_campaign_limitWriteSet how many campaigns one agent may take calls on at once.
POST /api/workspace/v1/tools/set_agent_onboarding_callWriteSet the agents' onboarding call booking link and where it is shown.
POST /api/workspace/v1/tools/set_support_alertsWriteTurn support alert emails on or off and choose who gets them.
POST /api/workspace/v1/tools/set_leaderboard_switchWriteTurn the leaderboard, premium ranks or share cards on or off.
POST /api/workspace/v1/tools/set_agency_leaderboard_modeWriteChoose which leaderboard one agency's agents see.
POST /api/workspace/v1/tools/save_brand_detailsWriteChange the brand name, support email and sign-in tagline.
POST /api/workspace/v1/tools/save_brand_themeWriteChange the brand colours, font and corner radius.
POST /api/workspace/v1/tools/set_brand_default_themeWriteChoose light, dark or system mode as the default look.
POST /api/workspace/v1/tools/save_brand_optionsWriteChange the powered-by line and the terms and privacy links.
POST /api/workspace/v1/tools/add_custom_domainWriteAdd a custom domain and get the DNS records to publish.
POST /api/workspace/v1/tools/recheck_custom_domainWriteCheck a custom domain's DNS now and mark it verified when it is ready.
POST /api/workspace/v1/tools/disable_custom_domainWriteStop a custom domain answering, until it is turned back on.
POST /api/workspace/v1/tools/enable_custom_domainWriteTurn a disabled custom domain back on.
POST /api/workspace/v1/tools/delete_custom_domainWriteRemove a custom domain for good.
POST /api/workspace/v1/tools/add_email_domainWriteSend emails from your own domain and get the DNS records to publish.
POST /api/workspace/v1/tools/recheck_email_domainWriteCheck the email sending domain's DNS records now.
POST /api/workspace/v1/tools/remove_email_domainWriteStop sending from your own email domain and go back to the default sender.
POST /api/workspace/v1/tools/set_email_senderWriteSet the sender name and address for emails from your own domain.
POST /api/workspace/v1/tools/save_kb_sectionWriteAdd or edit a section of the support assistant's knowledge base.
POST /api/workspace/v1/tools/disable_kb_sectionWriteTake a section out of the support assistant's knowledge base, keeping its text.
POST /api/workspace/v1/tools/review_kb_sectionWriteApprove a knowledge-base section for the assistant to quote to chosen groups, or withdraw it.
POST /api/workspace/v1/tools/create_vocabulary_setWriteCreate a transcription vocabulary set of words the calls use.
POST /api/workspace/v1/tools/update_vocabulary_setWriteEdit one of your transcription vocabulary sets.
POST /api/workspace/v1/tools/copy_vocabulary_setWriteMake an editable copy of a vocabulary set.
POST /api/workspace/v1/tools/delete_vocabulary_setWriteDelete one of your vocabulary sets.
POST /api/workspace/v1/tools/set_default_vocabulary_setWriteChoose the vocabulary set campaigns use by default.
POST /api/workspace/v1/tools/save_sop_sheetWriteChange the compliance sheet agents acknowledge before going live.
POST /api/workspace/v1/tools/reset_sop_sheetWritePut the base compliance sheet back, under a fresh version.
POST /api/workspace/v1/tools/set_compliance_enabledWriteTurn the compliance acknowledgement on or off for the whole workspace.
POST /api/workspace/v1/tools/set_campaign_sheet_modeWriteChoose which compliance sheet one campaign's agents acknowledge.
POST /api/workspace/v1/tools/save_campaign_sheetWriteChange a campaign's own compliance sheet.
POST /api/workspace/v1/tools/revoke_api_keyWriteRevoke an API key so it stops working at once.
POST /api/workspace/v1/tools/set_webhook_enabledWriteSwitch an outgoing webhook on or off.
POST /api/workspace/v1/tools/delete_webhookWriteDelete an outgoing webhook for good.
POST /api/workspace/v1/tools/list_api_keysReadList your API keys by name and last 4 characters. The key itself is never shown.
POST /api/workspace/v1/tools/list_webhooksReadList your outgoing webhooks by host and events. Secrets are never shown.
POST /api/workspace/v1/tools/propose_wallet_creditWrite (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_billWrite (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_decisionWrite (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_agentsWriteCheck up to 50 email addresses before inviting them as agents. Sends nothing.
POST /api/workspace/v1/tools/confirm_invite_agentsWriteInvite the agents a preview checked, from the workspace, through the console's invite.
POST /api/workspace/v1/tools/invite_managerWriteInvite one manager. Owner only.
POST /api/workspace/v1/tools/set_campaign_rosterWriteAdd 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_availabilityWriteAllow or deny one agent on a campaign, or clear that exception.
POST /api/workspace/v1/tools/reject_agentWriteReject an agent. Refused while they are on a call or one is being connected.
POST /api/workspace/v1/tools/unsuspend_agentWriteLift an agent's suspension.
POST /api/workspace/v1/tools/review_kycWriteApprove or decline an identity check that is waiting for a person.
POST /api/workspace/v1/tools/set_manager_page_accessWriteSet the console pages a manager can open. Owner only.
POST /api/workspace/v1/tools/set_manager_mcp_accessWriteTurn a manager's assistant access and its write access on or off. Owner only.
POST /api/workspace/v1/tools/set_coownerWriteMake a manager a co-owner or turn a co-owner back into a manager. Owner only.
POST /api/workspace/v1/tools/set_agent_referral_memberWriteAdd an agent to the referral programme or remove them. Owner only.
POST /api/workspace/v1/tools/retire_agent_referral_codeWriteRetire 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.

Checking the signature
// 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.

Every page here is also Markdown: add .md to its address, or send Accept: text/markdown.
© InboundX