← All action domains

Reseller

73 operations. Call each with POST https://app.chirply.io/api/v1/actions/<name> and a bearer token; the response is { "data": { "action", "summary", "result" } }. A read badge means the operation changes nothing; write requires the credential’s write scope.

List client report schedules

client_reports.list_schedulesreadadmin only

List every scheduled client report this agency has configured: which client, weekly or monthly, the recipient emails, whether it's enabled, when it last sent, and any delivery error. Read-only.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/client_reports.list_schedules \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool client_reports_list_schedules at https://app.chirply.io/api/mcp, same bearer token, same input.

Preview a client report

client_reports.previewread

Build a branded client report for the latest completed UTC week or month, returning subject, numbers, fetch time, and HTML without sending email. Unavailable source sections are null and visibly labeled; incomplete reports cannot be sent.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account (client account) the report is about. Must belong to this agency — ids come from reseller.list_clients.
cadence"weekly" | "monthly"optionalHow often the report goes out and what it covers: 'weekly' emails the previous Monday–Sunday week, 'monthly' emails the previous calendar month. Periods are UTC. Default: "monthly"

Example

curl -X POST https://app.chirply.io/api/v1/actions/client_reports.preview \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool client_reports_preview at https://app.chirply.io/api/mcp, same bearer token, same input.

Client performance rollup

client_reports.rollupread

Read each active client's new contacts, calls, connect rate, messages, appointments, reviews, and collected net revenue for a UTC period. Failed sources return null metrics and unavailable section names, never zero. Revenue totals disclose client coverage. Read-only; sends no messages.

Parameters

FieldTypeRequiredDescription
period"this_month" | "last_month" | "last_7" | "last_30"optionalThe reporting window, in UTC: the current calendar month so far, the previous calendar month, or the trailing 7/30 days. Default: "this_month"

Example

curl -X POST https://app.chirply.io/api/v1/actions/client_reports.rollup \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "period": "this_month"
  }'
Test with your API key

Over MCP the same operation is the tool client_reports_rollup at https://app.chirply.io/api/mcp, same bearer token, same input.

Send a client report now

client_reports.send_nowwriteconfirmadmin only

Assemble and email a client's branded performance report for the latest completed UTC week or month — a REAL email through the agency's connected Mailgun/Resend account, billed to the agency. Delivery is held if any source section is unavailable. Use preview to inspect without sending.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account (client account) the report is about. Must belong to this agency — ids come from reseller.list_clients.
cadence"weekly" | "monthly"optionalHow often the report goes out and what it covers: 'weekly' emails the previous Monday–Sunday week, 'monthly' emails the previous calendar month. Periods are UTC. Default: "monthly"
recipientsstring[]optionalWhere to send it. Omit to use the recipients saved on the client's schedule.

Example

curl -X POST https://app.chirply.io/api/v1/actions/client_reports.send_now \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool client_reports_send_now at https://app.chirply.io/api/mcp, same bearer token, same input.

Set a client's report schedule

client_reports.set_schedulewriteadmin only

Create or update the standing report for one client account: weekly or monthly cadence, the client emails it goes to, and whether it's on. Enabling it means a real branded report email is sent to those addresses automatically after each period ends, through this agency's own connected email account. No email is sent by this call itself.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account (client account) the report is about. Must belong to this agency — ids come from reseller.list_clients.
cadence"weekly" | "monthly"optionalHow often the report goes out and what it covers: 'weekly' emails the previous Monday–Sunday week, 'monthly' emails the previous calendar month. Periods are UTC. Default: "monthly"
recipientsstring[]requiredThe client's email addresses the report is delivered to (up to 20). Invalid or duplicate addresses are dropped.
enabledbooleanoptionaltrue starts sending on schedule (needs at least one valid recipient); false pauses without losing the configuration. Default: true

Example

curl -X POST https://app.chirply.io/api/v1/actions/client_reports.set_schedule \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "recipients": [
      "example"
    ]
  }'
Test with your API key

Over MCP the same operation is the tool client_reports_set_schedule at https://app.chirply.io/api/mcp, same bearer token, same input.

Adjust credits

reseller.adjust_client_creditswriteconfirmadmin only

Manually add or remove credits from a client's balance (a comp, a correction). A positive amount grants credits; a negative amount deducts them. Adding credits lifts a paused client back into service. This changes a real balance the reseller is liable for, so it's confirm-gated.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.
amount_dollarsnumberrequiredSigned dollars to apply. Positive grants credits, negative deducts. e.g. 25 or -10.
descriptionstringoptionalA note recorded on the ledger entry.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.adjust_client_credits \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "amount_dollars": 1
  }'
Test with your API key

Over MCP the same operation is the tool reseller_adjust_client_credits at https://app.chirply.io/api/mcp, same bearer token, same input.

Apply a feature preset to this client

reseller.apply_client_feature_presetwriteconfirmadmin only

Set a client account to one of the ready-made shapes — the full platform, CRM only, marketing suite, phone and voice, or inbox only. This REPLACES the client's whole switchboard: every section the preset does not keep is hidden, including features added to Chirply after the preset was written. Use reseller.get_client_features to see what each preset keeps before applying one. Reversible — apply 'everything' to restore the full platform. Does not change their plan or their bill.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account to curate.
preset_id"everything" | "crm" | "marketing" | "phone" | "inbox"requiredWhich preset to apply. 'everything' hides nothing; 'crm' keeps contacts, conversations, scheduling and revenue; 'marketing' keeps contacts, conversations, automations, sites, ads and assets; 'phone' keeps contacts, conversations, phone and AI; 'inbox' keeps only contacts and conversations.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.apply_client_feature_preset \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "preset_id": "everything"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_apply_client_feature_preset at https://app.chirply.io/api/mcp, same bearer token, same input.

Retire plan

reseller.archive_planwriteconfirmadmin only

Retire a plan so it can no longer be assigned or sold. Clients already on it keep it and keep working — nothing is deleted and nobody's billing changes — but the plan disappears from the pickers. There is no un-retire; recreate it if needed.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
plan_idstring (uuid)requiredThe plan to retire.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.archive_plan \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "plan_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_archive_plan at https://app.chirply.io/api/mcp, same bearer token, same input.

Assign account domain

reseller.assign_client_domainwriteconfirmadmin only

Assign an agency-owned domain to this client account. Once active, visitors sign in to the assigned account with the agency's branding. Changes live application routing, costs nothing, and preserves domain ownership. Requires White-Label; a domain assigned to another client must be unassigned first.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredClient account ID beneath this agency.
domain_idstring (uuid)requiredAgency-owned domain ID from reseller.list_client_domains.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.assign_client_domain \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "domain_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_assign_client_domain at https://app.chirply.io/api/mcp, same bearer token, same input.

Assign plan

reseller.assign_planwriteconfirmadmin only

