Printify: 16 reads, 11 writes and 2 destructive calls, one client
Print-on-demand: shops, catalog, products, publishing, uploads and orders. Every call below is available over HTTP, through the SDK and as a tool for a coding agent, with the same arguments and the same meter.
What Printify can do here
The integration exposes 16 reads, 11 writes and 2 destructive calls, each with a declared input and output schema rather than a page of documentation you would have to translate. Print-on-demand: shops, catalog, products, publishing, uploads and orders.
How it authenticates
Printify authenticates with a apiToken, supplied per request or stored once against your account and sealed at rest. On our side the same value is read from apiToken and baseUrl when we broker the call for you.
Capabilities it fulfils
Printify answers commerce.order.get, commerce.order.list, commerce.product.get and commerce.product.list in the vendor-neutral form, which means code asking for any of those can be pointed at Printify without naming it. If it goes down, or you would rather use somebody else, that is a preference change and not a rewrite.
- listShops β read: List your shops. NEEDS THE KEY: keyless this answers 401, unlike the catalog reads.
- listProducts β read: List products in a shop. UNLIKE the catalog, this really does page.
- getProduct β read: One product, with its full variant and print-area detail. This is what a "make another like this one" workflow reads.
- createProduct β write: Create a product. It appears in your Printify shop immediately and on NO sales channel β publishProduct is what does that.
- updateProduct β write: Change an existing product β the repricing and re-artwork call. Send only the keys you are changing.
- deleteProduct β destructive: Delete a product from the shop. Irreversible.
- publishProduct β write: Publish a product to its sales channel. THE SECOND HALF OF CREATING ONE β createProduct only drafts.
- publishingSucceeded β write: Tell Printify the publish completed, and unlock the product. Required on a custom_integration shop.
- publishingFailed β write: Tell Printify the publish failed, and unlock the product.
- listUploads β read: The artwork already in your Printify media library β the picker a product workflow chooses from. NEEDS THE KEY.
- getUpload β read: One uploaded image β its real pixel dimensions, which is what decides whether it can print at the blueprintβs print area.
- uploadImage β write: Upload an image BY URL. The URL must be publicly reachable β Printify fetches it itself.
- uploadImageBase64 β write: Upload an image by CONTENTS (base64), for artwork with no publicly reachable URL.
- getBlueprints β read: Every product blueprint Printify can print β the catalog you pick a garment from. PUBLIC: needs no credential.
- getBlueprint β read: One blueprint. Resolves a saved id back to a label without refetching all 2,115. PUBLIC.
- getPrintProviders β read: Which print providers can produce a blueprint. PUBLIC: needs no credential.
- listPrintProviders β read: Every print provider, with its location β the reverse index, for picking by region first. PUBLIC.
- getPrintProvider β read: One provider and EVERY blueprint it can print β the reverse of getPrintProviders. PUBLIC.
- getVariants β read: The sizes, colours and print areas one provider offers for one blueprint. PUBLIC: needs no credential.
- getShipping β read: Handling time and shipping profiles for one blueprint/provider pair. PUBLIC.
- calculateShipping β read: What shipping would cost for a real basket. Calculates only β creates nothing.
- listOrders β read: List orders.
- getOrder β read: One order, with its shipments and tracking.
- createOrder β write: Submit an order. IT IS ON HOLD until sendToProduction β creating it does not spend money.
Questions
Do I have to bring my own API keys?
You can, and that lane is free for ever β pass your key on the request or store it against your account, and we are one proxy hop. The paid lane is the other direction: we call 226 providers with our credentials so you never register anywhere. Both go through the same client and the same operation names.
What happens to a key I store here?
It is sealed with AES-256-GCM before it reaches the database and is only ever opened to make the call you asked for. It is scoped to your account, it is never logged, and deleting the connection deletes it. For an OAuth provider we hold a refresh token instead, and revoking the link at the provider stops the calls here immediately.
What happens when a provider changes its API?
The operation contract is declared, so a response that no longer matches is a refusal rather than a silently wrong answer. The contract does not coerce types β a field declared a number that arrives as a string is rejected at the edge, on the way in and on the way out.