27 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.
Update app
apps.apply_updatewriteconfirmadmin only
Move one installed Marketplace app to its newest published version. For hosted or external apps this immediately changes the app UI and declared event subscriptions running in the account; native apps acknowledge the version of their already-deployed feature. Existing permissions and access token remain unchanged.
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
Field
Type
Required
Description
install_id
string (uuid)
required
The installed app to update to its newest published version.
Over MCP the same operation is the tool apps_apply_update at https://app.chirply.io/api/mcp, same bearer token, same input.
Pay now
apps.complete_purchasewriteconfirmadmin only
Submit payment for a paid app prepared with apps.start_purchase. On the first call, confirmation_token must come from the buyer's completed Stripe Payment Element; only then does this create and confirm a REAL-MONEY one-time charge or monthly subscription on the developer's Stripe account. If customer authentication is required, call again without the token after Stripe.js completes it. Installs the app only after Stripe verifies payment.
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
Field
Type
Required
Description
order_id
string (uuid)
required
The pending order id from apps.start_purchase.
confirmation_token
string
optional
Stripe ConfirmationToken from the buyer's submitted Payment Element. Required for the first payment attempt; omit only when rechecking after customer authentication.
Over MCP the same operation is the tool apps_complete_purchase at https://app.chirply.io/api/mcp, same bearer token, same input.
Confirm agency checkout
apps.confirm_reseller_checkoutwriteadmin only
After paying on an agency's Stripe Checkout page (from apps.start_reseller_checkout), confirm that payment with the agency's Stripe and switch the app on in THIS account now, instead of waiting for the agency's Stripe webhook. Charges nothing and is safe to repeat — a payment already confirmed changes nothing, and a checkout that was not for this account, not paid, or taken in test mode is refused.
Parameters
Field
Type
Required
Description
session_id
string
required
The Stripe Checkout Session id the buyer came back with (the `reseller_checkout` value on the return URL).
Over MCP the same operation is the tool apps_confirm_reseller_checkout at https://app.chirply.io/api/mcp, same bearer token, same input.
Create an app
apps.createwriteadmin only
Create a new app in this agency's developer account, as a private draft. Doesn't publish or list it — that happens later via apps.submit_for_review and platform review. Requires an agency (white-label or reseller) plan. Both hosting modes are live: 'external' loads your own HTTPS URL in a sandboxed iframe, 'hosted' serves a self-contained HTML document you publish through apps.publish_version. Paid apps are live too — apps.start_purchase and apps.complete_purchase take real money from buyers — so set pricing_kind, price_cents and currency to what you actually intend to charge.
Parameters
Field
Type
Required
Description
slug
string
required
Globally-unique URL-safe id, e.g. 'acme-dialer'. Permanent once set.
name
string
required
Display name shown on the marketplace card.
tagline
string
optional
One-line pitch for the card.
description
string
optional
Full description for the listing page.
category
string
optional
Marketplace category, e.g. 'Telephony'.
icon_url
string (uri)
optional
HTTPS URL of the app's square icon (upload via POST /api/apps/images).
screenshots
array of (string (uri))
optional
HTTPS URLs of marketplace screenshots (upload via POST /api/apps/images). Default: []
hosting
"external" | "hosted"
optional
'external' = you host the app UI yourself and register its HTTPS URL; 'hosted' = the app is a single self-contained HTML document Chirply serves in a sandboxed iframe (publish it with apps.publish_version). Default: "external"
external_base_url
string (uri)
optional
For 'external' hosting: the HTTPS URL the app UI is loaded from. Every page/widget/card path is resolved against it, so changing it repoints the app's whole UI for everyone who has it installed.
requested_scopes
string[]
optional
The most an install may ever grant this app, e.g. ['contacts:read','tasks:write']. Outward-facing actions also need a '<area>:confirm' scope. Default: []
pricing_kind
"free" | "one_time" | "subscription"
optional
How the app is sold — free, one-time, or a recurring subscription. Buyers are charged for real; see apps.start_purchase / apps.complete_purchase. Default: "free"
price_cents
integer
optional
Price in integer cents (2900 = $29.00). Real money, charged to the buyer. Default: 0
currency
string
optional
ISO currency code, lowercase, e.g. 'usd'. Default: "usd"
Over MCP the same operation is the tool apps_create at https://app.chirply.io/api/mcp, same bearer token, same input.
How to build an app
apps.dev_guideread
Read this FIRST. Returns the complete guide to building and publishing a marketplace app with your own AI agent: the hosted vs external model, the create → publish_version → submit_for_review → (admin review) → install flow, the manifest (pages/widgets/cards), the App SDK (chirply.call / chirply.data / chirply.context), the scope grammar, and a minimal worked hosted app. After reading it, use apps.create, apps.publish_version, and apps.submit_for_review.
Over MCP the same operation is the tool apps_dev_guide at https://app.chirply.io/api/mcp, same bearer token, same input.
Connect Stripe for payouts
apps.developer_connectwriteadmin only
Start (or resume) Stripe Connect onboarding so your agency gets PAID for paid app installs. Returns a Stripe-hosted onboarding URL — open it, finish the steps, come back. Money from paid installs settles to this connected account (you're the merchant of record), minus the marketplace fee. Required before you can actually charge for an app.
Over MCP the same operation is the tool apps_developer_connect_status at https://app.chirply.io/api/mcp, same bearer token, same input.
Check app ownership
apps.entitlementreadadmin only
Check what this account has PAID for on one app, which is a different question from whether it is currently installed. Returns how it was bought (paid once, monthly, or yearly), whether the account may install it again without paying, when a subscription's paid-up period ends, and whether that subscription is already cancelling. Reads only — spends no money and changes no install. Use it before apps.install on a paid app: an account that already owns one reinstalls for free, so a purchase is not always needed.
Parameters
Field
Type
Required
Description
app_id
string (uuid)
optional
The app to check, by id. Give this or slug.
slug
string
optional
The app to check, by marketplace slug. Give this or app_id.
Over MCP the same operation is the tool apps_get at https://app.chirply.io/api/mcp, same bearer token, same input.
View a marketplace listing
apps.get_listingread
Fetch one marketplace app's public listing detail by slug or id: its full description, screenshots, icon, pricing, category, requested scopes, developer name, and how many accounts have it installed. Returns publicly-listed apps, plus your own agency's apps before they're listed. This is the read behind the app's detail page. In a client account whose agency resells the app, the pricing is the AGENCY's and `agency_offer` says who sells it, at what price, whether it can be bought yet (the agency has connected its Stripe) and whether this account already owns it.
Over MCP the same operation is the tool apps_get_listing at https://app.chirply.io/api/mcp, same bearer token, same input.
Install an app
apps.installwriteconfirmadmin only
Install an app into THIS account and issue it an access token with the scopes you grant. This gives third-party code ongoing API access to the account's data within those scopes — the token is shown once and can't be retrieved again. IT ALSO STARTS SENDING DATA OUT: if the app's manifest subscribes to events and you grant 'events:read', the install provisions those event subscriptions and returns a `webhook_secret`, after which this account POSTs the subscribed events (new contacts, inbound messages, won deals, paid invoices…) to the app developer's own server as they happen, until someone uninstalls. Grant the least it needs, and know where the data is going. Re-installing rotates the existing install.
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
Field
Type
Required
Description
app_id
string (uuid)
optional
The app to install (by id).
slug
string
optional
The app to install (by slug), if id is not given.
grant_scopes
string[]
required
Scopes to grant this install — must be within the app's requested_scopes, e.g. ['contacts:read']. Grant the least it needs.
config
map of string → object
optional
Non-secret per-install settings the app reads back. Default: {}
Over MCP the same operation is the tool apps_install at https://app.chirply.io/api/mcp, same bearer token, same input.
Install a built-in app
apps.install_nativewriteadmin only
Turn ON one of the platform's built-in (native) first-party apps for this account: Browser Agent ('browser-agent'), Directories ('directories'), Domain Leads ('domain-leads'), Desk Phones ('desk-phones'), Business Cards ('business-cards'), Martial Arts Gym ('martial-arts-gym'), GoHighLevel ('gohighlevel'), Quotes & Proposals ('proposals'), Project Preview ('project-preview'), Restaurant ('restaurant'), Shopify Commerce ('shopify'), Klaviyo ('klaviyo') — the same list apps.list_directory marks as native, and the same Install button on the Apps screen. A native app is a feature shipped inside the product, so this issues no token, grants no scopes, and sends no data to any third party; it simply enables that feature's screens and, for integration apps like GoHighLevel and Klaviyo, unlocks their capability domains (which refuse with app_required until the app is installed). PAID native apps are NOT granted by this: unless the account already owns the app (check apps.entitlement), the install is refused with payment_required and the purchase must go through apps.start_purchase / apps.complete_purchase — exactly the same gate the Install button enforces, so this is never a way to get an app the account hasn't bought. Reinstalling an owned app is free and reactivates every licence the account holds.
Parameters
Field
Type
Required
Description
slug
string
required
The native app's slug, e.g. 'restaurant', 'klaviyo', 'gohighlevel'. The valid slugs are listed in this capability's description and marked native in apps.list_directory.
Over MCP the same operation is the tool apps_list at https://app.chirply.io/api/mcp, same bearer token, same input.
Browse the app marketplace
apps.list_directoryread
Browse apps that can be installed into this account — everything listed publicly, plus this agency's own apps (so you can install one before it's listed). Each app includes its cumulative download count across accounts, and an `is_owner` flag that is true for apps this account publishes (those can be managed in the developer portal). In a client account of a reselling agency, apps the agency's licence covers show the AGENCY's price (`sold_by_agency: true`, bought with apps.start_reseller_checkout) or are free (`included_by_agency: true`) instead of the marketplace's own price.
Over MCP the same operation is the tool apps_list_installs at https://app.chirply.io/api/mcp, same bearer token, same input.
Installed account apps
apps.list_mobile_pagesread
List the custom pages contributed by active apps installed in this account — first-party native apps (each gated by its own feature flag) plus external/hosted Marketplace apps when the app platform is on. This is the member-safe mobile navigation view: it returns only page labels and in-app routes, never install tokens, secrets, granted scopes, or configuration. Read-only.
Over MCP the same operation is the tool apps_list_mobile_pages at https://app.chirply.io/api/mcp, same bearer token, same input.
View an app's what's new
apps.list_release_notesread
List the published version history and app-owned release notes for one app installed in this account. This is the app's own What's new feed, separate from the product-wide release feed.
Over MCP the same operation is the tool apps_list_release_notes at https://app.chirply.io/api/mcp, same bearer token, same input.
View app updates
apps.list_updatesread
List version updates for apps installed in this account. Each result identifies the installed version, newest published version, app-specific release notes, and whether an update is available. Marketplace app changes live here instead of the product-wide What's new feed.
Parameters
Field
Type
Required
Description
available_only
boolean
optional
Return only apps with a newer published version. Set false to include current apps too. Default: true
Over MCP the same operation is the tool apps_list_updates at https://app.chirply.io/api/mcp, same bearer token, same input.
Publish an app version
apps.publish_versionwriteconfirmadmin only
Publish an immutable version of an app: its manifest (the pages/widgets/cards/actions it adds) and, for a PLATFORM-HOSTED app, its `document` — a single self-contained HTML page (inline CSS/JS + the App SDK) served in a sandboxed iframe. This is how an AI agent ships an app it wrote onto the marketplace. It is OUTWARD-FACING AND PERMANENT: a published version cannot be edited or unpublished, a listed app's new installs pin it straight away, and the code in `document` runs inside other people's accounts. Version labels are unique per app, so a mistake can only be superseded, never withdrawn.
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
Field
Type
Required
Description
app_id
string (uuid)
required
The app to publish a version of.
version
string
required
Version label, unique within the app, e.g. '1.0.0'.
manifest
object
optional
The app manifest: `pages`/`widgets`/`cards` are UI surfaces; `actions` are named operations the app contributes to the platform's action pickers. For a hosted app the app reads chirply.context.view to know which surface it's rendering. Default: {}
manifest.pages
object[]
optional
Custom pages the app adds to the workspace nav.
manifest.pages[].key
string
required
URL-safe id — the last segment of /apps/<install>/<key>. Permanent.
manifest.pages[].label
string
required
The nav label a user sees.
manifest.pages[].path
string
optional
Entry path on the app's base URL, e.g. '/panel'. Same origin only. Default: "/"
manifest.pages[].icon
string
optional
Optional icon hint (a lucide name); a default is used when omitted.
manifest.widgets
object[]
optional
Dashboard widgets the app makes available (they launch to the Customize tray).
manifest.widgets[].key
string
required
URL-safe id for this widget. Permanent.
manifest.widgets[].label
string
required
The widget's title on the dashboard.
manifest.widgets[].path
string
optional
Entry path on the app's base URL for the widget UI. Same origin only. Default: "/"
manifest.widgets[].defaultSpan
integer
optional
Default width in 12-column grid units. Defaults to 6 (half).
manifest.cards
object[]
optional
Cards the app shows on a contact record (given the contact id).
manifest.cards[].key
string
required
URL-safe id for this card. Permanent.
manifest.cards[].label
string
required
The card's title on the contact record.
manifest.cards[].path
string
optional
Entry path on the app's base URL for the card UI. Same origin only. Default: "/"
manifest.cards[].height
integer
optional
Card height in pixels. Defaults to 320.
manifest.events
object
optional
Platform events the app subscribes to (external apps with a backend). Needs the 'events:read' scope.
manifest.events.path
string
optional
Path on your base URL that receives event POSTs, e.g. '/webhooks'. Same origin only. Default: "/webhooks"
manifest.events.subscribe
string[]
optional
Platform event names to receive — the automation trigger names (e.g. 'contact_created', 'message_received', 'deal_won', 'invoice_paid'). Each is delivered as a signed POST. Default: []
manifest.actions
object[]
optional
Actions the app contributes to the platform's action pickers.
manifest.actions[].key
string
required
Permanent action key sent to POST <base URL>/actions.
manifest.actions[].label
string
required
The action name shown in action pickers.
manifest.actions[].description
string
required
What the action does, including any real-world side effect or cost.
manifest.actions[].icon
string
optional
Optional Lucide icon name.
manifest.actions[].fields
object[]
optional
Parameters collected before running the action. Default: []
manifest.actions[].fields[].key
string
required
Stable parameter key sent to the app's action endpoint.
manifest.actions[].fields[].label
string
required
The field label a user sees.
manifest.actions[].fields[].type
"text" | "textarea" | "number" | "select"
optional
The input control rendered for this parameter. Default: "text"
manifest.actions[].fields[].options
object[]
optional
Choices for a select field.
manifest.actions[].fields[].optional
boolean
optional
Whether the action can run without this value.
manifest.actions[].fields[].placeholder
string
optional
Example value shown inside the field.
manifest.actions[].fields[].hint
string
optional
Short help text shown below the field.
manifest.actions[].fields[].defaultValue
string
optional
Initial value for the field.
manifest.actions[].surfaces
array of ("automation" | "disposition" | "bulk" | "contact")
optional
Places where users can choose this action. Default: ["automation","disposition","bulk","contact"]
document
string
optional
For hosting='hosted' ONLY: the app's full self-contained HTML (inline CSS/JS; include <script src="/apps/sdk.js"></script> and use chirply.call / chirply.data). It is served in a null-origin sandbox. Read the guide via apps.dev_guide first.
Over MCP the same operation is the tool apps_publish_version at https://app.chirply.io/api/mcp, same bearer token, same input.
Rotate an install's token
apps.rotate_tokenwriteconfirmadmin only
Issue a fresh access token for an installed app and invalidate the old one immediately. Use if a token may have leaked. The new token is shown once.
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.
Over MCP the same operation is the tool apps_rotate_token at https://app.chirply.io/api/mcp, same bearer token, same input.
Continue to payment
apps.start_purchasewriteadmin only
Prepare the payment form for a PAID app in THIS account. Creates an internal pending order and may create a short-lived Stripe CustomerSession to show an existing saved card; it does not create a Stripe PaymentIntent, charge money, or install the app. Submit payment details with apps.complete_purchase. Free apps use apps.install instead. Refused in a client account whose agency resells the app: an app the agency sells is bought with apps.start_reseller_checkout (paid to the agency), and one the agency includes installs free.
Parameters
Field
Type
Required
Description
price_option_id
string
optional
The buyer-selected price option id from the listing.
instance_name
string
optional
Name for this paid install.
app_id
string (uuid)
optional
The paid app to buy (by id).
slug
string
optional
The paid app to buy (by slug).
grant_scopes
string[]
optional
Scopes to grant the install once paid — within the app's requested_scopes. Default: []
Over MCP the same operation is the tool apps_start_purchase at https://app.chirply.io/api/mcp, same bearer token, same input.
Buy from your agency
apps.start_reseller_checkoutwriteadmin only
For a client account whose agency sells this app at its own price: open a Stripe Checkout page on the AGENCY's own Stripe account and return its URL for a person to pay on. Creating it charges nothing — the buyer enters their card on Stripe's page, the money goes to the agency (the platform takes no cut), and the app then switches on in this account automatically. Creates a pending sale the agency can see, and on first sale the app's product on the agency's Stripe. Refused when the agency does not sell the app (use apps.start_purchase or apps.install), when this account already owns it, or when the agency has not connected a Stripe account that can take live payments.
Parameters
Field
Type
Required
Description
app_id
string (uuid)
optional
The app to buy from the agency (by id). Give this or slug.
slug
string
optional
The app to buy from the agency (by marketplace slug).
return_origin
string
optional
The app address the buyer is signed in on now, e.g. https://app.youragency.com, so Stripe sends them back there after paying. Honoured only when it is this account's own app address or the platform's; anything else returns them to this account's branded app address.
Over MCP the same operation is the tool apps_start_reseller_checkout at https://app.chirply.io/api/mcp, same bearer token, same input.
App install stats
apps.statsreadadmin only
For an app your agency OWNS, how many accounts have installed it — total, active, revoked, and suspended. This is your developer analytics: it counts installs across all accounts (aggregate only, it never reveals which accounts).
Over MCP the same operation is the tool apps_stats at https://app.chirply.io/api/mcp, same bearer token, same input.
Submit an app for review
apps.submit_for_reviewwriteconfirmadmin only
Move a draft app into the platform review queue so it can be approved and listed on the marketplace. This hands the app, its published code and its listing copy to platform reviewers outside this agency, and approval puts it in front of every account on the platform. The app must have a published version 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.
Over MCP the same operation is the tool apps_submit_for_review at https://app.chirply.io/api/mcp, same bearer token, same input.
Uninstall an app
apps.uninstallwriteconfirmadmin only
Revoke an app's install in this account. Its access token stops working immediately and the app can no longer reach any of this account's data. If the app is on a paid subscription this ALSO cancels that subscription at the end of the current period — billing stops, access continues until the period ends, and it can be reinstalled free until then, after which it switches off. Uninstalling never refunds and never destroys a one-time purchase: an app bought outright can always be reinstalled at no 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.
Over MCP the same operation is the tool apps_uninstall at https://app.chirply.io/api/mcp, same bearer token, same input.
Uninstall a built-in app
apps.uninstall_nativewriteconfirmadmin only
Turn OFF one of the platform's built-in (native) apps for this account (Browser Agent ('browser-agent'), Directories ('directories'), Domain Leads ('domain-leads'), Desk Phones ('desk-phones'), Business Cards ('business-cards'), Martial Arts Gym ('martial-arts-gym'), GoHighLevel ('gohighlevel'), Quotes & Proposals ('proposals'), Project Preview ('project-preview'), Restaurant ('restaurant'), Shopify Commerce ('shopify'), Klaviyo ('klaviyo')) — the trash-can Uninstall on the Apps screen. The feature's screens disappear from the account and, for integration apps like GoHighLevel and Klaviyo, their capability domains start refusing with app_required. If the app is on a paid subscription this ALSO cancels that subscription at the end of the current paid period — billing stops, and the app can be reinstalled free until the period runs out. Uninstalling never refunds and never destroys a one-time purchase (an app bought outright reinstalls free forever, via apps.install_native), and data the app already imported into this account stays.
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
Field
Type
Required
Description
slug
string
required
The native app's slug to switch off, e.g. 'restaurant', 'klaviyo', 'gohighlevel'.
Over MCP the same operation is the tool apps_uninstall_native at https://app.chirply.io/api/mcp, same bearer token, same input.
Edit an app
apps.updatewriteadmin only
Update an app's details, pricing, requested scopes, or visibility (private/unlisted). Doesn't change review status. Omitted fields are left alone. This edits a LISTED app too, not only a draft: the name, copy and price change on the public marketplace card immediately, with no re-review, and price_cents is what the next buyer is really charged. Repointing external_base_url moves every installed copy's UI to a different server.
Parameters
Field
Type
Required
Description
id
string (uuid)
required
The app to edit.
name
string
optional
Display name shown on the marketplace card.
tagline
string (or null)
optional
One-line pitch for the card.
description
string (or null)
optional
Full description for the listing page.
category
string (or null)
optional
Marketplace category, e.g. 'Telephony'.
icon_url
string (uri) (or null)
optional
HTTPS URL of the app's square icon (upload via POST /api/apps/images).
screenshots
array of (string (uri))
optional
Replaces the app's screenshot list.
hosting
"external" | "hosted"
optional
'external' = you host the app UI yourself and register its HTTPS URL; 'hosted' = the app is a single self-contained HTML document Chirply serves in a sandboxed iframe (publish it with apps.publish_version).
external_base_url
string (uri) (or null)
optional
For 'external' hosting: the HTTPS URL the app UI is loaded from. Every page/widget/card path is resolved against it, so changing it repoints the app's whole UI for everyone who has it installed.
requested_scopes
string[]
optional
Replaces the app's requested-scope list.
pricing_kind
"free" | "one_time" | "subscription"
optional
How the app is sold — free, one-time, or a recurring subscription. Buyers are charged for real; see apps.start_purchase / apps.complete_purchase.
price_cents
integer
optional
Price in integer cents (2900 = $29.00). Real money, charged to the buyer.
pricing_options
object[]
optional
Replaces the buyer-selectable price options. Use an empty array for free.
pricing_options[].id
string
required
Stable identifier for this price option.
pricing_options[].label
string
required
Buyer-facing option name, such as Monthly or Lifetime.
pricing_options[].kind
"one_time" | "monthly" | "yearly"
required
Whether this is paid once, monthly, or yearly.
pricing_options[].amount_cents
integer
required
Regular price in the app currency, in cents.
pricing_options[].sale_amount_cents
integer (or null)
optional
Temporary sale price in cents, or null. Default: null
pricing_options[].sale_starts_at
string (date-time) (or null)
optional
When the sale becomes active, or null for immediately. Default: null
pricing_options[].sale_ends_at
string (date-time) (or null)
optional
When the sale ends, or null for no scheduled end. Default: null
setup_fee_cents
integer
optional
Required upfront fee in cents, added to a selected recurring plan.
allow_multiple_installs
boolean
optional
Allow several separately billed installs in one account.
currency
string
optional
ISO currency code, lowercase, e.g. 'usd'.
visibility
"private" | "unlisted"
optional
Public listing is granted by platform review, not set here.