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.
ship, pick_up, local_delivery order, manual, proforma, correction 
