Skip to main content

Import Purchase Orders

POST 

/api/purchase-orders/import

Execute the purchase order import — create purchase orders from validated data.

Required scope: purchase-orders:write

Grant this scope to your token under Settings → Developer → Personal Access Tokens.

Authentication: Requires Bearer token.

Returns 201 Created on success, 422 on failure.

Purchase order fields:

  • purchase_order_date (required, date)
  • supplier_id (required, exists:suppliers)
  • destination_warehouse_id (required, exists:warehouses)
  • purchase_order_number (optional)
  • currency_id (optional), currency_code (optional)
  • order_status (optional, in:draft,open)
  • estimated_delivery_date, supplier_notes, tracking_number, tags (all optional)
  • payment_term_id, shipping_method_id, incoterm_id, store_id (all optional)

Line fields:

  • quantity (required, numeric, min:1)
  • amount (required, numeric, min:0)
  • product_id, description, discount, tax_rate, nominal_code_id, estimated_delivery_date (all optional)

Requires permission: purchase_orders.import

Response (201): {created: [{id, purchase_order_number}], updated: [{id, purchase_order_number}], errors: [], warnings: [{index, purchase_order_number, message}]} (plus sent_for_approval when an approval policy governs imports). Rows with existing_purchase_order_id update that order instead of creating one. The batch is all-or-nothing: any failing row returns 422 and nothing is saved.

order_status: open needs purchase_orders.approve when no approval policy governs imports. Without it the row is still created, as a draft, and listed in warnings; ask someone who holds the permission to open it.

Request​

Responses​

Created

Response Headers
    Content-Type