Testing safely
There is no sandbox. Read this page before you place an order.
POST /ordersplaces a real order: it charges your account, routes the work to a print partner, and ships a real garment to the address you supply. Every token is a live token — there is no credential that makes an order pretend.
This page once described an isolated sandbox with mock stock and non-shipping orders. That was never built, and the pat_test_ prefix that hinted at it was labelling only — it isolated nothing. Test-mode tokens are no longer issued at all; the portal mints pat_live_ exclusively, so the ambiguity is gone.
What replaced it is narrower but real: a one-hour window in which you can undo an order yourself.
The cancellation window is your safety net
For one hour after placing an order, POST /orders/{ref}/cancel refunds it in full, automatically. After that the work has been released to a print partner and cancelling becomes a support conversation.
That is enough to build against honestly:
- Place a
sampleorder with quantity 1 — the cheapest real order you can make. - Send it to your own address, so a mistake reaches you and nobody else.
- Verify whatever you needed to verify.
- Cancel it within the hour for a full refund.
See Cancel an order for the response shape and failure modes, including what happens when you miss the window.
What is free to call
Everything except order placement is non-destructive, so most of an integration can be built and verified without spending anything:
| Safe to call freely | Notes |
| --- | --- |
| GET /catalog/* | Read-only reference data. |
| GET /products, GET /products/{id} | Your own products. |
| POST /products, PATCH, DELETE | Creates real products, but they cost nothing and DELETE archives them. |
| POST /uploads/validate | Dry-run artwork validation — fetches and checks a URL, stores nothing. |
| POST /orders/estimate | Prices a basket exactly as POST /orders would, and charges nothing. |
| GET /shipping/rates, GET /tax/rates | Quotes only. |
| GET /stock, GET /orders | Read-only. |
Use POST /orders/estimate to check your pricing maths. It runs the same pricing path as order creation, so the total it returns is the amount you will be charged — without creating anything.
Testing webhooks
A webhook test needs a real transition to observe. The cheapest complete one is the sample-order loop above: placing it emits order.created and cancelling it emits order.cancelled, both fully refunded. See Webhooks.
Going live
There is no separate live environment to move to. Keep using the same endpoints — just make sure the orders you send are ones you intend to pay for and receive.