Read and manage CallRail calls, text messages, form submissions, trackers and companies.
CallRail ships in the w6w first-party pack. It declares 26 actions, 2 health checks, and the host runs its code in a sandbox that never sees the credential.
io.w6w.callrailCallRail is a call-tracking and conversation-analytics platform: it assigns dynamic tracking numbers to marketing channels so a call, text or form submission can be attributed back to whichever campaign produced it. This app puts calls, text-message conversations, form submissions, tracking numbers, tags, companies and users into a workflow — list and read them, place an outbound call, send a one-to-one text, and create or update companies, tags and form submissions.
Everything nests under an account, and within it a company — a separate business or client the account tracks calls for. Every action takes an explicit account id rather than guessing which of a key’s several accounts a call belongs to, since CallRail gives no “primary account” to fall back on; listing accounts is how a workflow discovers which ids a given key can actually reach.
A few sharp edges are handled rather than papered over: placing an outbound call is a real, billed call to a US or Canadian number and is not safe to retry blind; a call recording’s URL comes back as either a long-lived link or a short-lived one depending on the account’s HIPAA status; and outbound text sending is limited to one-at-a-time messages with an opt-out keyword, matching CallRail’s own prohibition on automated bulk messaging. Creating a tracking number is deliberately left out, since its shape depends entirely on the tracker type in a way a static form can’t represent faithfully.
Three routes to the same 26 actions. The Workflow tab is generated from CallRail's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.
call-create Place an outbound phone call connecting a business number to a customer number. US and Canadian numbers only.
call-list List tracked calls in a CallRail account, with filtering, sorting and searching.
call-recording-get Get a link to a call's MP3 recording. For HIPAA accounts the URL is temporary (about 24 hours) — re-invoke this action rather than caching it.
call-summary-get Aggregate call counts for an account or company, optionally grouped by source, keywords, campaign, referrer, landing page or company.
call-update Tag or annotate a call, set its lead status, rename the lead, or mark it spam.
form-submission-create Record a form submission against a company. Provide either Session ID, or Referrer + Referring URL + Landing page URL.
form-submission-update Tag or annotate a form submission, set its monetary value, or set its lead status.
tag-delete Delete a tag. Removes it from every call flow and interaction it was applied to. To stop new applications without deleting history, use Update Tag with Disabled instead.
tag-update Rename or recolor a tag, or disable it from being applied to new interactions.
text-message-get Fetch a text-message conversation and its message history, newest first.
text-message-list List text-message conversations, newest first. Each result carries only the two most recent messages — use Get Text Conversation for the full history.
text-message-send Send an SMS (or MMS via a media URL) to a customer, starting or continuing a conversation. Person-to-person use only — automated bulk messaging is prohibited by CallRail's terms.
A workflow step names the app and the action, and the editor fills in the
connection when you pick one. This is the Step shape from the
workflow spec, carrying CallRail's real ids.
{
"manifestVersion": "2",
"name": "callrail-example",
"steps": [
{
"id": "account-get",
"uses": {
"app": "io.w6w.callrail",
"action": "account-get",
"connection": "conn_YOUR_CONNECTION_ID"
},
"with": {
"accountId": "<accountId>"
}
}
]
}account-get account-list call-create call-get call-list +21 more actions available
Every app-specific value here is a blank you have to fill in. An
app action is reached through the connection that authenticates it, so the
address is a connection id, not the app id — and connections belong to your account,
so a public page cannot know yours. Create one for CallRail, then fill in
the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the
parameters that action declares. The call itself is real — the shape is transcribed
from the studio's own snippet builder, which prints the same kind of blanks — but
nothing in it is specific to CallRail. The Workflow tab is where this app's
real ids are.
npm install @w6w/sdkyarn add @w6w/sdkpnpm add @w6w/sdkdeno add npm:@w6w/sdkimport { W6wClient, isActionRun } from "@w6w/sdk";
// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();
const envelope = await client.run({
urn: "conn_YOUR_CONNECTION_ID",
action: "account-get",
payload: {
accountId: "<value>",
// fields: "<value>",
},
});
if (isActionRun(envelope)) console.log(envelope.value); npm install -g @w6w/cli w6w run conn_YOUR_CONNECTION_ID --action account-get --payload '{"accountId":"<value>"}' Give an AI agent CallRail — without giving it CallRail's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.
One tool call{
"name": "w6w_invoke",
"arguments": {
"ref": "app:io.w6w.callrail#account-get",
"input": {
"accountId": "<accountId>"
}
}
}
Every tool names its target with a single ref. The
app: form above doesn't name a connection at all — the
host resolves which of the caller's CallRail connections to sign
with, and refuses rather than guesses when the answer is ambiguous.
The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.
Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.
Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.
CallRail's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.
The MCP surface is part of the hosted platform. CallRail itself is MIT, and the runtime that executes it is source-available (FSL).
CallRail declares its own checks, so its health is a property of the app rather than something the host guesses at.
Component status from status.callrail.com. Covers the API, Call Tracking, SMS, MMS, Call Routing, Webhooks, Call Recording and Call Transcription, plus the rest of CallRail's own product surface.
CallRail documents fixed hourly/daily request ceilings but exposes no header or endpoint that reports remaining headroom against them.