← All action domains

Invoices

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.

Add a line item

invoices.add_line_itemwriteconfirmadmin only

Append a line item to an invoice and recompute its cached totals. `unit_amount` is integer cents. Set item_kind to 'recurring' with an interval to bill it as a subscription line; leave it 'one_time' for a single charge. THIS RE-PRICES A PAY PAGE: once the invoice is published its page is public, so the new line is what the very next buyer is charged, and a 'recurring' line signs them up to be charged again every interval until someone cancels. No confirmation reaches the buyer — the amount on the page is simply different from then 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
invoice_idstring (uuid)requiredThe invoice to add the item to.
namestringrequiredWhat the buyer is paying for. Shown on the pay page and the receipt.
unit_amountintegerrequiredPrice per unit in integer cents (e.g. 4999 = $49.99).
quantityintegeroptionalHow many units. Multiplies the price. Default: 1
descriptionstring (or null)optionalLonger detail line shown under the item's name.
item_kind"one_time" | "recurring"optional'one_time' charges once; 'recurring' bills it as a subscription line on the interval below. Default: "one_time"
taxablebooleanoptionalWhether the invoice's tax rate applies to this line. Default: true
min_unit_amountinteger (or null)optionaltrial_ascending only: the starting price in cents, climbing to unit_amount.
recurring_interval"day" | "week" | "month" | "year"optionalRecurring items only: how often it bills.
recurring_interval_countintegeroptionalRecurring items only: how many intervals between charges — 28 with a 'day' interval bills every 28 days. A cycle can't exceed a year, so the real ceiling is 365 for day, 52 for week, 12 for month, 1 for year; anything higher is rejected. Default: 1
stripe_price_idstringoptionalExisting recurring Stripe Price id returned by Search Stripe subscription prices. Omit to create one reusable Product + Price at first checkout.
stripe_product_idstringoptionalMatching Product for stripe_price_id, or an existing Product to reuse while creating a new recurring Price when stripe_price_id is omitted.

Example

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

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

Archive

invoices.archivewriteconfirmadmin only

Archive an invoice: it leaves every list, its pay page stops working, and it can no longer be opened. Orders and payments are kept so its financial history remains auditable. Use permanent deletion only for invoices with no financial history.

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
idstring (uuid)requiredThe invoice to archive.

Example

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

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

Cancel an order

invoices.cancel_orderwriteconfirmadmin only

Cancel a buyer's order and every charge still scheduled against it, so their card is never charged again. Payments already taken are left untouched — this does NOT refund anything.

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
order_idstring (uuid)requiredThe order to cancel.

Example

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

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

Charge a scheduled payment now

invoices.charge_saved_cardwriteconfirmadmin only

CHARGES REAL MONEY. Runs a scheduled charge immediately against the card the buyer already authorized, on the organization's own Stripe account — the same off-session charge the invoice scheduler makes when an installment, a group close or a capture date comes due. Use it to collect early or to retry a failed installment. The amount comes from the schedule row; it cannot be changed here.

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
schedule_idstring (uuid)requiredThe scheduled charge to run now (see invoices.list_schedules).

Example

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

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

Stop accepting payments

invoices.closewriteadmin only

Close an invoice so its pay page stops taking new payments. Nothing is deleted and charges already scheduled against existing orders still run. Publishing it again reopens it.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe invoice to close.

Example

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

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

New invoice

invoices.createwriteadmin only

Create a draft invoice of the chosen kind. It starts empty with that kind's default pricing rules; add line items and then publish it to make its pay page live. Nothing is charged and nobody is emailed. For an ongoing subscription until canceled, use standard (one customer) or product (reusable checkout page) and add a recurring line item; plan is only a finite total split into a fixed number of installments. Other kinds: group (price drops as more join), ascending (price rises per buyer). For trial_ascending: A reusable signup link starts a separate free trial for every buyer, anchored to that buyer's enrollment time. Enrollment saves a card but charges nothing. During the initial discount window they can end the trial and pay the starting price immediately; after that, the price rises once per selected time unit in equal increments until it reaches full price at the trial deadline. Paying early cancels the deadline charge. If they do not pay early, their saved card is charged the full price when their own trial ends.

