Every operation in the PrintedSimply API — orders, products, pricing, shipping, artwork, and webhooks. Open one for its parameters, request body, response, scopes and errors, and the same request in curl, TypeScript, Python and PHP.
The base URL itself answers without a credential, so a client can find the machine-readable spec before it has a key.
/ordersList ordersPOST/orderCreate an orderGET/order/{id}Get order detailsDELETE/order/{id}/cancelCancel an orderPUT/order/{id}/addressUpdate shipping addressPUT/order/{id}/shippingUpdate shipping methodGET/order/{id}/eventsGet order eventsGET/order/{id}/timelineGet an order's timelinePOST/order/{id}/missing-letterReport a missing letter and reship it oncePOST/order/{id}/reorderPlace an order againPOST/order/{id}/simulateForce a sandbox order to a lifecycle stateGET/orders/exportExport orders as CSVPOST/orders/bulkCreate bulk ordersPOST/orders/multi-shipCreate multi-address orderArtwork is read before the charge: on a sticker, decal, magnet or poster line, the file behind artwork_url or print_file is graded against the line's print size. A live order whose file is gone, is not an image, or is too small to print at that size is refused with 422 artwork_not_printable, naming each line and the pixels it needs, and nothing is charged. A live line with no file at all is refused first, with 422 artwork_required naming the line. A file we could not read just now never refuses an order. The answer carries those lines' verdicts in artwork_check; a test key is never refused for artwork, and would_refuse says whether a live order would be.
A different name on every sticker: an item of a flat-goods line made at our own plant may carry variable_data, the named slots of its design and a value for each slot on every unit, from a units array (one entry per unit), a number sequence, or both, plus an optional QR payload template. The quote and the order preflight it before anything is charged and refuse an overflow, a count mismatch or an unknown slot with 422 variable_data_invalid; both answer with the first, last and longest unit as proofs. It never changes the price. Test keys run it end to end; live orders carrying it are refused with variable_data_unavailable until production is switched on.
Item paths are relative to an order id, e.g. /{id}/item.
Webhook endpoints are managed with your API key — register them, rotate their signing secrets, inspect deliveries, and replay a failed one, all without opening a browser. The same subscriptions appear in your dashboard.
PrintedSimply signs every delivery twice. Verify X-PS-Signature-V2 (t=<unix>,v1=<hex>), which signs the timestamp with the body so a replayed request can be refused; X-PS-Signature (sha256=<hex>) is the original, body-only one.
/webhooksList webhook subscriptionsPOST/webhooksCreate a webhook subscriptionGET/webhooks/{id}Retrieve a webhook subscriptionPATCH/webhooks/{id}Update a webhook subscriptionDELETE/webhooks/{id}Delete a webhook subscriptionPOST/webhooks/{id}/rotate-secretRotate a webhook signing secretDELETE/webhooks/{id}/rotate-secretEnd an open rotation windowPOST/events/{eventId}/replayReplay a stored event to your webhooksGET/webhooks/deliveriesList webhook delivery attemptsGET/webhooks/deliveries/{id}Retrieve a webhook deliveryPOST/webhooks/deliveries/{id}/redeliverReplay a webhook deliveryGET/webhooks/inboxRead the hosted test inboxPOST/webhooks/inboxCreate the hosted test inboxDELETE/webhooks/inbox/entriesEmpty the hosted test inboxA webhook needs a public URL to POST to. If you do not have one — a script in a notebook, a job behind NAT — pull the same events instead. This is also how a subscriber catches up after being down longer than the retry ladder: event_id is the same value as the X-PS-Event-Id header, so you can dedupe across both. Events are kept 30 days.
See the Webhooks guide for event types, signature verification, and retry policies.
Reliability contract · Rate limits · Webhooks · Error reference · Email us at developers@printedsimply.com