Skip to main content
POST
Create an order (any document_type)

Authorizations

Authorization
string
header
required

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

Idempotency-Key
string

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.

Maximum string length: 255

Body

application/json
document_type
enum<string>
required

Discriminator. sales_order and invoice are for customer accounts; purchase_order for vendors.

Available options:
quote,
sales_order,
invoice,
return,
purchase_order
account_id
string<uuid>
required

Customer or vendor account. Account defaults (pricing level, addresses, payment terms) are auto-inherited.

location_id
string<uuid>

Warehouse location for inventory allocation. Defaults to entity default location.

shipping_address_id
string<uuid>

Shipping address. Auto-resolved from account default when omitted.

billing_address_id
string<uuid>

Billing address. Auto-resolved from account default when omitted.

payment_term_id
string<uuid>

Payment terms (e.g. Net 30). Auto-resolved from account, channel, and entity default cascade.

sales_channel_id
string<uuid>
pricing_level_id
string<uuid>

Override pricing level. Auto-resolved from account default when omitted.

po_number
string

Customer purchase order number.

order_date
string<date-time>

Order date. Defaults to now.

notes
string

Customer-visible notes.

internal_notes
string

Internal-only notes.

customer_notes
string
requested_ship_date
string<date>
ship_complete
boolean

When true, do not ship partial. Inherited from account default.

default_shipping_method
string | null

Order-header shipping-method override. Accepts a Shippo service token (e.g. 'ups_ground') or a carrier service name (e.g. 'UPS Ground'); stored canonicalized as the token. Unrecognized values return 400 validation_failed. Omitted: inherited from the account's Default Ship Method when set. Drives rate-shop suggested-service selection (header override beats shipping rules).

ships_freight
boolean
tax_exempt
boolean

Mark order tax-exempt. Requires avatax_entity_code on the order or linked account.

avatax_entity_code
string

AvaTax exemption entity code (e.g. 'RESALE', 'EXEMPT').

sales_agent_id
string<uuid>
metadata
object

Arbitrary key-value metadata stored on the order.

line_items
object[]

Inline line items. Inserted atomically with the order. Any failure rolls back all items and the order header.

discount
object

Header-level discount applied to the order subtotal.

auto_compute_tax
boolean

Run AvaTax (or local rate) after all items are inserted. Requires shipping_address_id to resolve to a taxable jurisdiction.

auto_allocate_inventory
boolean

Reserve inventory per line item. Returns 422 with shortfall details if any line has insufficient stock. Rollback is atomic.

payments
object[]

Inline payment(s). Fired after the order is committed. Payment failure does NOT roll back the order.

Response

Created order (hydrated with line_items, payments, tax_lines)

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).

id
string<uuid>
object
enum<string>
Available options:
order
entity_id
string<uuid>
read-only
order_number
string
read-only
document_type
enum<string>
Available options:
quote,
sales_order,
invoice,
return,
purchase_order
order_status
enum<string>
Available options:
draft,
confirmed,
partially_fulfilled,
fulfilled,
cancelled,
voided,
awaiting_ach_clearance,
on_hold
payment_status
enum<string>
Available options:
unpaid,
partially_paid,
paid,
overpaid,
refunded,
partially_refunded,
voided
fulfillment_status
enum<string>
Available options:
unfulfilled,
partially_fulfilled,
fulfilled
account_id
string<uuid> | null
location_id
string<uuid> | null
po_number
string | null
order_date
string<date-time> | null
due_date
string<date-time> | null
subtotal
number
discount_total
number
shipping_total
number
tax_total
number
fee_total
number
order_total
number
list_price_total
number
read-only

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.

pricing_savings
number
read-only

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.

amount_paid
number
read-only

SSOT: utils/ar-helpers.mjs::updateARBalance. Do not write directly.

balance_due
number
read-only

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.

amount_due
number
read-only

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.

tax_exempt
boolean
delivery_option
enum<string>
Available options:
ship,
pick_up,
local_delivery
notes
string | null
internal_notes
string | null
invoice_number
string | null
read-only
invoice_type
enum<string> | null
Available options:
order,
manual,
proforma,
correction
is_on_hold
boolean
read-only
hold_type
string | null
read-only
ship_complete
boolean
source_platform
string | null
external_order_id
string | null
external_order_number
string | null
metadata
object | null
created_at
string<date-time>
read-only
updated_at
string<date-time>
read-only