verification
use it
# add to stunt.yaml
services:
printify:
adapter: embedded:printify-style
# then
$ stunt upThe embedded: source extracts this adapter from the binary — no git clone, fully offline.
how to mock the Printify API locally
Install stunt, paste the service block above into stunt.yaml, run stunt up — then point your client at localhost instead of Printify API. It works offline, keeps state across requests and restarts, and every response is synthetic: the route shapes, status codes, pagination, and webhook delivery follow the real Printify API v1 surface — the data is fake, the behavior is real.
backing stores
productsorders
api surface (16)
generated from the adapter manifest — exactly what boots, nothing more · covers 27% of the real API's 40 routes (derived from spec Printify OpenAPI @ 1.0.0)
16 routes
GET/v1/catalog/blueprints.json
GET/v1/catalog/blueprints/{blueprint_id}/variants.json
GET/v1/shops/{shop_id}/products.json
POST/v1/shops/{shop_id}/products.json
GET/v1/shops/{shop_id}/products/{product_id}
PUT/v1/shops/{shop_id}/products/{product_id}
DELETE/v1/shops/{shop_id}/products/{product_id}
POST/v1/shops/{shop_id}/orders.json
GET/v1/shops/{shop_id}/orders/{order_id}
GET/v1/orders.json
POST/v1/orders.json
POST/v1/orders/{order_id}/send.json
GET/v1/shops/{shop_id}/webhooks.json
POST/v1/shops/{shop_id}/webhooks.json
GET/v1/shops/{shop_id}/webhooks/{webhook_id}
DELETE/v1/shops/{shop_id}/webhooks/{webhook_id}
VM-verified behaviors (10)
- ✓a missing or non-Bearer Authorization is a flat 401 at every surface
- ✓the static catalog serves both blueprints and their variant tables
- ✓product create mints sequential hex ids for each blueprint/provider pair
- ✓product lists are shop-scoped and walk the page cursor without repeats
- ✓update merges under the clock and delete leaves a flat 404
- ✓both order-create route forms build the same priced pending document
- ✓order polling strips .json and send flips it to fulfilled
- ✓the global order list pages by limit/page and rejects garbage cursors
- ✓webhook secrets stay masked through every read, and delete leaves a flat 404
- ✓deliveries are HMAC-signed by the subscribing hook's own secret
Not implemented (5)
- No shops endpoints (GET /v1/shops.json); shop_id is a path placeholder
- No image uploads (POST /v1/uploads/images.json)
- No order update route (PUT /v1/shops/{shop_id}/orders/{order_id}.json)
- No product publish/unpublish (publish.json, unpublish.json)
- No shipping calculation or shipping-methods endpoints
Differs from the real API (4)
- Webhook without a secret signs with built-in mock secret stunt_mock_potify_webhook_secret
- List envelopes are a stunt invention with hardcoded current_page/per_page/last_page; real Printify returns bare arrays
- total_price is a synthetic whole number (qty x 20); real prices are per-variant cent strings
- The order list is global across shops; real Printify lists orders shop-scoped
want more of the Printify API surface? adapters are YAML + Starlark — the authoring guide covers adding routes, fixtures, and state machines. Open an issue for anything big first, or just file a PR — merged routes ship in the next release.