Create a purchase order
purchasing:writeCreates a new purchase order in draft status. You must identify the vendor
using either vendor_id (the natural B2B convention, preferred) or account_id
(legacy alias — both refer to the same vendor account UUID). If both are supplied,
account_id takes precedence. At least one is required.
JSON body examples:
Shape A (preferred — vendor_id):
{
"vendor_id": "df56267d-7890-41a2-a62c-ee8955aab150",
"notes": "Q3 stock order"
}
Shape B (alias — account_id):
{
"account_id": "df56267d-7890-41a2-a62c-ee8955aab150",
"notes": "Q3 stock order"
}
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.
Body
Either vendor_id or account_id is required (both refer to the same
vendor account UUID). vendor_id is the preferred B2B convention;
account_id is the legacy internal alias. If both are present,
account_id wins.
UUID of the vendor account (preferred field name -- matches B2B convention used throughout the purchasing API). Alias for account_id.
UUID of the vendor account (legacy internal alias for vendor_id). Accepted for backward compatibility. If both vendor_id and account_id are provided, account_id takes precedence.
Response
Created purchase order
A purchase order issued to a vendor.
purchase_order draft, approved, sent, partially_received, received, closed, cancelled The order total as it stood when an approver approved this purchase order -- the basis they actually saw. NULL on every approval predating 2026-08-17 (no backfill) and NULL means "basis unknown", which is treated as fail-safe.
DERIVED, not stored. True when the order is approved AND its total has since risen above approved_total. The purchase order still receives normally; this is a non-blocking prompt to re-approve.
Per-field verdicts for the header fields, from the same predicate the write handlers enforce. Keys: notes, internal_notes, due_date, expected_date, location_id, po_tracking_reference. Each is { allowed: boolean, reason: string|null } where reason is a token from the PoLineEditReason vocabulary.

