API v4

Version 4 (V4) is now available. It introduces expanded credit memo functionality and bundles several deprecation cleanups and documentation fixes. The changes below apply to V4 only; V3 and earlier are unchanged.

Credit Memo Applications (new)

Credit memos can now be applied to invoices through dedicated endpoints, replacing the prior invoice_id-on-update model:

  • POST /credit-memos/{credit_memo_id}/applications - Reconcile a credit memo's applications. The request body (applications array of invoice_id, amount, application_date) represents the complete desired set: missing applications are removed, new ones inserted, and existing ones updated when the amount or application date changes.
  • DELETE /credit-memos/{credit_memo_id}/applications - Unapply all applications on a credit memo, reverting every invoice allocation.

Credit memo responses now include applied_amount, remaining_amount, and an applications array detailing each individual application.

Breaking: Credit Memo status values

The status enum on credit memos has changed:

  • UNPAID has been renamed to UNAPPLIED
  • PARTIALLY_APPLIED is a new status for credit memos that are partly applied
  • APPLIED_TO_BALANCE has been removed

Update any logic that branches on these values.

Breaking: invoice_id removed from credit memo create and update

POST /credit-memos and PUT /credit-memos/{id} no longer accept invoice_id. Use POST /credit-memos/{credit_memo_id}/applications to apply a credit memo to one or more invoices.

Breaking: /pending-contracts removed

The legacy /pending-contracts endpoints have been removed. Use the /draft-contracts endpoints, which provide the same staging workflow with deduplication via external_references.

Breaking: legacy bill_id removed from bill payment body

The redundant bill_id field has been removed from the bill payment request body. The bill is identified solely by the bill_id path parameter on POST /bills/{bill_id}/payments.

Breaking: deprecated subsidiaryId parameter removed

GET /reports/arr-waterfall no longer accepts the camelCase subsidiaryId query parameter. Use the snake_case subsidiary_id parameter, consistent with the rest of the API.

Revenue recognition only invoices: exchange_rate

Revenue recognition only invoice creation now accepts an optional exchange_rate field for multi-currency scenarios, matching standard invoices.

Documentation: corrected permission scopes

The following endpoints now document their correct permission scope (scopes are documentation metadata and are not enforced at runtime):

  • Retrieve a customer: ar:products:viewar:customers:view
  • Delete a bill payment: ar:invoice-payments:deleteap:expense-payments:delete
  • Update taxes for a credit memo: ar:contracts:editar:credit-memos:edit