Put a client account on one of the agency's plans, or clear it. This changes what a paying third-party business can actually do straight away, because the plan pins their underlying platform tier and limits — moving them down a tier removes features and can push them over a limit they are currently using. It does NOT charge them or change an existing subscription — billing is started separately with reseller.start_client_billing — so the money and the entitlements can end up out of step until someone reconciles them.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.
plan_idstring (uuid) (or null)requiredOne of this agency's plans, or null to clear it — a client with no plan inherits whatever plan the agency itself is on.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.assign_plan \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "plan_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_assign_plan at https://app.chirply.io/api/mcp, same bearer token, same input.

Stop billing a client

reseller.cancel_client_billingwriteconfirmadmin only

Cancel a client's subscription on the agency's Stripe. By default it ends when the period they've already paid for runs out; `immediately` cuts it off now, which forfeits the rest of a period they have already been charged for and is not reversible. Does not suspend or delete their account.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account to stop charging.
immediatelybooleanoptionalEnd the subscription right now instead of at the end of the paid period. Forfeits time they've already paid for. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.cancel_client_billing \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_cancel_client_billing at https://app.chirply.io/api/mcp, same bearer token, same input.

Switch plan

reseller.change_client_planwriteconfirmadmin only

Move the current CLIENT account to another of its agency's plans. Changes the customer's subscription on the AGENCY's connected Stripe account (never the platform's) and switches the account's features to the new plan immediately. During a free trial nothing is charged: the trial keeps its end date and the new plan's price is charged when it ends. Outside a trial the new price applies at once — Stripe credits the unused part of the current plan and adds the difference to the next invoice, or, when the billing interval changes (monthly to yearly or back), starts a new billing period and charges the card on file today. A declined charge leaves the plan unchanged. Only for client accounts that signed up through the agency's store; a plan the agency bills or sets directly is changed by the agency (reseller.assign_plan). Check reseller.client_plan first for the plans on offer.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
plan_idstring (uuid)requiredId of the agency plan to switch to — one of the `options` returned by reseller.client_plan.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.change_client_plan \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "plan_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_change_client_plan at https://app.chirply.io/api/mcp, same bearer token, same input.

View checkout terms

reseller.checkout_termsreadadmin only

Read this agency's store checkout requirements: whether buyers must tick a confirmation box (and its exact text and current version), whether the order form collects a company name and VAT ID, the legal links shown on every store page, whether Stripe Tax is on (and the latest reason Stripe refused tax, if any). Also returns the store's checkout address and the exact form field names, with which are required, for an agency's own website that posts orders directly. Changes nothing.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.checkout_terms \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_checkout_terms at https://app.chirply.io/api/mcp, same bearer token, same input.

Your plan

reseller.client_planreadadmin only

Read the current CLIENT account's plan the way its agency sells it: the plan's name, price and billing interval, the subscription status, trial end and renewal date, the agency's other plans this account can switch to, and whether switching is self-serve here (only for accounts that signed up through the agency's store). Only works inside a client account — one created under an agency. Read-only; nothing is charged.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.client_plan \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_client_plan at https://app.chirply.io/api/mcp, same bearer token, same input.

View your provider subscription

reseller.client_subscriptionreadadmin only

Read the subscription status and period end for the current client account's reseller subscription. Requires an account owner or admin. Does not change billing or access.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.client_subscription \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_client_subscription at https://app.chirply.io/api/mcp, same bearer token, same input.

Finish card setup

reseller.complete_client_card_setupwriteadmin only

Verify a confirmed SetupIntent with the reseller's Stripe and record the resulting payment method as the client's saved card for credit top-ups and auto-recharge. Refuses unless Stripe itself reports the setup succeeded for this client's customer. Moves no money.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account the card belongs to.
setup_intent_idstringrequiredThe SetupIntent id (seti_…) returned by reseller.start_client_card_setup, after the client confirmed it.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.complete_client_card_setup \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "setup_intent_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_complete_client_card_setup at https://app.chirply.io/api/mcp, same bearer token, same input.

Connect account domain

reseller.connect_client_domainwriteconfirmadmin only

Connect a hostname the agency already owns and assign it to this client account. Requests a public HTTPS certificate, consumes an agency domain slot, and changes where the app opens once DNS is verified. Does not buy a domain or edit DNS; the owner adds the returned CNAME at their provider. Requires White-Label. Existing published content and assignments to other clients are protected.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredClient account ID beneath this agency.
domainstringrequiredHostname the agency controls, such as app.client.com; a full URL is accepted.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.connect_client_domain \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "domain": "example"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_connect_client_domain at https://app.chirply.io/api/mcp, same bearer token, same input.

New client account

reseller.create_clientwriteadmin only

Create a new client account under this agency, optionally putting it straight onto one of the agency's plans. Counts against the agency's paid client account allowance and fails once that's used up. The account starts empty with nobody in it — invite the client with reseller.invite_client_user. Assigning a plan here pins their tier and limits immediately but charges nobody; billing is started separately.

Parameters

FieldTypeRequiredDescription
namestringrequiredThe client's name — what the account is called.
plan_idstring (uuid)optionalOptional. One of this agency's plans to put the new client on right away. Omit to leave them with no plan, inheriting whatever plan the agency itself is on.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.create_client \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_create_client at https://app.chirply.io/api/mcp, same bearer token, same input.

Create plan

reseller.create_planwriteadmin only

Create a plan this agency sells to its clients: a name the client sees on their invoice, the price the agency charges, which underlying platform tier it unlocks, optional per-limit tweaks on top of that tier, and optionally its own free-trial length on the agency's launch store (trial_days; default: the store's trial). Creating a plan costs nothing and charges nobody — it only defines a package. Clients are put on it separately with reseller.assign_plan.

Parameters