Parameters

FieldTypeRequiredDescription
kind"standard" | "product" | "group" | "ascending" | "plan" | "trial_ascending"requiredWhich of the six invoice types to create.
namestringoptionalInternal name for the invoice. Default: "Untitled invoice"
currencystringoptionalISO 4217 currency code, lowercase (e.g. 'usd'). Default: "usd"
stripe_account_idstring (uuid) (or null)optionalConnected Stripe account that collects this invoice. If omitted, the first connected account is pinned.
payment_mode"live" | "test"optionallive moves real money; test uses the selected account's Stripe test credentials. Default: "live"

Example

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

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

Delete invoice

invoices.deletewriteconfirmadmin only

Permanently deletes an invoice and its failed or canceled $0 checkout attempts. This destroys data and cannot be undone. Refuses to delete any invoice with a paid, refunded, active, pending, or otherwise in-flight order; archive those invoices instead.

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
idstring (uuid)requiredThe invoice to permanently delete.

Example

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

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

Delete payment attempt

invoices.delete_payment_attemptwriteconfirmadmin only

Permanently deletes one failed or canceled $0 invoice checkout attempt from the Payments list. This destroys data and cannot be undone. Any attempt with a successful or refunded payment is preserved and cannot be deleted.

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
idstring (uuid)requiredThe failed or canceled $0 order to delete.

Example

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

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

Duplicate

invoices.duplicatewriteadmin only

Copy an invoice and all of its line items into a fresh draft with a new public link. The copy takes no payments until it's published.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe invoice to duplicate.

Example

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

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

Open an invoice

invoices.getread

Fetch one invoice with its line items, pricing rules, pay-page settings and public link.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe invoice's id.

Example

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

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

Open a payment

invoices.get_orderread

Fetch one buyer's order with everything the payment page shows: totals, charges taken so far, the remaining schedule, the timeline, and the buyer's private receipt link.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe order's id.

Example

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

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

All invoices

invoices.listread

List the organization's invoices and checkout pages, newest first. Filter by invoice kind (standard, product, group, ascending, plan, trial_ascending) or status, and search names. Archived invoices are hidden, exactly as in the app.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
kind"standard" | "product" | "group" | "ascending" | "plan" | "trial_ascending"optionalOnly invoices of this kind.
status"draft" | "published" | "closed"optionalOnly invoices in this status.
querystringoptionalText to match in the invoice name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/invoices.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

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

Invoice timeline

invoices.list_eventsread

The activity timeline for one invoice — created, published, paid, failed, canceled — newest first.

Parameters

FieldTypeRequiredDescription
invoice_idstring (uuid)requiredThe invoice whose timeline to read.
limitintegeroptionalMax entries to return. Default: 30

Example

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

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

Invoice line items

invoices.list_line_itemsread

List the line items on one invoice, in display order, with their unit prices in integer cents.

Parameters

FieldTypeRequiredDescription
invoice_idstring (uuid)requiredThe invoice whose items to list.

Example

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

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

Payments (orders)

invoices.list_ordersread

List buyers' orders across every invoice, newest first — who bought, what they owe, and what they've paid. Filter to one invoice or one order status.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
invoice_idstring (uuid)optionalOnly orders on this invoice.
status"pending" | "committed" | "paid" | "partially_paid" | "failed" | "refunded" | … 1 moreoptionalOnly orders in this status.
querystringoptionalText to match in the buyer's name or email.

Example

curl -X POST https://app.chirply.io/api/v1/actions/invoices.list_orders \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

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

Payment history

invoices.list_paymentsread

List individual charges taken across the organization's invoices — succeeded, failed and refunded — newest first. Filter to one order or one status.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
order_idstring (uuid)optionalOnly charges against this order.
status"pending" | "succeeded" | "failed" | "refunded"optionalOnly charges in this status.

Example

curl -X POST https://app.chirply.io/api/v1/actions/invoices.list_payments \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

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

Scheduled charges

invoices.list_schedulesread

