Place, list, and retrieve orders via the Zinc API (zinc.com). Use when the user wants to buy a product from an online retailer, check order status, list recent orders, or anything involving the Zinc e-commerce ordering API. Requires ZINC_API_KEY environment variable.
Place and manage orders on online retailers through the Zinc API (https://api.zinc.com).
ZINC_API_KEY env var must be set. Get one from https://app.zinc.com.All requests use Bearer token auth:
Authorization: Bearer $ZINC_API_KEY
POST /ordersPlace a new order. Orders process asynchronously.
Required fields:
products — array of objects
{ url, quantity?, variant? }url: direct product page URL on a supported retailerquantity: integer (default 1)variant: array of { label, value } for size/color/etc.shipping_address — object with first_name, last_name, address_line1, address_line2, city, state (2-letter), postal_code, phone_number, country (ISO alpha-2, e.g. "US")max_price — integer, maximum price in centsOptional fields:
idempotency_key — string (max 36 chars) to prevent duplicatesretailer_credentials_id — short ID like zn_acct_XXXXXXXXmetadata — arbitrary key-value objectpo_number — purchase order number stringResponse: order object with id (UUID), status, items, shipping_address, created_at, tracking_numbers, etc.
Order statuses: pending → in_progress → order_placed | order_failed | cancelled
GET /ordersReturns { orders: [...] } array of order objects.
GET /orders/{id}Retrieve a single order by UUID.
curl -X POST https://api.zinc.com/orders \
-H "Authorization: Bearer $ZINC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"products": [{ "url": "https://example.com/product", "quantity": 1 }],
"max_price": 5000,
"shipping_address": {
"first_name": "Jane",
"last_name": "Doe",
"address_line1": "123 Main St",
"city": "San Francisco",
"state": "CA",
"postal_code": "94105",
"phone_number": "5551234567",
"country": "US"
}
}'
See references/errors.md for the full error code reference.
Key points:
{ code, message, details }error_typemax_price_exceeded, product_out_of_stock, invalid_shipping_addressOrders process asynchronously and typically take 5–10 minutes. After placing an order:
GET /orders/{id} to poll.Terminal statuses: order_placed, order_failed, cancelled — stop polling.
Non-terminal: pending, in_progress — schedule another check in 3–5 minutes.
Example cron job (isolated, announce back to the channel):
{
"name": "zinc-order-check-<short_id>",
"schedule": { "kind": "at", "at": "<ISO-8601 ~7min from now>" },
"payload": {
"kind": "agentTurn",
"message": "Check Zinc order <order_id> via GET https://api.zinc.com/orders/<order_id>"
},
"sessionTarget": "isolated",
"delivery": {
"mode": "announce",
"channel": "<channel>",
"to": "<channel_id>"
}
}
POST /orders). This spends real money.max_price is reasonable before submitting.