FieldTypeRequiredDescription
namestringrequiredWhat the client sees, e.g. 'Starter'. Must be unique here.
price_centsintegerrequiredWhat the AGENCY charges its client, in cents (9700 = $97). Unrelated to what the agency pays the platform — the difference is their margin. 0 makes a free plan that can't be billed.
interval"month" | "year"optionalHow often the client is charged your price. Default: "month"
plan_code"spark" | "build" | "launch" | "grow" | "scale"optionalWhich underlying platform tier a client on this plan runs on — this is what actually decides their limits (numbers, AI agents, funnels, automations). 'spark' is the entry rung and 'scale' the top; note that 'spark' and 'build' include NO calls, texts or marketing email, so a client who needs to phone or text anybody has to be on 'launch' or above. Default: "launch"
limit_overridesmap of string → objectoptionalOptional per-limit tweaks layered on top of the base tier, keyed by limit id — e.g. {"phoneNumbers": 20, "aiAgents": "unlimited", "powerDialer": true, "funnels": 50}. A number is a hard cap; true/false switch a feature on or off; "unlimited" removes a cap. Only send keys that differ from the tier's own value; omit this field entirely to leave the plan as its plain tier. Anything set higher than YOUR OWN plan allows is capped to it on save, and 'subAccounts' / 'whiteLabel' can never be granted to a client (those would make your client a reseller). Sending {} on an edit clears every tweak. Valid keys are the limit ids from the platform's plan comparison: seats, pipelines, customFields, phoneNumbers, transcription, powerDialer, salesBridges, ivrFlows, rvm, voiceBroadcast, aiAgents, aiRelay, aiOutbound, aiCampaigns, aiAssist, autoresponders, templates, workflows, voiceSteps, widgets, funnels, aiPageGen, customDomains, leadGen, restApi, apiKeys, mcpServer, webhooks, snapshots, and similar.
descriptionstringoptionalOptional blurb shown alongside the plan, on the client's plan picker.
currencystringoptionalISO currency the agency bills in, e.g. 'usd'. Default: "usd"
connect_fee_percentnumberoptionalThe agency's default Stripe Connect application fee for clients on this plan, as a percent (2.5 = 2.5%) of every payment run through the client's connected Stripe account. 0 (the default) takes no cut. A per-client override, set separately, wins over this plan default. Unrelated to price_cents — this only applies to Stripe Connect payment volume, not the plan subscription itself. Default: 0
trial_daysinteger (or null)optionalThis plan's own free trial on the agency's launch store (reseller website and signup funnels), in days. null (the default) uses the store's trial length set under Launch your business; 0 sells this plan with no free trial at all — its card on the trial signup page says Buy now and its checkout charges at once, even while 'Every signup starts with the free trial' is on; 1-30 gives this plan its own trial length. Applies to new checkouts only; existing subscriptions keep their terms.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.create_plan \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example",
    "price_cents": 1
  }'
Test with your API key

Over MCP the same operation is the tool reseller_create_plan at https://app.chirply.io/api/mcp, same bearer token, same input.

Create signup checkout

reseller.create_signup_checkoutwriteconfirmadmin only

Create a hosted Stripe checkout link for one published reseller plan on this agency's connected Stripe account. Completing checkout charges the chosen price or starts its configured trial, creates a client account, and enables approved customer emails. This call creates the link only and does not submit a payment or enroll the recipient into marketing nurture. A link created here goes straight to payment, so the store's confirmation checkbox is not shown and no confirmation is recorded for it. While the store's 'Every signup starts with the free trial' setting is on, the link always includes the trial. The trial length is the plan's own when it sets one (reseller.update_plan trial_days), otherwise the store's; a plan set to 0 days is always charged at checkout, trial or not.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
plan_idstring (uuid)requiredActive plan owned by this agency.
trialbooleanoptionalUse the free trial when one applies (the plan's own trial length, otherwise the store's); false starts a paid subscription at checkout. Ignored while 'Every signup starts with the free trial' (trial_only) is on: the checkout then always includes the trial — except for a plan set to 0 trial days, which is always charged at checkout. Default: true

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.create_signup_checkout \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "plan_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_create_signup_checkout at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete client

reseller.delete_clientwriteconfirmadmin only

Delete a client account. This is a soft delete: the account is closed and everyone in it is locked out immediately, but nothing is destroyed — it can be restored later with reseller.restore_client. It stops counting against your paid client account allowance, so deleting a client frees a slot to create another. It does NOT cancel any billing you have running for them on your Stripe — stop that separately with reseller.cancel_client_billing.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.delete_client \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_delete_client at https://app.chirply.io/api/mcp, same bearer token, same input.

Stop pooling a credential

reseller.disable_pooled_credentialwriteconfirmadmin only

