Confirm a draft sales order or invoice into the OPEN state
Transitions a draft sales order or draft invoice into the OPEN state, runs the
approval-threshold + credit-hold + delinquency gates, and triggers inventory allocation
for every line item. The order must have at least one line item and a valid shipping
address. Confirmation generates an order-confirmed activity log entry and optionally
sends a confirmation email when send_email: true is passed.
Quotes cannot be confirmed. A document with document_type='quote' returns HTTP 422
with code: 'quote_must_convert_before_confirm'. The canonical quote-to-sales-order
doorway is POST /orders/{id}/convert; after conversion, call /confirm on the
resulting sales order. This mirrors NetSuite Estimate, Acumatica Sales Quote, Odoo
Quotation, and QuickBooks Estimate behavior (quotes do not commit inventory).
Credit hold override (NEW-GAP-CS-CREDIT-HOLD-OVERRIDE-WITH-PERMISSION-AND-AUDIT,
2026-05-16). When an account is on credit hold (manual flag or credit-limit
exceeded), confirmOrder normally returns HTTP 409 with error: 'Order placed on hold' and places the order in is_on_hold = true. An operator with the
accounts.override_credit_hold permission can push the order through the gate
by passing override_credit_hold: true AND override_reason (minimum 10 chars
after trim) in the request body. The override is audit-logged via three channels:
(1) activity_log.action = 'order_credit_hold_overridden', (2) order_timeline
entry, and (3) order.credit_hold_overridden realtime broadcast. The order also
records orders.credit_hold_override_at / _by / _reason / _type for reporting.
Industry: NetSuite “Override Credit Hold” right, Acumatica SO.OverrideHold,
Brightpearl override-credit-limit prompt.
Delinquency acknowledgement (NEW-GAP-DELINQUENCY-ACKNOWLEDGE-FE-MODAL-AND-OPENAPI,
2026-05-18). When an account has overdue invoices (but is not on hard credit hold),
confirmOrder returns HTTP 422 requires_delinquency_acknowledgment with
overdue_count, overdue_amount, and max_days_overdue. An operator with the
accounts.acknowledge_delinquency permission can push through by retrying with
acknowledge_delinquency: true AND acknowledge_reason (min 10 chars after trim).
The acknowledgement is audit-logged via three channels: (1) activity_log.action = 'order_delinquency_acknowledged', (2) order_timeline entry, and (3)
order.delinquency_acknowledged realtime broadcast. The order records
orders.delinquency_acknowledged_at / _by / _reason for the controller report surface.
Industry: NetSuite Customer Has Past Due Invoices override, Acumatica Past Due
workflow override Modal, Brightpearl override-credit-limit prompt with reason field.
Requires orders:write scope. Override path additionally requires the
accounts.override_credit_hold permission. Delinquency path requires the
accounts.acknowledge_delinquency permission (returns HTTP 403 permission_denied
if the API key holder lacks either).
Authorizations
API key issued per entity via Settings > Developers > API Keys.
Each key carries scopes (e.g. orders:read, products:write).
Bearer token format: Authorization: Bearer ark_live_ent_Test keys use ark_test_ent_. Both are issued per entity
via Settings > Developers > API Keys.
Headers
Client-generated unique key for idempotent POST/PATCH/DELETE operations. Alias for the Idempotency parameter. Max 255 chars. On retry with the same key, the original response is returned without re-executing the operation. Keys expire after 24 hours.
255Path Parameters
Body
Set to true to bypass the delinquency soft-warning (account has
overdue invoices but is not on manual / credit-limit hold). Must be
paired with acknowledge_reason (min 10 chars after trim). Requires
accounts.acknowledge_delinquency permission (HTTP 403 if denied).
Industry: NetSuite Customer Past-Due Override, Acumatica Past Due
workflow override, Brightpearl override-credit-limit prompt.
Operator-typed reason for proceeding despite delinquency. Required
when acknowledge_delinquency: true. Minimum 10 characters after
trim. Stored in orders.delinquency_acknowledged_reason and
emitted in the order_timeline + activity_log row so AR teams
can review via the controller audit report surface. Returns HTTP
422 delinquency_acknowledge_requires_reason if omitted or too short.
10"Customer confirmed ACH payment of overdue invoices en route; GM approved."
Set to true to push an on-hold order through the credit gate
WITHOUT placing it on hold. Requires accounts.override_credit_hold
permission AND a paired override_reason (min 10 chars after trim).
Audit-logged via activity_log + order_timeline + realtime broadcast.
Operator-typed reason for the credit-hold override. Required when
override_credit_hold: true. Stored in
orders.credit_hold_override_reason + audit log metadata.
10"GM John approved by phone; card on file pre-charged for full balance."
Send the order confirmation email on success.
Response
Confirmed order
An Arcus ERP order document. One table holds quotes, sales_orders, invoices, returns, and purchase_orders -- always filter by document_type. entity_id is always from the API key (Layer 1 isolation).
order quote, sales_order, invoice, return, purchase_order draft, confirmed, partially_fulfilled, fulfilled, cancelled, voided, awaiting_ach_clearance, on_hold unpaid, partially_paid, paid, overpaid, refunded, partially_refunded, voided unfulfilled, partially_fulfilled, fulfilled Derived (display-only): SUM(list_price * qty) over non-kit lines. The gross baseline of the gross-to-net bridge (List price minus pricing_savings equals subtotal). Never part of order_total.
Derived (display-only): SUM(pricing_rule_adjustment * qty) over non-kit lines (positive magnitude). Per-unit pricing-rule savings already baked into subtotal via sell_rate (ASC 606 transaction price); shown as an informational List-to-Subtotal bridge, never subtracted from order_total.
SSOT: utils/ar-helpers.mjs::updateARBalance. Do not write directly.
AR receivable (the amount this document is owed AS A RECEIVABLE). Forced to 0 on DRAFT sales documents, on cancelled / archived / expired orders, and on voided or fully-refunded invoices, because none of those carries a receivable: a draft is not a receivable, and a terminal document owes nothing. This is the number that ties to AR aging, the AR outstanding total, and the GL AR control account. For the amount still COLLECTIBLE on any document at any status (including a draft), use amount_due. Purchase orders and quotes are never forced to 0. SSOT: utils/ar-helpers.mjs::updateARBalance. Do not write directly.
Collectible remainder: order_total minus amount_paid, rounded to 2 decimals. Status-blind BY DESIGN, so it answers "how much is still OUTSTANDING on this document as simple arithmetic" even where balance_due is 0 because the document is not (yet) a receivable. Negative when the customer has overpaid (money owed back to them). On a confirmed, non-refunded document with no sales allowance and no cancellation, amount_due and balance_due are equal. NOT A PAYABLE AMOUNT. Because it is status-blind it stays positive on documents that can accept no payment at all -- a cancelled / archived / expired order, a voided invoice, a fully-refunded order -- and it OVERSTATES what is owed on an allowance-settled order (a standalone concession refund reversed goods or tax: balance_due correctly settles to 0 while the remainder does not). Collecting amount_due on either shape creates an overpayment, and the payment endpoints will refuse it with order_not_payable (422). To decide how much to collect, take the amount from the payment surface you are about to call (POST /v1/orders/{id}/payments validates and caps server-side); to reconcile against AR aging or the GL AR control account, use balance_due.
ship, pick_up, local_delivery order, manual, proforma, correction 
