Changelog

Notable changes to the Chargetree APIs and to this documentation.

Breaking changes are announced here before they take effect. Additive changes — a new optional field, a new endpoint, a new event — can land at any time, so build handlers that tolerate fields they do not recognise.

October 2026

Record a payment against an invoice. POST /invoices/{id}/payments records money received outside Chargetree -- cash, a bank transfer, a card terminal or a gift card -- against one of your invoices. The invoice's balance and status update straight away, the payment is copied to Xero when the invoice is linked to Xero, and the invoice.payment_recorded webhook fires. No receipt is emailed. The endpoint honours Idempotency-Key, and is documented on its own Payments reference page. A new error code, INVOICE_NOT_PAYABLE, is returned for drafts, cancelled invoices and paid invoices.

One home for the API reference. The older one-page reference inside the app (manage.chargetree.co/docs) has been retired and now redirects here. This site is the only reference.

Payments now carry paid_on. Every entry in payments[] includes paid_on, the day the money was received.

Breaking change: payment method values. payments[].method on invoice responses now writes multi-word methods in snake_case -- bank_transfer, credit_card and gift_card -- instead of with a space (bank transfer, credit card, gift card). This brings responses into line with the values this reference has always documented, and with the values POST /invoices/{id}/payments accepts. If your integration matches on the spaced values, update it to the snake_case ones. Single-word values (cash, stripe) are unchanged.

September 2026

This documentation site. The API reference moved to docs.chargetree.co, generated from OpenAPI descriptions that are checked against the application code on every build. Several long-standing inaccuracies were corrected in the process:

  • Request quotas. The previous reference listed hourly quotas of 5,000 reads and 1,000 writes. No such quota has ever been enforced. The real limits are 120 reads and 30 writes per minute, and those are the only limits applied.
  • Idempotency scope. Idempotency-Key is honoured on POST /invoices and POST /contacts only. It is silently ignored on POST /invoices/{id}/cancel, which the previous reference implied was covered.
  • Idempotency retention. Keys are retained for at least 24 hours rather than exactly 24 hours.
  • Stalled requests. A reservation that has been in flight for more than 60 seconds is released, which was not previously documented anywhere.
  • Webhook retries. The waits between attempts are 5m, 30m, 2h and 12h. The previous reference listed a 1-minute first wait that does not occur.
  • Webhook signatures. Now states plainly that there is no timestamp header and no replay window, so deduplicating on event_id is mandatory rather than advisable.
  • Error codes. ACCOUNT_DISABLED, PARTNER_DISABLED and CONFLICT are now documented. They were always returnable.
  • Escalation priority. low is a valid value alongside high and medium.
  • Payment method. payments[].method is an open set, not the closed list previously published.
  • Partner list responses. email is always null when listing accounts.

The Partner API is documented for the first time. All six endpoints, the ct_partner_ key space, the external_id retry behaviour and the one-time secrets now have a reference and a guide.

Earlier changes

Partner account fields. owner_email was renamed to email, and the deprecated industry field was removed from account creation and from account responses.

Partner addresses were split into structured fields — address_line1, address_city, address_state, address_postal_code, address_country — replacing a single free-text address.

Draft invoices. Invoices support an is_draft flag on creation and update, with strict ISO date validation on invoice_date and due_date.

On this page