# The Chirply Handbook A complete, plain-language description of Chirply: what it is, every feature that is live in production, what every plan costs, what a customer pays outside the subscription, how to answer the questions buyers ask, and the full list of operations the platform exposes. This document is generated from the product itself — the feature catalog, the plan matrix, and the live capability registry — so it does not go stale. Canonical HTML version: https://chirply.io/handbook ## Contents - What Chirply is, in one paragraph - Who Chirply is for — and who it isn't - The pricing model, and why it matters - What Chirply replaces - Telephony: A whole phone system, not a click-to-dial button. - AI: AI that answers the phone — not a chatbot in the corner. - CRM: The system of record everything else writes to. - Messaging & email: Every conversation in one thread. - Automations: One action catalog. Available everywhere. - Funnels & leads: Fill the pipeline and capture what lands. - Agency & platform: Built to be resold, from the schema up. - Pricing — the plans - Pricing — the full plan comparison - Pricing — the partner add-ons (reseller and white-label) - The affiliate program - What a customer pays OUTSIDE the Chirply subscription - How someone actually gets started - Agent-native: the API, the MCP server, and the in-app assistant - Security, tenancy, and data ownership - Compliance — the parts that keep customers out of trouble - Support, roadmap, and how the company operates - Frequently asked questions - Objection handling - Discovery questions worth asking on a call - Guardrails — what an AI agent must NOT say - Glossary of Chirply terms - Complete action catalog - Actions — affiliates - Actions — ai-agents - Actions — assistant - Actions — automations - Actions — billing - Actions — campaigns - Actions — communications - Actions — companies - Actions — compliance - Actions — contacts - Actions — conversations - Actions — deal_templates - Actions — deals - Actions — developers - Actions — domain_leads - Actions — domains - Actions — funnels - Actions — invoices - Actions — leads - Actions — links - Actions — lists - Actions — marketplace - Actions — pipelines - Actions — plans - Actions — privacy - Actions — rvm - Actions — settings - Actions — snapshots - Actions — stages - Actions — subaccounts - Actions — support - Actions — tasks - Actions — team - Actions — telephony - Actions — templates - Actions — tracking - Actions — white-label - Actions — widgets --- ## What Chirply is, in one paragraph _If you read nothing else, read this._ Chirply is an all-in-one business platform that combines a CRM, a full phone system, AI phone agents, two-way SMS and email, marketing campaigns, automations, a funnel and landing-page builder, lead generation, and invoicing into a single login. It is aimed at small businesses, sales teams, and marketing agencies who are currently paying for five or six separate tools that do not talk to each other. Its two defining decisions are these: you connect your OWN accounts with the underlying providers — Twilio for calls and texts, Mailgun for email, your own AI model key — so you pay carrier rates directly and Chirply never marks up the wire; and everything a human can do by clicking in the app can also be done by an AI agent through a public API, a built-in MCP server, or the assistant inside the app. It is sold as a monthly subscription starting at $47/month. Chirply is operated by Vaughn Labs. The public site is https://chirply.io, the application lives at https://app.chirply.io, and support is reachable at support@chirply.io. There are 39 distinct capability areas live in production today, spread across 7 product categories. --- ## Who Chirply is for — and who it isn't _Qualify against this before pitching anything else._ ### Strong fits - Businesses whose revenue depends on the phone — home services (roofing, HVAC, plumbing, solar, remodeling), insurance, real estate, mortgage, legal intake, medical and dental practices, auto dealers, staffing. - Anyone running outbound: a team dialing lists, following up on leads, or chasing quotes. The power dialer, call outcomes, and ringless voicemail are built for exactly this. - Anyone drowning in inbound they can't answer. AI phone agents pick up at 3am, on weekends, and while the crew is on a roof. - Marketing agencies and consultants who want to resell a platform under their own brand instead of pushing clients to somebody else's login. - Businesses already paying for a CRM, a dialer, an email tool, a page builder, and a scheduling tool separately — the consolidation case is the easiest sale Chirply has. - Technically-inclined operators who want their own AI agents to drive the CRM. Chirply is unusual in exposing every operation to machines, not just a token API. ### Weak fits — do not force these - Enterprises needing SOC 2 attestation, procurement review, or a signed BAA today. Chirply is a young platform built in public; it is not the safe answer for a compliance-gated buyer. - Businesses with no phone motion and no outbound at all — a pure e-commerce store with no sales calls gets less than half the value. - Buyers who refuse to open their own Twilio and Mailgun accounts. Bring-your-own is the whole pricing model; there is no fully-bundled option. - Anyone who needs deep native integrations with a specific vertical system of record today. Chirply has a full REST API and webhooks, but a prebuilt connector to a niche industry tool probably does not exist yet. - Buyers wanting a free trial with no card. Accounts are only opened through a paid checkout, a superadmin comp, or an invitation from an existing workspace — there is no public self-signup. --- ## The pricing model, and why it matters _The single most misunderstood thing about Chirply. Get this right on a call._ Most platforms in this category buy telephony and email wholesale and resell it to you with a margin on top — you pay them per text, per minute, per email, and per contact. Chirply does not do that. You connect your own Twilio account, your own Mailgun account, your own AI model key, and your own Stripe account. Chirply orchestrates them. The money for calls, texts, emails, and AI tokens goes from you to those providers directly, at their published rates, on their bill. Two consequences follow, and both are selling points. First, the volume that a competitor meters — contacts, calls, texts, emails, voicemail drops — costs Chirply nothing, so it is UNLIMITED on every plan including the cheapest one. Second, nobody is holding the customer's phone numbers, message history, or sending reputation hostage: those assets sit in accounts the customer owns and can walk away with. The Chirply subscription therefore buys capability and capacity, not volume. Plans are separated by how many phone numbers, AI agents, sales bridges, IVR menus, funnels, workflows and seats you get, and which of the heavier features are switched on — never by how much you use them. ### The honest trade-off, which an agent should raise before the buyer does - The customer has to open a Twilio account and a Mailgun account. Chirply shows exactly which webhook URLs to paste and which events to turn on, but it is still a setup step that a fully-bundled competitor does not have. - The customer receives two or three bills instead of one: Chirply's subscription, plus their carrier and email usage. - In exchange, usage is at wholesale rates with no markup, and at any real volume that is dramatically cheaper. A business sending tens of thousands of texts a month is the clearest case. --- ## What Chirply replaces _The consolidation pitch, category by category._ Chirply is not a point solution. On a discovery call, the fastest way to establish value is to find out what the prospect is already paying for and count how many of these boxes are already in their stack. - CRM and contact database — contacts, companies, custom fields, tags, lists, lifecycle stages, activity timeline. - Sales pipeline / deal tracking — drag-and-drop boards with stages you define. - Phone system — business numbers, a browser softphone, warm transfer, three-way calling, voicemail, call recording and transcription. - Power dialer / outbound calling tool — work a list without touching the dial pad. - Ringless voicemail service — drop a recording into a mailbox without the phone ringing. - Voice broadcast / call blast — one message to a whole list, with answering-machine detection. - IVR / phone-tree provider — press-1 menus, inbound and outbound, built visually. - AI receptionist / answering service — an agent that answers, holds a real conversation, captures details, and transfers to a human. - SMS marketing tool — two-way texting, autoresponders, bulk sends, STOP handling. - Email marketing tool — broadcasts, templates, merge fields, opens, clicks, bounces, unsubscribes. - Marketing automation / workflow builder — triggers, waits, branches, and a full action catalog. - Landing page and funnel builder — multi-step funnels with forms that create contacts. - Lead generation / scraping tool — a B2B business database and Google Maps search, enriched and deduped into the CRM. - Link shortener with tracking — branded short links, per-recipient tracking, click attribution. - Website visitor analytics — visitor tracking that resolves to a contact record. - Invoicing tool — six invoice types on one pricing engine, with payments landing on the contact timeline. - White-label agency platform — resell the whole thing under your own brand and domain. The claim to make is consolidation and a shared system of record: a call, a text, an email, an AI conversation, a payment, and an automation run all land on the same contact record, so there is one place to look before picking up the phone. The claim NOT to make is that Chirply is the deepest tool in every one of those categories. It is not, and saying so gets caught in the demo. --- ## Telephony: A whole phone system, not a click-to-dial button. _Chirply runs on your own Twilio account, so you keep carrier-rate pricing and own every number, recording, and log. Everything below is built in — no bolt-on dialer, no second login._ ### Browser dialer (softphone) Take and make calls from the same tab your CRM is in. A real softphone docked in the top bar of every page. Inbound calls ring your browser wherever you are in the app, and outbound goes out on your business caller ID. - Mute, keypad (for punching through other companies' IVRs), add a third party, warm transfer with the caller held while you consult - Simulring your online team — first to answer takes it - Missed calls fall through to voicemail and land on the contact's timeline - Drag the panel anywhere; it survives navigating the app ### Power dialer Work a list of 200 leads without touching the dial pad once. Multi-select contacts, hit Call, and Chirply walks the list for you — dial, talk, log the outcome, next. A docked widget that expands to a full calling view. - Auto-advance after you log a disposition and a note - Pause and resume a session any time — it survives closing the tab - Live done / skipped / remaining counts across the whole list - Every call logged with its outcome against the contact ### Call outcomes that do the follow-up Stop remembering to send the follow-up. Picking the outcome sends it. Define your own call dispositions (name + color) in Settings, then attach actions to them. Choosing an outcome fires those actions in the background while you're already dialing the next number. - "Left voicemail" → text them, tag them, and enroll them in a follow-up sequence — automatically - Any action in the platform is attachable: SMS, email, RVM, tag, list, pipeline stage, task, AI call - Runs in the background so the dialer never waits on it ### Ringless voicemail Land in 500 voicemail boxes without a single phone ringing. A two-leg carrier drop that deposits your recording straight into their mailbox. Their handset never rings, so you're not interrupting anyone — they just see a voicemail waiting. - Record it in the browser or generate it with text-to-speech - Merge fields are spoken correctly — no robot reading "open brace" - DNC list, suppressions, and quiet-hours enforced before every drop - Fire it one-off from a contact, from a call outcome, from an automation, or in bulk ### Sales bridge — instant warm transfer Connect a hot lead to a live human in about 15 seconds. The moment a lead is ready, Chirply rings your entire rep pool at once, whispers the lead's context to whoever answers, and bridges the first one to press 1 straight through to the lead. - Simulring cell phones and browser softphones together - Whisper the lead's name, city, and source before they're connected — recorded or spoken - Atomic first-to-claim: exactly one rep wins, every other leg is dropped cleanly - Optional SMS heads-up to each rep, dual-channel recording on the bridged call ### IVR builder — inbound and outbound Route every caller correctly without hiring a receptionist. Build press-1 phone trees once and use them on the way in and the way out. Each digit can dial a number, take a voicemail, speak a message, send a text, or open a sub-menu. - Recorded intro (record in-browser or upload) or text-to-speech greeting - Merge fields in the greeting — callers hear their own name - Nested sub-menus, graceful no-input fallback - The same menu drives outbound campaigns: they answer, they hear the menu, they press a key ### Voice broadcast & call blast Get one message to a whole list in minutes. Dial an entire audience with a pre-recorded message, text-to-speech, an interactive IVR, or an AI agent — with answering-machine detection branching to a separate voicemail script. - Answering machine detection: humans hear one script, mailboxes hear another - Quiet hours, DNC, and wallet balance checked before every single dial - Concurrency cap so you don't blow up your own switchboard - Optional SMS follow-up fired off the same campaign ### Recording & transcription Coach from real calls instead of relying on memory. Opt-in recording per number. Audio is pulled off Twilio into your own storage and the provider's copy is deleted, so there's one place your recordings live. - Per-number opt-in, with a recording announcement for consent where you need it - Automatic transcription attached to the call log - Delete the audio and keep the log and transcript ### Per-number control Every line behaves exactly the way that line should. Each phone number gets its own settings page — no hunting through a shared console. - Internal label (the call log names the line, not just the digits) - Inbound voice routing: ring the team, an IVR, an AI agent, or forward out - Transparent forwarding that shows the original caller's number - Outbound caller ID, availability hours, recording and transcription toggles ### Line-type intelligence Know it's a mobile before you spend money texting it. Every contact and lead number is classified mobile, landline, or VoIP and shown with an icon across contacts, contact detail, and lead results. - Automatic lookup on new numbers, plus a one-time scan of your existing database - Platform-wide shared cache — a number is only ever paid for once - Runs on your own Twilio at roughly a fraction of a cent per number --- ## AI: AI that answers the phone — not a chatbot in the corner. _Chirply's AI agents hold real phone conversations, take real actions in the CRM, and hand off to humans when it matters. Bring your own model key and pick the model per agent._ ### AI phone agents (receptionist) Never miss another inbound call, at 3am or on a Sunday. Point any number at an AI agent and it answers, holds a natural conversation, and actually does things — captures the caller's details, takes a message, or warm-transfers to a human. - Creates and updates the contact record from what the caller says - Takes a message and files it as a task for the right person - Warm-transfers to a number or to whoever on your team is online — with take-a-message fallback if nobody picks up - Leaves your voicemail script after the beep when it hits an answering machine ### Real-time voice, not walkie-talkie It sounds like a person, because it doesn't leave dead air. Calls stream in real time over a dedicated edge worker instead of waiting for a full reply before speaking. The agent starts talking on its first few words, and you can interrupt it mid-sentence. - Roughly one second of gap after you stop talking - Barge-in: talk over it and it stops and listens - Automatically falls back to the standard flow if anything on the streaming path hiccups — a caller is never dropped ### AI Brain knowledge base Teach it your business once, and every agent knows it. Organize everything your agents should know into topics and items — hours, pricing, services, policies, objection handling — then drop it into any agent's greeting, persona, or goals. - Upload what you already have: PDF, Word, spreadsheets, HTML, CSV, Markdown, or plain text - Or point it at your website and let it read the pages — one page, a section, or the whole domain - Merge the whole brain, one topic, or one item into any prompt - Word counts and copy chips so you can see what you're spending on context - Change the knowledge once; every agent using it updates ### Pick the voice it speaks in Audition voices in the browser instead of calling yourself to hear one. Every agent gets its own voice and language. Choose from the built-in phone voices, or from your own cloned and premium voices if you've connected ElevenLabs. - Your ElevenLabs account's own voices — including ones you cloned — listed in the picker - Press play and hear a sample right there, no test call needed - Set per agent, so your receptionist and your outbound campaigns can sound different ### Outbound AI calls & AI campaigns Qualify a list of 1,000 without a rep on the phone. The same agents make outbound calls — one at a time from a call outcome or an automation, or as a bulk campaign with a per-campaign goal. - "AI call" is a first-class action anywhere actions live - Bulk AI campaigns ride the same dispatcher: quiet hours, DNC, wallet, metering - Every call logged with a full transcript, an AI summary, and an outcome on the contact timeline ### AI throughout the app The blank page problem, gone. AI is woven through the CRM, messaging, and the funnel builder — draft a reply, summarize a contact, or generate a whole landing page. - AI page and funnel generation - Message drafting and contact summarization - A searchable model picker with live input/output pricing and context windows, so you compare cost before committing --- ## CRM: The system of record everything else writes to. _Calls, texts, emails, payments, AI conversations, and automation runs all land on the same contact record — so there's one place to look before you pick up the phone._ ### Contacts & companies One record per human, with everything they've ever done on it. Inline-editable contact records with companies, business name, website, and address — plus your own custom fields for whatever your business actually tracks. - Custom fields of every type, usable as merge fields everywhere - Phone matching that ignores formatting — (409) 893-0064 finds 4098930064 - Duplicate phone numbers are refused on the way in, and anything already doubled up is surfaced for you to sort out - Tags, lifecycle stage, and per-row quick actions ### Sales pipelines See the whole board and drag a deal to where it really is. Drag-and-drop deal pipelines with stages you define — and stage changes that can trigger automations. - Multiple pipelines, custom stages - "Deal stage changed" is an automation trigger - "Move pipeline stage" is an action any automation, outcome, or bulk selection can fire ### Tasks & activity timeline Nothing falls through, and you can prove what happened. A tabbed activity feed on every contact with multi-select filters by channel and direction, plus tasks with priorities and due dates. - Calls, SMS, email, AI sessions, payments, and automation runs on one timeline - Filter to just inbound calls, or just email, in a click - Tasks created by hand, by an automation, or by an AI agent taking a message ### Lists & bulk actions Do one thing to two thousand people at once. First-class contact lists, plus a multi-select bulk actions bar on contacts and lists that offers every action the platform has. - Select all across pages, not just the visible ones - Tag, list, lifecycle, pipeline stage, task, delete - Bulk SMS and email, personalized with merge fields and threaded into each contact's own conversation - Bulk ringless voicemail, outbound IVR, sales bridge, AI call, campaign enroll ### Merge fields everywhere Personalization that works in every field, not just email. One renderer powers the whole platform — every built-in contact field plus all of your custom fields, with a searchable picker beside every composer. - 22 built-in tokens including nested address parts - Checkboxes render Yes/No, multi-selects comma-spaced - Works in SMS, email, voice TTS, IVR greetings, AI personas and goals, and campaign copy --- ## Messaging & email: Every conversation in one thread. _Two-way SMS and email against the same contact, with the compliance plumbing — unsubscribes, STOP handling, suppressions, quiet hours — already wired._ ### Unified conversations inbox Stop switching apps to find out what you already told them. Inbound and outbound SMS and email threaded together per contact, with color-coded bubbles for direction. - Reply from the inbox or straight from the contact record - Inbound email routed in via your own sending domain - Every message on the shared activity timeline ### Autoresponders A reply goes out in seconds, at 2am, without you. Rule-based automatic replies on inbound messages, fully merge-field aware. - Trigger on inbound message content - Personalized with the contact's real details - Handed off to automations for anything more involved ### Broadcast campaigns Reach a whole segment on any channel, from one screen. One-off blasts by email, SMS, ringless voicemail, outbound IVR or AI call — one composer, one audience builder, real analytics. Multi-step follow-ups are automations. - Any channel from one composer — email, SMS, voicemail drop, IVR or AI call - Send windows, days of week, timezone, and throttle-per-minute - Signed one-click unsubscribe, SMS STOP handling, and provider bounce/complaint suppression - Opens, clicks, bounces, unsubscribes, and per-recipient status ### Templates Write the good version once and reuse it forever. Reusable SMS, email, and ringless-voicemail templates — including recorded audio or text-to-speech for voicemail — available from every composer. - "Start from a template" in the bulk text and email composer - Voicemail templates store the recording or the TTS script - Templates are selectable from automations and call outcomes too ### Compliance built in The boring parts that keep you out of trouble. A shared compliance layer every outbound channel runs through — no per-feature reimplementation, no gaps. - Do-not-call list and per-org suppressions - Quiet hours by local timezone on every voice and campaign channel - TCPA consent text on the click-to-call widget, recording announcements on calls --- ## Automations: One action catalog. Available everywhere. _Chirply has a single registry of things it can do. Every surface that fires actions — workflows, call outcomes, bulk selections — draws from the same list, so a capability can never exist in one place and be missing in another._ ### Visual workflow builder Build the follow-up once and let it run forever. Multi-step workflows with waits and branching, triggered by what actually happens in your business. - Triggers: contact created, tag added, deal stage changed, form submitted, message received, call completed, on a schedule, or manually / by webhook - Steps: send SMS or email, add or remove tags, add to a list, move a pipeline stage, create a task, wait, call a webhook, notify your team - Voice steps: ringless voicemail, outbound IVR, sales bridge, AI call, enroll in a campaign - Full run history so you can see what fired and why ### The shared action engine Add a capability once and it shows up in every menu. Actions are defined in one registry with their fields and the surfaces they're allowed on. Workflows, call dispositions, and bulk actions all render from it. - Same action, same options, whether you're in a workflow or a bulk selection - Pickers for numbers, IVR menus, campaigns, sales bridges, AI agents, lists, and stages - Registry-driven, so the menus can't drift out of sync ### Click-to-call widget Turn website visitors into live phone calls. An embeddable call-me button for any site. A visitor enters their number, your team rings, and the two are bridged — usually inside 20 seconds. - Simulring or sequential dialing of your rep pool, with a whisper before connect - Business-hours scheduling and a desktop / mobile visibility switch - Your logo, colors, copy, and "powered by" line — or none at all - Origin allow-list, daily call cap, TCPA consent text, and missed-lead notifications --- ## Funnels & leads: Fill the pipeline and capture what lands. _Build the pages, generate the leads, and drop them straight into the CRM — without a page builder subscription or a scraping tool on the side._ ### Funnel & page builder Ship a landing page today, not next sprint. Build multi-step funnels from blocks — headings, copy, images, buttons, and forms — by hand or generated with AI, then publish. - Form submissions create contacts and can trigger a workflow - Publish behind your own custom domain via Cloudflare DNS and SSL - AI generation for a first draft you then edit ### Built-in lead generation Fresh, targeted leads without a separate scraping tool. Search a B2B business database or Google Maps from inside Chirply, enrich the results, and import them to the CRM deduped. - Two search modes with comprehensive filters, paginated results, select-all across pages - Email, contact, and company-insights enrichment - Phone-unique dedupe across every scan, with per-search duplicate counts - Live cost estimate at real published rates plus your account's actual billing ### Custom domains Your brand on the address bar, not ours. Point a domain at Chirply and it's provisioned automatically — DNS record and SSL certificate handled through the Cloudflare API. - Custom domains for funnels and for the whole white-labeled app - Automatic certificate issuance - Host-based routing to the right tenant --- ## Agency & platform: Built to be resold, from the schema up. _Chirply is multi-tenant at the database level, not by convention — four tiers, row-level security on every table, and a white-label layer that was in the design from day one._ ### White-label & reseller Sell it as your own product, at your own price. Run the whole platform under your brand and your domain, issue sub-accounts to your clients, and bill them yourself. - Your logo, colors, and domain across the app and auth emails - Unlimited client sub-accounts under your agency - Agency rebilling and markup on usage ### Teams, roles & sub-accounts Give people exactly the access they should have. A four-tier hierarchy — platform, agency, sub-account, user — with owner, admin, and member roles and email invites. - Agency admins reach into their own sub-accounts; clients never see each other - Invite by email with a role attached - Superadmin console with audited "view as org" impersonation ### Billing, wallets & metering Know what a lead costs you before the month closes. Stripe subscriptions plus prepaid usage wallets, metered per event across every channel. - Metered kinds: SMS, MMS, calls, email, leads, AI, ringless voicemail, and lookups - Campaigns pause themselves cleanly when a wallet runs dry instead of failing silently - Self-serve plan changes, card updates, and cancellation ### Bring your own providers Carrier-rate pricing and no vendor holding your data hostage. You connect your own Twilio, Mailgun, OpenRouter, ElevenLabs, Outscraper, Firecrawl, and Stripe accounts. Chirply never marks up the wire. - Credentials stored encrypted, per workspace, never shared across tenants - Every provider card shows the exact webhook URLs to paste and the events to enable - Providers that need no setup say so outright instead of leaving you guessing ### Payments on the timeline See what a contact has paid you without opening Stripe. Connect your own Stripe and payments, failed charges, refunds, and subscription changes land on the matching contact's timeline. - Each callback verified against the signing secret that workspace stored - Payer matched to a contact by email - Deduped, so provider retries can't double-log ### API & built-in MCP server Your AI agents can drive Chirply directly. A public REST API and a built-in MCP server on the same API keys — so Claude, or anything else that speaks MCP, can operate your CRM as a tool. - REST endpoints for contacts, deals, and tasks - MCP tools: list and search contacts, create contacts, list and create deals, list tasks - Bearer-authenticated with scoped, revocable API keys ### Security model Tenant isolation you can point an auditor at. Row-level security is the authorization boundary — enforced by the database, not by application code remembering to filter. - RLS enabled on every table, policies delegating to security-definer helpers - Impersonation recorded to an audit log and surfaced with a persistent banner - Server-only secrets never reachable from the browser bundle --- ## Pricing — the plans _Three publicly purchasable plans plus a closed founder round. Prices are per workspace, in US dollars, billed monthly or yearly._ Annual billing is ten times the monthly price, which is two months free. Everything in a lower plan is included in every higher plan. Volume — contacts, calls, texts, emails, voicemail drops — is unlimited on all of them, including Launch, because the customer pays their own providers for it. ### Launch — $47/month, or $470/year (two months free). For: Solo operator. Run your whole book of business out of one login. - Unlimited contacts, calls, texts & emails - Browser dialer with recording - 1 phone number, 1 sales bridge, 1 IVR - Pipeline, tasks, lists & full activity timeline - Funnel builder + 3 automations ### Grow — $97/month, or $970/year (two months free). For: Small team. Add an AI receptionist, ringless voicemail, and your team. This is the plan most buyers should land on, and the one marked most popular on the pricing page. - Everything in Launch, plus: - 1 AI phone agent with its own knowledge base - Ringless voicemail + voice broadcast - Power dialer & call transcription - 10 seats · 5 numbers · 25 automations - Lead generation, REST API & custom domain ### Scale — $197/month, or $1970/year (two months free). For: Agency & power user. Unlimited everything, and your AI agents can drive it. - Everything in Grow, plus: - Unlimited AI phone agents - Real-time streaming voice (no dead air) - Outbound AI calls & bulk AI campaigns - Built-in MCP server + unlimited API keys - Unlimited seats, numbers, bridges, IVRs & funnels ### Founder — a closed round, not a retail plan The founder round is limited to 100 people total. A founder gets everything in Scale with every limit removed, and their rate is locked at whatever it was the moment they joined — forever. The price climbs as spots sell: monthly started at $7 and rises $1 with each monthly founder, capped at $47; yearly started at $70 and rises $10 per yearly founder, capped at $470. Because the price depends on how many have already bought, never quote a specific founder price from this document — send the buyer to https://chirply.io/pricing, which shows the live number. - Everything in Scale — our $197/mo top plan - Unlimited AI phone agents, numbers, bridges & IVRs - Full CRM — contacts, sales pipelines, tasks & timelines - Browser dialer — inbound/outbound calls & recordings - 2-way SMS & email inboxes with autoresponders - Funnel & landing-page builder (AI-assisted) - Built-in lead generation - Agent-native: full API + built-in MCP server - Your spot on the founders page as one of the first 100 - Founding-member access to the Partner & Reseller programs - Your price locked forever the moment you join - Behind-the-scenes founder access to every daily drop The founder offer is genuinely scarce and genuinely time-sensitive, which makes it the strongest close Chirply has. It is also the one thing an agent must not exaggerate: do not invent a countdown, a spot count, or a price. State the mechanic, point at the live page. --- ## Pricing — the full plan comparison _Every limit on every plan, exactly as published on the pricing page. Use this to answer 'is X included on Y?' precisely._ | | Launch | Grow | Scale | Founder | | --- | --- | --- | --- | --- | | Price per month | $47 | $97 | $197 | Founder ladder | | Price per year | $470 | $970 | $1970 | Founder ladder | ### Volume You connect your own Twilio and Mailgun, so you pay carrier rates directly and we never mark up the wire. Nothing here is metered on any plan. | Capability | Launch | Grow | Scale | Founder | | --- | --- | --- | --- | --- | | Contacts & companies | Unlimited | Unlimited | Unlimited | Unlimited | | Calls — inbound & outbound | Unlimited | Unlimited | Unlimited | Unlimited | | SMS & MMS | Unlimited | Unlimited | Unlimited | Unlimited | | Emails sent | Unlimited | Unlimited | Unlimited | Unlimited | | Ringless voicemail drops | Unlimited | Unlimited | Unlimited | Unlimited | ### CRM | Capability | Launch | Grow | Scale | Founder | | --- | --- | --- | --- | --- | | Team seats | 2 | 10 | Unlimited | Unlimited | | Sales pipelines | 1 | 5 | Unlimited | Unlimited | | Custom fields (Usable as merge fields everywhere) | 10 | 50 | Unlimited | Unlimited | | Lists, tags, tasks & activity timeline | Included | Included | Included | Included | | Bulk actions | Tag, list, stage, task | + bulk SMS & email | Every action | Every action | ### Telephony & voice | Capability | Launch | Grow | Scale | Founder | | --- | --- | --- | --- | --- | | Phone numbers | 1 | 5 | Unlimited | Unlimited | | Browser dialer (softphone) | Included | Included | Included | Included | | Warm transfer & 3-way calling | Included | Included | Included | Included | | Call recording | Included | Included | Included | Included | | Call transcription | Not on this plan | Included | Included | Included | | Power dialer | Not on this plan | Included | Included | Included | | Call outcomes with attached actions | 1 action each | Unlimited | Unlimited | Unlimited | | Sales bridges (Hot lead to a live rep in ~15 seconds) | 1 | 3 | Unlimited | Unlimited | | IVR flows (Inbound and outbound, same builder) | 1 | 5 | Unlimited | Unlimited | | Ringless voicemail | Not on this plan | Included | Included | Included | | Voice broadcast & call blast | Not on this plan | Included | Included | Included | | Line-type intelligence | Included | Included | Included | Included | ### AI | Capability | Launch | Grow | Scale | Founder | | --- | --- | --- | --- | --- | | AI phone agents (Answer inbound, capture details, transfer to a human) | Not on this plan | 1 | Unlimited | Unlimited | | Real-time streaming voice (~1s response, barge-in — not walkie-talkie) | Not on this plan | Not on this plan | Included | Included | | AI Brain knowledge base | Not on this plan | 1 brain · doc upload | Unlimited · + website crawling | Unlimited · + website crawling | | Outbound AI calls | Not on this plan | Not on this plan | Included | Included | | Bulk AI call campaigns | Not on this plan | Not on this plan | Included | Included | | AI drafting & contact summaries | Not on this plan | Included | Included | Included | | Bring your own model key | Included | Included | Included | Included | ### Messaging & campaigns | Capability | Launch | Grow | Scale | Founder | | --- | --- | --- | --- | --- | | Unified SMS + email inbox | Included | Included | Included | Included | | Autoresponders | 1 | 10 | Unlimited | Unlimited | | Broadcasts — email, SMS, voicemail, IVR & AI calls | Unlimited | Unlimited | Unlimited | Unlimited | | SMS, email & voicemail templates | 10 | Unlimited | Unlimited | Unlimited | | Compliance — DNC, quiet hours, STOP, unsubscribe | Included | Included | Included | Included | ### Automations | Capability | Launch | Grow | Scale | Founder | | --- | --- | --- | --- | --- | | Workflows (active) | 3 | 25 | Unlimited | Unlimited | | Full trigger set & run history | Included | Included | Included | Included | | Voice steps — RVM, IVR, sales bridge, AI call | Not on this plan | Included | Included | Included | | Click-to-call widgets | Not on this plan | 1 | Unlimited | Unlimited | ### Funnels, leads & invoicing | Capability | Launch | Grow | Scale | Founder | | --- | --- | --- | --- | --- | | Funnels & landing pages | 1 | 10 | Unlimited | Unlimited | | AI page & funnel generation | Not on this plan | Included | Included | Included | | Custom domains | Chirply subdomain | 1 | 10 | Unlimited | | Built-in lead generation (B2B database + Google Maps, deduped into the CRM) | Not on this plan | Included | Included | Included | | Invoicing | One-off & recurring | All 6 invoice types | All 6 invoice types | All 6 invoice types | | Payments on the contact timeline | Included | Included | Included | Included | ### Platform & agent-native | Capability | Launch | Grow | Scale | Founder | | --- | --- | --- | --- | --- | | REST API | Not on this plan | Included | Included | Included | | API keys | Not on this plan | 2 | Unlimited | Unlimited | | Built-in MCP server (Let Claude and other agents operate your CRM as a tool) | Not on this plan | Not on this plan | Included | Included | | Webhooks — triggers & steps | Not on this plan | Included | Included | Included | | Bring your own providers | Included | Included | Included | Included | | Support | AI support, 24/7 | AI support, 24/7 | AI support + human escalation | Direct founder line | | Account snapshots (Freeze a workspace's setup and reinstall it anywhere) | 3 | 25 | Unlimited | Unlimited | | Sell snapshots & list on the marketplace (Buyers pay through your own connected Stripe — we take no cut) | Not on this plan | Not on this plan | Included | Included | | Client sub-accounts (Reseller partner add-on) | Not on this plan | Not on this plan | Not on this plan | Not on this plan | | White-label & custom app domain (White-label partner add-on) | Not on this plan | Not on this plan | Not on this plan | Not on this plan | --- ## Pricing — the partner add-ons (reseller and white-label) _These sit on top of the ladder rather than beside it. Each one includes Scale in full._ Two capabilities are deliberately not on any retail plan: issuing client sub-accounts, and white-labeling the platform. Both are partner add-ons, aimed at agencies and consultants who want to sell Chirply as their own product. ### Reseller Partner Sell Chirply to your clients and keep the margin. Includes Scale, in full. - Issue client sub-accounts on any plan level - Set your own price — you keep the spread - Spin up and manage client workspaces in a click - Wholesale rates on every account you open ### White-Label Partner Ship the whole platform as your own product. Includes Scale + Reseller, in full. - Your logo, name and colors across the entire app - Your own domain — clients never see Chirply - Branded auth emails and client dashboards - Agency rebilling and markup controls ### What the partner tiers cost - **Reseller Partner** — $97/month during the founder-window offer, $297/month at the regular rate. Covers up to 100 resellable client sub-accounts at wholesale pricing. - **White-Label Partner** — $247/month during the founder-window offer, $497/month at the regular rate. Rebrands the whole platform — logo, name, colors, custom domain, branded auth emails, client-facing dashboards, and agency rebilling. Both add-ons bill monthly regardless of how the underlying plan is billed, and both can be cancelled without touching the underlying plan. The discounted prices are attached to a 24-hour window that opens the first time a founder visits their billing page. An important disclosure for any conversation involving partners: a Chirply account sold by a reseller or white-label partner is created, priced, billed, and supported by that independent partner, not by Chirply. Partners are not our agents and do not speak for us. --- ## The affiliate program _Every account holder is an affiliate automatically — no application._ Chirply pays two-tier recurring commission on referred subscriptions. The default published terms are 25% on people you refer directly and 5% on the people they in turn refer, paid recurring for as long as the referred subscription stays active. Partner-audience terms are richer than standard terms. Commission rates are set per campaign by platform admins and can change, so treat the numbers above as the standing default rather than a contractual promise. A prospect who wants exact current terms should read them on their own affiliate page inside the app, which always renders the live campaign they are actually on. - Everyone with an account is enrolled automatically — there is nothing to apply for. - Referral tracking works from any page on the marketing site, via a ref link. - Payouts run through Stripe Connect or PayPal. - Two tiers: direct referrals and their referrals. --- ## What a customer pays OUTSIDE the Chirply subscription _Never let a prospect discover this after they've signed. Raise it during discovery._ Because every provider is bring-your-own, the customer holds accounts with the providers below and pays them directly at published rates. Chirply adds nothing to those bills and never touches that money. Which of these a customer needs depends entirely on what they turn on — a business that only uses the CRM and pipelines needs none of them. - **Twilio (required for anything phone or SMS)** — Phone numbers, inbound and outbound minutes, SMS and MMS, ringless voicemail delivery, call recording, transcription, and line-type lookups. Billed by Twilio at their carrier rates. - **Mailgun (required for email)** — Sending and receiving email on the customer's own domain, including bounce and complaint handling. Billed by Mailgun. - **An AI model provider — OpenRouter (required for AI features)** — Tokens consumed by AI phone agents, AI drafting, contact summaries, and AI page generation. The model picker in-app shows live input and output pricing per model so the customer can compare cost before committing. - **ElevenLabs (optional)** — Premium and cloned voices for AI agents and pre-rendered voicemail or IVR audio. Only needed if the built-in phone voices aren't enough. - **Outscraper (optional)** — Powers built-in lead generation — the B2B business database and Google Maps search. Only needed if the customer uses lead gen. - **Firecrawl (optional)** — Website crawling that reads a customer's site into an AI agent's knowledge base. - **Stripe (optional)** — Only needed if the customer wants to take payments or send invoices. Their own Stripe account, their own money, standard Stripe fees. - **Domain registration (optional)** — A custom domain for funnels or a white-labeled app. Customers can bring one they already own, or buy one inside Chirply. There is deliberately no platform wallet gating sends: Chirply will not block a customer's campaign because of a balance held by us. Their spend is between them and their providers. --- ## How someone actually gets started _The buying and onboarding path, end to end._ There is no public self-signup and no free trial with no card. An account comes into existence in exactly one of three ways: somebody completes a paid checkout, a platform admin comps them an account, or an existing workspace invites them as a team member. This is deliberate — it keeps the tenant list clean — but it means an agent should never tell a prospect to 'go sign up free'. - Buy at https://chirply.io/pricing. Payment is taken inline on the page with card details entered directly — there is no redirect to a third-party checkout. - Set up the workspace: name it, brand it, and invite teammates by email with a role attached. - Connect providers. Each provider card shows the exact webhook URLs to paste and the events to enable, and the ones that need no setup say so outright. - Buy or port a phone number, then configure it. Every number gets its own settings page — label, inbound routing, caller ID, availability hours, recording and transcription. - Import contacts, or generate fresh ones with built-in lead generation. - Turn on what the business actually needs: dialer, AI agent, campaigns, automations, funnels. Practical onboarding note worth mentioning to nervous buyers: a whole workspace configuration can be captured as a snapshot and reinstalled into another workspace. Agencies use this to set a client up in one click instead of rebuilding from scratch, and there is a marketplace where snapshots can be shared or sold. --- ## Agent-native: the API, the MCP server, and the in-app assistant _The differentiator most competitors cannot match, and the reason this handbook exists._ Chirply is built so that anything a human can do by clicking, a machine can also do. That is not a marketing line about having an API — it is an architectural rule enforced in the codebase. Every action is defined exactly once, and three surfaces are thin adapters over that one definition, which means they cannot drift apart. - **Public REST API** — Every action is a POST to a predictable endpoint. A discovery endpoint publishes the full catalog with a JSON Schema for each action's arguments, so an integrator or an agent reads it once and knows the whole API without a hand-written client. Authenticated with scoped, revocable API keys. Available from the Grow plan up. - **Built-in MCP server** — Claude and any other MCP-speaking agent can operate the CRM as a tool — same keys, same permissions, same validation as the API. Available on the Scale plan and to founders. - **In-app assistant** — A unified assistant inside the app that both answers questions and takes actions on the user's behalf. Anything irreversible, outward-facing, or that spends money is classified as high-risk and the assistant refuses to run it without a human clicking Approve. There are currently over five hundred distinct operations exposed this way. The complete list, with a plain description of each, is at the end of this document. Why this matters commercially: a business that wants its own AI agents to book appointments, update deals, send follow-ups, or run reports can point them straight at Chirply. Most CRMs in this price bracket expose a handful of endpoints and call it an API. --- ## Security, tenancy, and data ownership - Multi-tenant at the database level, not by convention. Row-level security is the authorization boundary and it is enforced by the database, not by application code remembering to filter. - A four-tier hierarchy: platform, agency, sub-account, and user, with owner / admin / member roles inside each organization. Agency admins can reach into their own sub-accounts; clients never see each other. - Provider credentials are stored encrypted, per workspace, and are never shared across tenants. - Server-only secrets are never reachable from the browser bundle. - Support impersonation ('view as org') is recorded to an audit log and surfaced to the user with a persistent banner. - A screen-share privacy mode redacts sensitive data on screen, for demos and support calls. - The customer's calls, recordings, messages, and email history live in provider accounts the customer owns. If they leave, those assets stay theirs. What NOT to claim: Chirply does not currently hold SOC 2, ISO 27001, or HIPAA attestation, and does not sign BAAs. If a prospect's buying process requires any of those, say so plainly and escalate to a human rather than improvising. --- ## Compliance — the parts that keep customers out of trouble _A shared layer every outbound channel runs through, so there is no per-feature gap._ - A do-not-call list and per-workspace suppression lists, checked before every outbound send on every channel. - Quiet hours evaluated in the contact's local timezone across voice and campaign channels. Quiet hours are opt-in and off by default, and an explicit send-now always sends. - SMS STOP handling and signed one-click unsubscribe links on email. - A per-channel unsubscribe center that records who opted out of what, and how. - Provider bounce and complaint suppression fed back automatically. - TCPA consent text on the click-to-call widget, and recording announcements on calls where consent needs to be captured. - Carrier registration support — A2P 10DLC and voice trust — driven against the customer's own Twilio account. Framing for a sales conversation: Chirply gives a business the tooling to comply. It does not make them compliant, and it is not legal advice. Whether a given campaign is lawful depends on their consent records and their jurisdiction. Do not tell a prospect that using Chirply makes cold outreach legal. --- ## Support, roadmap, and how the company operates - AI support is available 24/7 on every plan. Scale adds human escalation. Founders get a direct line to the founder. - Chirply is built in public. A daily shipping log at /progression publishes what went live each day, and /roadmap shows what is coming. - There is a public feature board where customers can file bug reports and vote on requests. - Support email: support@chirply.io. Building in public is a real asset on a sales call with a skeptical buyer: the ship log is a verifiable, dated record of the product moving, which is exactly the objection ('is this thing going to still exist next year?') that a young platform normally cannot answer. --- ## Frequently asked questions _Short, accurate answers an agent can say out loud._ **Q: What does Chirply cost?** A: Three plans: Launch at $47/month, Grow at $97/month, and Scale at $197/month, each with two months free if paid annually. There is also a closed founder round of 100 spots at a much lower locked-for-life rate, priced on a ladder that climbs as spots sell. **Q: Is there a free trial?** A: No. There is no public signup and no card-free trial. Accounts are created through a paid checkout, a comped account from the platform, or an invitation from an existing workspace. **Q: Do I pay per contact, per text, or per minute?** A: Not to Chirply. Contacts, calls, texts, emails, and voicemail drops are unlimited on every plan. You connect your own Twilio and Mailgun accounts and pay them directly at their rates, with no markup from us. **Q: So I need my own Twilio account?** A: Yes, for anything involving phone calls or SMS, and your own Mailgun account for email. Chirply shows you exactly what to paste and where. It is an extra setup step, and in exchange your usage is at wholesale rates. **Q: Can it answer my phone when nobody's available?** A: Yes. Point any number at an AI phone agent and it answers, holds a real conversation, captures the caller's details into the CRM, takes a message as a task, or warm-transfers to whoever on your team is online. On Scale it streams in real time, so there is about a second of gap and you can interrupt it mid-sentence. **Q: Can I call from my computer?** A: Yes. There is a browser softphone docked in the top bar on every page. Inbound calls ring your browser wherever you are in the app; outbound goes out on your business caller ID. Mute, keypad, add a third party, and warm transfer with the caller on hold are all there. **Q: What is a sales bridge?** A: When a lead is hot, Chirply rings your whole rep pool at once — cell phones and browser softphones together — whispers the lead's context to whoever answers, and bridges the first rep who presses 1 straight through to the lead. Typically about 15 seconds from trigger to live conversation. **Q: What is ringless voicemail?** A: A carrier drop that deposits your recording straight into someone's voicemail box without their handset ever ringing. You record it in the browser or generate it with text-to-speech, and merge fields are spoken correctly. **Q: Can I text and email my whole list?** A: Yes — broadcasts go out by email, SMS, ringless voicemail, outbound IVR, or AI call from one composer, with send windows, day-of-week rules, timezone handling, and a per-minute throttle. You get opens, clicks, bounces, unsubscribes, and per-recipient status. **Q: Does it have automations?** A: Yes. A visual workflow builder with triggers (contact created, tag added, deal stage changed, form submitted, message received, call completed, on a schedule, or by webhook), waits and branching, and a full action catalog including the voice actions. Every run is logged so you can see what fired and why. **Q: Can I build landing pages?** A: Yes — a multi-step funnel and page builder with blocks, forms that create contacts and can trigger a workflow, AI generation for a first draft, and publishing behind your own custom domain with DNS and SSL handled automatically. **Q: Where do leads come from?** A: Chirply has lead generation built in: search a B2B business database or Google Maps from inside the app, enrich the results, and import them to the CRM deduped by phone number. You see a live cost estimate at published rates before you spend anything. **Q: Can I white-label it?** A: Yes, as a partner add-on. The White-Label Partner tier puts your logo, name, colors, and domain across the entire app including auth emails, so your clients never see Chirply. Reseller Partner lets you issue and bill client sub-accounts at your own price. **Q: Can my own AI agents use it?** A: Yes, and this is unusually strong. There is a public REST API and a built-in MCP server covering over five hundred operations — the same catalog the app's own buttons use, with the same permissions and validation. Point Claude or your own agent at it. **Q: Will it import my existing contacts?** A: Yes. Contacts import into the CRM, and duplicate phone numbers are refused on the way in — one phone number is one contact, with anything already doubled up surfaced for you to resolve. **Q: Does it record calls?** A: Yes, opt-in per phone number, with an optional recording announcement for consent. Audio is pulled off the provider into storage so there is one place your recordings live, and transcription is attached to the call log. You can delete the audio and keep the log and transcript. **Q: Can I keep my existing phone number?** A: Yes — numbers are held in your own Twilio account, so porting an existing business number is a standard Twilio port and the number stays yours. **Q: How many people can use it?** A: Two seats on Launch, ten on Grow, unlimited on Scale and for founders. Invites go out by email with a role attached — owner, admin, or member. **Q: Can I change plans later?** A: Yes, self-serve. Upgrades charge and switch immediately; downgrades take effect at the end of the current billing period. You can also update your card and cancel yourself, without emailing anyone. **Q: What happens if I cancel?** A: You keep your Twilio numbers, your recordings, your email domain and sending reputation, and your Stripe history, because those live in accounts you own. That is a direct consequence of the bring-your-own model. **Q: Is my data separated from other customers'?** A: Yes. Chirply is multi-tenant at the database level with row-level security enforced by the database itself, not by application code remembering to filter. Provider credentials are encrypted per workspace and never shared. **Q: Are you HIPAA or SOC 2 compliant?** A: No. Chirply does not currently hold SOC 2, ISO 27001, or HIPAA attestation and does not sign BAAs. If your buying process requires that, Chirply is not the right fit today. **Q: How long does setup take?** A: A workspace with contacts, a phone number, and a dialer is a same-day job. Connecting providers is the slow part, and it is mostly waiting on Twilio and Mailgun verification rather than on Chirply. Agencies can capture a finished setup as a snapshot and reinstall it into a new client workspace in one click. **Q: Who's behind it?** A: Chirply is built and operated by Vaughn Labs. It is developed in public — there is a dated daily shipping log of everything that goes live, and a public roadmap. --- ## Objection handling _The objections that actually come up, with the honest answer rather than the clever one._ **Q: "I already have a CRM."** A: Good — then the question isn't the CRM, it's what's bolted onto it. How many separate tools are you paying for around it: a dialer, a texting app, an email tool, a page builder, a scheduler? Chirply's case is that those stop being separate systems, and every call, text, email, and payment lands on the same contact record. **Q: "This is cheaper than what I'm paying — what's the catch?"** A: There's a real one and I'd rather say it now: you bring your own Twilio and Mailgun accounts and pay them directly. That's an extra setup step and a second bill. What you get for it is unlimited contacts, calls, texts and emails on the subscription, because we're not reselling you minutes at a markup. **Q: "I don't want to set up Twilio."** A: Fair, and it's the one genuinely fiddly part. It's a one-time setup, the app shows you exactly which URLs to paste and which events to switch on, and support will walk you through it. If you'd rather never touch a provider account at all, a fully-bundled competitor is honestly the better fit for you. **Q: "You're a new company. What if you disappear?"** A: Two honest answers. One: your numbers, recordings, email domain and payment history live in your accounts, not ours, so you're not holding a bag if we vanish. Two: we build in public — there's a dated log of exactly what shipped every single day. You can go read it right now instead of taking my word for it. **Q: "Does it do everything GoHighLevel does?"** A: Not everything, and I'm not going to pretend otherwise. Where Chirply is genuinely ahead is telephony depth and being agent-native — over five hundred operations exposed to your own AI agents through an API and an MCP server. Where a mature competitor may still be ahead is breadth of prebuilt integrations. Tell me the three things you actually use every day and I'll tell you straight whether we do them. **Q: "Can I try it free first?"** A: There's no free trial — accounts are only opened through a paid checkout. What I can do is show you the live product on a screen share so you're not buying blind. **Q: "It's too expensive."** A: Compared to what, specifically? Add up what you're paying now for CRM, dialer, texting, email, and page builder. And check whether you're being charged per contact or per message anywhere, because that's the line that grows on you — here it doesn't. **Q: "I need to talk to my partner / team."** A: Of course. One thing worth knowing before you do: if you're looking at the founder round, the price moves as spots sell and it's locked for life at whatever it is when you join. That's the only part of this that's genuinely time-sensitive. **Q: "We're too small for this."** A: The Launch plan at $47 is built for exactly one person — unlimited contacts, calls and texts, a browser dialer with recording, a pipeline, a funnel, and three automations. If you're on the phone at all, it pays for itself on one recovered lead. **Q: "We're too big / too complex."** A: Then the API and the MCP server are the part to look at, plus unlimited seats, numbers, and workflows on Scale. If you have someone technical, they can drive the whole platform programmatically rather than through the UI. **Q: "AI answering my phone will annoy my customers."** A: It can, if it's bad. The specific thing to judge is dead air — most AI phone systems make you wait for a full reply before they speak. On Scale, Chirply streams in real time: about a second of gap, and you can talk over it and it stops. And it hands off to a human whenever it should. Let me set one up and call it yourself. **Q: "Is this compliant? Can I cold-call/text with it?"** A: Chirply gives you the tooling — do-not-call lists, suppression lists, quiet hours by the contact's timezone, STOP handling, one-click unsubscribe, consent text, recording announcements. What it can't do is make outreach lawful on its own; that depends on your consent records and your jurisdiction, and it's a question for your attorney, not for me. --- ## Discovery questions worth asking on a call _What to find out before recommending a plan. Each answer maps to a specific feature._ - How do most of your customers reach you — do they call, or fill out a form? (Calls means telephony and AI receptionist. Forms means funnels and automations.) - What happens right now when someone calls and nobody picks up? (The single best opening for AI phone agents.) - How many calls a day are you missing, roughly? (Turns the problem into a number.) - Is anyone on your team calling out to leads or lists? (Power dialer, call outcomes, ringless voicemail.) - How fast do you get back to a new lead — minutes, hours, or the next day? (Sales bridge: fifteen seconds.) - What are you using today to keep track of customers and deals? (Establishes the incumbent and the switching cost.) - What else are you paying for around it — texting, email, page builder, scheduler? (Builds the consolidation math.) - Do you have a Twilio account already, or would that be new? (Surfaces the setup objection before it ambushes you.) - Do you text your customers today? Is anyone handling STOP requests? (Compliance risk they may not know they have.) - How many people would need a login? (Chooses the plan: 2 / 10 / unlimited.) - Are you doing this for your own business, or do you have clients you'd want to set up too? (Qualifies for the reseller or white-label add-on — a much bigger deal.) - Do you have anyone technical, or use AI tools already? (Qualifies the agent-native pitch, which is wasted on most buyers and decisive for a few.) --- ## Guardrails — what an AI agent must NOT say _Read this before writing an outbound script. Every line here exists because getting it wrong costs a customer or creates a legal problem._ - Do not invent features. If a capability is not described in this document, Chirply does not have it. Say 'I don't think we do that today, let me get you a straight answer' rather than guessing. - Do not quote a specific founder price, a spot count, or a countdown. That price moves with every purchase. Point the buyer at the live pricing page. - Do not promise SOC 2, HIPAA, ISO 27001, a BAA, or any compliance attestation. Chirply has none of these today. - Do not tell anyone Chirply makes their outreach legal, or advise on TCPA, consent, or DNC obligations. Describe the tooling; refer the legal question to their attorney. - Do not say there is a free trial, a free plan, or free signup. There is none. - Do not imply that calls, texts, and emails are free. They are unlimited on the Chirply subscription and billed by the customer's own providers. - Do not disparage competitors or state competitor pricing, feature sets, or outage history as fact. - Do not claim a specific ROI, revenue increase, close-rate lift, or income figure. There are no published customer results to stand behind. - Do not promise a delivery date for anything on the roadmap. - Do not describe Chirply as an autodialer for cold, non-consented lists, or pitch it as a way to get around carrier filtering or do-not-call rules. - Do not offer a discount, a custom price, an extension, or a contract term. Pricing is what is published. - Do not speak for a reseller or white-label partner's account, pricing, or support. Those are independent businesses. - Identify yourself as an AI when asked, and honor a request to stop calling immediately and permanently. --- ## Glossary of Chirply terms _Vocabulary a caller may use, or may need explained back to them._ - **Workspace / organization** — One business's account. Contacts, numbers, campaigns and settings all belong to a workspace and are invisible to every other workspace. - **Sub-account** — A client workspace issued underneath an agency by a Reseller Partner. The agency can reach into it; the client cannot see other clients. - **Softphone** — The browser dialer docked in the top bar — makes and receives calls without a desk phone or an app. - **Power dialer** — Works through a list of contacts automatically: dial, talk, log the outcome, advance to the next one. - **Disposition / call outcome** — The result you log after a call. Outcomes are yours to define, and each can carry actions that fire automatically when you pick it. - **Sales bridge** — Rings your whole rep pool at once and connects the first one to answer straight to a hot lead, with a whisper of context first. - **RVM / ringless voicemail** — Deposits a recording into a voicemail box without the phone ringing. - **IVR** — A press-1 phone menu. Chirply's builder drives both inbound menus and outbound campaigns. - **Whisper** — A short message played only to the rep — the lead's name, city, and source — before the two are connected. - **AMD / answering machine detection** — Detects whether a human or a machine picked up, so humans hear one script and mailboxes hear another. - **Simulring** — Rings several devices or people at once; whoever answers first takes the call. - **AI Brain** — The knowledge base an AI agent draws on — hours, pricing, services, policies, objection handling — built from uploads or by reading a website. - **Merge field** — A placeholder like the contact's first name that gets replaced with their real details. Works in SMS, email, spoken voice, IVR greetings, and AI prompts. - **Broadcast** — A one-off send to a whole audience on any channel. Multi-step follow-ups are automations, not broadcasts. - **Automation / workflow** — A trigger plus a sequence of steps with waits and branching that runs by itself. - **Snapshot** — A frozen copy of a workspace's configuration that can be reinstalled into another workspace, shared, or sold. - **Capability / action** — One thing the platform can do, defined once and available to the UI, the REST API, the MCP server, and the in-app assistant identically. - **MCP server** — A standard way for AI agents like Claude to use Chirply as a tool. - **White-label** — Running the entire platform under your own brand and domain so your clients never see the name Chirply. - **Founder round** — The first 100 customers, at a laddered price that rises with each sale and is locked for that customer forever. --- ## Complete action catalog _All 554 operations Chirply exposes, across 38 domains. Every one is available to the app's UI, the REST API, the MCP server, and the in-app assistant identically._ This is the exhaustive answer to "can Chirply do X?". Each entry is one thing the platform can do, with the name a machine calls it by, the wording used on the button a person would click, and a description of the effect. Entries marked HIGH RISK are irreversible, outward-facing, or spend money — the in-app assistant will not run those without a human clicking Approve. Read-only operations are marked READ. Everything else changes data. Some operations additionally require an admin or owner role in the workspace, and that is noted where it applies. --- ## Actions — affiliates _13 operations._ - **Your affiliate link (affiliates.get_program)** — [READ] Get the caller's own affiliate link, referral code, and exactly what they earn at BOTH tiers — tier 1 on customers they refer directly, tier 2 on customers referred by affiliates they recruited. Also returns which campaign and rate table (everyone vs partner) they're on. Read-only; costs nothing. Every Chirply account holder is an affiliate automatically, so this always returns something. - **Link to a specific page (affiliates.build_link)** — [READ] Build the caller's affiliate link pointing at a specific page of the Chirply site — the pricing page, a blog post, anything. Any page works; the referral is captured site-wide. Optionally tag it with a campaign to run on that campaign's terms. Read-only. - **Your affiliate earnings (affiliates.stats)** — [READ] The caller's affiliate numbers: how much is due to be paid out, how much is still in the clearing period, how much has been paid out all time, the split between tier-1 earnings (their own referrals) and tier-2 earnings (their team's), and how many people clicked, signed up, and became paying customers. Read-only. - **Your team (affiliates.downline)** — [READ] List the affiliates the caller recruited — the people whose sales earn them tier-2 commission — with how many paying customers each has brought in and how much each has earned the caller. Read-only. - **Leaderboard (affiliates.leaderboard)** — [READ] The live affiliate leaderboard — who has the most paying customers, the most signups, or the most clicks, across everyone promoting Chirply. Returns counts only, never anyone's earnings, and excludes affiliates who opted out. Also returns the caller's own position even when they're outside the top of the board. Use it to find who to reward. Read-only. - **People you referred (affiliates.list_referrals)** — [READ] List the people the caller referred and where each one got to — signed up, paying, or cancelled — along with the commission terms locked in for each. Read-only. - **Your commissions (affiliates.list_commissions)** — [READ] List the caller's individual commission entries — one per payment a referred customer made, including renewals, at both tiers. Shows what the customer paid, what the affiliate earned, which tier it came from, and whether it has cleared the hold period, been paid out, or been reversed by a refund. Read-only. - **Your payouts (affiliates.list_payouts)** — [READ] List the caller's payout requests and their state — requested, sending, paid, failed or cancelled. Read-only. - **Save payout details (affiliates.set_payout_method)** — Set where the caller's affiliate commission should be sent — a PayPal email address, or free-text bank details for a manual transfer. Overwrites whatever was there before. Getting the PayPal address wrong means the payment bounces, so confirm the address with the person before saving it. - **Set up with Stripe (affiliates.connect_stripe)** — Start (or resume) Stripe Express onboarding so the caller can be paid straight to their bank. Returns a one-time Stripe URL the person must open in a browser and complete themselves — Chirply never sees their bank details, and this capability cannot finish onboarding on their behalf. Safe to call repeatedly: the Stripe account is created once and reused, and the link is short-lived so a fresh one is minted each time. - **Stripe payout status (affiliates.stripe_status)** — [READ] Check whether the caller's Stripe Express account is ready to receive payouts. Re-reads the account from Stripe rather than trusting the stored copy, so it reflects onboarding they finished seconds ago. Read-only. - **Affiliate campaigns (affiliates.list_campaigns)** — [READ] List affiliate campaigns with their full rate tables — for each campaign, whether it is one tier or two, and what each audience (everyone vs partners) earns at each tier. Read-only. Available to any signed-in caller, since an affiliate is entitled to see the terms on offer. - **Affiliate dashboard (affiliates.overview)** — [READ] Everything on the caller's affiliate page in one call: their link and both tiers of terms, balances, click and referral counts, their team, and their most recent referrals, commissions and payouts. Use this instead of several separate reads when summarising someone's affiliate activity. Read-only. --- ## Actions — ai-agents _32 operations._ - **List AI agents (ai_agents.list)** — [READ] List the workspace's AI phone agents (AI receptionists) with their voice, model, language and whether each is active. - **Open an AI agent (ai_agents.get)** — [READ] Fetch one AI agent with every setting — persona, greeting, goals, voice and TTS provider, model, transfer rules, guardrails — plus the brain topics it's scoped to. - **Create an AI agent (ai_agents.create)** — Create an AI phone agent. Only a name is required — it starts paused-safe with the default Polly voice and no knowledge scope, ready to configure with ai_agents.update. - **Edit an AI agent (ai_agents.update)** — Update any part of an AI agent — identity, persona and goals, greeting, voice and TTS provider, model, knowledge scope, what it's allowed to do on a call, transfer target, voicemail script and turn limit. Omitted fields are left alone. Everything is validated before anything is written. Setting use_relay=true runs this agent's calls on Twilio ConversationRelay, which is faster but ADDS $0.07 PER MINUTE to every call. - **Activate or pause an AI agent (ai_agents.set_active)** — Turn an AI agent on or off. A paused agent stops answering inbound calls routed to it and refuses to place outbound ones; everything it's configured with is kept. - **Delete an AI agent (ai_agents.delete)** — [HIGH RISK] Permanently delete an AI agent. Refused while any call campaign is still using it — deleting mid-flight would leave every remaining recipient dialed, hearing silence, and metered. Numbers pointed at the agent fall back to the team automatically. This cannot be undone. - **List agent voices (ai_agents.list_voices)** — [READ] List every voice an AI agent can speak with: the curated Amazon Polly and Google catalogs (included with Chirply, no extra account) and — when the workspace has connected ElevenLabs — the voices in its own ElevenLabs account. Use the returned ids with ai_agents.update. Each ElevenLabs voice carries live_call_safe: it is false for a voice the workspace CREATED itself (an instant or professional clone, a designed voice), because on a live call Twilio does the ElevenLabs synthesis from its own account and can only reach the shared ElevenLabs library — assigning one to an agent is refused. Those voices are still usable for voicemail drops and phone-menu prompts, where Chirply renders the audio up front with the workspace's own key. - **Preview a voice (ai_agents.preview_voice)** — [HIGH RISK] Audition an ElevenLabs voice without placing a call: synthesizes a short fixed sample line in the workspace's OWN ElevenLabs account, which SPENDS ITS CREDITS the first time a given voice is previewed (every preview after that is served from cache, free). Amazon Polly and Google voices cannot be previewed — Twilio only exposes them at call time, and Chirply holds no AWS or Google credentials — so a preview is never faked with a substitute voice. Returns a link to play the audio; the bytes themselves aren't inlined. - **List agent models (ai_agents.list_models)** — [READ] List the OpenRouter models an AI agent can run on, with per-1M-token pricing, context window, and whether each supports tool calling (the voice agent requires it). Flags models measured too slow for live voice — a 'smart' model with a 16-second first token is unusable on a phone call. - **List what an agent can be allowed to do (ai_agents.list_abilities)** — [READ] List the abilities an AI phone agent can be granted for use mid-call — sending an email or a text it writes itself, tagging, moving a deal along the pipeline, creating a task, honoring a do-not-contact request, and so on. Use it to build the `abilities` list for ai_agents.update. Each one is flagged for whether it reaches a real person the moment the agent uses it. - **Point a number at an AI agent (ai_agents.attach_to_number)** — [ADMIN ONLY] Route a phone number's incoming calls to an AI agent — the number's inbound destination becomes 'ai_agent' and this agent answers every call to it from now on. Manager-only, matching the number settings page. - **Stop an AI agent answering a number (ai_agents.detach_from_number)** — [ADMIN ONLY] Hand a phone number's incoming calls back to the team (simulring online browser agents, then voicemail). The agent itself is untouched. Manager-only, matching the number settings page. - **Place a test call (ai_agents.test_call)** — [HIGH RISK] Have an AI agent call a phone number right now so you can hear it — the agent page's 'Test call' button. THIS DIALS A REAL PHONE: it bills the workspace's own Twilio for the voice minutes and its OpenRouter account for the tokens the conversation uses (plus $0.07/min if the agent runs on ConversationRelay). The agent must be active and OpenRouter must be connected. - **Have an AI agent call a contact (ai_agents.call_contact)** — [HIGH RISK] Queue an AI agent to call one of your contacts on their stored phone number, dispatched immediately by the outbound call engine (do-not-contact and the wallet guard still apply; quiet hours are deliberately skipped because this is an explicit 'call them now'). THIS DIALS A REAL PERSON and bills Twilio voice minutes plus OpenRouter tokens. The agent must be active and OpenRouter must be connected. - **List AI calls (ai_agents.list_calls)** — [READ] List calls AI agents have handled — which agent took it, which of your phone numbers it ran on, direction, who was on the other end, status, outcome, turn count and what each call cost. Use ai_agents.get_call for the full transcript. - **Open an AI call (ai_agents.get_call)** — [READ] Fetch one AI call in full: which agent handled it and on which of your phone numbers, the turn-by-turn transcript, every tool the agent used, the summary and outcome, any message it took or contact fields it updated, and a link to the recording when one was kept. - **List knowledge topics (brain.list_topics)** — [READ] List the AI Brain's topics — the folders of knowledge agents answer from, and the unit an agent's knowledge scope is set in. - **Create a knowledge topic (brain.create_topic)** — Create a topic in the AI Brain. Topic names are unique per workspace and become merge-field slugs ({{brain.pricing_faq}}), so pick something an agent can be pointed at. - **Rename a knowledge topic (brain.update_topic)** — Change a knowledge topic's name or description. Its knowledge items are untouched. - **Delete a knowledge topic (brain.delete_topic)** — [HIGH RISK] Permanently delete a knowledge topic AND every knowledge item inside it. Agents scoped to this topic lose that knowledge on their next call. This cannot be undone. - **List knowledge items (brain.list_knowledge)** — [READ] List the AI Brain's knowledge items with their provenance — typed in by hand, extracted from an uploaded document, or crawled off a website — and how many words each holds. Body text is omitted unless you ask for it. - **Open a knowledge item (brain.get_knowledge)** — [READ] Fetch one knowledge item with its full body text — exactly what an agent reads to a caller — plus where it came from and when it was last extracted. - **Add a knowledge item (brain.add_knowledge)** — Add a knowledge item to a topic by typing the text in. This is the same column an uploaded document or a crawled page lands in, so the agent reads it by the identical path. Content may be left empty as a stub. - **Edit a knowledge item (brain.update_knowledge)** — Update a knowledge item's title, description or body text. Provenance is deliberately kept: a crawled page someone tidied up by hand is still that page, which is what lets a re-crawl update this item instead of duplicating it. - **Delete a knowledge item (brain.delete_knowledge)** — [HIGH RISK] Permanently delete a knowledge item and any source documents stored behind it. Agents stop answering from it on their next call. This cannot be undone. - **List source documents (brain.list_documents)** — [READ] List the original documents stored behind knowledge items — filename, size, which extractor read it and how much text came out. Each row links to a download of the original. - **Ingest a document from a URL (brain.add_document_from_url)** — [HIGH RISK] Fetch a document from a URL, extract its text, and store it as knowledge — the machine-surface equivalent of the Brain's upload button (binary uploads can't ride a tool call). TXT/MD/CSV/TSV/JSON are decoded in-process for free; PDF/DOCX/DOC/ODT/RTF/XLSX/XLS/HTML are read by Firecrawl, which SPENDS THE WORKSPACE'S FIRECRAWL CREDITS and needs Firecrawl connected. Pass item_id to REPLACE an existing item's content (its old source documents are removed). Files over 20 MB, and scans with no text layer, are refused with the reason. - **Crawl a website into the Brain (brain.crawl_website)** — [HIGH RISK] Crawl a website (or a single page) with Firecrawl and import each page as a knowledge item in a topic. THIS SPENDS THE WORKSPACE'S FIRECRAWL CREDITS — roughly one per page crawled — so keep page_limit tight. Firecrawl must be connected. The crawl runs in the background for minutes; poll brain.get_crawl for progress. Re-crawling the same URL UPDATES the items it produced before rather than duplicating them, which is also how you re-ingest a site that has changed. - **List website crawls (brain.list_crawls)** — [READ] List website crawl jobs with their ingestion status — queued, crawling, done, failed or canceled — plus pages found, imported and skipped, and the Firecrawl credits each one used. - **Check a crawl's progress (brain.get_crawl)** — [READ] Fetch one website crawl job — where it is, how many pages have been crawled, imported and skipped, credits used, and the reason if it failed. Poll this after brain.crawl_website; a crawl runs for minutes. - **Stop a website crawl (brain.cancel_crawl)** — [HIGH RISK] Stop a crawl that is still queued or running, so it stops spending Firecrawl credits. Pages already imported stay in the Brain, and a canceled crawl can't be resumed — start a new one instead. - **Delete a crawl from the history (brain.delete_crawl)** — [HIGH RISK] Remove a crawl job from the history panel. The knowledge items it imported are left in place — delete those separately if you want them gone. --- ## Actions — assistant _5 operations._ - **Ask the assistant (assistant.ask)** — Send a message to the in-app AI assistant and get its reply. In 'chat' mode it only explains how the product works and changes nothing. In 'do' or 'smart' mode it can operate the workspace on your behalf — creating and editing records, running the same actions this API exposes — so treat its replies as having had real effects. Anything irreversible, outward-facing or costly (sending messages, spending money, deleting) is NEVER run off its own decision: those come back in `pending` for you to authorize with assistant.approve. Continues an existing conversation when you pass thread_id, otherwise starts one. Runs on the organization's own OpenRouter key and is billed to it; with no key connected, only 'chat' works. - **Approve a proposed action (assistant.approve)** — [HIGH RISK] Authorize (or refuse) the action the assistant stopped to ask about, then let it carry on. Approving RUNS the action for real — it is the one the assistant flagged as irreversible, outward-facing or costly, so it may send messages to real people, spend the organization's money or destroy data. Refusing tells the assistant no and it continues without it. - **List conversations (assistant.threads)** — [READ] List your conversations with the assistant, most recently used first. Titles are taken from the first thing said in each. - **Read a conversation (assistant.thread)** — [READ] Read one conversation back: what was asked, what the assistant answered, and every action it took along the way. - **Delete a conversation (assistant.delete_thread)** — [HIGH RISK] Permanently delete one conversation and every message in it. This cannot be undone. Anything the assistant already did to the workspace stays done — only the record of the conversation goes. --- ## Actions — automations _19 operations._ - **List workflows (automations.list)** — [READ] List the organization's automation workflows, newest first, with each one's trigger, whether it is active, and how many steps and runs it has. - **Open a workflow (automations.get)** — [READ] Fetch one workflow with its ordered steps and the webhook endpoint that can trigger it, matching the workflow editor page. - **Create a workflow (automations.create)** — Create a workflow: a trigger plus an ordered list of actions. It is created PAUSED and with no steps, so nothing fires until steps are added and automations.activate is called. - **Edit workflow details (automations.update)** — Update a workflow's name, description, trigger or webhook secret. Omitted fields are left alone. Changing the trigger of an ACTIVE workflow changes which real events fire it. - **Activate a workflow (automations.activate)** — [HIGH RISK] ARMS A LIVE AUTOMATION. Once active, every matching event fires this workflow's steps for real — sending SMS/email, placing calls, dropping voicemails, enrolling contacts in campaigns, spending the tenant's money — with no further human approval. Check the steps before turning it on. - **Pause a workflow (automations.pause)** — Turn a workflow off. Its trigger stops firing it; the steps and run history are kept and it can be activated again. Manual runs still work while paused. - **Delete a workflow (automations.delete)** — [HIGH RISK] Permanently delete a workflow along with its steps and its entire run history. This cannot be undone. - **List available step actions (automations.list_action_types)** — [READ] The shared action registry — every action a workflow step (or a call disposition, or a bulk action) can run, with its editable fields. Read this before writing steps so action_config uses the right keys. - **Add a workflow step (automations.add_step)** — Append an action to the end of a workflow. Adding a step does not run it; it runs on the next trigger or manual run. The action must be one the shared registry knows — see automations.list_action_types. - **Edit a workflow step (automations.update_step)** — Change what an existing step does. Both the action type and its config are replaced wholesale — send the complete config, not a patch. - **Delete a workflow step (automations.delete_step)** — [HIGH RISK] Remove a step from a workflow. The remaining steps keep their order. This cannot be undone. - **Reorder a workflow step (automations.move_step)** — Move a step one place up or down, swapping it with its neighbour — the arrows in the step list. Moving a step at the top or bottom edge is a no-op. - **Replace all workflow steps (automations.set_steps)** — [HIGH RISK] Replace a workflow's entire step list in one call, in the order given. Every existing step is deleted first, so this is destructive — pass the complete sequence, not just the changes. Nothing runs until the workflow is triggered. - **Open the automation flow (automations.get_flow)** — [READ] Fetch a workflow's flow graph — the nodes and connections the visual builder draws, and the exact structure the runtime walks. A workflow that predates the builder is lifted from its stored steps on the way out, so this always returns a graph. Read-only. - **Save the automation flow (automations.set_flow)** — [HIGH RISK] Replace a workflow's entire flow graph — its steps, waits, branches and the connections between them — in one call. This is how a multi-step follow-up sequence is built: an action node sends, a wait node genuinely defers the run for minutes/hours/days, and a branch node splits the path on something about the contact. Destructive: pass the complete graph, not just the changes. Saving sends nothing; the workflow still has to be triggered. A graph with blocking problems (an unconfigured action, a loop with no wait in it) can be saved as a draft but will be refused if is_active is true. - **Run a workflow now (automations.run_for_contact)** — [HIGH RISK] RUNS THE WORKFLOW FOR REAL, RIGHT NOW, against one contact — the 'Run manually' panel. Every step executes immediately through the tenant's own providers: real SMS and email leave, real calls and voicemails are placed, tags and deals change, and the tenant is billed. Works whether or not the workflow is active. Returns the run id and each step's outcome. - **Enroll contacts in a workflow (automations.enroll_contacts)** — [HIGH RISK] RUNS THE WORKFLOW FOR REAL against every contact given — the bulk 'Enroll in automation' action. Runs are one-shot and synchronous, so all of the steps fire immediately for each contact: real SMS/email/calls, real charges, once per contact. Continues past individual failures and reports the tally. - **List automation runs (automations.list_runs)** — [READ] Execution history: every time a workflow fired, with its status, how far it got, the contact it ran for and any error. Newest first. Filter by workflow or status. - **Open an automation run (automations.get_run)** — [READ] Fetch one run with its full context payload and error, for debugging why an automation did or didn't do what was expected. --- ## Actions — billing _12 operations._ - **My plan (billing.get_membership)** — [READ] The signed-in user's own Chirply membership: plan name, price and interval, live subscription status, next billing date, whether it's set to cancel, any paid add-ons, and the card on file as brand plus last four digits only. Read-only; nothing is charged. This is the person's personal subscription, not the workspace's invoicing. - **Available upgrades (billing.list_upgrade_offers)** — [READ] The one-click plan upgrades offered to a founder on the billing page (White-Label Partner, Reseller Partner), their current prices, and how long the founder deal window has left. When the window has closed, `reset` also gives the one-time price to reopen it and, in `restores`, the exact price each upgrade drops back to if they do. Nothing is charged. Note: like opening the billing page, the FIRST call anchors the 24-hour deal window to now. - **Plans (billing.list_plans)** — [READ] The Chirply plan ladder — Launch, Grow and Scale — with monthly and yearly prices, which one the signed-in user is on, and, for every other rung, whether moving there counts as an upgrade or a downgrade and exactly what that would cost and when. Also reports any plan change already scheduled for the end of the current billing cycle. Read-only; nothing is charged. Use billing.change_plan to actually move. - **Change plan (billing.change_plan)** — [HIGH RISK] Moves the signed-in user's Chirply membership to another plan. UPGRADING (a bigger plan, or the same plan switched from monthly to yearly) CHARGES THE CARD ON FILE IN FULL IMMEDIATELY and switches them over on the spot; the plan they were on is not refunded or prorated, it simply stops renewing at the end of the cycle already paid for. DOWNGRADING (a smaller plan, or yearly to monthly) charges nothing today — the current plan and everything in it runs to the end of the billing cycle, then cancels, and the cheaper plan starts and takes its first payment that same day. Booking a new change replaces any change already scheduled. Founder and complimentary memberships cannot be switched this way. Check billing.list_plans first to see which direction a given plan is and what it costs. - **Keep my current plan (billing.cancel_plan_change)** — [HIGH RISK] Calls off a plan change that was scheduled for the end of the current billing cycle and keeps the member on the plan they're on, renewing as normal. Nothing is charged or refunded — the scheduled plan never started. Only affects a booked-but-not-yet-started change; an upgrade that already took effect and was charged cannot be undone this way. - **Update payment method (start) (billing.start_card_update)** — Begin replacing the card on the caller's Chirply membership. Creates a Stripe SetupIntent on their billing account and returns its client secret, which a browser Payment Element uses to collect the new card. Card details are never sent through Chirply and nothing is charged. Finish with billing.finish_card_update. - **Update payment method (finish) (billing.finish_card_update)** — [HIGH RISK] Finish a card update: verifies the confirmed SetupIntent belongs to the caller, then makes its card the default for their Chirply billing account and every subscription on it. Nothing is charged now, but all FUTURE membership charges move to this card. - **Cancel membership (billing.cancel_membership)** — [HIGH RISK] Cancel the caller's Chirply membership at the end of the period they've already paid for. Access continues until then and no refund is issued. A founder who cancels loses their locked-in founder rate — resuming before the end date keeps it. Reversible with billing.resume_membership until the period ends. - **Resume membership (billing.resume_membership)** — Undo a scheduled cancellation so the membership keeps renewing at its existing rate. Nothing is charged now — the next renewal bills as normal. - **Switch to yearly (billing.upgrade_to_yearly)** — [HIGH RISK] CHARGES REAL MONEY NOW. Moves a monthly founder membership to the yearly plan at today's yearly ladder price. The switch is immediate: Stripe credits the unused part of the month and invoices the full annual term against the card on file straight away. There is no refund path back to monthly. - **Add a plan upgrade (billing.accept_upgrade)** — [HIGH RISK] CHARGES REAL MONEY NOW. Adds a paid add-on to the caller's Chirply membership — 'partner' (White-Label) or 'reseller' — as a NEW monthly subscription billed off-session to the card already on their founder subscription. The price is decided by the server: the founder deal price while their 24-hour window is open, the regular price after it. Already owning the tier is a no-op rather than a second charge. - **Reopen the founder window (billing.reset_upgrade_window)** — [HIGH RISK] CHARGES REAL MONEY NOW — a one-time payment to the card on the caller's founder subscription that reopens their 24-hour founder-pricing window, putting the White-Label and Reseller upgrades back at their founding prices. The price is computed on the server and climbs the longer the window has been closed, so pass the price the user was shown as `expected_price_dollars`; if it has moved, nothing is charged. If the window is still open this is a no-op. --- ## Actions — campaigns _20 operations._ - **List broadcasts (campaigns.list)** — [READ] List the organization's broadcast campaigns, newest first, each with its recipient, sent, delivered, opened and clicked counts. A campaign is a one-off blast on a single channel — email, SMS, ringless voicemail, outbound IVR or AI call. Archived campaigns are hidden unless asked for, matching the Campaigns page. - **Open a broadcast (campaigns.get)** — [READ] Fetch one campaign with its message, its saved audience spec, and its delivery counts — the whole composer in one payload. - **Create a broadcast (campaigns.create)** — Create a draft broadcast campaign and seed it with an empty audience, exactly like the New campaign dialog. A campaign sends ONE message ONCE — for a multi-step follow-up sequence with delays between messages, build an automation instead. Nothing is sent here: a draft has to be given content, an audience, and then sent or scheduled. - **Edit broadcast details (campaigns.update)** — Rename a campaign or change its sender overrides (the From email address, or the phone number SMS steps send from). Omitted fields are left alone. Content, audience and schedule have their own capabilities. - **Duplicate a broadcast (campaigns.duplicate)** — Copy a campaign — its message, channel, audience, send window and throttle — into a new draft named " (copy)". The copy has no recipients and sends nothing until it is sent or scheduled. This is how a sent campaign is edited: duplicate, then change the copy. - **Archive a broadcast (campaigns.archive)** — [HIGH RISK] Archive a campaign so it disappears from the Campaigns list. Its recipients, send ledger and analytics are kept — this is the app's way of removing a campaign; there is no hard delete. - **Save broadcast content (campaigns.set_message)** — Write the one message this broadcast sends, and pick which channel it goes out on. Nothing is sent by saving — this only stores the content. Only draft or paused campaigns can be edited. A campaign sends a single message; for a multi-step sequence with delays, build an automation instead. - **Save broadcast content (campaigns.save_step)** — DEPRECATED — use `campaigns.set_message`. Campaigns are one-off broadcasts now: they carry a single message, so there are no steps to order. This still writes that message, and ignores step_id, delay_amount and delay_unit. For a multi-step sequence with delays, build an automation. - **Delete a broadcast step (campaigns.delete_step)** — [HIGH RISK] DEPRECATED and no longer possible. A campaign is a one-off broadcast carrying exactly one message, so there are no steps to remove — clear the message with `campaigns.set_message`, or archive the campaign. Multi-step sequences live in automations. - **Choose the audience (campaigns.set_audience)** — Replace a campaign's audience spec — who it will go to. The spec is resolved to actual contacts only at send/schedule time, so this write sends nothing. Supplying manual_contact_ids overrides the tag/lifecycle/search filters entirely. Use campaigns.preview_audience to see how many people it matches first. - **Preview the audience count (campaigns.preview_audience)** — [READ] Count how many contacts a campaign would actually reach — channel-reachable and not suppressed — without saving or sending anything. Defaults to the campaign's saved audience; any field you pass overrides that field for the preview only. - **Save the sending window (campaigns.set_schedule)** — Set a campaign's timezone, quiet-hours window, allowed weekdays and per-minute throttle. This governs WHEN queued messages go out; it does not start a send. Replaces the whole schedule — omitted fields fall back to their defaults, matching the Schedule tab. - **Send the broadcast now (campaigns.send_now)** — [HIGH RISK] SENDS FOR REAL, IMMEDIATELY, to real people. Resolves the saved audience and starts delivering to every one of them through the org's OWN Mailgun or Twilio account — potentially thousands of emails, text messages, voicemail drops or phone calls, each metered and billed to the tenant. On a voice channel this places actual outbound calls. There is no undo; the only stop is campaigns.pause or campaigns.cancel, and anything already sent stays sent. Email/SMS send up to 500 inline with the rest queued; voicemail and call channels hand the whole audience to their own paced dispatcher. Requires saved content and a non-empty audience, and refuses a campaign that already sent. - **Schedule the broadcast (campaigns.schedule)** — [HIGH RISK] COMMITS A REAL SEND at a future time. Snapshots the audience now and sets the start time; when it arrives the dispatcher blasts every recipient through the org's OWN Mailgun or Twilio — potentially thousands of billed emails, texts, voicemail drops or phone calls, unattended. Use campaigns.cancel before the start time to stop it. Requires saved content, a non-empty audience, and a time that isn't in the past. - **Pause a sending broadcast (campaigns.pause)** — Stop a campaign that is mid-blast. Recipients already sent to keep their messages; everyone still queued stays queued until it is resumed. Only a campaign in 'sending' can be paused. - **Resume a paused broadcast (campaigns.resume)** — [HIGH RISK] RESTARTS A REAL BLAST. Puts a paused campaign back into 'sending' so the dispatcher immediately continues delivering to every recipient still queued — real, billed emails or texts. Only a paused campaign (including one paused for lack of funds) can be resumed. - **Cancel a broadcast (campaigns.cancel)** — [HIGH RISK] Halt a campaign for good: every pending and in-flight recipient stops immediately and nothing more goes out. Messages already delivered cannot be recalled, and a canceled campaign cannot be sent again — duplicate it instead. - **Enroll contacts in a broadcast (campaigns.enroll_contacts)** — [HIGH RISK] ENQUEUES REAL MESSAGES. Adds specific contacts to a campaign's recipient list with their first step due immediately, the same as the bulk 'Enroll in campaign' action on the contacts list. If the campaign is sending, they receive it on the next dispatch tick — real, billed email or SMS. Already-enrolled contacts are skipped. - **List broadcast recipients (campaigns.list_recipients)** — [READ] The delivery table for a campaign: who is enrolled, which step they are on, when they run next, and why any of them failed. Includes the per-status counts the Recipients page shows. - **Broadcast analytics (campaigns.stats)** — [READ] The delivery funnel for one campaign — recipients, sent, delivered, opened, clicked, plus bounced, failed and unsubscribed — computed from the send ledger, exactly as the Analytics page renders it. --- ## Actions — communications _3 operations._ - **Communication log (communications.list)** — [READ] Read the communication log: every call, text and email in and out of this workspace on one timeline, newest first, with both sides of each exchange named — the org's own line by its label, the far side by the contact who owns that number or address. Calls carry duration, recording URL and transcript; messages carry subject and body. Read-only. Archived entries are excluded unless `archived` is true. - **Archive (communications.archive)** — Take one entry out of the communication log once it's been dealt with. NOT a delete: the call or message stays on file with its recording, transcript and body intact, still visible in its conversation thread and on the contact's timeline — it just stops appearing in the log and in the dashboard's Recent Communication column. Reversible with communications.unarchive. - **Restore to log (communications.unarchive)** — Put a previously archived call, text or email back into the communication log, where it returns to its original place in the timeline. --- ## Actions — companies _5 operations._ - **List companies (companies.list)** — [READ] List the organization's companies, A–Z. Search matches the company name. - **Open a company (companies.get)** — [READ] Fetch one company by id, with all of its fields. Use contacts.list with company_id for the people who work there. - **Create a company (companies.create)** — Create a company record. Only a name is required; attach contacts to it afterwards with contacts.update. - **Edit a company (companies.update)** — Update fields on an existing company. Omitted fields are left alone; an explicit null clears one. - **Delete a company (companies.delete)** — [HIGH RISK] Permanently delete a company and its activity timeline. Contacts at the company are kept but are detached from it. This cannot be undone. --- ## Actions — compliance _35 operations._ - **Business profile (trust.get_profile)** — [READ · ADMIN ONLY] Read the organization's Twilio business profile: the business details on file, whether Twilio has approved it, and anything still missing. This profile is the foundation — SMS brand registration and every voice-trust product depend on it being approved first. - **Save business details (trust.save_profile)** — [ADMIN ONLY] Save the legal business details Twilio and the carriers require: registered name, business type, tax/registration number, address, website, and the authorized representatives. Saved locally only — nothing is sent to Twilio until the profile is submitted, so this can be filled in over several sittings. Editing an already-submitted profile stages the change for the next resubmission. - **Find my Twilio profile (trust.link_profile)** — [ADMIN ONLY] Look on the organization's own Twilio account for the business profile they created in the Twilio Console, and link it to Chirply. Twilio provides no API to CREATE that primary profile — it has to be started in their Console — so this is how the two sides get connected. Prefers an already-approved profile when several exist. - **Check before submitting (trust.check_profile)** — [ADMIN ONLY] Run Twilio's own free requirement check against the business profile and return which requirements pass and which fail. Costs nothing and does not submit anything. Worth running before every submission — a rejection costs days of review time for problems this check reports instantly. - **Submit for review (trust.submit_profile)** — [HIGH RISK · ADMIN ONLY] Send the business profile to Twilio for review. Pushes the saved details to Twilio, runs the free pre-check, and refuses to submit if that check fails. Review typically takes up to 72 hours and the profile can't be edited freely while it's in review. Free, but it gates everything else: no SMS brand and no voice-trust product can be registered until this is approved. - **Refresh profile status (trust.refresh_profile)** — [ADMIN ONLY] Re-read the business profile's review status from Twilio right now, instead of waiting for the background check that runs every 15 minutes. - **Carrier trust products (trust.list_products)** — [READ · ADMIN ONLY] List every carrier-trust product — SHAKEN/STIR call signing, CNAM caller-ID name, Voice Integrity spam protection, Branded Calling, and the A2P messaging profile — with the organization's registration status for each, what each one costs, and how long Twilio takes to review it. - **Add another caller ID name (trust.add_cnam_name)** — [ADMIN ONLY] Start an additional CNAM registration, so different phone numbers can display different business names — useful when one organization trades under more than one name. Each registration carries exactly one name and covers whichever numbers are added to it. Creates a draft only; nothing is sent to Twilio and nothing is charged until it's registered. - **Delete a registration (trust.delete_registration)** — [HIGH RISK · ADMIN ONLY] Delete a carrier-trust registration that was never submitted. Only works while it is still a draft — once Twilio holds it, the bundle exists on the organization's Twilio account and has to be removed there instead. - **Save trust product details (trust.save_product)** — [ADMIN ONLY] Save the extra answers a specific trust product needs before it can be registered. CNAM needs the caller-ID name to display (15 characters maximum — carriers cut it off past that). Voice Integrity needs what the organization uses calling for, its employee count, and its average calls per business day. SHAKEN/STIR and the A2P messaging profile need nothing beyond the business profile. Saved locally; nothing is sent to Twilio until the product is submitted. - **Register with the carriers (trust.submit_product)** — [HIGH RISK · ADMIN ONLY] Register a carrier-trust product with Twilio: creates the bundle, attaches the approved business profile and the product's own details, runs Twilio's free pre-check, and submits it. SHAKEN/STIR, CNAM and Voice Integrity are all free to register and take roughly 24–72 hours. Requires the business profile to be approved first. Branded Calling cannot be registered this way — Twilio has no API for it and it needs a signed Letter of Authorization, so it has to be started in the organization's own Twilio Console. - **Link an existing registration (trust.link_product)** — [ADMIN ONLY] Adopt a trust bundle that already exists on the organization's own Twilio account, by its bundle SID (starts with BU). This is how a Branded Calling registration — which has to be done in the Twilio Console — becomes visible in Chirply so its phone numbers can be managed here. - **Refresh registration status (trust.refresh_product)** — [ADMIN ONLY] Re-read one carrier-trust product's review status from Twilio right now, instead of waiting for the background check that runs every 15 minutes. - **Cover a number (trust.add_number)** — [ADMIN ONLY] Add one of the organization's phone numbers to an approved trust product, so calls from that number get its benefit — the highest SHAKEN/STIR attestation, the registered caller-ID name, or Voice Integrity's spam protection. The product must be approved first. Free. - **Uncover a number (trust.remove_number)** — [HIGH RISK · ADMIN ONLY] Remove a phone number from a trust product. Calls from it immediately lose that product's benefit — a number pulled off CNAM stops showing the business name, and one pulled off SHAKEN/STIR drops to a lower attestation and is more likely to be labeled spam. - **SMS brand registration (a2p.get_brand)** — [READ · ADMIN ONLY] Read the organization's A2P 10DLC brand: its registration status with the carriers, its trust score (which sets how many texts a day it can send), and whether a sole-proprietor phone verification is still outstanding. - **Register SMS brand (a2p.submit_brand)** — [HIGH RISK · ADMIN ONLY] Register the organization as an A2P 10DLC brand with The Campaign Registry, which US carriers require before any business texting. COSTS REAL MONEY on the organization's own Twilio account: $4.50 to register, plus $41.50 for secondary vetting unless skipped. Both are NON-REFUNDABLE and are charged even if the carriers reject the brand. Requires an approved business profile and an approved A2P messaging profile. Sole proprietors must additionally give the owner's personal mobile — Twilio texts it and the owner has to reply YES within 24 hours, which no software can do for them. - **Refresh brand status (a2p.refresh_brand)** — [ADMIN ONLY] Re-read the SMS brand's status from Twilio right now, instead of waiting for the background check that runs every 15 minutes. - **Resend owner verification text (a2p.resend_verification)** — [HIGH RISK · ADMIN ONLY] Send the sole-proprietor verification text again. This sends a REAL text message to the business owner's personal mobile, and they must reply YES to it. Only applies to sole-proprietor brands. The whole verification expires 30 days after the brand was created. - **Buy secondary vetting (a2p.request_vetting)** — [HIGH RISK · ADMIN ONLY] Order third-party secondary vetting for the SMS brand. COSTS $41.50 on the organization's own Twilio account, NON-REFUNDABLE, and it cannot be undone or repeated. In exchange the brand gets a trust score, which raises how many messages a day the carriers will accept from it. Only worth doing for a brand registered without vetting that is now hitting its daily limit. - **List messaging campaigns (a2p.list_campaigns)** — [READ · ADMIN ONLY] List the organization's A2P 10DLC campaigns — the registered descriptions of what it texts people about — with each one's carrier-approval status. - **Open a messaging campaign (a2p.get_campaign)** — [READ · ADMIN ONLY] Read one A2P 10DLC campaign in full: its use case, the description and opt-in wording registered with the carriers, its sample messages, its status, and anything still missing before it can be submitted. - **New messaging campaign (a2p.create_campaign)** — [ADMIN ONLY] Start a new A2P 10DLC campaign as a draft. Free — nothing reaches the carriers and nothing is charged until the campaign is submitted. Creates the Twilio Messaging Service the campaign's phone numbers will send through. - **Edit messaging campaign (a2p.update_campaign)** — [ADMIN ONLY] Edit a draft campaign's registration details. What goes here is read by human carrier reviewers, and vague answers are the single most common reason campaigns get rejected — describe what the business actually texts people and how those people asked for it. Saved locally; nothing reaches the carriers until the campaign is submitted. - **Available campaign types (a2p.list_use_cases)** — [READ · ADMIN ONLY] List the campaign use cases this organization's brand is actually eligible for, with each one's monthly carrier fee and whether it needs extra carrier approval. Always read this before setting a campaign's use case — the list depends on the brand's type and trust score, so a hardcoded guess gets rejected. - **Submit campaign to carriers (a2p.submit_campaign)** — [HIGH RISK · ADMIN ONLY] Submit an A2P 10DLC campaign to the carriers for approval. COSTS REAL MONEY on the organization's own Twilio account: a $15 NON-REFUNDABLE vetting fee charged once per campaign, plus a recurring monthly fee of $1.50 to $30 depending on the use case, billed for as long as the campaign exists. Carrier review takes 10–15 days and sometimes longer. Requires an approved brand. If a campaign is rejected it must be fixed and RESUBMITTED — deleting it and creating a new one is charged the $15 again. - **Refresh campaign status (a2p.refresh_campaign)** — [ADMIN ONLY] Re-read a campaign's carrier-approval status from Twilio right now, instead of waiting for the background check that runs every 15 minutes. - **Add number to campaign (a2p.add_campaign_number)** — [ADMIN ONLY] Put one of the organization's phone numbers behind a registered campaign. From then on texts sent from that number route through the campaign's Messaging Service, which is what makes them A2P-compliant and stops US carriers filtering them. A Messaging Service holds at most 400 numbers. - **Remove number from campaign (a2p.remove_campaign_number)** — [HIGH RISK · ADMIN ONLY] Take a phone number off a campaign. Its texts immediately go back to sending unregistered, which US carriers routinely filter or block — do this only when moving the number to a different campaign. - **Unsubscribed (unsubscribe.list)** — [READ] List everyone the organization can no longer contact, with what each person is unsubscribed from, how they came off the list (they texted STOP, clicked an unsubscribe link, used the opt-out page, pressed a key on a call — or a team member removed them by hand), and when. Read-only. - **Unsubscribe totals (unsubscribe.counts)** — [READ] How many people are unsubscribed, broken down by what they're unsubscribed from. Useful for checking how much of an audience a campaign will actually reach before sending it. - **Communication preferences (unsubscribe.get_contact)** — [READ] Read one contact's communication preferences: which kinds of message they can still be sent, which they've been unsubscribed from, who unsubscribed them and how, plus the full history of every opt-out and resubscribe on their record. Check this before sending anyone anything one-to-one. - **Unsubscribe (unsubscribe.add)** — Stop contacting someone. Immediately blocks every campaign, automation, and bulk send on the channels given — real messages that would otherwise have been sent are not sent. Works on a contact, or on a bare email address or phone number for someone who isn't in the CRM. Recorded with who did it and when, and reversible with unsubscribe.remove. - **Resubscribe (unsubscribe.remove)** — [HIGH RISK] Put someone back on the list, so campaigns and automations can contact them again on the channels given. ONLY do this when the person has actually asked to be contacted again — resubscribing someone who opted out is how a business ends up messaging people who told it to stop, which in the US carries statutory penalties per message. The original opt-out stays in the record permanently either way. - **Can we contact them? (unsubscribe.check)** — [READ] Check whether one email address or phone number is unsubscribed, before sending to it. Returns which kinds of message are still allowed and which are blocked. Cheap, read-only, and worth calling before any one-to-one outreach. --- ## Actions — contacts _35 operations._ - **List contacts (contacts.list)** — [READ] List the organization's contacts, newest first. Optionally filter by lifecycle stage, company, owner or lead source, and search names, business name, email and phone. Each contact carries `source` (the channel it arrived through) and `source_detail` (the specifics — which website page, which lead search, which import file). - **Open a contact (contacts.get)** — [READ] Fetch one contact by id, with every field plus the tags assigned to them. - **Lead sources (contacts.list_sources)** — [READ] Break this organization's contacts down by where they came from — the channel each lead arrived through, with a count, commonest first. Only sources that actually occur are returned, so an empty result means the org has no contacts. Use the returned `source` values to filter contacts.list. Reads nothing outside this org and changes nothing. - **Columns (contacts.get_column_layout)** — [READ] Read which columns you see on the contacts list and in what order, plus every column this organization could show (built-ins and its custom fields). Personal to you — it does not affect what teammates see. Returns the defaults when you have never changed them. - **Save columns (contacts.set_column_layout)** — Choose which columns you see on the contacts list and in what order — the array order IS the left-to-right order, and any column you leave out is hidden. Personal to you; teammates' lists are unaffected. Unknown keys are dropped and 'name' is always kept (it is the link into each record), so the list can never be left unusable. Call contacts.get_column_layout for the valid keys. - **Reset columns (contacts.reset_column_layout)** — Forget your saved column choices for the contacts list so it goes back to the default columns (name, contact, source, company, tags, owner, lifecycle). Personal to you, and affects only which columns are displayed — no contact data is changed or deleted. - **Find a contact by phone number (contacts.find_by_phone)** — [READ] Look up the org's contact at a phone number, matched on any spelling of it ('4098930064', '+14098930064' and '(409) 893-0064' are the same person). Returns null when nobody holds that number. Use this before creating a contact from a call or a text. - **Create a contact (contacts.create)** — Create a contact. Requires at least a name, business name, or email. The phone number is normalized to E.164 and is an identity: if another contact in this org already holds it, this fails with a conflict naming that contact rather than creating a duplicate — update that one instead. - **Edit a contact (contacts.update)** — Update fields on an existing contact. Omitted fields are left alone; an explicit null clears one. Moving a phone number onto this contact fails with a conflict when it is already someone else's in this org. - **Delete a contact (contacts.delete)** — [HIGH RISK] Permanently delete a contact and everything that cascades off them — tags, notes and the whole activity timeline. This cannot be undone. - **Delete selected contacts (contacts.bulk_delete)** — [HIGH RISK] Permanently delete every listed contact, along with their tags, notes and activity timelines. This cannot be undone. - **Set lifecycle stage (contacts.set_lifecycle)** — Move every listed contact to a lifecycle stage (lead, active, customer, churned). Reversible — set it back to change your mind. - **Import contacts (contacts.import)** — Bulk-create contacts from a list of records — the machine intake path (CSV/lead imports). Unlike contacts.create, a row whose email or phone already matches an existing contact does NOT error and does NOT duplicate: it is reported as matched and skipped. Nothing existing is overwritten. - **Import contacts from a CSV (contacts.import_csv)** — Import contacts from raw CSV text — the same importer the Contacts screen's Import button runs, taking the file's contents instead of a file. The first row must be headers; they are matched to contact fields by name ('First Name', 'Email', 'Mobile', 'Company' and the obvious variants all work), and anything unrecognized is ignored unless you map it explicitly. A row whose email or phone already belongs to a contact is reported as matched and skipped — nothing existing is ever overwritten. Every contact created is stamped as a file import with the file name, so they can be found again later. - **List duplicate phone numbers (contacts.list_duplicates)** — [READ] List contacts in this org that share a phone number, grouped, oldest first inside each group. Read-only, and expected to come back empty: duplicates are merged automatically the moment they are written. A non-empty result means two contacts were created on the same number simultaneously — run contacts.merge_duplicates to collapse them. - **Merge duplicate contacts (contacts.merge_duplicates)** — [HIGH RISK] Permanently collapse every set of contacts in this org that share a phone number down to one contact each. The newest record of each set survives and absorbs the others: their calls, messages, tasks, invoices, notes, tags and list memberships all move onto it, and any field it was missing is filled in from the older record. The older rows are then DELETED and their contact ids stop resolving — this cannot be undone. Normally there is nothing to do, because duplicates are merged as they are created; this is the repair for the rare pair created by two simultaneous writes. - **List tags (contacts.list_tags)** — [READ] List the org's contact tags, with the colour each one renders in. - **Create a tag (contacts.create_tag)** — Create a contact tag. Tag names are unique per organization — creating one that already exists fails. - **Rename a tag (contacts.update_tag)** — Rename a tag or change its colour. Every contact carrying it is updated at once. - **Delete a tag (contacts.delete_tag)** — [HIGH RISK] Permanently delete a tag and strip it from every contact that carries it. This cannot be undone; the contacts themselves are kept. - **Tag contacts (contacts.add_tags)** — Add one or more existing tags to one or more contacts. Idempotent — a tag a contact already has is left alone. - **Untag contacts (contacts.remove_tags)** — Remove one or more tags from one or more contacts. The tags themselves are kept — use contacts.delete_tag to remove a tag entirely. - **List custom fields (contacts.list_fields)** — [READ] List the org's custom-field definitions — the keys, labels and types that the `custom` blob on contacts, companies and deals is made of. - **Create a custom field (contacts.create_field)** — Define a new custom field on contacts, companies or deals. The storage key is derived from the label and is unique per record type — a second field with the same derived key fails. - **Edit a custom field (contacts.update_field)** — Change a custom field's label, type, choices or required flag. The storage key never changes, so values already recorded stay attached. - **Delete a custom field (contacts.delete_field)** — [HIGH RISK] Permanently delete a custom-field definition. The app stops showing and collecting it; values already stored in each record's `custom` blob become unreachable. This cannot be undone. - **Add a note (contacts.add_note)** — Add a free-text note to a contact's, company's or deal's activity timeline. Attach it to at least one of them. - **Open the activity timeline (contacts.list_activity)** — [READ] Read the activity timeline for a contact, company or deal — notes, calls, texts, emails, tasks and stage changes, newest first. - **Text contacts (contacts.send_sms)** — [HIGH RISK] SEND A REAL TEXT MESSAGE to each listed contact from one of the org's active Twilio numbers. Costs money per message and reaches real people immediately; there is no undo. `{{token}}` merge fields are rendered per contact and each text lands in that contact's own conversation. Contacts with no phone number are skipped. - **Email contacts (contacts.send_email)** — [HIGH RISK] SEND A REAL EMAIL to each listed contact through the org's own Mailgun account. Reaches real inboxes immediately and cannot be recalled. Subject and body both render `{{token}}` merge fields per contact, and each email lands in that contact's own conversation. Contacts with no email address are skipped. - **Enroll contacts in an automation (contacts.enroll_in_automation)** — [HIGH RISK] Run an active workflow against each listed contact. Runs are immediate and one-shot, so whatever the workflow does — texts, emails, ringless voicemails, calls, webhooks — happens now, to real people, at the org's expense. - **Run actions on contacts (contacts.run_actions)** — [HIGH RISK] Run a list of shared-registry actions against each listed contact — the same actions the contacts bulk bar and a single contact's 'Reach out' panel offer. Actions can text, email, drop a ringless voicemail, place an outbound IVR, AI-agent or sales-bridge call, enroll in a campaign, send an invoice, move a deal, create a task, call a webhook, or delete the contact — so this can spend money, reach real people, and destroy data depending on what you pass. - **Detect line type (contacts.lookup_line_type)** — [HIGH RISK] Queue a Twilio Lookup for each listed contact's phone number to learn whether it is mobile, landline or VoIP. Twilio BILLS the org per number looked up. Results land asynchronously in the shared line-type cache, so numbers already known cost nothing and are not re-queued. Returns how many NEW paid lookups were queued. - **Summarize a contact (contacts.summarize)** — [READ] Generate a short situational summary plus two or three next-best actions for a contact, grounded in their profile, deals and recent activity. Reads only — it changes nothing — but it spends a little of the org's own AI credit, and needs OpenRouter connected. - **Draft a follow-up (contacts.draft_follow_up)** — [READ] Draft a ready-to-send follow-up message body for a contact, grounded in their history. Returns the text only — it does NOT send anything; pass it to contacts.send_sms or contacts.send_email to actually reach them. Spends a little of the org's own AI credit. --- ## Actions — conversations _15 operations._ - **List conversations (conversations.list)** — [READ] List the inbox's conversation threads, most recent activity first. Filter by channel (sms/email), status (open/snoozed/closed), the teammate a thread is assigned to, or the contact it's with, and search subjects and last-message previews. - **Open a conversation (conversations.get)** — [READ] Open one thread and read its history. Returns the conversation, the contact, and — exactly like the inbox — EVERY message exchanged with that contact across all channels and threads plus their calls, merged chronologically, not just this thread's own messages. - **Recent Communication (conversations.recent)** — [READ] DEPRECATED — use `communications.list`, which this now calls and which adds direction/type filters, paging and the archive. Returns the newest entries of the communication log (calls, texts and emails merged, newest first) — the same rows the dashboard's Recent Communication column shows. Read-only. - **Start a conversation (conversations.start)** — [HIGH RISK] Open a new SMS or email thread with a contact. If `body` is supplied it is SENT IMMEDIATELY as the first message — a real text or email leaves the org's own Twilio/Mailgun account, reaches the recipient, and bills the tenant. Leave `body` empty to open an empty thread without sending anything. Merge tokens like {{first_name}} are rendered against the contact. - **Assign a conversation (conversations.assign)** — Assign a thread to a teammate, or pass assigned_to = null to leave it unassigned. The user must be a member of this organization. - **Set conversation status (conversations.set_status)** — Move a thread between open, snoozed, and closed — the Status section of the inbox's Manage menu. Use it to close a resolved thread or reopen a closed one; nothing is deleted either way. - **Summarize a thread (conversations.summarize)** — [READ] Summarize a conversation into a few bullets — what the customer wants, the key facts, and the next step. Grounded only in that thread's own messages. Runs on the org's own OpenRouter connection and fails with a plain message when AI isn't connected. Reads only; nothing is sent or saved. - **List messages (messages.list)** — [READ] List individual SMS and email messages, newest first. Narrow to one conversation or contact, or filter by channel, direction, or delivery status to find what failed. Use conversations.get instead to read a thread in order. - **Send a reply (messages.send)** — [HIGH RISK] SENDS A REAL MESSAGE. Replies on an existing thread: a text goes out over the org's own Twilio number, an email over the org's own Mailgun domain, it reaches an actual person, and the tenant is billed for it. There is no draft or undo. The recipient defaults to the contact's address for the thread's channel, falling back to whoever last wrote in. Merge tokens like {{first_name}} are rendered against the contact before sending. - **Draft, improve, or retone a reply (messages.assist_reply)** — [READ] The composer's AI buttons. mode='draft' writes the next reply from the thread so far, 'improve' polishes the draft you pass in, and 'tone' rewrites it in the requested tone. Returns TEXT ONLY — nothing is sent; pass the result to messages.send when the human approves it. Runs on the org's own OpenRouter connection. - **List autoresponders (conversations.list_autoresponders)** — [READ] List the org's auto-reply rules — what fires automatically on an inbound SMS or email, or on a missed call. - **Create an autoresponder (conversations.create_autoresponder)** — [HIGH RISK] Create an auto-reply rule. Once active it SENDS REAL MESSAGES on its own — every matching inbound message gets this body texted or emailed back from the org's own account, billed to the tenant, with no human in the loop. Create it inactive (is_active=false) to stage it first. - **Edit an autoresponder (conversations.update_autoresponder)** — [HIGH RISK] Update an existing auto-reply rule. Omitted fields are left alone. Changes take effect on the next inbound message, so an active rule starts sending the new body immediately. - **Activate or pause an autoresponder (conversations.toggle_autoresponder)** — [HIGH RISK] Flip an auto-reply rule's Active checkbox. Activating it arms real automatic sends on the next matching inbound message; pausing it stops them without deleting the rule. - **Delete an autoresponder (conversations.delete_autoresponder)** — [HIGH RISK] Permanently delete an auto-reply rule. This cannot be undone. --- ## Actions — deal_templates _5 operations._ - **List deal templates (deal_templates.list)** — [READ] List the saved starting points for new cards. Pass pipeline_id to get exactly what the Add-deal form on that board offers: the templates tied to it plus the org-wide ones. Values come back as integer cents. - **New deal template (deal_templates.create)** — Save a starting point for new cards on a board: a title, value, starting stage, owner, custom fields and how many days out the expected close should be. Leave pipeline_id off to offer it on every board. Setting is_default makes the Add-deal form on that board open pre-filled with it, and clears the flag from any other template on the same board. Creates nothing on the board itself — it's a form pre-fill. - **Edit a deal template (deal_templates.update)** — Change a saved template. Omitted fields are left alone. Existing deals created from it are untouched — a template is a pre-fill, not a link. Setting is_default clears the flag from any other template on the same board. - **Add a deal from a template (deal_templates.use)** — Create a real deal on the board using a template as the starting point — the same thing as picking it under 'Start from' and submitting. The template's title, value, stage, owner, custom fields and 'close in N days' are applied, and anything you pass here overrides them. The template itself is unchanged. - **Delete a deal template (deal_templates.delete)** — [HIGH RISK] Permanently delete a saved template. Deals already created from it are NOT affected — a template is only a form pre-fill. Cannot be undone. --- ## Actions — deals _12 operations._ - **List deals (deals.list)** — [READ] List and search deals, newest first. Filter by pipeline, stage, status, owner, contact, or company, and search deal titles with `query`. Values come back as integer cents. - **Open a deal (deals.get)** — [READ] Fetch one deal by id, with all of its fields including custom fields. - **Create a deal (deals.create)** — Create a deal on a pipeline board. Only a title is required: without pipeline_id it lands on the org's default pipeline, and without stage_id it goes in that pipeline's first stage. The status is derived from the stage — creating straight into a won/lost stage closes the deal. - **Edit a deal (deals.update)** — Update any field on a deal — title, value, currency, expected close date, links, custom fields, stage, or status. Omitted fields are left alone. Moving it with stage_id re-derives the status from that stage; passing status explicitly wins and stamps or clears closed_at accordingly. - **Move a deal to another stage (deals.move)** — Drop a deal card into a stage of its own pipeline — the drag gesture on the board. Without `position` it lands at the bottom of the target column; with one it lands at that slot and the rest of the column shifts down. Moving to a new stage re-derives the deal's status from that stage's outcome (won/lost stages close the deal and stamp closed_at) and logs a stage-change entry on the deal's timeline. Passing the stage the deal is already in just reorders it inside that column — no status change, no timeline entry. - **Mark a deal won (deals.mark_won)** — Close a deal as won and stamp its close time. If the pipeline has a stage flagged as won, the deal is moved into that column and a stage-change entry is logged, exactly as dragging it there would. - **Mark a deal lost (deals.mark_lost)** — Close a deal as lost and stamp its close time. If the pipeline has a stage flagged as lost, the deal is moved into that column and a stage-change entry is logged. - **Mark a deal abandoned (deals.mark_abandoned)** — Close a deal as abandoned (walked away, not a loss) and stamp its close time. No stage carries an 'abandoned' flag, so the deal keeps its current column but stops counting as open. - **Reopen a deal (deals.reopen)** — Put a closed deal (won, lost, or abandoned) back to open and clear its close time. Pass stage_id to also move it back into a working column — otherwise it stays where it is, which may be a won/lost column. - **Assign a deal owner (deals.assign)** — Set the org member who owns a deal, or pass owner_id=null to leave it unassigned. The user must already be a member of this organization. - **Link a deal to a contact or company (deals.link)** — Attach a deal to a contact and/or a company so it shows on that record, or pass null to unlink. Supply at least one of contact_id or company_id; both must belong to this organization. - **Delete a deal (deals.delete)** — [HIGH RISK] Permanently delete a deal. DESTRUCTIVE: its activity timeline (notes, stage changes) is deleted with it, and any task pointing at it loses the link. The contact and company survive. Cannot be undone. --- ## Actions — developers _4 operations._ - **List API keys (api_keys.list)** — [READ · ADMIN ONLY] List this workspace's API keys — name, display prefix, scopes, last-used time, and whether each is revoked. The secret itself is never stored in readable form and is never returned here. - **Create an API key (api_keys.create)** — [HIGH RISK · ADMIN ONLY] Mint a new API key for this workspace and return the full secret — this is the ONLY time it can ever be read, so hand it to the user immediately. The key can do anything an owner can within this org, limited only by its scopes. Treat it as a live credential. - **Revoke an API key (api_keys.revoke)** — [HIGH RISK · ADMIN ONLY] Revoke an API key immediately. Any integration authenticating with it starts failing on its next request, and the key can never be un-revoked. - **Delete an API key (api_keys.delete)** — [HIGH RISK · ADMIN ONLY] Permanently delete an API key row, removing it from the list entirely. Same live effect as revoking — anything using it breaks — but it also loses the audit trail, so prefer api_keys.revoke unless the row is genuinely unwanted. --- ## Actions — domain_leads _5 operations._ - **Search domain leads (domain_leads.search)** — [READ] Search ~26 million registered domains by a keyword in the domain name and return the person or business who registered each one, with their name, company, phone, email and postal address. Read-only reference data covering registrations from 2019 to December 2025 — it is a historical snapshot, not live WHOIS. Domains registered behind a privacy/proxy service are excluded entirely because they carry no reachable contact. Costs nothing to run. - **Get a domain's registrant (domain_leads.get)** — [READ] Look up one specific domain and return everything known about who registered it — name, company, phone, email, full postal address, registrar, and registration/expiry dates. Returns null when the domain isn't in the database or was registered behind a privacy proxy. - **List a registrant's other domains (domain_leads.registrant_portfolio)** — [READ] Given a registrant's email address, list the other domains that same person or business registered. Useful for gauging whether a lead is a real business (a handful of domains) or a domain speculator (hundreds). - **List domain endings and countries (domain_leads.list_filters)** — [READ] List the domain endings (TLDs) and registrant countries available as search filters, each with how many domains carry it, most common first. Use this to discover valid values for the tld and country arguments of domain_leads.search. - **Import domain leads into contacts (domain_leads.import_to_contacts)** — [HIGH RISK] Run a domain-leads search and copy the matching registrants into this organization's CRM as contacts, with their name, company, email, phone and website. Creates up to 500 contact records in one call — these are real people's contact details and will appear in the org's contact list, where they can then be called, texted or emailed. Does not send anything by itself and spends no money, but bulk-importing thousands of contacts is tedious to undo, so it asks for confirmation. --- ## Actions — domains _21 operations._ - **Domains (domains.list)** — [READ] List every custom domain this workspace has connected, with what is currently published on each one — the site or funnel at its root, how many short links point at it, and how many invoices are served from it. Includes whether each domain was bought through Chirply or brought from another registrar, its DNS/certificate status, and its renewal date. - **Domain details (domains.get)** — [READ] Read one domain: its status, how it was obtained, the DNS record required (if any), its expiry and auto-renew setting, and a breakdown of everything published on it. - **Connect a domain (domains.connect)** — [HIGH RISK · ADMIN ONLY] Connect a domain the organization ALREADY OWNS at another registrar (e.g. go.acme.com) and request a public TLS certificate for it. Does not buy anything and costs no money. The domain does not serve traffic until the owner adds the returned CNAME record at their DNS provider; use domains.verify afterwards to check. Once live it can serve short links, a funnel or site, and invoices at the same time. - **Check again (domains.verify)** — Re-check a domain's DNS and certificate with Cloudflare and store the result. Safe to call repeatedly; changes nothing except the recorded status. - **Domain settings (domains.update)** — [HIGH RISK · ADMIN ONLY] Change what a domain does: which site or funnel answers at its root, where the bare domain redirects when nothing is attached, where unknown paths go, and whether short links are allowed on it. Turning links off instantly stops every short link on this domain from resolving. - **Disconnect (domains.disconnect)** — [HIGH RISK · ADMIN ONLY] Stop serving a domain and release its certificate. Every short link, funnel page and invoice published on it stops working immediately and falls back to Chirply's own address. A domain BOUGHT through Chirply stays registered to the organization — this only stops serving it, it does not give up the domain or refund anything. - **Find a domain (domains.search)** — [READ] Search for domain names that are available to buy, with the price the organization would pay. Read-only — nothing is reserved or charged. Returns first-year and yearly renewal prices, which often differ. - **Check a domain (domains.check_availability)** — [READ] Check whether specific domain names are available and what they would cost. Read-only — nothing is reserved or charged. - **Buy a domain (domains.purchase)** — [HIGH RISK · ADMIN ONLY] Buy and register a domain, CHARGING THE ORGANIZATION'S SAVED CARD for the first year at the price returned by domains.search. Registration is non-refundable once it completes. The card is authorized first and only captured after the registry confirms the domain, so a failed registration costs nothing. The domain is configured automatically and is live immediately — no DNS setup. It renews yearly at the quoted renewal price unless auto-renew is turned off. - **Auto-renew (domains.set_auto_renew)** — [HIGH RISK · ADMIN ONLY] Turn yearly auto-renewal on or off for a domain bought through Chirply. With it on, the organization's card is charged about 30 days before expiry at the current renewal price. With it OFF the domain will EXPIRE at the end of its term and everything published on it will stop working. - **Pixels (pixels.list)** — [READ] List the organization's retargeting pixels. A pixel is defined once and can fire on any public surface — link interstitials, funnel pages, invoice pay pages — either everywhere or only where attached. - **Add a pixel (pixels.create)** — [ADMIN ONLY] Add a retargeting pixel. For a known provider give the ID from their ads manager and the snippet is generated safely; for anything else use provider 'custom' and supply the raw snippet. Setting all_surfaces fires it on every public page the organization serves, which is usually what's wanted. Attaching a pixel to a short link forces that link's interstitial page on, because a bare redirect renders no page for a pixel to fire on. - **Edit a pixel (pixels.update)** — [ADMIN ONLY] Change a pixel's name, ID, snippet, placement, or whether it fires on every public page. - **Delete a pixel (pixels.delete)** — [HIGH RISK · ADMIN ONLY] Delete a pixel and remove it from everything it was attached to. It stops firing immediately and the audience it was building stops growing. - **Attach a pixel (pixels.attach)** — [ADMIN ONLY] Attach or detach a pixel from one specific link, funnel, page or invoice. Not needed for pixels marked all_surfaces — those already fire everywhere. - **Where a pixel fires (pixels.attachments)** — [READ] List everything one pixel is currently attached to. - **Tracking scripts (scripts.list)** — [READ] List the organization's tracking scripts — Google Tag Manager, heatmaps, chat widgets, affiliate tags. Defined once and reusable on any public page, rather than pasted into each invoice or funnel separately. - **Add a tracking script (scripts.create)** — [HIGH RISK · ADMIN ONLY] Add a tracking snippet that runs on the organization's public pages. The snippet executes in visitors' browsers on pages the organization controls. Setting all_surfaces runs it on every public page. Maximum 8000 characters. - **Edit a tracking script (scripts.update)** — [HIGH RISK · ADMIN ONLY] Change a tracking script's name, snippet, placement, or whether it's active. Setting active to false stops it running everywhere at once. - **Delete a tracking script (scripts.delete)** — [HIGH RISK · ADMIN ONLY] Delete a tracking script and remove it from everything it was attached to. It stops running immediately, and anything it was measuring stops being recorded. - **Attach a tracking script (scripts.attach)** — [ADMIN ONLY] Attach or detach a tracking script from one specific link, funnel, page or invoice. Not needed for scripts marked all_surfaces. --- ## Actions — funnels _44 operations._ - **List funnels (funnels.list)** — [READ] List the organization's funnels, most recently edited first. Each funnel is a sequence of landing pages served at /f/. - **Open a funnel (funnels.get)** — [READ] Fetch one funnel with its steps (pages), connected custom domains, theme, and total form submissions. Page documents are omitted — use funnel_pages.get for a page's content. - **Create a funnel (funnels.create)** — Create a draft funnel — or, with kind='page', a single standalone page — and seed its home page with a ready-made starter layout for the chosen step type. The public URL is derived from the name; nothing is visible to the public until funnels.publish is called. - **Rename a funnel (funnels.update)** — Rename a funnel or change its description or public slug. Changing the slug MOVES the funnel's public URL — any link already shared at the old /f/ stops working. Omitted fields are left alone. - **Duplicate a funnel (funnels.duplicate)** — Copy a funnel — its theme and every page's working draft — into a brand-new DRAFT funnel on a fresh URL. Component ids are regenerated so the copy and the original can never interfere. Nothing is published, and the original is untouched. - **Publish a funnel (funnels.publish)** — [HIGH RISK] PUT THIS FUNNEL ON THE PUBLIC INTERNET. Every page of it that is itself published becomes reachable at /f/ (and on any active custom domain) to anyone with the link, with no login. Publish only when the content is ready to be seen by customers. - **Take a funnel offline (funnels.unpublish)** — [HIGH RISK] Take a live funnel off the public internet. Visitors on /f/ and on any custom domain immediately stop being able to reach it. Content and pages are kept — publish again to restore it. - **Delete a funnel (funnels.delete)** — [HIGH RISK] PERMANENTLY DESTROY a funnel and everything under it: every page and its published content, every saved version, the funnel's captured submissions, and its connected custom domains. This cannot be undone. Templates already saved from it, and funnels built from those templates, are unaffected. - **List theme presets (funnels.list_theme_presets)** — [READ] List the curated funnel theme presets — id, name, the mood each one suits, and its design tokens. These are the options the theme picker offers and the palette funnels.set_theme accepts. - **Change a funnel's theme (funnels.set_theme)** — Restyle an entire funnel — colors, fonts, corner radius, button style and spacing — in one write. Every page reads these tokens, so no page edits are needed. Pass a preset id, explicit token overrides, or both (overrides layer on top of the preset). Live pages change appearance immediately. - **Funnel performance (funnels.stats)** — [READ] Conversion stats per step for a funnel over the last N days: views, unique visitors, form submissions, paid orders and revenue (cents, net of refunds). This is what the Performance report on the funnel page shows. - **List funnel submissions (funnels.list_submissions)** — [READ] List the leads captured by a funnel's opt-in and order forms, newest first, with the raw submitted field values and the contact each one was promoted into. - **Build a funnel with AI (funnels.generate)** — Describe a business and an offer, and the AI plans the whole step sequence, writes every page, and picks a theme. Everything is saved as a DRAFT with no published content — a generated funnel can never put itself live. Consumes the organization's AI credits and takes up to a minute. - **Rewrite page copy (funnels.rewrite_copy)** — [READ] Rewrite one snippet of page copy — a headline, a subhead, a button label — and return the new text. Nothing is saved; write it back with funnel_pages.save_content. Consumes the organization's AI credits. - **Generate a page image (funnels.generate_image)** — Generate an image from a description, store it in the organization's media bucket, and return its URL for use in a page component's image prop. Consumes the organization's AI credits. - **List funnel steps (funnel_pages.list)** — [READ] List a funnel's pages in step order. Page documents are omitted — call funnel_pages.get for a page's content. - **Open a funnel page (funnel_pages.get)** — [READ] Fetch one page with BOTH documents: `content` is the working draft you edit, `published_content` is what visitors currently see. Read this before editing a page — funnel_pages.save_content expects a document in the same shape. - **Add a funnel step (funnel_pages.create)** — Add a page to the end of a funnel, seeded with a ready-made starter layout for the chosen step type. It is created as a draft; publish it separately with funnel_pages.publish. - **Rename a funnel step (funnel_pages.update)** — Rename a page, change its URL path, or change its step type. Changing the path MOVES its public URL. The home page cannot be edited here — it is the funnel root and its path is fixed at ''. - **Redirect a page (funnel_pages.set_redirect)** — [HIGH RISK] Make a published page send visitors somewhere else instead of rendering. Takes effect on the live page immediately, on every address it is served at, including the funnel's custom domain. The page's content is kept untouched — pass an empty redirect_url to switch it back on. Works on the home page too, which is how a whole single-page site gets redirected. - **Reorder funnel steps (funnel_pages.reorder)** — Set the order visitors move through a funnel's steps. Pass every page id of the funnel in the order you want; the first one must be the funnel's home page. Order only — no content or URL changes. - **Save a page draft (funnel_pages.save_content)** — Replace a page's WORKING DRAFT with a Puck document. Visitors are unaffected — the live page reads `published_content` — so this is safe to call repeatedly. Read the page with funnel_pages.get first and edit the document it returns; components the registry doesn't recognise are dropped on save. - **Publish a page (funnel_pages.publish)** — [HIGH RISK] PUT THIS PAGE ON THE PUBLIC INTERNET. Copies the working draft over the live version, so whatever the draft currently says becomes what visitors see at /f//. If the funnel itself is still a draft it is published too, because a live page inside an offline funnel is unreachable. A restore point is saved first, so this is undoable via funnel_pages.restore_version. - **Take a page offline (funnel_pages.unpublish)** — [HIGH RISK] Take one live page off the public internet — visitors on its URL immediately stop being able to reach it. The rest of the funnel stays live. The draft and the last published content are kept, so publishing again restores it. - **Delete a funnel step (funnel_pages.delete)** — [HIGH RISK] PERMANENTLY DESTROY a page, its live content and its entire version history. This cannot be undone. The home page cannot be deleted — it is the funnel's entry point; delete the funnel instead. - **List page versions (funnel_pages.list_versions)** — [READ] List a page's saved restore points, newest first — every publish, every AI edit, and every manual snapshot. Documents are omitted; funnel_pages.restore_version brings one back. - **Save a restore point (funnel_pages.snapshot)** — Save a named restore point for a page. Nothing about the page changes — this only records what the draft looks like now so it can be brought back later. - **Restore a page version (funnel_pages.restore_version)** — Bring a saved version back into the page's WORKING DRAFT. The live page is not touched — publish afterwards if you want visitors to see it. The draft being replaced is snapshotted first, so a restore is itself undoable. - **Generate a page with AI (funnel_pages.generate_content)** — [READ] Generate a complete page document from a prompt and RETURN it for review — nothing is saved. Pass the result to funnel_pages.save_content to keep it. Consumes the organization's AI credits. - **Edit a page with AI (funnel_pages.ai_edit)** — Apply a natural-language change to a page's draft document ("make the headline punchier", "add a testimonial section") and RETURN the new document — nothing is saved, so pass it to funnel_pages.save_content to keep it. The pre-edit document is snapshotted automatically. If the instruction implies a restyle, the funnel's theme IS changed immediately. Consumes the organization's AI credits. - **List custom domains (funnel_domains.list)** — [READ] List the custom domains connected to the organization's funnels, with their verification and TLS status and the CNAME record the tenant has to create. - **Connect a custom domain (funnel_domains.attach)** — [HIGH RISK · ADMIN ONLY] Point a real hostname the organization owns (e.g. offers.acme.com) at a funnel and register it for a public TLS certificate. This publishes the funnel on a NEW address on the open internet as soon as the tenant's CNAME resolves. Returns the DNS record they must create; use funnel_domains.verify afterwards. - **Verify a custom domain (funnel_domains.verify)** — Re-check a connected domain with Cloudflare and update its status. Run this once the CNAME record exists — certificate issuance is asynchronous and completes on its own within a few minutes. - **Disconnect a custom domain (funnel_domains.detach)** — [HIGH RISK · ADMIN ONLY] Disconnect a custom domain and release its Cloudflare hostname and certificate. Everything served on that address STOPS immediately — the funnel, any single pages, and every LinkWizard link hosted on it, including copies already shared. The funnel itself, its /f/ URL, and the links themselves are kept and can be moved elsewhere. - **List funnel templates (funnel_templates.list)** — [READ] List the funnel templates available to start from: the organization's own saved ones plus the shared library Chirply provides. A template is a frozen copy of a funnel's theme and every page. - **Open a funnel template (funnel_templates.get)** — [READ] Fetch one funnel template with its theme and the full frozen document of every page it carries. - **Save a funnel as a template (funnel_templates.save_from_funnel)** — Freeze a funnel's theme and every page's WORKING DRAFT into a reusable template. It is a snapshot, not a link — editing the funnel afterwards never changes the template, and funnels built from it are never coupled back to it. - **Start a funnel from a template (funnel_templates.use)** — Create a new funnel from a template — theme and every page copied in, with fresh component ids. Everything lands as a DRAFT: a template can contain a published-looking funnel, and using one must never put it live. - **Delete a funnel template (funnel_templates.delete)** — [HIGH RISK] PERMANENTLY DESTROY one of the organization's saved funnel templates, including every page document frozen inside it. This cannot be undone. Funnels already built from it are unaffected. Templates provided by Chirply can't be deleted. - **List products (products.list)** — [READ] List what the organization's funnels sell. A product can be the main offer on one funnel's order form and the order bump or one-click upsell on another. Amounts are integer cents. - **Open a product (products.get)** — [READ] Fetch one product with its pricing, currency and billing interval. - **Create a product (products.create)** — Add a sellable product to the catalogue so it can be attached to an order form, an order bump or a one-click upsell inside the builder. Creating a product charges nobody — checkouts run on the organization's own connected Stripe account, and nothing can be sold until Stripe is connected. - **Edit a product (products.update)** — Update a product's name, price, currency, billing kind or artwork. Changing a price does NOT rewrite past orders — order items copy the amount at purchase time — but it DOES change what every funnel offering this product charges from now on. Omitted fields are left alone. - **Archive or restore a product (products.archive)** — Take a product out of the builder's pickers (archive) or put it back (restore). Products are archived rather than deleted because past orders reference them and a sold product has to stay resolvable for reporting. --- ## Actions — invoices _24 operations._ - **All invoices (invoices.list)** — [READ] List the organization's invoices and checkout pages, newest first. Filter by invoice kind (standard, product, group, ascending, plan, trial_ascending) or status, and search names. Archived invoices are hidden, exactly as in the app. - **Open an invoice (invoices.get)** — [READ] Fetch one invoice with its line items, pricing rules, pay-page settings and public link. - **Copy the invoice link (invoices.get_public_link)** — [READ] Get the public pay-page URL for an invoice, plus the iframe snippet for embedding it. The link only takes payments once the invoice is published. - **Price this invoice now (invoices.quote)** — [READ] Run the invoice through the pricing engine and return what a buyer would pay right now: priced lines, discount, scarcity increase, tax, total, what's due at checkout, and every future scheduled charge. This is the same calculation the public pay page and the scheduler use — never compute invoice totals yourself. - **Invoice line items (invoices.list_line_items)** — [READ] List the line items on one invoice, in display order, with their unit prices in integer cents. - **Payments (orders) (invoices.list_orders)** — [READ] List buyers' orders across every invoice, newest first — who bought, what they owe, and what they've paid. Filter to one invoice or one order status. - **Open a payment (invoices.get_order)** — [READ] Fetch one buyer's order with everything the payment page shows: totals, charges taken so far, the remaining schedule, the timeline, and the buyer's private receipt link. - **Payment history (invoices.list_payments)** — [READ] List individual charges taken across the organization's invoices — succeeded, failed and refunded — newest first. Filter to one order or one status. - **Scheduled charges (invoices.list_schedules)** — [READ] List the future charges queued against orders — payment-plan installments, a group offer's close, a standard invoice's capture date, and dunning retries. Filter by invoice, order, or status to find what's due or what has failed. - **Invoice timeline (invoices.list_events)** — [READ] The activity timeline for one invoice — created, published, paid, failed, canceled — newest first. - **Invoicing overview (invoices.summary)** — [READ] The money view from the Invoices dashboard: total invoiced, collected, outstanding and failed, plus collections per day for the last N days. Reads real orders and cleared payments, not cached counters. - **New invoice (invoices.create)** — [ADMIN ONLY] Create a draft invoice of the chosen kind. It starts empty with that kind's default pricing rules; add line items and then publish it to make its pay page live. Nothing is charged and nobody is emailed. Kinds: standard (one customer), product (reusable checkout page), group (price drops as more join), ascending (price rises per buyer), plan (installments), trial_ascending (cheap now, full price later). - **Edit invoice details (invoices.update)** — [ADMIN ONLY] Update an invoice's name, memo, currency, tax rate, billed contact, pricing rules or pay-page settings. Omitted fields are left alone; `pricing` and `settings` are merged over what's stored, then normalized for the invoice's kind. Money values are integer cents. Line items are edited with the invoices.add_line_item / update_line_item / remove_line_item capabilities. - **Add a line item (invoices.add_line_item)** — [ADMIN ONLY] Append a line item to an invoice. `unit_amount` is integer cents. Set item_kind to 'recurring' with an interval to bill it as a subscription line; leave it 'one_time' for a single charge. Recomputes the invoice's cached totals. - **Edit a line item (invoices.update_line_item)** — [ADMIN ONLY] Update one line item's name, price, quantity, taxability, ordering or recurrence. Omitted fields are left alone. Recomputes the invoice's cached totals. - **Remove a line item (invoices.remove_line_item)** — [HIGH RISK · ADMIN ONLY] Delete one line item from an invoice and recompute its totals. Orders already placed keep the price they were quoted. - **Publish (invoices.publish)** — [HIGH RISK · ADMIN ONLY] Publish a draft invoice so its public pay page goes LIVE and starts taking real payments on the organization's own Stripe account. Anyone with the link can then buy. Requires at least one line item. - **Stop accepting payments (invoices.close)** — [ADMIN ONLY] Close an invoice so its pay page stops taking new payments. Nothing is deleted and charges already scheduled against existing orders still run. Publishing it again reopens it. - **Archive (invoices.archive)** — [HIGH RISK · ADMIN ONLY] Archive an invoice: it leaves every list, its pay page stops working, and it can no longer be opened. Orders and payments are kept — the revenue record is never destroyed. This is how the app deletes an invoice, and it cannot be undone from here. - **Duplicate (invoices.duplicate)** — [ADMIN ONLY] Copy an invoice and all of its line items into a fresh draft with a new public link. The copy takes no payments until it's published. - **Send the invoice (invoices.send)** — [HIGH RISK · ADMIN ONLY] SENDS A REAL EMAIL to a customer with a link to a published invoice's pay page, from the organization's own email provider. The invoice must be published. Give either a contact_id (uses that contact's email and renders merge fields like {{first_name}}) or an explicit `to` address. - **Mark paid outside Stripe (invoices.mark_paid)** — [HIGH RISK · ADMIN ONLY] Record that an order's outstanding balance arrived OUTSIDE Stripe — cash, a bank transfer, a legacy invoice. Writes a real payment row for the full outstanding amount, marks the order paid, and cancels anything still scheduled against it. No card is charged; this changes the revenue record, so only use it when the money genuinely arrived. - **Cancel an order (invoices.cancel_order)** — [HIGH RISK · ADMIN ONLY] Cancel a buyer's order and every charge still scheduled against it, so their card is never charged again. Payments already taken are left untouched — this does NOT refund anything. - **Charge a scheduled payment now (invoices.charge_saved_card)** — [HIGH RISK · ADMIN ONLY] CHARGES REAL MONEY. Runs a scheduled charge immediately against the card the buyer already authorized, on the organization's own Stripe account — the same off-session charge the invoice scheduler makes when an installment, a group close or a capture date comes due. Use it to collect early or to retry a failed installment. The amount comes from the schedule row; it cannot be changed here. --- ## Actions — leads _11 operations._ - **Check the Outscraper connection (leads.outscraper_status)** — [READ] Report whether the organization has connected its own Outscraper account, plus its remaining credit and this cycle's usage. Read-only — call it before a paid search to see what the tenant has to spend. - **List lead searches (leads.list_searches)** — [READ] List past lead searches, newest first, with each one's status, result count, duplicates skipped and estimated cost — plus the org's running totals. Purely historical; it runs nothing and spends nothing. - **Open a lead search (leads.get_search)** — [READ] Fetch one lead search by id — its query, status, result and duplicate counts, estimated cost, and any provider error. - **Search and filter lead search results (leads.list_results)** — [READ] Page through the businesses one lead search found — name, phone, email, website, rating, phone line type, and whether each is already in the CRM — narrowing them exactly as the results table does. Use the filters to isolate the leads actually worth importing: `q` free-text matches name, phone, email, address, city, category and website; `has_phone`/`has_email`/`has_website` drop the unreachable ones; `line_type: "mobile"` keeps only numbers that can receive a text or voicemail drop; `min_rating` keeps the well-reviewed ones. Reads staged results only — nothing is fetched from Outscraper, so this costs nothing. Feed the returned ids straight into leads.import. - **Search Google Maps for leads (leads.search_maps)** — [HIGH RISK] Scrape Google Maps for businesses matching a category and location, via the organization's OWN Outscraper account. THIS SPENDS THE TENANT'S MONEY: Outscraper bills per record returned (roughly $3 per 1,000 Maps records after the first 500 free each cycle, more with the emails enrichment), and duplicates already in the CRM are still scraped and still billed. Set the limit deliberately. Jobs over 80 results, or any search with emails on, are submitted in the background and finish later — poll with leads.check_status. - **Search Yelp for leads (leads.search_yelp)** — [HIGH RISK] Scrape Yelp for local businesses matching a category and location, via the organization's OWN Outscraper account. THIS SPENDS THE TENANT'S MONEY: Outscraper bills per listing returned, and duplicates already in the CRM are still scraped and still billed. Know what you get: business name, phone, street address, rating, review count, categories, price range, neighborhood, a link to the Yelp listing, and the business's own website when Yelp has one on file — but NEVER an email address. Set `emails: true` to chain the website-finder and contact-scraper enrichments on top, which is the only way a Yelp lead becomes emailable; it costs several times more per record. EVERY Yelp search runs in the background — Yelp is slow (about 90 seconds for ten listings) — so this returns a search id immediately and you collect the results with leads.check_status or leads.list_results a couple of minutes later. - **Search the business database for leads (leads.search_database)** — [HIGH RISK] Search Outscraper's B2B business database with structured filters (category, country/state/city/postal, name, minimum rating or review count, has-website/has-phone/verified). Instant and cursor-paginated. THIS SPENDS THE TENANT'S MONEY: Outscraper bills per record returned (roughly $2 per 1,000 for the first 5,000 each cycle, more above that, plus a surcharge per record for the emails or insights enrichments), and duplicates already in the CRM are still billed. At least one filter or a keyword query is required so the whole database isn't scanned. - **Load more results (leads.load_more)** — [HIGH RISK] Fetch and append the next page of an existing business-database search using its stored cursor. THIS SPENDS THE TENANT'S MONEY exactly like a new search — another page of records is billed to the organization's Outscraper account. Only database ('b2b') searches can load more. - **Check a running search (leads.check_status)** — Poll a background Google-Maps or Yelp search and stage its results if Outscraper has finished. Costs nothing extra — the scrape was already billed when it was submitted; this only collects what was paid for. - **Delete a lead search (leads.delete_search)** — [HIGH RISK] Permanently delete a lead search and every staged result under it. Contacts already imported into the CRM are kept, but the un-imported leads are gone and re-finding them means paying Outscraper for the search again. - **Import leads into the CRM (leads.import)** — [HIGH RISK] Import staged lead-search results into the CRM as contacts, and optionally run actions on them in the same pass. Pass result_ids for specific leads, or just search_id to import every not-yet-imported result of that search — which can create hundreds of contacts in one call and is not undoable in bulk. Deduped by phone and email: a lead matching an existing contact links to it instead of creating a duplicate. The import itself costs nothing extra (the search was already billed), BUT the optional `actions` run once per imported contact and are a real mass send — depending on the actions chosen they text, email, drop ringless voicemails, place automated or AI calls, or enroll people into campaigns, immediately and irreversibly, billed through the organization's own Twilio/Mailgun accounts. Actions also hit the existing contacts that leads deduped onto, not just the newly created ones. Optionally add every imported contact to a list. --- ## Actions — links _23 operations._ - **List links (links.list)** — [READ] List the organization's links, newest first, with their click, unique-visitor and conversion counts. Optionally filter by kind, status, domain or tag, and search the name, label and destination. - **Open a link (links.get)** — [READ] Fetch one link by id with all of its rules, its rotation destinations and the retargeting pixels attached to it, plus its public URL. - **Create a link (links.create)** — Create a link and return its public URL. Costs nothing and sends nothing — the link is live immediately but nobody sees it until it is shared. Leave the name blank for a short random one. Leave domain_id blank to host it on Chirply's own short address; supply one of the organization's connected domains to brand it. Rotating, sticky and overflow links need `targets`; a file link needs a file URL. - **Edit a link (links.update)** — Update any field on an existing link. Omitted fields are left alone. Supplying `targets` REPLACES the whole destination list, which resets the per-destination click counts that overflow caps rely on. - **Pause or resume a link (links.set_status)** — [HIGH RISK] Set a link live, paused or archived. A paused link stops resolving immediately — everyone who opens it, including people who already have it, gets a not-found page. - **Duplicate a link (links.duplicate)** — Copy a link with all of its rules and destinations under a fresh random name. The copy is created PAUSED on purpose — an exact duplicate that went live immediately would start splitting traffic with the original before anything had been changed. Retargeting pixels are not copied. - **Delete a link (links.delete)** — [HIGH RISK] Permanently delete a link, along with every click and conversion recorded against it. Anyone who already has the link gets a not-found page from then on. This cannot be undone — pause the link instead if you only want to stop it temporarily. - **Link report (links.stats)** — [READ] Click and conversion statistics for one link over a window of days: totals, unique visitors, blocked clicks, conversions and their value, a per-day series, and rankings by country, device, browser, operating system and referring site. - **Recent clicks (links.clicks)** — [READ] The most recent individual clicks on a link — when, from which country and city, on what device and browser, where they came from, and whether they were sent through or stopped by a rule. - **Links overview (links.overview)** — [READ] Totals across every link in the organization: how many links, how many clicks and how many conversions. - **List retargeting pixels (links.list_pixels)** — [READ] List the retargeting pixels set up for this organization, ready to attach to links. - **Add a retargeting pixel (links.create_pixel)** — Add a retargeting pixel that can be attached to links. Supply the provider's own ID (from Meta Events Manager, Google Ads, and so on) — the snippet is generated from it. Use provider 'custom' with `custom_html` for anything else, which injects that HTML verbatim into the waiting page. - **Delete a retargeting pixel (links.delete_pixel)** — [HIGH RISK] Permanently delete a retargeting pixel and remove it from every link it was attached to. Those links stop building that audience from the next click on. This cannot be undone. - **Choose which pixels fire on a link (links.set_pixels)** — Set exactly which retargeting pixels fire on a link, replacing whatever was attached before. Attaching any pixel means the link shows its short branded waiting page — that page is the only moment a pixel can fire on a click that is passing through to somebody else's site. - **List traffic sellers (links.list_vendors)** — [READ] List the people this organization buys clicks from, for assigning to links and tracking delivery against what was ordered. - **Add a traffic seller (links.create_vendor)** — Add someone this organization buys clicks from. Assign them to a link (with clicks_ordered and order_amount) to see how much of what was paid for actually arrived. - **Delete a traffic seller (links.delete_vendor)** — [HIGH RISK] Permanently delete a traffic seller. Links assigned to them keep working and keep their ordered-click figures, but are no longer grouped under anyone. This cannot be undone. - **Conversion tracking snippet (links.get_tracking)** — [READ] The organization's conversion-tracking token and the snippet to paste into their own website, plus the custom event names already seen. Returns nothing configured if tracking has never been switched on. - **Turn on conversion tracking (links.enable_tracking)** — Switch on full-loop conversion tracking and return the snippet to install. Once on, every tracked link appends a small `cwc` parameter to the destination URL so a lead or sale fired later on the organization's own site can be attributed back to the click. Safe to call repeatedly — it returns the existing token if there is one. - **Who a link was sent to (links.recipients)** — [READ] The people this link was sent to individually, and which of them opened it — highest engagement first. Only populated when per-person link tracking is on: each recipient of an email or text gets their own copy of the link, so a click can be attributed to a named contact rather than an anonymous visitor. - **Turn per-person links on or off (links.set_link_rewriting)** — [HIGH RISK · ADMIN ONLY] Switch per-person link rewriting for the whole workspace. When ON, every link inside outgoing emails and texts is rewritten so each recipient gets their own URL — clicks then carry the contact's identity, and so do any conversions they produce. All recipients still share ONE link, so editing where it points changes every message already delivered. Unsubscribe links are never rewritten. Turning it OFF does not break links already sent; it only stops new ones being minted. Switching it on also enables conversion tracking, which adds a `cwc` parameter to destination URLs. - **Connect a domain (links.connect_domain)** — [HIGH RISK · ADMIN ONLY] Register a domain the organization owns so links and pages can be served on it. Creates a Cloudflare custom hostname and starts certificate issuance; the domain will NOT serve anything until the owner adds a CNAME record at their DNS provider and the certificate is issued. Nothing is charged, but this claims the hostname on Chirply's Cloudflare zone. - **Change a domain's settings (links.update_domain)** — Set what a connected domain serves: which funnel or single page is attached, where the bare domain redirects when nothing is attached, where unknown addresses go, and whether links are allowed on it at all. Turning links off on a domain immediately stops every link hosted there from resolving. --- ## Actions — lists _10 operations._ - **List lists (lists.list)** — [READ] List the organization's contact lists with each one's member count. Lists are named STATIC segments — membership is explicit, not a saved filter. - **Open a list (lists.get)** — [READ] Fetch one list by id, with its description and current member count. - **Create a list (lists.create)** — Create an empty contact list. Only a name is required, and it must be unique within the organization. Add contacts afterwards with lists.add_contacts. - **Edit a list (lists.update)** — Rename a list or change its description. Omitted fields are left alone; membership is untouched. - **Delete a list (lists.delete)** — [HIGH RISK] Permanently delete a list and every membership row on it. The contacts themselves are NOT deleted, but the segment is gone and cannot be restored. - **View list members (lists.members)** — [READ] Page through the contacts on a list, newest addition first, with each member's name, email and phone. - **Add contacts to a list (lists.add_contacts)** — Add one or more existing contacts to a list. Idempotent — a contact already on the list is silently kept, not duplicated. Contact ids that don't belong to this organization are ignored. - **Remove contacts from a list (lists.remove_contacts)** — Remove one or more contacts from a list. This only drops the membership — the contacts themselves are untouched. - **Browse runnable actions (lists.action_types)** — [READ] List the action types lists.run_actions accepts, with each one's configurable fields. Call this before lists.run_actions so the action config is built with the right keys. - **Run actions on a list (lists.run_actions)** — [HIGH RISK] Run one or more actions against EVERY contact on a list — the same 'Run actions' bulk surface the app offers. This is a mass send: depending on the actions chosen it texts, emails, drops ringless voicemails, places automated or AI calls, enrolls people into campaigns, emails invoices, or deletes contacts, once per member, immediately and irreversibly, billed through the organization's own Twilio/Mailgun accounts. Pass contact_ids to restrict it to specific members. Confirm the list's exact member count with lists.get before calling. Runs on up to 2,000 members. --- ## Actions — marketplace _6 operations._ - **Browse marketplace (marketplace.browse)** — [READ] Searches snapshots other Chirply users have published, by keyword and category. Installing one still requires buying or being granted it. - **My listing (marketplace.get_my_listing)** — [READ · ADMIN ONLY] This workspace's marketplace listing for a snapshot, including its review state and any note the Chirply reviewer left. - **Edit listing (marketplace.upsert_listing)** — [ADMIN ONLY] Creates or edits the marketplace listing copy for a snapshot. Editing does NOT publish it — submit it for review separately. - **Submit for review (marketplace.submit_listing)** — [HIGH RISK · OWNER ONLY] Sends the listing to Chirply for review and public publication. A Chirply admin reads the whole configuration first, including every outbound URL it would contact. - **Unlist (marketplace.unlist)** — [HIGH RISK · OWNER ONLY] Removes a listing from public browsing. Existing licences and anything already installed are unaffected. - **Report a listing (marketplace.report_listing)** — [HIGH RISK] Flags a marketplace listing to Chirply as spam, malicious, broken or infringing. Three open reports suspend a listing pending review. --- ## Actions — pipelines _10 operations._ - **List pipelines (pipelines.list)** — [READ] List the organization's deal pipelines in board order, with the default one flagged. Call this first when you need a pipeline_id. - **Open a pipeline (pipelines.get)** — [READ] Fetch one pipeline together with its stages, in board order. Omit the id to get the org's default pipeline. - **View the pipeline board (pipelines.board)** — [READ] Summarize a pipeline board the way the Pipeline page and the dashboard's Pipeline widget do: every stage with its deal count and total value, plus the board's split into in-progress (open), won, and lost deals with the money in each. 'Lost' counts both lost and abandoned deals — closed without a win. All values are integer cents. Read-only. - **Create a pipeline (pipelines.create)** — Create a new deal pipeline and seed it with the starter stages (New → Qualified → Proposal → Won → Lost) so its board is usable immediately. It is added after the existing pipelines and does not become the default. - **Create the default pipeline (pipelines.seed_default)** — Set up the starter 'Sales' pipeline (New → Qualified → Proposal → Won → Lost) for an org that has no pipeline yet, and mark it default. Does nothing if the org already has at least one pipeline. - **Rename a pipeline (pipelines.rename)** — Change a pipeline's name. Stages and deals are untouched — this is the name field in the pipeline settings dialog. - **Make a pipeline the default (pipelines.set_default)** — Mark one pipeline as the org's default. The default is what the Pipeline page opens on and what a deal created without a pipeline_id lands in; any other pipeline loses the flag. - **Money or a process (pipelines.set_value_tracking)** — Switch a board between a sales pipeline and a process board. With tracks_value true each card carries a value and the columns total it; false hides the value field and the totals, which is what you want for onboarding, fulfilment, hiring or any board where the cards aren't sales. This is a display decision only — values already saved on the deals are kept, so switching back restores them. - **Reorder pipelines (pipelines.reorder)** — Set the left-to-right order of the pipelines in the switcher. Pass every pipeline id in the order you want; any pipeline you leave out keeps its current position. - **Delete a pipeline (pipelines.delete)** — [HIGH RISK] Permanently delete a pipeline. DESTRUCTIVE: the database cascades, so every stage in the pipeline AND every deal on its board is deleted with it — deals are not moved anywhere. Cannot be undone. --- ## Actions — plans _8 operations._ - **My plan & limits (plans.get)** — [READ] The plan this workspace is on and every limit it carries — caps like phone numbers and seats, and on/off features like ringless voicemail or the MCP server — with where the plan came from (bought by the owner, pinned by Chirply, or inherited from a parent agency) and any limit Chirply has bent for this workspace specifically. Read-only; nothing is charged. - **Plan usage (plans.usage)** — [READ] How much of each countable limit this workspace has used — phone numbers, seats, funnels, workflows, AI agents and so on — with the cap beside it and whether there's room for another. Use this before creating something to know whether it will be refused. Read-only. - **Plan catalog (admin) (plans.list_catalog)** — [READ] PLATFORM ADMIN ONLY. Every plan on the ladder with its shipped defaults and any limits a Chirply admin has changed, so you can see what was decided in code versus in the console. Read-only. - **Change a plan limit (admin) (plans.set_limit)** — [HIGH RISK] PLATFORM ADMIN ONLY. Changes one limit on one plan FOR EVERY WORKSPACE ON THAT PLAN — raising a cap gives it to all of them, lowering one stops all of them creating more. Nothing already built is deleted or switched off; workspaces over a lowered cap keep what they have and simply can't add. Omit `value` to drop the override and go back to Chirply's shipped default. - **Reset a plan (admin) (plans.reset_plan)** — [HIGH RISK] PLATFORM ADMIN ONLY. Drops every console override on one plan so it follows Chirply's shipped ladder again. Affects every workspace on that plan. Nothing already built is removed. - **Pin a workspace to a plan (admin) (plans.set_workspace_plan)** — [HIGH RISK] PLATFORM ADMIN ONLY. Puts one workspace on a specific plan regardless of what its owner is paying for — comps, staff workspaces, a tenant mid-migration. This does NOT charge or refund anything and does not touch Stripe; it only changes what the workspace is allowed to do. Omit `plan` to remove the pin and go back to following the owner's membership. - **Bend one limit for a workspace (admin) (plans.override_workspace_limit)** — [HIGH RISK] PLATFORM ADMIN ONLY. Changes a single limit for ONE workspace while leaving its plan alone — the way to give one customer an extra phone number without moving them up a tier or changing anything for anyone else. Omit `value` to remove the exception. Nothing already built is removed. - **Clear a workspace's exceptions (admin) (plans.clear_workspace_overrides)** — [HIGH RISK] PLATFORM ADMIN ONLY. Removes every limit exception on one workspace, putting it entirely back on its plan. Nothing already built is removed — they simply can't create beyond the plan any more. --- ## Actions — privacy _6 operations._ - **Privacy mode (privacy.get_settings)** — [READ] Read the user's screen-share privacy settings: whether privacy mode is on, which classes of information it is hiding, and whether redaction is `partial` (a short readable prefix survives on names, phone numbers and emails) or `full` (nothing survives). Also returns the full catalog of categories, marking the three that are always hidden (contact details, conversations, and keys) and the six the user can choose. - **Turn on privacy mode (privacy.enable)** — Turn on privacy mode so the user can share their screen, demo, or record a walkthrough safely. Sensitive values are blurred on screen immediately: contact names and details, conversation and call content, and API keys are ALWAYS hidden, plus whichever optional categories the user has chosen. Nothing is deleted and no permissions change — this only affects what is legible on screen. Optionally pass `also_hide` to switch extra categories on at the same time. - **Turn off privacy mode (privacy.disable)** — [HIGH RISK] Turn privacy mode off, making every hidden value readable again across the whole app — contact names, phone numbers, email addresses, message content and API keys included. Only do this when the user has confirmed they are no longer sharing their screen or recording; if they are, this puts their customers' personal information straight back on the stream. - **How much to hide (privacy.set_strength)** — [HIGH RISK] Choose how much of a redacted identity stays readable. `partial` (the default) leaves the first few characters of names, phone numbers, emails and addresses legible — 'Sar…', '+1 (415) …' — so the user can still tell rows apart and talk about one while demoing, without anyone being identifiable. `full` blurs them completely, for a recording that will be published. Either way this only affects IDENTITIES: money and counts are always hidden whole, because the leading digits of a figure give the figure away. - **Hide more in privacy mode (privacy.hide)** — Switch additional optional categories on, so privacy mode also hides them. Use this for the user's own commercially sensitive figures — their revenue, what individual customers have paid, their subscription, their teammates' names, their volumes, or their own name and workspace. Takes effect immediately if privacy mode is on, and is remembered for next time if it isn't. Contact details, conversations and keys don't need to be listed here: they are always hidden. - **Stop hiding a category (privacy.reveal)** — [HIGH RISK] Stop hiding one or more optional categories, making those values readable again even while privacy mode stays on — for example to show revenue during a sales demo. This exposes real figures on screen, so confirm the user actually wants them visible. It cannot unhide contact details, conversation content or API keys: those stay hidden whenever privacy mode is on. --- ## Actions — rvm _10 operations._ - **List voicemail recordings (rvm.list_recordings)** — [READ] List the saved voicemail recordings this workspace can drop — uploaded audio, in-app recordings, ElevenLabs-synthesized clips, and Twilio text-to-speech scripts. Newest first. - **Open a voicemail recording (rvm.get_recording)** — [READ] Fetch one saved voicemail recording by id, including its duration and (for text-to-speech recordings) the script and voice it speaks. - **Add a voicemail recording from a URL (rvm.add_recording_from_url)** — Save an existing audio file as a reusable voicemail recording by fetching it from a public URL (the machine-surface equivalent of the app's upload button — binary uploads can't ride a tool call). TWILIO FORMAT RULE: the file must be MP3, WAV, GSM, µ-law or AIFF; m4a/aac/webm fail the drop with Twilio error 12300, so they're refused here. Voicemails must be 55 seconds or shorter. - **Generate a voicemail with text-to-speech (rvm.generate_recording)** — [HIGH RISK] Turn a script into a reusable voicemail recording. Engine 'elevenlabs' synthesizes an MP3 right now through the workspace's OWN ElevenLabs account and SPENDS ITS TTS CREDITS; engine 'twilio' stores only the script and has Twilio speak it live at drop time (no synthesis charge, billed as part of the call). Scripts longer than about 55 spoken seconds are refused. - **List voicemail campaigns (rvm.list_campaigns)** — [READ] List ringless-voicemail campaigns with their status and per-recipient tallies (dropped, failed, skipped), newest first. - **Open a voicemail campaign (rvm.get_campaign)** — [READ] Fetch one voicemail campaign with live per-status drop counts — how many are pending, in flight, dropped, failed or skipped. - **List voicemail drops (rvm.list_drops)** — [READ] List the individual recipients of a voicemail campaign and what happened to each one — pending, filtering, dropping, dropped, failed (with the error) or skipped (e.g. do-not-contact). - **Send a ringless voicemail campaign (rvm.create_campaign)** — [HIGH RISK] Create and send a ringless-voicemail campaign to contacts and/or saved lists. THIS DROPS REAL VOICEMAILS: each recipient costs two outbound Twilio calls (a filter call plus the voicemail leg) billed to the workspace, and 'now' fans out immediately. Needs a saved recording (rvm.generate_recording or rvm.add_recording_from_url) and TWO DIFFERENT active numbers — a filter number and a from number. Do-not-contact is always enforced; quiet hours only when scheduled and explicitly asked for. - **Drop a voicemail to one contact (rvm.drop_to_contact)** — [HIGH RISK] Drop a ringless voicemail to a single contact right now — the same one-click action as the contact page's 'Drop voicemail' dialog. THIS PLACES REAL CALLS and bills the workspace two Twilio legs. Needs a saved recording and two different active numbers. Do-not-contact is enforced before dialing. - **Cancel a voicemail campaign (rvm.cancel_campaign)** — [HIGH RISK] Stop a voicemail campaign: any drop that hasn't gone out yet is skipped and the campaign is marked canceled. Voicemails already delivered can't be recalled, and a canceled campaign can't be resumed. --- ## Actions — settings _10 operations._ - **Workspace settings (org.get)** — [READ] Read this workspace's profile: its name, URL slug, status, what kind of account it is (a plain Account, or a White-Label / Reseller / Agency Partner once those upgrades are bought), its entitlements, its branding, and its seat usage — members, owners, and pending invites. - **List call dispositions (dispositions.list)** — [READ] List the call outcomes agents pick after a call — “Connected”, “Left voicemail”, “Not interested”, and any custom ones — in display order, with the actions each one fires. - **Add a disposition (dispositions.create)** — [ADMIN ONLY] Add a call outcome to the end of the list. Attach actions from the shared Actions registry to have picking it fire them automatically — sending an SMS, tagging the contact, dropping a voicemail, enrolling in a campaign, and so on. - **Edit a disposition (dispositions.update)** — [ADMIN ONLY] Rename a disposition, recolor it, switch it on or off for the dialer, or replace the actions it fires. Omitted fields are left alone; supplying `actions` REPLACES the whole list. - **Delete a disposition (dispositions.delete)** — [HIGH RISK · ADMIN ONLY] Permanently delete a call outcome and the actions attached to it. Calls already logged against it keep their record; the outcome just stops being offered. - **List integrations (integrations.list)** — [READ] List every provider this workspace can connect (Twilio, Mailgun, OpenRouter, Outscraper, ElevenLabs, Firecrawl, and the tenant's own Stripe) with whether it's connected, whether it's fully configured, its last status, and the callback URLs it needs. Stored credentials are NEVER returned — secrets are reported only as set/not set. - **Open an integration (integrations.get)** — [READ] Fetch one provider's connection status plus the exact fields its connect form takes — use this before integrations.connect so you know which keys to send. Never returns a stored credential, only whether each secret is set. - **Connect an integration (integrations.connect)** — [ADMIN ONLY] Save this workspace's own credentials for a provider, creating the connection or updating it. Secret fields are encrypted with AES-256-GCM before storage and can never be read back; OMIT a secret to keep the one already stored. Connecting Twilio also auto-creates the API Key + Voice app the softphone needs, and connecting Mailgun reconciles the inbound route and delivery webhooks in the tenant's Mailgun account. Charges from these providers bill to the tenant's own account. - **Test an integration (integrations.test)** — [ADMIN ONLY] Call the provider with this workspace's stored credentials to confirm they still work, then record the outcome on the connection (connected / error). Testing Mailgun also REPAIRS inbound email — it re-creates the missing route or webhook and re-checks the domain's MX. Only Twilio, Mailgun, OpenRouter, Firecrawl, and ElevenLabs are testable. - **Disconnect an integration (integrations.disconnect)** — [HIGH RISK · ADMIN ONLY] Delete this workspace's connection to a provider, including its stored credentials. Everything that runs on it stops immediately — disconnecting Twilio kills calling and SMS, Mailgun kills email, OpenRouter kills the AI features. --- ## Actions — snapshots _20 operations._ - **Snapshots (snapshots.list)** — [READ] Lists the configuration snapshots this workspace owns, with their status and how many times each has been installed. - **Snapshot details (snapshots.get)** — [READ] One snapshot with every published version, including what each version contains and which outside servers its configuration would contact. - **What can go in a snapshot (snapshots.inventory)** — [READ · ADMIN ONLY] Everything in this workspace that can be packaged into a snapshot, grouped by type. Reads configuration only — it never touches contacts, conversations, calls or any other customer data, because none of that can be put in a snapshot. - **New snapshot (snapshots.create)** — [ADMIN ONLY] Creates a draft snapshot from a selection of this workspace's configuration. A draft is private and cannot be installed or shared until it is published. - **Edit snapshot (snapshots.update)** — [ADMIN ONLY] Renames a snapshot or changes what its next version will contain. Versions already published are frozen and are not affected. - **Publish version (snapshots.publish_version)** — [HIGH RISK · ADMIN ONLY] Freezes the current selection as a new, permanent version and copies every recording and image it uses into the snapshot. From now on anyone holding a share link or licence installs this version. Published versions can never be edited — publish again to ship a change. - **Preview install (snapshots.preview_install)** — [READ · ADMIN ONLY] Dry-runs an install and reports exactly what would be created, what would be reused because a name already matches, which outside servers the configuration would contact, and what setup it still needs. Changes absolutely nothing. - **Install snapshot (snapshots.install)** — [HIGH RISK · ADMIN ONLY] Writes a snapshot's configuration into a workspace — funnels, automations, templates, phone menus and settings. Everything arrives switched OFF: no automation runs, no message is sent, no page is published until a human turns it on. Nothing existing is overwritten or deleted. Reversible for 14 days. - **Push to sub-accounts (snapshots.push_to_subaccounts)** — [HIGH RISK · OWNER ONLY] Installs a snapshot into several sub-accounts at once. Each account is installed independently, so one failing does not stop the others. As with any install, everything arrives switched off and nothing existing is overwritten. - **Install history (snapshots.list_installs)** — [READ · ADMIN ONLY] Every snapshot install into this workspace, with what it created, its status, and any setup steps still outstanding. - **Delete snapshot (snapshots.delete)** — [HIGH RISK · OWNER ONLY] Permanently deletes a snapshot, every published version of it, and the frozen copies of its recordings and images. Anything anyone already installed from it stays exactly where it is — an install is a copy, so this does not un-install anything. - **Create install link (snapshots.create_link)** — [HIGH RISK · ADMIN ONLY] Mints a public URL for a published snapshot. ANYONE HOLDING THE LINK can install this configuration into a workspace they manage, until it is revoked or expires. Optionally cap the number of uses or lock it to one recipient's email address. - **Install links (snapshots.list_links)** — [READ · ADMIN ONLY] Every share link for a snapshot, with how many times each has been used, when it expires, and whether it has been revoked. - **Revoke install link (snapshots.revoke_link)** — [HIGH RISK · ADMIN ONLY] Kills a share link immediately, so it can no longer be used to install. Installs already completed from it are unaffected — an install is a copy, so this does not un-install anything. - **Finish setup (snapshots.checklist)** — [READ · ADMIN ONLY] The outstanding setup steps for an install — the phone numbers, domains and teammates a snapshot could not carry, plus anything that needs a look. - **Fill a setup step (snapshots.resolve_slot)** — [HIGH RISK · ADMIN ONLY] Supplies one of the things a snapshot could not carry — typically a phone number id. The value is written everywhere the snapshot used it, including inside phone menus and automation steps, and anything that was held back waiting on it is created at that point. - **Undo install (snapshots.undo_install)** — [HIGH RISK · OWNER ONLY] DELETES everything a snapshot install created in this workspace and restores anything it replaced. Items you have since attached real data to — a funnel that has taken orders, an invoice that has been paid — are kept rather than deleted. Only available for 14 days after the install. - **Who can install this (snapshots.list_grants)** — [READ · ADMIN ONLY] Every workspace that has been granted or has bought the right to install a snapshot, and whether that access is still active. - **Revoke access (snapshots.revoke_grant)** — [HIGH RISK · OWNER ONLY] Stops a workspace installing this snapshot again. It does NOT remove anything they have already installed — that is their own configuration now, and there is no remote kill switch. - **Snapshot item types (snapshots.types)** — [READ] The kinds of configuration a snapshot can carry, with the label and category of each. Useful for building a selection before calling snapshots.create. --- ## Actions — stages _5 operations._ - **List pipeline stages (stages.list)** — [READ] List a pipeline's stages in board order, with each stage's win probability and whether it counts as won or lost. Omit pipeline_id for the default pipeline. - **Add a stage (stages.create)** — Add a stage to the end of a pipeline. A stage with outcome 'won' or 'lost' closes any deal moved into it (stamping closed_at); 'in_progress' keeps deals open. - **Edit a stage (stages.update)** — Rename a stage or change its win probability or outcome. Omitted fields are left alone. Changing the outcome does NOT restate deals already sitting in the stage — it applies the next time a deal moves in. - **Reorder stages (stages.reorder)** — Set the left-to-right column order of a pipeline's stages. Pass the stage ids in the order you want them; every id must belong to the given pipeline. Deals stay in their stages. - **Delete a stage (stages.delete)** — [HIGH RISK] Permanently delete a stage from its pipeline. Deals in that column are NOT deleted — their stage is cleared, so they drop off the board until they're moved into another stage. Cannot be undone. --- ## Actions — subaccounts _3 operations._ - **List sub-accounts (subaccounts.list)** — [READ] List the client workspaces under this agency, with how many of the plan's sub-account allowance are used. - **Create a sub-account (subaccounts.create)** — [ADMIN ONLY] Create a client workspace under this agency. The URL slug is derived from the name and de-duplicated automatically. Fails once the reseller plan's sub-account allowance is used up. - **Edit a sub-account (subaccounts.update)** — [ADMIN ONLY] Rename one of this agency's client workspaces, or suspend/reactivate it. Suspending locks the workspace for everyone in it. --- ## Actions — support _12 operations._ - **List bug reports (support.list_bug_reports)** — [READ] List the bug reports filed from this workspace, newest first, with reply and attachment counts. Optionally filter by status or search titles and descriptions. - **Open a bug report (support.get_bug_report)** — [READ] Fetch one bug report filed from this workspace, with its full reply thread. Internal Chirply-team notes are included only for platform admins. - **Report a bug (support.file_bug)** — File a bug report with the Chirply team on behalf of the signed-in user. Emails the team immediately and starts a thread the reporter can be replied to on. Screenshots and screen recordings can only be attached from the app. - **Reply on a bug report (support.reply_to_bug)** — Post a reply on a bug report's thread. A platform admin's public reply emails the reporter; set internal=true (platform admins only) to leave a note the reporter never sees. - **Delete a bug report (support.delete_bug_report)** — [HIGH RISK] Permanently delete a bug report, its whole thread, and its uploaded screenshots. Only the person who filed it, or the Chirply team, can do this. - **List feature requests (support.list_feature_requests)** — [READ] List the public feature-request board with vote and comment counts. This board is shared by every Chirply workspace on purpose — it carries no customer data, only a poster's display name — so results are not limited to this workspace. - **Open a feature request (support.get_feature_request)** — [READ] Fetch one feature request from the public board with its vote count and its comment thread. Internal Chirply-team comments are included only for platform admins. - **Request a feature (support.request_feature)** — Post a feature request onto the public board on behalf of the signed-in user, and upvote it for them. Every Chirply user can see it and vote on it, and the Chirply team is emailed. - **Comment on a feature request (support.comment_on_feature)** — Add a public comment to a feature request and email its author. Set internal=true (platform admins only) for a note nobody else sees. - **Upvote a feature request (support.vote_feature)** — Upvote a feature request, or take your vote back. Votes are one per person and drive the board's “most wanted” ranking, which is how Chirply decides what to build next. - **Delete a feature request (support.delete_feature_request)** — [HIGH RISK] Permanently delete a feature request, its comments, its votes, and its attachments. Only the person who posted it, or the Chirply team, can do this. - **Delete a feature comment (support.delete_feature_comment)** — [HIGH RISK] Permanently delete one comment from a feature request, along with anything attached to it. Only its author, or the Chirply team, can do this. --- ## Actions — tasks _6 operations._ - **List tasks (tasks.list)** — [READ] List the organization's tasks, newest first. Optionally filter by status, priority, assignee, or the contact/deal a task hangs off, and search titles and descriptions. - **Open a task (tasks.get)** — [READ] Fetch one task by id, with all of its fields. - **Create a task (tasks.create)** — Create a task. Only a title is required; link it to a contact or deal to have it show on that record's timeline. - **Edit a task (tasks.update)** — Update any field on an existing task. Omitted fields are left alone. Setting status to 'done' stamps the completion time automatically. - **Mark a task done (tasks.complete)** — Mark a task complete (or reopen it with done=false). Same as ticking the checkbox in the app. - **Delete a task (tasks.delete)** — [HIGH RISK] Permanently delete a task. This cannot be undone. --- ## Actions — team _6 operations._ - **List team members (team.list_members)** — [READ] List everyone with access to this workspace — name, email, role (owner/admin/member), and when they joined. - **List pending invitations (team.list_invites)** — [READ · ADMIN ONLY] List invitations to this workspace that haven't been accepted or revoked yet, including which have passed their 14-day expiry. - **Invite a teammate (team.invite)** — [ADMIN ONLY] Invite someone to this workspace by email as a member or an admin. Creates a pending invitation with a 14-day link; owners can only be made by changing an existing member's role. - **Change a member's role (team.change_role)** — [HIGH RISK · ADMIN ONLY] Change what a teammate can do in this workspace. Promoting to owner grants full control including billing; demoting the last remaining owner is refused, since an organization must always keep one. - **Remove a teammate (team.remove_member)** — [HIGH RISK · ADMIN ONLY] Remove someone's access to this workspace. They lose the workspace immediately; their records (contacts, notes, calls) stay. The last owner can never be removed. - **Revoke an invitation (team.revoke_invite)** — [ADMIN ONLY] Cancel a pending invitation so its link stops working. The person can be invited again afterwards. --- ## Actions — telephony _58 operations._ - **List phone numbers (numbers.list)** — [READ] List the phone numbers this workspace uses in Chirply, with each one's inbound destination, recording preferences and status. Read-only — costs nothing. - **Open a phone number (numbers.get)** — [READ] Fetch one phone number with every setting on its settings page: label, inbound destination and its target, call recording, transcription and forwarding preferences. - **Search available numbers (numbers.search_available)** — [READ · ADMIN ONLY] Search the workspace's own Twilio account for local numbers that are available to buy, by country, area code, or a digit/keypad-letter pattern. This only searches — nothing is purchased and nothing is billed. - **Buy a phone number (numbers.buy)** — [HIGH RISK · ADMIN ONLY] PURCHASE a phone number on the workspace's own Twilio account. This SPENDS REAL MONEY — Twilio bills the tenant an upfront and a monthly fee for the number immediately, and it can only be undone by releasing it. By default the number is also routed into Chirply (voice + SMS webhooks) and added to the dialer. - **Release a phone number (numbers.release)** — [HIGH RISK · ADMIN ONLY] PERMANENTLY release a phone number back to Twilio and remove it from Chirply. This CANNOT BE UNDONE — the number is gone from the account, anyone who calls it reaches nobody, and it may not be re-purchasable. Billing for it stops. Use numbers.archive instead to simply hide a number you want to keep. - **Save a number's settings (numbers.update_settings)** — [ADMIN ONLY] Update any setting on one phone number's settings page: its internal label, where incoming calls go (team simulring, an AI receptionist, an IVR phone menu, a blind forward, or a conference room) and that destination's target, call recording, transcription and recording announcements, transparent-forward caller ID, and whether it is the workspace's default outbound caller ID. Omitted fields are left alone. Does not touch Twilio's own webhook routing — use numbers.configure_routing for that. - **Set where a number's calls arrive (numbers.configure_routing)** — [ADMIN ONLY] Point one Twilio number's inbound voice and/or SMS webhooks at Chirply, at a custom https URL, or turn the channel off. This changes configuration on the workspace's Twilio account and takes effect on the next call. Addressed by the Twilio number SID, so it also works for numbers that aren't in Chirply's dialer yet. - **Use a Twilio number in Chirply (numbers.use_in_chirply)** — [ADMIN ONLY] One click: route a Twilio number's voice AND SMS into Chirply and add it to the dialer so it can place calls and send messages. Addressed by the Twilio number SID. Does not buy anything. - **Stop using a number in Chirply (numbers.stop_using_in_chirply)** — [ADMIN ONLY] Reverse of 'use in Chirply': clear Chirply's voice + SMS routing on Twilio and remove the number from the dialer. The number stays on the Twilio account and keeps billing — this does not release it. Clears the default-outbound preference if it pointed here. - **Archive a phone number (numbers.archive)** — [ADMIN ONLY] Hide a number from the dialer and every from-number picker WITHOUT releasing it on Twilio or changing its routing — for a line you run elsewhere but want out of the way. Billing continues. Clears the default-outbound preference if it pointed here. Reverse it with numbers.restore. - **Restore an archived number (numbers.restore)** — [ADMIN ONLY] Bring an archived number back into the dialer and the numbers console. - **Set the default outbound number (numbers.set_default_outbound)** — [ADMIN ONLY] Set (or clear) the workspace's default outbound caller ID and SMS sender. The number must already be active in Chirply. - **Look up known line types (numbers.get_line_type)** — [READ] Read the cached line type (mobile / landline / VoIP / toll-free) and carrier for one or more phone numbers. Reads the platform's shared lookup cache only, so it is instant and costs nothing; numbers nobody has ever paid to look up simply come back unknown. Use numbers.queue_line_type_lookup to pay for the unknown ones. - **Look up line types (paid) (numbers.queue_line_type_lookup)** — [HIGH RISK] Queue phone numbers for a Twilio Lookup line-type check. This SPENDS REAL MONEY — each number not already in the shared cache is billed to the workspace's own Twilio account (roughly $0.008 each). Numbers already known, or already queued, are skipped for free. Results land asynchronously; read them back with numbers.get_line_type. - **Scan the database for line types (numbers.scan_line_types)** — [HIGH RISK · ADMIN ONLY] One-time sweep: queue EVERY not-yet-known phone number across this workspace's contacts and staged leads for a line-type lookup. This SPENDS REAL MONEY — each unknown number is billed to the workspace's own Twilio (roughly $0.008 each), and a large database can mean thousands of lookups. - **Toggle automatic line-type lookup (numbers.set_auto_line_type_lookup)** — [ADMIN ONLY] Turn automatic line-type lookup on or off for this workspace. When on, every new phone number that enters the CRM is looked up on the workspace's own Twilio account (a small per-number charge) unless the platform already knows it. Stored alongside the Twilio credentials it spends. - **Check the Twilio connection (telephony.get_connection)** — [READ] Report whether this workspace has connected its own Twilio account, and the connection's current status. Never returns the auth token or API key secret — those are stored encrypted and are not readable. - **Save Twilio credentials (telephony.connect_twilio)** — [HIGH RISK · ADMIN ONLY] Connect (or update) the workspace's own Twilio account. Every call, message and number purchase Chirply makes is billed to these credentials, so pointing them at a different account changes who pays. The auth token and API-key secret are encrypted before storage; leaving either blank on an update keeps the stored value. - **Test the Twilio connection (telephony.test_connection)** — [ADMIN ONLY] Verify the stored Twilio credentials by fetching the account from Twilio, and update the connection's status to reflect the result. - **List calls (calls.list)** — [READ] List the call log, newest first — inbound and outbound, with duration, disposition, recording state and transcript availability. Filter by direction, status, contact, line, voicemails, or whether a recording was kept. - **Open a call (calls.get)** — [READ] Fetch one call from the log with its full detail: both numbers, duration, disposition, notes, recording URL (when the audio is still stored) and transcript. - **Place a call (calls.place)** — [HIGH RISK] PLACE A REAL OUTBOUND PHONE CALL from one of the workspace's numbers. This DIALS A REAL PERSON immediately and bills the workspace's own Twilio account for the minutes. The call is logged, and when a contact is named the call also lands on that contact's timeline. If the from-number has recording switched on, the call is recorded. - **Set a call's outcome (calls.set_disposition)** — [HIGH RISK] Record a call's disposition (outcome) and note, the same as picking one in the power dialer. Setting a disposition FIRES ITS ATTACHED ACTIONS against the call's contact — which can send real SMS or email, enrol them in a campaign, or move a deal — so it is not a passive edit. - **Delete a recording's audio (calls.delete_recording_audio)** — [HIGH RISK] Permanently delete ONLY a call's recorded audio from storage, keeping the call log entry and its transcript. This cannot be undone — the audio is gone. - **Delete a call (calls.delete)** — [HIGH RISK] Permanently delete a call from the log, along with its recorded audio. This cannot be undone. - **Set the voicemail greeting (calls.set_voicemail_greeting)** — [ADMIN ONLY] Set the workspace's voicemail greeting — the words callers hear before the beep, and which Twilio voice speaks them. Optionally clear a previously recorded greeting so the spoken text is used again. Uploading a new recorded greeting is only possible in the app. - **Add someone to a live call (calls.add_party)** — [HIGH RISK] DIAL A THIRD PERSON into a call that is happening right now, escalating it to a conference so all three can talk. This RINGS A REAL PHONE and bills the workspace's own Twilio for the extra leg. - **Transfer a live call (calls.transfer)** — [HIGH RISK] Blind-transfer a call that is happening right now: DIAL the target and hand the other party straight over, dropping this side. This RINGS A REAL PHONE, bills the workspace's own Twilio, and cannot be taken back once the transfer lands. Use calls.warm_transfer_start to consult first. - **Start a warm transfer (calls.warm_transfer_start)** — [HIGH RISK] Step one of a consultative transfer on a live call: DIAL the target, put the other party on hold, and let this side speak to the target privately. RINGS A REAL PHONE and bills the workspace's own Twilio. Finish with calls.warm_transfer_complete or back out with calls.warm_transfer_cancel. - **Complete a warm transfer (calls.warm_transfer_complete)** — [HIGH RISK] Finish a consultative transfer: take the caller off hold, connect them to the target, and drop this side out of the call. Cannot be taken back. - **Cancel a warm transfer (calls.warm_transfer_cancel)** — [HIGH RISK] Back out of a consultative transfer: drop the target's leg and take the caller off hold so this side keeps the call. - **End a live call (calls.hangup)** — [HIGH RISK] END a call that is happening right now, dropping every remaining party. This disconnects real people mid-conversation and cannot be undone. - **Send a ringing call to voicemail (calls.send_to_voicemail)** — [HIGH RISK] Send a still-ringing INBOUND call straight to voicemail without answering it. The caller hears the workspace's greeting and can leave a message. - **Forward a ringing call (calls.forward_incoming)** — [HIGH RISK] Forward a still-ringing INBOUND call to another number without answering it. This RINGS A REAL PHONE and bills the workspace's own Twilio for the forwarded leg. When the receiving line opts into transparent forwarding, the original caller's number is presented. - **List IVR phone menus (ivr.list)** — [READ] List the workspace's IVR flows (phone menus) built in the visual builder, with whether each is live and which lines it answers. - **Open an IVR phone menu (ivr.get)** — [READ] Fetch one IVR flow: its full node/edge graph as drawn in the builder, whether it is live, any validation issues that would stop it answering a real line, and every phone number currently pointing at it. - **Create an IVR phone menu (ivr.create)** — Create a new, empty IVR flow and return its id. Deliberately off air and unattached — pointing a live number at a flow with no steps would answer real callers with silence. Draw it with ivr.update, then publish and attach it. - **Save an IVR phone menu (ivr.update)** — Rename an IVR flow and/or replace its node/edge graph — the same graph the visual builder saves, and the one the live call runtime walks for both inbound calls and outbound voice campaigns. The flat greeting/options summary is recompiled automatically. A flow that is already LIVE is refused if the new graph would misroute a real caller. - **Publish an IVR phone menu (ivr.publish)** — [HIGH RISK] Put an IVR flow LIVE so it can answer real callers, or take it off air. Publishing is refused when the flow has issues that would misroute a caller (a dead hand-off, a missing or paused AI agent, an unconnected key). TAKING IT OFF AIR CHANGES WHERE CALLS GO: an off-air menu cannot answer, so every line pointing at it is sent back to the team simulring and named in the result. - **Attach an IVR to a number (ivr.attach_number)** — [ADMIN ONLY] Point one of the workspace's phone numbers at this IVR flow, so incoming calls to that line walk the menu. The flow must be live. A line already answering with an AI receptionist, a forward, a conference room or a different IVR is refused rather than silently repointed. - **Detach an IVR from a number (ivr.detach_number)** — [ADMIN ONLY] Stop a phone number answering with this IVR flow and send it back to the team simulring. Omit the number to release every line pointing at the flow. - **Delete an IVR phone menu (ivr.delete)** — [HIGH RISK] Permanently delete an IVR flow. This cannot be undone. Any line answering with it is first sent back to the team simulring and named in the result. A flow that ANOTHER flow hands calls to is refused, because deleting it would leave that other flow hanging up on real callers. - **List sales bridges (sales_bridges.list)** — [READ] List the workspace's sales bridges — the press-1 simulring connectors that ring a pool of agents for one hot lead. - **Open a sales bridge (sales_bridges.get)** — [READ] Fetch one sales bridge with its whisper script, caller-ID line, dial timeout, recording preferences and its full agent pool in ring order. - **Create a sales bridge (sales_bridges.create)** — [ADMIN ONLY] Create a sales bridge: a name, the line to call from, an optional whisper played to the agent who answers, an optional SMS sent to each agent on dispatch, and the pool of agent phones to ring. Creating it dials nobody — use sales_bridges.start_run for that. - **Edit a sales bridge (sales_bridges.update)** — [ADMIN ONLY] Update a sales bridge's settings. Omitted fields are left alone. Supplying `agents` REPLACES the whole pool in the order given. - **Delete a sales bridge (sales_bridges.delete)** — [HIGH RISK · ADMIN ONLY] Permanently delete a sales bridge and its agent pool. This cannot be undone. Past runs are removed with it. - **Start a sales bridge (sales_bridges.start_run)** — [HIGH RISK] Dispatch a sales bridge for one lead RIGHT NOW: it RINGS EVERY AGENT IN THE POOL simultaneously and, on the first press of 1, bridges that agent to the lead. This places multiple REAL CALLS and bills the workspace's own Twilio for every leg, plus an SMS per agent when the bridge has one. Numbers on the do-not-contact list are refused. - **List sales bridge runs (sales_bridges.list_runs)** — [READ] List recent sales-bridge dispatches with their outcome — ringing, claimed, bridged, completed, no answer, failed or canceled — and which agent won each one. - **Open a sales bridge run (sales_bridges.get_run)** — [READ] Fetch one sales-bridge run with every agent leg it dialed and how each leg ended, plus the call-log row for the bridged conversation. - **List voice campaigns (voice_campaigns.list)** — [READ] List the workspace's outbound voice campaigns (call blasts and outbound IVR) with their status, schedule and per-recipient tallies. - **Open a voice campaign (voice_campaigns.get)** — [READ] Fetch one voice campaign with its content (IVR menu, spoken message, recorded audio or AI agent), schedule, quiet-hours and concurrency settings, and its recipient tallies. - **List campaign recipients (voice_campaigns.list_recipients)** — [READ] List a voice campaign's recipients with each one's dial status, attempt count, answering-machine verdict and last keypad selection. - **Create a voice campaign (voice_campaigns.create)** — [HIGH RISK] Create and LAUNCH an outbound voice campaign. This CALLS REAL PEOPLE — every contact in the chosen audience is dialed from the workspace's own Twilio account and billed to it, starting immediately unless a future start time is given. Content is either an IVR phone menu (the live runtime walks the same flow the builder draws), a spoken message, or an AI agent. Uploading pre-recorded broadcast audio is only possible in the app. - **Start, pause or cancel a campaign (voice_campaigns.set_status)** — [HIGH RISK] Change a voice campaign's status. Setting it to 'running' STARTS OR RESUMES DIALING REAL PEOPLE and billing the workspace's own Twilio. 'paused' holds the queue; 'canceled' stops it for good and marks every not-yet-dialed recipient as skipped, which cannot be undone. - **Add contacts to a campaign (voice_campaigns.add_recipients)** — [HIGH RISK] Enqueue more contacts into an existing voice campaign. On a RUNNING campaign they WILL BE CALLED — real calls billed to the workspace's own Twilio — as soon as the dispatcher reaches them. Contacts already on the campaign, and contacts without a dialable number, are skipped. - **Call one contact with a menu or message (voice_campaigns.call_contact)** — [HIGH RISK] Place a single outbound IVR (or spoken-message) call to one contact. This CALLS A REAL PERSON and bills the workspace's own Twilio. Implemented as a one-recipient campaign so it goes through the same dispatcher — quiet hours, do-not-contact and pacing all apply, and the same IVR runtime walks the flow. - **Delete a voice campaign (voice_campaigns.delete)** — [HIGH RISK] Permanently delete a voice campaign, its recipient queue and its stored broadcast audio. This cannot be undone. A running campaign stops. --- ## Actions — templates _7 operations._ - **List message templates (templates.list)** — [READ] List the organization's reusable message templates — SMS bodies, email subject+body pairs, and ringless-voicemail scripts or recordings. These are what campaigns, automations, dispositions and bulk sends pick from. - **Open a message template (templates.get)** — [READ] Fetch one message template with its subject, body and — for a recorded voicemail — the audio URL. - **Create a message template (templates.create)** — Create a reusable SMS, email or ringless-voicemail template. Bodies may contain merge tokens like {{first_name}} or {{company.name}}, resolved per recipient at send time — call templates.list_merge_tokens for the full set. Creating a template sends nothing. - **Edit a message template (templates.update)** — Update a message template's name, subject, body, voice or recording. Editing a template changes what every campaign, automation and disposition using it will send from now on; messages already sent are unaffected. Omitted fields are left alone. - **Delete a message template (templates.delete)** — [HIGH RISK] PERMANENTLY DESTROY a message template. This cannot be undone, and any campaign, automation or disposition still pointing at it loses its message content. - **List merge tokens (templates.list_merge_tokens)** — [READ] List every merge token a template body can use — the built-in contact, company and address fields plus one entry per contact custom field this organization has defined. Use these exact spellings; an unknown {{token}} renders as an empty string. - **Preview a template (templates.preview)** — [READ] Render a template's subject and body with merge tokens resolved, either for a real contact or with the tokens left empty. Sends nothing — this is the preview shown in the template editor. --- ## Actions — tracking _15 operations._ - **List tracked websites (tracking.list_sites)** — [READ] List the websites this organization has a tracking script installed on, newest first. Returns each site's public embed key, status, and settings — no visitor data. - **Open a tracked website (tracking.get_site)** — [READ] Fetch one tracked website by id, with its normalized settings, the origins it is allowed to report from, and the exact