Skills zinc-orders
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.
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/a5huynh/universal-checkout" ~/.claude/skills/openclaw-skills-zinc-orders && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/a5huynh/universal-checkout" ~/.openclaw/skills/openclaw-skills-zinc-orders && rm -rf "$T"
skills/a5huynh/universal-checkout/SKILL.mdZinc Orders
Place and manage orders on online retailers through the Zinc API (
https://api.zinc.com).
Prerequisites
env var must be set. Get one from https://app.zinc.com.ZINC_API_KEY
Authentication
All requests use Bearer token auth:
Authorization: Bearer $ZINC_API_KEY
Endpoints
Create Order — POST /orders
POST /ordersPlace a new order. Orders process asynchronously.
Required fields:
— array ofproducts
objects{ url, quantity?, variant? }
: direct product page URL on a supported retailerurl
: integer (default 1)quantity
: array ofvariant
for size/color/etc.{ label, value }
— object withshipping_address
,first_name
,last_name
,address_line1
,address_line2
,city
(2-letter),state
,postal_code
,phone_number
(ISO alpha-2, e.g. "US")country
— integer, maximum price in centsmax_price
Optional fields:
— string (max 36 chars) to prevent duplicatesidempotency_key
— short ID likeretailer_credentials_idzn_acct_XXXXXXXX
— arbitrary key-value objectmetadata
— purchase order number stringpo_number
Response: order object with
id (UUID), status, items, shipping_address, created_at, tracking_numbers, etc.
Order statuses:
pending → in_progress → order_placed | order_failed | cancelled
List Orders — GET /orders
GET /ordersReturns
{ orders: [...] } array of order objects.
Get Order — GET /orders/{id}
GET /orders/{id}Retrieve a single order by UUID.
Example: Place an Order
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" } }'
Error Handling
See references/errors.md for the full error code reference.
Key points:
- HTTP errors return
{ code, message, details } - Order processing failures appear in webhook/order response as
error_type - Common issues:
,max_price_exceeded
,product_out_of_stockinvalid_shipping_address
Order Status Tracking
Orders process asynchronously and typically take 5–10 minutes. After placing an order:
- Schedule a cron job to check the order status ~7 minutes after creation.
- Use
to poll.GET /orders/{id} - Report the result back to the user in the same channel.
- If still pending/in_progress, schedule another check in 5 minutes.
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>" } }
Safety
- Always confirm with the user before placing an order (
). This spends real money.POST /orders - Reading orders (GET) is always safe.
- Validate that
is reasonable before submitting.max_price