Turn off a pooled provider for a client. By default this is a reversible soft off — the client goes back to using its own connection and the isolation artifacts are kept, so re-enabling is instant. Set teardown to also SUSPEND the Twilio subaccount (reversible, keeps the client's numbers) or DELETE the Mailgun subdomain.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.
provider"twilio" | "mailgun" | "elevenlabs" | "openrouter" | "outscraper" | "firecrawl"requiredWhich provider to pool. 'twilio' provisions an isolated Twilio subaccount under your master account (billed to you); 'mailgun' provisions an isolated sending subdomain; 'elevenlabs', 'openrouter', 'outscraper', and 'firecrawl' use your own API key directly. Stripe is handled separately via Stripe Connect, not here.
teardownbooleanoptionalAlso dismantle the isolation: suspend the Twilio subaccount or delete the Mailgun subdomain. Off just stops using the pooled credential. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.disable_pooled_credential \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "provider": "twilio"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_disable_pooled_credential at https://app.chirply.io/api/mcp, same bearer token, same input.

Stop a client taking payments through you

reseller.disable_stripe_connectwriteconfirmadmin only

Turn off Stripe Connect for a client. Reversible: the client goes back to selling on its own Stripe, and the connected account is kept so you can switch it back on instantly. Does not move or refund any money already collected.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.disable_stripe_connect \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_disable_stripe_connect at https://app.chirply.io/api/mcp, same bearer token, same input.

Pool a credential to a client

reseller.enable_pooled_credentialwriteconfirmadmin only

Let a client account use YOUR provider account instead of connecting its own. For Twilio this creates an isolated Twilio subaccount under your master account — the client's calls and texts run on it and Twilio bills YOU for them. For Mailgun it provisions an isolated sending subdomain (which needs its DNS verified before it goes live). For ElevenLabs / OpenRouter / Outscraper / Firecrawl it uses your API key directly, effective immediately. The client's usage becomes your real cost — meter and rebill it with the credit system. Reversible at any time.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account to pool the credential to.
provider"twilio" | "mailgun" | "elevenlabs" | "openrouter" | "outscraper" | "firecrawl"requiredWhich provider to pool. 'twilio' provisions an isolated Twilio subaccount under your master account (billed to you); 'mailgun' provisions an isolated sending subdomain; 'elevenlabs', 'openrouter', 'outscraper', and 'firecrawl' use your own API key directly. Stripe is handled separately via Stripe Connect, not here.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.enable_pooled_credential \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "provider": "twilio"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_enable_pooled_credential at https://app.chirply.io/api/mcp, same bearer token, same input.

Let a client take payments through you

reseller.enable_stripe_connectwriteconfirmadmin only

Turn on Stripe Connect for a client: create (or reuse) an Express connected account under YOUR Stripe platform so the client can accept card payments through you. Money settles to the client and they stay merchant of record; you take an application fee on each transaction (set separately). This does NOT finish setup — the client must still complete Stripe's identity + bank verification (a link, from get_stripe_connect_link) before they can accept a payment. Requires your own Stripe to be connected and have Connect enabled. Reversible.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account to enable payments-through-you for.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.enable_stripe_connect \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_enable_stripe_connect at https://app.chirply.io/api/mcp, same bearer token, same input.

Billing setup

reseller.get_billing_statusreadadmin only

Whether this agency has connected its own Stripe account, which is required before it can charge any client. Read-only.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.get_billing_status \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_get_billing_status at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a client

reseller.get_clientread

Everything about one client account: its plan, the people in it, outstanding invitations, and its billing state on the agency's own Stripe. Read-only.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account's org id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.get_client \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_get_client at https://app.chirply.io/api/mcp, same bearer token, same input.

Client credits

reseller.get_client_creditsread

A client's prepaid credit standing on the reseller's pooled providers: balance (cycle allowance + purchased), whether it's paused for being out of credits, its effective per-unit prices, and its recent credit ledger. Read-only.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.get_client_credits \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_get_client_credits at https://app.chirply.io/api/mcp, same bearer token, same input.

What this client can see

reseller.get_client_featuresread

For one client account, list every feature you can switch on or off for them and which ones are currently hidden. Returns the full catalog — sections (Sites, Phone, AI…) and the individual rows inside each — plus the one-click presets. Hidden features are gone from that client's navigation, their pages don't open, and their API keys and integrations can't reach them, with no upgrade prompt shown anywhere. This is separate from the client's plan and does not change it. Read-only.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account's org id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.get_client_features \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_get_client_features at https://app.chirply.io/api/mcp, same bearer token, same input.

Rate card

reseller.get_rate_cardread

Read the per-item prices a reseller charges. With a client_id, returns that client's effective prices (override → plan default → agency default) plus its own overrides. Otherwise returns the default prices for a plan (or the agency-wide default when no plan_id is given). Each price also reports `markup_percent`: the percentage on cost it was written as, or null when it is a fixed dollar amount. Read-only, costs the caller nothing.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)optionalA client account — returns its effective prices + overrides.
plan_idstring (uuid) (or null)optionalA reseller plan whose default prices to read. Omit/null for the agency-wide default.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.get_rate_card \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "plan_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_get_rate_card at https://app.chirply.io/api/mcp, same bearer token, same input.

Client payment setup (Stripe Connect)

reseller.get_stripe_connectread

For one client account, show whether it accepts payments through YOUR Stripe (a connected account under your platform) or its own. Reports the status (own Stripe / onboarding / restricted / live), whether charges and payouts are enabled, and the application fee you take on its transactions (the per-client override or the plan default). Read-only.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account's org id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.get_stripe_connect \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_get_stripe_connect at https://app.chirply.io/api/mcp, same bearer token, same input.

What it costs you

reseller.get_unit_costsreadadmin only

Read what each metered unit costs the RESELLER at their own provider — the base every percentage mark-up price is worked out from. Units the reseller has not given a figure for report Chirply's published list price for that provider, flagged with is_custom false. This is the agency's margin data and is never visible to a client. Read-only.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.get_unit_costs \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_get_unit_costs at https://app.chirply.io/api/mcp, same bearer token, same input.

Invite to client account

reseller.invite_client_userwriteconfirmadmin only

Invite someone into a client's account — normally the client themselves, so they can log in and use the platform. Creates a pending invitation they accept to join; it grants them access to that one account only, never to the agency. Sends a real invitation to a real email address.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account to put them in.
emailstring (email)requiredThe person's email address.
role"owner" | "admin" | "member"optionalTheir role inside the client's own account. 'owner' is normal for the client themselves — it does NOT give them anything in your agency. Default: "owner"

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.invite_client_user \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "email": "ada@example.com"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_invite_client_user at https://app.chirply.io/api/mcp, same bearer token, same input.

View reseller launch

reseller.launch_overviewreadadmin only

Read the current reseller website, offer terms (including trialOnly: whether every signup starts with the free trial and the paid signup page opens the trial signup; planTrials: each live plan's free trial as the store sells it — its own trialDays when set, null when it follows the store, and sellsWithTrialDays; trialOnlyExceptions: plans sold without a trial while trial-only is on), marketingOptIn (whether a ticked 'Email me setup tips' box is confirmed by double opt-in before setup tips start — state confirming, off, not_started or channel_off — how many buyers are waiting to confirm, and the Email preferences link that changes it), connection readiness, public funnel links, and recent signup failures for this agency. Does not publish or send messages.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.launch_overview \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_launch_overview at https://app.chirply.io/api/mcp, same bearer token, same input.

Account domain

reseller.list_client_domainsread

List agency-owned domains, their DNS and HTTPS status, and assigned client account IDs. Read-only; changes no routing and costs nothing. An app_org_id matching the client is its dedicated account address; null means unassigned.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredClient account ID beneath this agency, from reseller.list_clients.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.list_client_domains \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_list_client_domains at https://app.chirply.io/api/mcp, same bearer token, same input.

Client's people

reseller.list_client_usersread

List who can sign in to a client account, plus any invitations that haven't been accepted yet. Read-only.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.list_client_users \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_list_client_users at https://app.chirply.io/api/mcp, same bearer token, same input.

Clients

reseller.list_clientsread

List every client account (client account) under this agency, with the included client-account allowance, used and remaining capacity, the plan each one is on, how many people are in it, and whether the agency is billing them. Includes soft-deleted clients — those have status 'canceled' and can be brought back with reseller.restore_client. Read-only.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.list_clients \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_list_clients at https://app.chirply.io/api/mcp, same bearer token, same input.

List your Mailgun sending domains

reseller.list_mailgun_domainsreadadmin only

The sending domains on YOUR OWN connected Mailgun account, with whether each one is verified. Use it to choose which domain a pooled client should send from. Sandbox domains are left out on purpose: Mailgun only lets those reach addresses you have individually authorised, so a client placed on one would appear to be sending while reaching almost nobody. Reads only.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.list_mailgun_domains \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_list_mailgun_domains at https://app.chirply.io/api/mcp, same bearer token, same input.

Your plans

reseller.list_plansread

List the plans this agency sells to its clients — the reseller's own packages, with the price the reseller charges, which underlying platform tier each one unlocks, and each plan's own free trial on the launch store (trial_days: null = the store's trial, 0 = no trial). These are NOT the platform's own retail plans; they're what this agency resells under its own brand.

Parameters

FieldTypeRequiredDescription
include_archivedbooleanoptionalInclude retired plans that clients may still be sitting on. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.list_plans \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "include_archived": false
  }'
Test with your API key

Over MCP the same operation is the tool reseller_list_plans at https://app.chirply.io/api/mcp, same bearer token, same input.

Pooled credentials

reseller.list_pooled_credentialsread

For one client account, show which providers it's using YOUR pooled credentials for versus its own. Each row reports the provider, whether pooling is on, its status (off / provisioning / active / error), and any isolation detail (the Twilio subaccount SID, the Mailgun subdomain and its DNS state). Read-only.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account's org id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.list_pooled_credentials \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_list_pooled_credentials at https://app.chirply.io/api/mcp, same bearer token, same input.

Manage subscription

reseller.open_subscription_portalwriteconfirmadmin only

Create a secure Stripe portal link for the current client account's own reseller subscription. The customer can update payment details, view invoices, and cancel at period end there. Opening this link does not itself charge or cancel the subscription.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.open_subscription_portal \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_open_subscription_portal at https://app.chirply.io/api/mcp, same bearer token, same input.

Pause new signups & emails

reseller.pause_launchwriteconfirmadmin only

Close the public reseller offer and pause queued customer lifecycle emails. Existing Stripe subscriptions keep billing and automatic account access checks continue. Does not cancel customer subscriptions or delete data.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.pause_launch \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_pause_launch at https://app.chirply.io/api/mcp, same bearer token, same input.

Prepare my launch package

reseller.prepare_launchwriteadmin only

Prepare a draft reseller website, trial and paid signup funnels, and customer lifecycle email templates. Seeds suggested plans only when the agency has not seeded them previously. Does not publish, charge, or email customers.

Parameters

FieldTypeRequiredDescription
actor_idstring (uuid)optionalAgency manager who owns automatic provisioning. Required for API-key callers without a signed-in user; must already manage this agency.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.prepare_launch \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "actor_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_prepare_launch at https://app.chirply.io/api/mcp, same bearer token, same input.

Launch website & automations

reseller.publish_launchwriteconfirmadmin only

Publish the reseller website and both signup funnels after connection and test checks pass. Enables real customer invitation, onboarding, trial, payment recovery and cancellation emails through the agency sending provider. Future signups create client accounts and subscriptions billed to the agency connected Stripe account; email and processing fees may apply.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.publish_launch \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_publish_launch at https://app.chirply.io/api/mcp, same bearer token, same input.

Refresh a client's payment status

reseller.refresh_stripe_connectwriteadmin only

Re-check a client's connected account with Stripe and update whether it can accept charges and receive payouts. Use after the client finishes onboarding to confirm they're live. Charges nothing.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.refresh_stripe_connect \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_refresh_stripe_connect at https://app.chirply.io/api/mcp, same bearer token, same input.

Remove assignment

reseller.remove_client_domainwriteconfirmadmin only

Remove this client's dedicated account assignment from one agency-owned domain. Immediately restores shared agency sign-in at that hostname. Keeps the domain connection, HTTPS certificate and agency ownership; costs nothing. Requires White-Label.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredClient account ID beneath this agency.
domain_idstring (uuid)requiredAgency-owned domain ID from reseller.list_client_domains.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.remove_client_domain \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "domain_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_remove_client_domain at https://app.chirply.io/api/mcp, same bearer token, same input.

Rename client

reseller.rename_clientwriteadmin only

Rename a client account. Cosmetic — the URL slug and everything inside it are untouched.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account to rename.
namestringrequiredThe new name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.rename_client \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "name": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_rename_client at https://app.chirply.io/api/mcp, same bearer token, same input.

Reorder plans

reseller.reorder_planswriteadmin only

Set the order this agency's live plans appear in on its public store — the pricing page, the trial and paid signup funnels — and in every plan picker. List plan ids first to last; any live plan left out keeps its current relative place after the ones named. After this call the agency's own order is kept exactly, and a plan created later joins the end of it. Changes display order only: no price, plan contents, client assignment or billing changes, and nothing is sent to anyone. Use reseller.sort_plans_by_price to return to the automatic lowest-price-first order.

Parameters

FieldTypeRequiredDescription
plan_idsarray of (string (uuid))requiredLive plan ids in the order they should appear, first to last. Each id at most once. Get them from reseller.list_plans.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.reorder_plans \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "plan_ids": [
      "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
    ]
  }'
Test with your API key

Over MCP the same operation is the tool reseller_reorder_plans at https://app.chirply.io/api/mcp, same bearer token, same input.

Restore client

reseller.restore_clientwriteadmin only

Bring a deleted (cancelled) client account back to active, with all its data intact. Fails if you're already at your paid client account allowance — free a slot or upgrade first, since a restored client counts again.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe cancelled client account to restore.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.restore_client \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_restore_client at https://app.chirply.io/api/mcp, same bearer token, same input.

Withdraw invitation

reseller.revoke_client_invitewriteadmin only

Withdraw a pending invitation into a client account. Their invite link stops working. Anyone who already accepted is unaffected.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.
invite_idstring (uuid)requiredThe pending invitation to withdraw.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.revoke_client_invite \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "invite_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_revoke_client_invite at https://app.chirply.io/api/mcp, same bearer token, same input.

Save checkout terms

reseller.save_checkout_termswriteconfirmadmin only

Change the public store's checkout requirements for new orders: require a confirmation checkbox with the given text (links as [text](https://url)), collect a company name and VAT ID (off, optional or required), set the legal links shown on every store page, and turn Stripe Tax on or off. With Stripe Tax on, new checkouts add or include tax calculated by the agency's own Stripe account, and turning it on is refused unless Stripe Tax is active there. Takes effect immediately on the live store and on orders the agency's own website posts to the store checkout; while the checkbox is required, the checkout refuses any order that does not send terms_accepted. Omitted fields keep their saved values. Does not charge, email or change existing subscriptions.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
terms_requiredbooleanoptionalWhen true, buyers must tick a confirmation box before the order button works, and the store checkout refuses any order (including a direct POST from your own website) that does not send terms_accepted. Requires terms_text.
terms_textstring (or null)optionalThe confirmation text shown beside the checkbox and recorded with every order. Plain text; add links as [link text](https://example.com/terms). HTML is not rendered. Null or empty clears it.
company_field"off" | "optional" | "required"optionalCompany name field on the order form: off, optional or required. A given company name becomes the Stripe customer name and the new client account's name.
vat_field"off" | "optional" | "required"optionalVAT ID field on the order form: off, optional or required. A given EU or UK VAT ID is saved to the buyer's Stripe customer as a tax ID; Stripe rejects invalid numbers before checkout.
legal_linksobject[]optionalLegal links shown in the footer of every store page and beside the order buttons, in this order. Replaces the saved list; an empty list removes them.
legal_links[].labelstringrequiredLink text, for example Imprint, Terms of Service, Privacy Policy or Cancellation & refund policy.
legal_links[].urlstringrequiredFull https:// address of the page.
stripe_tax"off" | "exclusive" | "inclusive"optionalStripe Tax on new store checkouts: off; exclusive (store prices are shown before tax and Stripe adds tax at checkout); or inclusive (store prices already include tax). When on, Stripe Tax on the agency's own connected Stripe account calculates tax from the buyer's billing address — VAT for a domestic buyer, reverse charge for an EU business with a VAT ID — and taxes renewals too. Requires Stripe Tax to be active on that account; it is checked when saved. Existing subscriptions are unchanged.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.save_checkout_terms \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "terms_required": true,
    "terms_text": "example"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_save_checkout_terms at https://app.chirply.io/api/mcp, same bearer token, same input.

Save launch settings

reseller.save_launchwriteconfirmadmin only

Set the connected Stripe account, website domain, trial duration, payment grace period, and whether every signup starts with the free trial (trial_only: the paid signup page then opens the trial signup and every new checkout includes the trial) for future reseller signups. Changes an already published offer for new customers; existing subscriptions retain their terms. Does not charge or email anyone.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
stripe_account_idstring (uuid)requiredConnected Stripe account that receives new customer subscriptions.
domain_idstring (uuid) (or null)requiredUnused connected website domain, or null to use the hosted website link.
trial_daysintegerrequiredThe store's free trial length in days, used by every plan that does not set its own (reseller.update_plan trial_days). Zero enables paid signup only for those plans. Applies to new subscriptions.
grace_daysintegerrequiredDays to retain access after a failed renewal, before a billing suspension. Applies to new subscriptions.
trial_onlybooleanoptionalEvery signup starts with the free trial. When true, the paid signup page (/join) opens the trial signup page (/trial) with its query string kept, and every checkout the store opens includes the trial: store order forms, orders your own website posts to the store checkout, and checkout links your team creates — except plans set to 0 trial days (reseller.update_plan trial_days), which always sell without one. Requires trial_days above 0: true with trial_days 0 is refused, and saving trial_days 0 turns it off. Omit to keep the saved value. Default false.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.save_launch \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "stripe_account_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "domain_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "trial_days": 1,
    "grace_days": 1
  }'
Test with your API key

Over MCP the same operation is the tool reseller_save_launch at https://app.chirply.io/api/mcp, same bearer token, same input.

Save store alerts

reseller.save_store_alertswriteconfirmadmin only

Turn this agency's store alerts on or off and choose where they go. When on, the agency is emailed — from its own verified sending address, the same one its store uses — each time a customer starts a trial, places a paid order, converts from trial, switches plans (with the old plan, the new plan and when it takes effect), fails a renewal payment, pays a failed renewal or ends a subscription, and its owners' and admins' browsers get a notification. A blank email sends alerts to the agency's owners and admins (up to five, owners first). Every alert carries the buyer's name, email and company, so the chosen address receives that customer data from now on — confirm it belongs to the agency. Sends nothing by itself and costs nothing beyond the agency's normal email sending.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
enabledbooleanrequiredtrue to email the agency about store signups and billing changes; false to stop.
emailstring (or null)optionalOne address to receive every store alert instead of the owners and admins, e.g. sales@agency.com. Omit or send null/empty to use the owners and admins.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.save_store_alerts \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled": true
  }'