List the future charges queued against orders — payment-plan installments, a group offer's close, a standard invoice's capture date, and dunning retries. Filter by invoice, order, or status to find what's due or what has failed.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
invoice_idstring (uuid)optionalOnly charges for this invoice.
order_idstring (uuid)optionalOnly charges for this order.
status"pending" | "processing" | "paid" | "failed" | "canceled"optionalOnly charges in this status.

Example

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

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

Search Stripe subscription prices

invoices.list_stripe_pricesreadadmin only

List every active fixed recurring Price in the Stripe account and live/test environment selected by an invoice. Use a returned price_id with Add a line item or Edit a line item to reuse that Stripe Product and Price instead of creating a new catalogue entry. This only reads Stripe and does not charge anyone.

Parameters

FieldTypeRequiredDescription
invoice_idstring (uuid)requiredInvoice whose selected Stripe account and payment mode should be searched.

Example

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

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

Mark paid outside Stripe

invoices.mark_paidwriteconfirmadmin only

Record that an order's outstanding balance arrived OUTSIDE Stripe — cash, a bank transfer, a legacy invoice. Writes a real payment row for the full outstanding amount, marks the order paid, and cancels anything still scheduled against it. No card is charged; this changes the revenue record, so only use it when the money genuinely arrived.

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
order_idstring (uuid)requiredThe order that was paid.
notestringoptionalHow it was paid, e.g. 'paid by bank transfer'. Shown on the payment record.

Example

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

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

Publish

invoices.publishwriteconfirmadmin only

Publish a draft invoice so its public pay page goes LIVE and starts taking real payments on the organization's own Stripe account. Anyone with the link can then buy. Requires at least one line item.

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
idstring (uuid)requiredThe invoice to publish.

Example

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

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

Price this invoice now

invoices.quoteread

Run the invoice through the pricing engine and return what a buyer would pay right now: priced lines, discount, scarcity increase, tax, total, what's due at checkout, and every future scheduled charge. This is the same calculation the public pay page and the scheduler use — never compute invoice totals yourself.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe invoice to price.
quantityintegeroptionalUnits the buyer wants — product invoices that allow quantity only. Default: 1
curvebooleanoptionalAlso return the price curve shown in the builder's chart. Default: false

Example

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

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

Remove a line item

invoices.remove_line_itemwriteconfirmadmin only

Delete one line item from an invoice and recompute its totals. Orders already placed keep the price they were quoted.

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
idstring (uuid)requiredThe line item to remove.

Example

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

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

Send the invoice

invoices.sendwriteconfirmadmin only

