Skip to main content
POST
Create Order
Create a new order for processing. Orders are queued and processed asynchronously.

Request Flow

  1. Submit Order - Send order details including products and shipping address
  2. Validation - We validate product URLs and shipping address
  3. Queued - Order is queued for processing
  4. Processing - Our system places the order with the retailer
  5. Completed - You receive confirmation with tracking details
Order flow diagram

Order processing flow

Product URLs

Provide direct product URLs from supported retailers. Each product must include:
  • url - Direct link to the product page
Make sure product URLs are accessible and lead directly to the product page, not search results or category pages.
Optionally, the product can include:
  • quantity - Number of items to order (integer, default 1)
  • variant - A list of label, value pairs indicating a variant of a product. For example, if you’re ordering a shirt. The shirt may come in different colors and different sizes. To indicate a red medium shirt, you would do:
    Make sure the strings used for both the label and value match up to what is present on the retailer website. For example, if a medium is indicated by the value M, use M for the value.
  • condition_in / condition_not_in - Condition allow/deny lists. Limit which offers are eligible by item condition — useful for buying only new items, or for accepting used items down to a floor. See Condition Filtering.

Shipping Address

All orders require a valid shipping address. Addresses are validated using Google’s Address Validation API. Required fields:
  • first_name and last_name
  • address_line1 (use address_line2 for apartment/suite, optional)
  • city
  • postal_code
  • phone_number
Optional fields:
  • state — omit for countries that don’t use states/provinces
  • country — ISO 3166-1 alpha-2 code (e.g. US, CA, GB, DE); defaults to US
International shipping is supported. Provide the destination country as an ISO 3166-1 alpha-2 code; state is optional where it doesn’t apply.

Payment

By default, orders draw from your prepaid wallet — no payment object needed. To charge your own end-customer’s card instead and keep a margin, include a payment object with mode: "connect". See the Stripe Connect guide for the full flow. In Connect mode the authorization hold is sized from max_price; your end-customer is charged the actual total when Zinc places the order with the retailer.

Optional Order Data

You can include additional data with your order for tracking and reference purposes. This data will be used by our system as input to any fields during checkout that match.
  • po_number - Your internal purchase order number for tracking and reconciliation
  • is_gift - Mark the order as a gift (boolean, default false), suppressing prices on the packing slip. See Gift orders for the failure behavior when a retailer offers no gift option.
  • gift_message - Optional note for the recipient, entered into the retailer’s gift-message field at checkout (string, max 240 characters). Requires is_gift to be true.
  • handling_days_max - Optional ceiling on a seller’s handling days (integer, minimum 1). Offers from sellers whose handling time exceeds this are skipped. Omit or send null for no limit.
If you only need data for internal reference, use the metadata field instead.

Gift orders

Setting is_gift: true suppresses prices on the packing slip. Because a gift that arrives with prices visible to the recipient is worse than no order at all, this is treated as a hard requirement rather than a preference:
If the retailer’s checkout offers no free gift option, the order fails with gift_option_unavailable instead of being placed as a normal order. Handle this error type if you offer gifting as an optional add-on — see Order Processing Errors.
gift_message is best-effort by contrast: it’s delivered where the retailer’s checkout offers a gift-message field, and the order is still placed without it where one isn’t available.
is_gift and gift_message are also accepted on POST /agent/orders, which shares the same order-creation schema.

Response

A successful order creation returns:
  • id - Unique order identifier (UUID)
  • status - Current order status (initially “pending”)
  • items - Array of order items with their details
  • shipping_address - Confirmed shipping address
  • created_at - Timestamp of order creation
Use the order id to retrieve order status and updates.

Authorizations

Authorization
string
header
required

Zinc API key (Bearer zn_...)

Headers

authorization
string | null

Body

application/json

Request model for creating a new order.

products
OrderProduct · object[]
required
shipping_address
Address · object
required

Shipping address model.

Supports international addresses. The state field is optional for countries that don't use states/provinces. The country field uses ISO 3166-1 alpha-2 country codes (e.g., "US", "CA", "GB", "DE").

max_price
integer
required

Maximum price (in cents) allowed for an order before it is finalized.

idempotency_key
string | null

Optional idempotency key to prevent duplicate orders. If not provided, one will be generated.

Maximum string length: 36
retailer_credentials_id
string | null

Optional short ID (e.g., 'zn_acct_XXXXXXXX') of specific retailer credentials to use for this order. If not provided, credentials will be selected automatically.

metadata
Metadata · object | null

Optional metadata to attach to the order. Can contain arbitrary key-value pairs.

po_number
string | null

Optional purchase order number for the order.

handling_days_max
integer | null

Optional ceiling on a seller's shipping and handling days. Omit or send null for no limit.

Required range: x >= 1
is_gift
boolean
default:false

Mark the order as a gift, suppressing prices on the packing slip. If the retailer's checkout offers no free gift option, the order FAILS with gift_option_unavailable rather than being placed as a normal order — a gift that arrives with prices visible to the recipient is treated as worse than no order.

gift_message
string | null

Optional note for the recipient, entered into the retailer's gift-message field at checkout. Requires is_gift to be true. Max 240 characters. Delivered where the retailer's checkout offers a gift message; the order is still placed without it where one isn't available.

Maximum string length: 240
payment
OrderPayment · object | null

Optional payment block. Omit for prepaid-wallet billing (default).

customer_notifications
CustomerNotifications · object | null

Opt in to emailing the end customer order updates (and unlock the public tracking page for this order). Adds a per-order surcharge. Omit for no customer notifications (default).

Response

Successful Response

Response model for order data.

id
string<uuid>
required
status
enum<string>
required
Available options:
pending,
in_progress,
order_placed,
order_failed,
cancelled,
cancelled_by_retailer
max_price
integer
required
attempts
integer
required
items
OrderItemResponse · object[]
required
shipping_address
Shipping Address · object
required
retailer_credentials_id
string | null
required
created_at
string<date-time>
required
updated_at
string<date-time>
required
metadata
Metadata · object
po_number
string | null
handling_days_max
integer | null
is_gift
boolean
default:false
gift_message
string | null
retailer_credentials_uuid
string | null
job_result
OrderJobResult · object | null

Fulfillment result and price breakdown for a completed or failed order; null while processing.

merchant_order_ids
string[]

The retailer's own order number(s) for this order (e.g. an Amazon 113-… ID), as recorded when it was placed. Empty while processing, or if the order never reached the retailer.

tracking_numbers
TrackingNumberResponse · object[]
created_by
string | null
user_id
integer | null
returns
ReturnRequestSummary · object[]
connect
OrderConnectInfo · object | null

Stripe Connect charge details when this order was paid via Connect; null for prepaid-wallet orders.

customer_notifications
CustomerNotificationStatus · object | null

End-customer email-notification status when the order opted into the notifications add-on; null when it didn't.