Test with your API key

Over MCP the same operation is the tool reseller_save_store_alerts at https://app.chirply.io/api/mcp, same bearer token, same input.

Send test alert

reseller.send_test_store_alertwriteconfirmadmin only

Email one sample store alert right now — a made-up 'new trial' for the store's first plan — to whoever currently receives this agency's store alerts, from the agency's own sending address. Lets the agency confirm the alert arrives and where. Sends one real email per recipient (up to five); creates no signup, client account or charge.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.send_test_store_alert \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_send_test_store_alert at https://app.chirply.io/api/mcp, same bearer token, same input.

Auto-recharge

reseller.set_client_auto_rechargewriteconfirmadmin only

Turn a client's credit auto-recharge on or off and set its rules. While on, whenever a pooled-usage debit drops the client's balance under the threshold, their SAVED card is automatically charged the recharge amount on the RESELLER'S OWN Stripe — unattended, real-money charges, at most one attempt per 15 minutes. Confirm-gated because saving these settings arms future charges nobody clicks on.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.
enabledbooleanrequiredtrue arms auto-recharge; false disarms it (rules are cleared).
threshold_dollarsnumberoptionalRecharge when the spendable balance dips under this many dollars. Required when enabling.
amount_dollarsnumberoptionalDollars to charge each time, $5–$2,000. Required when enabling.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.set_client_auto_recharge \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "enabled": true
  }'