SENDS A REAL EMAIL to a customer with a link to a published invoice's pay page, from the organization's own email provider. The invoice must be published. Give either a contact_id (uses that contact's email and renders merge fields like {{first_name}}) or an explicit `to` address.

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
invoice_idstring (uuid)requiredThe published invoice to send.
contact_idstring (uuid)optionalContact to send to; their email is used and merge fields resolve from them.
tostring (email)optionalExplicit recipient email. Overrides the contact's own address.
subjectstringoptionalEmail subject. Defaults to the invoice name.
messagestringoptionalBody text above the pay button. Supports merge fields.

Example

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

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

Invoicing overview

invoices.summaryread

The money view from the Invoices dashboard: total invoiced, collected, outstanding and failed, plus collections per day for the last N days. Reads real orders and cleared payments, not cached counters.

Parameters

FieldTypeRequiredDescription
daysintegeroptionalHow many days of daily collections to include. Default: 30

Example

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

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

Edit invoice details

invoices.updatewriteconfirmadmin only

Update an invoice's name, memo, currency, tax rate, billed contact, connected pay-page domain, pricing rules or pay-page settings. Omitted fields are left alone; `pricing` and `settings` are merged over what's stored, then normalized for the invoice's kind. Money values are integer cents. TWO THINGS HERE REACH THE PUBLIC IMMEDIATELY. (1) `pricing` and `tax_rate` re-price a LIVE pay page — if the invoice is published, the next buyer is charged the new amount with no notice. (2) `settings.headerScript` and `settings.footerScript` inject ARBITRARY JAVASCRIPT into the page where buyers type their card details, and `settings.redirectUrl` sends them anywhere after paying; nothing reviews either. Line items are edited with the invoices.add_line_item / update_line_item / remove_line_item capabilities.

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
idstring (uuid)requiredThe invoice to edit.
namestringoptionalInternal name for the invoice.
memostring (or null)optionalNote shown to the buyer.
currencystringoptionalISO 4217 code, lowercase.
tax_ratenumberoptionalTax percentage applied to taxable lines, 0–100 (e.g. 8.25).
contact_idstring (uuid) (or null)optionalContact this invoice is billed to. Standard invoices only; ignored otherwise.
domain_idstring (uuid) (or null)optionalActive connected serving domain for the public pay page, or null for the platform's own address.
stripe_account_idstring (uuid) (or null)optionalConnected Stripe account that collects new payments for this invoice.
payment_mode"live" | "test"optionallive moves real money; test uses the selected account's Stripe test credentials.
pricingobjectoptionalPricing rules for this invoice's kind. Only the supplied keys change.
pricing.captureAtstring (date-time) (or null)optionalstandard: charge the held card on this date instead of now.
pricing.nonPayablebooleanoptionalstandard: record-only invoice that can never be paid.
pricing.limitType"people" | "time" | "quantity" (or null)optionalproduct: what caps availability, or null for no cap.
pricing.limitTointeger (or null)optionalproduct: max number of buyers when limitType is 'people'.
pricing.limitUntilstring (date-time) (or null)optionalproduct: closes at this time when limitType is 'time'.
pricing.limitQuantityinteger (or null)optionalproduct: max units when limitType is 'quantity'.
pricing.allowQuantitybooleanoptionalproduct: let the buyer choose how many units to buy.
pricing.discountType"amount" | "percent"optionalgroup: whether tier discounts are cents or percentage points.
pricing.tiersobject[]optionalgroup: the discount ladder. Replaces the whole ladder.
pricing.tiers[].peopleintegerrequiredHeadcount that unlocks this tier.
pricing.tiers[].discountintegerrequiredDiscount: integer cents, or percentage points when discountType is 'percent'.
pricing.closesAtstring (date-time) (or null)optionalgroup: when the offer closes and every held card is charged.
pricing.inflationType"amount" | "percent"optionalascending: whether the increment is cents or percentage points.
pricing.incrementintegeroptionalascending: how much the price goes up at each rise — integer cents, or percentage points when inflationType is 'percent'.
pricing.buyersPerStepintegeroptionalascending: how many buyers share a price before it rises. 1 (the default) raises the price on every purchase; 10 holds it for buyers 1-10, raises it for buyer 11, again for buyer 21, and so on.
pricing.endsAtstring (date-time) (or null)optionalascending: hard stop, after which the invoice closes.
pricing.maxAmountinteger (or null)optionalascending: price ceiling in integer cents, or null for none.
pricing.segment"each" | "all"optionalgroup/ascending: apply the adjustment per line item or to the order total.
pricing.installmentsintegeroptionalplan: how many payments, including the first.
pricing.interval"day" | "week" | "month"optionalplan: the gap between installments.
pricing.intervalCountintegeroptionalplan: how many intervals between installments. A cycle can't exceed a year, so the ceiling depends on interval — 365 for day, 52 for week, 12 for month. Anything higher is rejected.
pricing.surgeAmountintegeroptionalplan: financing fee in integer cents, spread across installments.
pricing.lateFeeintegeroptionalplan: integer cents added to an installment that has to be retried.
pricing.firstCharge"now" | "on_schedule"optionalplan: charge the first installment at checkout, or wait for startsAt.
pricing.startsAtstring (date-time) (or null)optionalplan: when the schedule starts if firstCharge is 'on_schedule'.
pricing.trialDurationintegeroptionaltrial_ascending: how long each enrolled buyer can lock the minimum price.
pricing.totalDurationintegeroptionaltrial_ascending: each buyer's free-trial length; their saved card is charged the full price at the end unless they lock a lower price first.
pricing.unit"hours" | "days"optionaltrial_ascending: the unit both durations are measured in.
settingsobjectoptionalPay-page copy and behavior. Only the supplied keys change.
settings.template"ledger" | "studio" | "essential"optionalInvoice document design: classic Ledger, branded Studio, or compact Essential.
settings.logoMode"business" | "custom" | "none"optionalUse the account business-profile logo, a custom invoice logoUrl, or no logo.
settings.logoUrlstring (uri) (or null)optionalHosted HTTPS logo override used when logoMode is custom.
settings.primaryColorstring (or null)optionalHex accent color, e.g. #2668d5.
settings.headingstringoptionalHeadline on the pay page.
settings.subheadingstringoptionalSupporting line under the headline.
settings.submitLabelstringoptionalText on the pay button.
settings.thankYoustringoptionalCopy shown after a successful payment.
settings.redirectUrlstring (uri) (or null)optionalWhere to send the buyer after paying.
settings.collectNamebooleanoptionalAsk the buyer for their name.
settings.collectEmailbooleanoptionalAsk the buyer for their email.
settings.collectPhonebooleanoptionalAsk the buyer for their phone.
settings.collectAddressbooleanoptionalAsk the buyer for a billing address.
settings.customFieldsobject[]optionalExtra questions. Replaces the whole list.
settings.customFields[].keystringoptionalMachine key; derived from the label when omitted.
settings.customFields[].labelstringrequiredWhat the buyer sees above the input.
settings.customFields[].type"text" | "textarea" | "email" | "phone" | "number" | "select" | … 1 moreoptionalWhat kind of input the buyer gets on the pay page. 'select' needs `options`; 'checkbox' is a single tick box. Default: "text"
settings.customFields[].requiredbooleanoptionaltrue blocks the buyer from paying until they fill this in. Default: false
settings.customFields[].optionsstring[]optionalChoices, for type 'select' only.
settings.headerScriptstring (or null)optionalTenant script injected in the pay page head.
settings.footerScriptstring (or null)optionalTenant script injected at the end of the pay page.
settings.afterPaymentHeaderScriptstring (or null)optionalHead script on the thank-you page.
settings.afterPaymentFooterScriptstring (or null)optionalFooter script on the thank-you page.
settings.notifyEmailstring (email) (or null)optionalEmail the tenant when someone pays.
settings.notifySmsNumberstring (or null)optionalSMS the tenant when someone pays.
settings.showPoweredBybooleanoptionalShow the 'powered by' line on the pay page.

Example

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

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

Edit a line item

invoices.update_line_itemwriteconfirmadmin only

Update one line item's name, price, quantity, taxability, ordering or recurrence, and recompute the invoice's cached totals. Omitted fields are left alone. THIS RE-PRICES A LIVE PUBLIC PAY PAGE: if the invoice is published, the new amount is what the very next buyer is charged, immediately and with no notice to anyone. Changing item_kind to 'recurring' turns a one-off purchase into a subscription that keeps charging. People who already paid are not affected — the change only reaches buyers from now 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
idstring (uuid)requiredThe line item to edit.
namestringoptionalWhat the buyer is paying for. Shown on the pay page and the receipt.
unit_amountintegeroptionalNew price per unit in integer cents. Charged to the next buyer.
quantityintegeroptionalHow many units. Multiplies the price.
descriptionstring (or null)optionalLonger detail line shown under the item's name.
item_kind"one_time" | "recurring"optional'one_time' charges once; 'recurring' bills it as a subscription line on the interval below.
taxablebooleanoptionalWhether the invoice's tax rate applies to this line.
min_unit_amountinteger (or null)optionaltrial_ascending only: starting price in cents.
recurring_interval"day" | "week" | "month" | "year" (or null)optionalRecurring items only: how often it bills.
recurring_interval_countintegeroptionalRecurring items only: how many intervals between charges. Must fit what the interval allows — 365 day / 52 week / 12 month / 1 year.
sort_orderintegeroptionalPosition in the item list.
stripe_price_idstring (or null)optionalExisting recurring Stripe Price id returned by Search Stripe subscription prices, or null to create and reuse a new Product + Price at first checkout.
stripe_product_idstring (or null)optionalOptional Product id matching stripe_price_id, or null when clearing the existing Stripe selection.

Example

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

Over MCP the same operation is the tool invoices_update_line_item 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=invoices — same operations, with full JSON Schemas. Authentication, errors and rate limits are covered in the API documentation home.