Test with your API key

Over MCP the same operation is the tool reseller_set_client_auto_recharge at https://app.chirply.io/api/mcp, same bearer token, same input.

Set what this client can see

reseller.set_client_featureswriteconfirmadmin only

Replace the whole list of features hidden from one client account. Pass every feature id you want HIDDEN; anything you leave out becomes visible, so sending an empty list restores the full platform. A hidden feature disappears from that client's navigation, its pages stop opening, and the client's own API keys, MCP sessions and Copilot can no longer reach it — no upgrade prompt is shown, because there is nothing for them to buy. Nothing is deleted: their existing data stays and comes back untouched if you switch the feature on again. Does not change their plan or their bill.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account to curate.
hiddenstring[]requiredEvery feature id to hide, as a complete list. Ids not in the catalog are ignored. An empty array switches everything back on.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.set_client_features \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "hidden": [
      "example"
    ]
  }'
Test with your API key

Over MCP the same operation is the tool reseller_set_client_features at https://app.chirply.io/api/mcp, same bearer token, same input.

Suspend or reactivate client

reseller.set_client_statuswriteconfirmadmin only

Suspend a client account so nobody in it can sign in — how an agency handles a client who has stopped paying — or reactivate a suspended one. Nothing is deleted and it is fully reversible, but suspending locks real people out of their account immediately.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.
status"active" | "suspended"required'suspended' locks their team out; 'active' restores access.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.set_client_status \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "status": "active"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_set_client_status at https://app.chirply.io/api/mcp, same bearer token, same input.

Choose a client's sending domain

reseller.set_pooled_mailgun_domainwriteconfirmadmin only

Set which Mailgun domain a pooled client sends from, instead of the automatic `<client>.<your root domain>` subdomain. Give a domain already verified on your Mailgun account and the switch takes effect immediately with no DNS to publish. Give a new one and it is created, and the client KEEPS SENDING ON THEIR OWN CONNECTION until its DNS is published and verified — their mail does not stop, but it is not on your account either. THIS CHANGES THE FROM-DOMAIN ON MAIL THEIR CUSTOMERS RECEIVE, which affects how that mail is recognised and filtered, so it is not a cosmetic setting.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account whose sending domain changes.
domainstringrequiredThe sending domain, e.g. mail.theirbusiness.com. Must be a domain name, not a URL or an email address.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.set_pooled_mailgun_domain \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "domain": "example"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_set_pooled_mailgun_domain at https://app.chirply.io/api/mcp, same bearer token, same input.

Set prices

reseller.set_rate_cardwriteadmin only

Set what a reseller charges per metered unit, as a fixed price or as a percentage mark-up on what the unit costs them. With a client_id, sets that client's overrides; with a plan_id, the plan's defaults; with neither, the agency-wide defaults. A mark-up price is recomputed from the cost basis (see reseller.get_unit_costs) every time it is charged, so correcting a cost re-prices every unit priced that way. Setting a price changes what the client is billed for future usage on your pooled credentials — it moves no money by itself and bills nobody retroactively. Unknown units are ignored with a warning.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)optionalSet this client's per-unit overrides.
plan_idstring (uuid) (or null)optionalSet this plan's default prices. Omit/null for the agency-wide default.
pricesmap of string → numberoptionalPer-unit prices to set, in dollars, keyed by unit. e.g. {"sms": 0.03, "call": 0.02, "email": 0.001}. Units: sms, mms, rcs, call, email, rvm, ai, lead, lookup, crawl (Firecrawl credits), tts (ElevenLabs characters). A price of 0 means free; to remove a price entirely (so that unit isn't rebilled) use `clear` instead.
markupsmap of string → numberoptionalPer-unit prices to set as a PERCENTAGE mark-up on what the unit costs you, keyed by unit. e.g. {"sms": 30} charges your SMS cost plus 30%. Overwrites any fixed price on that unit, and re-prices itself whenever the cost basis changes. Use `prices` instead to set a fixed dollar amount.
markup_allnumberoptionalPrice EVERY metered unit as this percentage on top of its cost, in one step — the equivalent of "mark everything up 30%". e.g. 30 charges cost + 30%. Applied before `prices` and `markups`, so those still win for the units they name.
provider"twilio" | "mailgun" | "elevenlabs" | "openrouter" | "outscraper" | "firecrawl"optionalNarrow `markup_all` and `clear_all` to the units that run on ONE pooled provider, leaving every other price alone. twilio covers sms, mms, rcs, call, rvm and lookup; mailgun covers email; openrouter covers ai; outscraper covers lead; firecrawl covers crawl; elevenlabs covers tts. Omit to mean every unit.
clear_allbooleanoptionalRemove the price from every unit in scope, which is how you say "this one is on me". The usage is still metered and still appears in usage reporting; it simply never debits the client's credits, so nothing is charged for it. Narrow it with `provider` to unprice one provider. This clears a per-client OVERRIDE, so the unit falls back to your plan or agency default if one is set.
cleararray of ("sms" | "mms" | "rcs" | "call" | "email" | "rvm" | … 5 more)optionalUnits to remove a price for (falls back to a broader layer, or unpriced).

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.set_rate_card \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "plan_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_set_rate_card at https://app.chirply.io/api/mcp, same bearer token, same input.

Set a client's payment fee

reseller.set_stripe_connect_feewriteconfirmadmin only

Set the application fee you take on this client's transactions, in basis points (100 = 1%, max 10000 = 100%). This is money taken off the top of another business's card revenue, and at 10000 it takes all of it — so confirm the number with a human before saving. It is a per-client override; pass null to clear it and inherit the client's plan default instead. Applies to future charges once Connect charge routing is live.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.
fee_bpsinteger (or null)requiredThe fee in basis points (100 = 1%). Null clears the per-client override and inherits the plan's connect fee.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.set_stripe_connect_fee \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "fee_bps": 1
  }'
Test with your API key

Over MCP the same operation is the tool reseller_set_stripe_connect_fee at https://app.chirply.io/api/mcp, same bearer token, same input.

Set your provider costs

reseller.set_unit_costswriteconfirmadmin only

Record what metered units actually cost the reseller at their provider, in dollars per unit (e.g. {"sms": 0.0079}). This is agency-wide and is the base for every price written as a percentage mark-up, so changing a cost immediately changes what EVERY client on a mark-up for that unit is charged for future usage — it moves no money by itself and never re-bills past usage. Units listed in `reset` fall back to Chirply's published list price. Unknown units are ignored with a warning.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
costsmap of string → numberoptionalPer-unit costs to record, in dollars, keyed by unit. e.g. {"sms": 0.0079, "call": 0.014, "email": 0.0008}. Units: sms, mms, rcs, call, email, rvm, ai, lead, lookup. Note `ai` is metered per TOKEN, not per request.
resetarray of ("sms" | "mms" | "rcs" | "call" | "email" | "rvm" | … 5 more)optionalUnits to drop your own figure for, falling back to the published list price.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.set_unit_costs \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_set_unit_costs at https://app.chirply.io/api/mcp, same bearer token, same input.

View signup confirmations

reseller.signup_terms_recordreadadmin only

Read what buyers confirmed when they ordered from this agency's store: the time, the exact confirmation text and its version, the host that sent the order (the store page or the agency's own website), the buyer's network address and browser, and the company name and VAT ID they gave. Signups started from a link the agency created itself are marked created_by: team, with the note: Created by your team — no buyer confirmation recorded. Narrow to one client account or one signup. Returns personal data about the agency's buyers; changes nothing.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)optionalOnly the signup that created this client account.
enrollment_idstring (uuid)optionalOnly this signup (the enrollment id shown on the launch screen and returned by the launch overview).
limitintegeroptionalMost recent signups to return, newest first. Default: 25

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.signup_terms_record \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "enrollment_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_signup_terms_record at https://app.chirply.io/api/mcp, same bearer token, same input.

Sort by price

reseller.sort_plans_by_pricewriteadmin only

Return this agency's plans to the automatic order on its store, signup funnels and plan pickers: monthly plans first, then yearly, each from the lowest price to the highest. Clears any order the agency arranged by hand. Changes display order only — no price, plan contents, client assignment or billing changes, and nothing is sent to anyone.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.sort_plans_by_price \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool reseller_sort_plans_by_price at https://app.chirply.io/api/mcp, same bearer token, same input.

Start billing a client

reseller.start_client_billingwriteconfirmadmin only

SPENDS THE CLIENT'S MONEY. Subscribes a client to one of the agency's plans on the AGENCY'S OWN Stripe account and has Stripe email them an invoice immediately, due in 7 days, recurring at the plan's price and interval. The money goes to the agency; the platform neither holds it nor takes a cut. Requires the agency to have connected Stripe. Fails if the client already has a live subscription.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account to start charging.
plan_idstring (uuid)requiredWhich of the agency's plans to bill them at. Must have a price above 0.
contact_emailstring (email)requiredWhere Stripe sends the invoice — the client's billing address.
contact_namestringoptionalWho to bill, if different from the account name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.start_client_billing \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "plan_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "contact_email": "ada@example.com"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_start_client_billing at https://app.chirply.io/api/mcp, same bearer token, same input.

Start card setup

reseller.start_client_card_setupwriteadmin only

Begin saving a payment card for a client's credit top-ups. Creates (or reuses) a customer on the RESELLER'S OWN Stripe account and returns a SetupIntent client_secret plus the reseller's publishable key, for a Stripe Payment Element the CLIENT completes in a browser. No money moves and no card data passes through this call — the card is entered directly into Stripe's form. Finish with reseller.complete_client_card_setup.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account the card will pay credits for.
emailstring (email)optionalBilling email for the Stripe customer created on the reseller's account.
namestringoptionalBilling name for the Stripe customer (defaults to the account name).

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.start_client_card_setup \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_start_client_card_setup at https://app.chirply.io/api/mcp, same bearer token, same input.

Store alerts

reseller.store_alertsreadadmin only

Read whether this agency is emailed about its own reseller store — when a customer starts a trial, places a paid order, converts from trial, switches plans, fails a renewal payment, pays a failed renewal, or ends a subscription — who those emails go to right now (the chosen alert address, or else the agency's owners and admins), and the most recent alerts with their delivery status. Changes nothing.

Parameters

FieldTypeRequiredDescription
recentintegeroptionalHow many of the most recent alerts to return, newest first. Default: 10

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.store_alerts \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "recent": 10
  }'
Test with your API key

Over MCP the same operation is the tool reseller_store_alerts at https://app.chirply.io/api/mcp, same bearer token, same input.

Refresh billing from Stripe

reseller.sync_client_billingwriteadmin only

Re-read a client's subscription from the agency's Stripe account and update the status shown here. This platform receives no webhooks from a tenant's own Stripe, so a payment that failed over there is only noticed when this runs. Read-only as far as Stripe is concerned — it charges nothing.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account to refresh.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.sync_client_billing \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_sync_client_billing at https://app.chirply.io/api/mcp, same bearer token, same input.

Run test signup

reseller.test_launchwriteadmin only

Create a Stripe test-mode checkout link for an agency plan using its saved trial terms (the plan's own trial length when it sets one, otherwise the store's). Requires test credentials. No real money is charged and no live client or customer email is created. Complete checkout with a Stripe test payment method to verify it.

Parameters

FieldTypeRequiredDescription
plan_idstring (uuid)requiredActive reseller plan to use in test checkout.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.test_launch \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "plan_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_test_launch at https://app.chirply.io/api/mcp, same bearer token, same input.

Charge card

reseller.top_up_client_creditswriteconfirmadmin only

Immediately charges the client's SAVED card on the RESELLER'S OWN Stripe account for a credit top-up — real money, billed to the client by the reseller — and adds the amount to the client's credit balance once Stripe confirms the charge settled (which also resumes paused pooled sends). Between $5 and $2,000. Refuses when no card is saved (see reseller.start_client_card_setup).

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account whose saved card is charged.
amount_dollarsnumberrequiredDollars to charge and credit, e.g. 50. Whole cents only.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.top_up_client_credits \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "amount_dollars": 1
  }'
Test with your API key

Over MCP the same operation is the tool reseller_top_up_client_credits at https://app.chirply.io/api/mcp, same bearer token, same input.

Edit plan

reseller.update_planwriteconfirmadmin only

Change a plan's name, price, billing interval, which underlying platform tier it unlocks, its per-limit tweaks, its default Stripe Connect application fee, or its own free trial on the agency's launch store (trial_days: 0 sells it with no trial and charges at checkout, even while the store is trial-only; null follows the store's trial). This edits a package the agency SELLS: every client already on the plan immediately follows its new tier and limits, so lowering a tier or a limit can take a working feature away from a paying customer, and the new price is what the next client to sign up pays. Their existing Stripe subscription is NOT re-priced — changing what a live customer pays has to be done deliberately by cancelling and re-starting their billing. Raising connect_fee_percent raises the cut taken on every client on this plan's live Stripe Connect payment volume immediately, unless that client carries their own fee override.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
plan_idstring (uuid)requiredThe plan to edit.
namestringoptionalWhat the client sees, e.g. 'Starter'. Must be unique here.
price_centsintegeroptionalWhat the AGENCY charges its client, in cents (9700 = $97). Unrelated to what the agency pays the platform — the difference is their margin. 0 makes a free plan that can't be billed.
interval"month" | "year"optionalHow often the client is charged your price.
plan_code"spark" | "build" | "launch" | "grow" | "scale"optionalWhich underlying platform tier a client on this plan runs on — this is what actually decides their limits (numbers, AI agents, funnels, automations). 'spark' is the entry rung and 'scale' the top; note that 'spark' and 'build' include NO calls, texts or marketing email, so a client who needs to phone or text anybody has to be on 'launch' or above.
limit_overridesmap of string → objectoptionalReplace the plan's per-limit tweaks. Omit to leave them unchanged; send {} to clear them all. Same rules and keys as on create — capped to your own plan, client accounts/white-label excluded.
descriptionstring (or null)optionalOptional blurb shown alongside the plan, on the client's plan picker.
connect_fee_percentnumberoptionalThe agency's default Stripe Connect application fee for clients on this plan, as a percent (2.5 = 2.5%) of every payment run through the client's connected Stripe account. 0 (the default) takes no cut. A per-client override, set separately, wins over this plan default. Unrelated to price_cents — this only applies to Stripe Connect payment volume, not the plan subscription itself.
trial_daysinteger (or null)optionalSet this plan's own free trial on the launch store: a number of days (0 = no free trial, even while the store is trial-only), or null to follow the store's trial again. Omit to leave it unchanged. Applies to new checkouts only; existing subscriptions keep their terms.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.update_plan \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "plan_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_update_plan at https://app.chirply.io/api/mcp, same bearer token, same input.

Check account domain

reseller.verify_client_domainwriteadmin only

Re-check DNS and HTTPS certificate status for a domain assigned to this client account and save its connection status. Changes only the stored verification state, edits no DNS and costs nothing. Requires White-Label.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredClient account ID beneath this agency.
domain_idstring (uuid)requiredAgency-owned domain ID from reseller.list_client_domains.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.verify_client_domain \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "domain_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_verify_client_domain at https://app.chirply.io/api/mcp, same bearer token, same input.

Verify pooled Mailgun DNS

reseller.verify_pooled_credentialwriteadmin only

Re-check a pooled Mailgun subdomain's DNS with Mailgun and flip it live once the records verify. Only applies to Mailgun; the other providers need no verification. Charges nothing.

Parameters

FieldTypeRequiredDescription
client_idstring (uuid)requiredThe client account.
provider"twilio" | "mailgun" | "elevenlabs" | "openrouter" | "outscraper" | "firecrawl"requiredWhich provider to pool. 'twilio' provisions an isolated Twilio subaccount under your master account (billed to you); 'mailgun' provisions an isolated sending subdomain; 'elevenlabs', 'openrouter', 'outscraper', and 'firecrawl' use your own API key directly. Stripe is handled separately via Stripe Connect, not here.

Example

curl -X POST https://app.chirply.io/api/v1/actions/reseller.verify_pooled_credential \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "provider": "twilio"
  }'
Test with your API key

Over MCP the same operation is the tool reseller_verify_pooled_credential at https://app.chirply.io/api/mcp, same bearer token, same input.

The machine-readable version of this page is GET https://app.chirply.io/api/v1/actions?domain=reseller — same operations, with full JSON Schemas. Authentication, errors and rate limits are covered in the API documentation home.