# PrintedSimply > Custom printed products from our own plant, ordered and tracked over a REST API or an MCP server. The agent makes the artwork, a person approves it, and we make the thing. Custom stickers, decals, magnets and posters, printed in one US plant. A run of one is an order: every product's minimum_quantity is 1. A test key runs the same order through a $0 sandbox from placed to delivered. Every status change arrives as a signed webhook, on a test order as on a live one. Each artwork file is checked at the size it prints before a live order is charged. An order line can declare how its artwork was made and who approved it, and the order and its webhooks carry that declaration. Stickers, decals, magnets and posters, made in our own US plant, in about 2 days — ordered over a REST API with one key. Sign up at https://portal.printedsimply.com/signup for a test key (ps_test_*) and a live key (ps_live_*). A test key runs the whole order lifecycle in a $0 sandbox with real signed webhooks and never charges; a live key charges the card on file and sends the order to production. Keys created before the PrintedSimply rename start with mf_test_ or mf_live_ and keep working. ## API (base https://portal.printedsimply.com/api/v1) - Auth: send your key in the `x-api-key` header on every request. - Writes accept an `Idempotency-Key` header; a retry with the same key never places a second order. - GET /products — the catalog: what our plant makes, with all-in prices. - POST /orders/quote — a signed, expiring price for an order. - POST /order — place an order. - GET /order/{id} — status, line items and tracking. - GET /order/{id}/events — the order's history. - POST /webhooks — subscribe an endpoint to order events, HMAC-signed. - Reference: https://portal.printedsimply.com/docs/api-reference - OpenAPI: https://portal.printedsimply.com/api/openapi.json ## MCP server Order from Claude, Cursor, ChatGPT or any MCP client with the same key, no code. - Endpoint: https://portal.printedsimply.com/api/mcp?via=llms_txt (streamable HTTP, nothing to install). Send the key in the `x-api-key` header or as `Authorization: Bearer`; an OAuth client is pointed at the sign-in by the server's 401. - No key yet: https://portal.printedsimply.com/api/mcp?via=llms_txt&profile=visitor needs none. It searches the catalog, prices an order, checks artwork and places a $0 sandbox order on a demo account, then hands the person a link to finish on the dashboard. - How to connect: https://portal.printedsimply.com/docs/quickstarts/mcp (a config to paste: https://portal.printedsimply.com/mcp-config.json) - Discovery: https://portal.printedsimply.com/.well-known/mcp (the server card: https://portal.printedsimply.com/.well-known/mcp/server-card.json), and the AI Catalog at https://portal.printedsimply.com/.well-known/ai-catalog.json (SEP-2127), naming the card at https://portal.printedsimply.com/api/mcp/server-card - Tools (28); call whoami first to see whether the key is a test key or a live one: - search_catalog: Search the catalog - get_product: Get a product - get_product_options: List custom-size options - recommend_products: Recommend products - estimate_shipping: Estimate shipping - get_calendar: Get the plant calendar - quote_order: Quote an order - estimate_pricing: Estimate a price - create_mockup: Render a product mockup - validate_artwork: Check a print file - create_order: Place an order - reorder: Place an order again - get_order_status: Get an order's status - track_order: Track a shipment - list_orders: List orders - cancel_order: Cancel an order - get_order_events: Get an order's events - update_order_address: Change an order's address - update_order_shipping: Change an order's shipping - add_order_item: Add an item to an order - update_order_item: Change an item's quantity - cancel_order_item: Cancel one order item - whoami: Check this key - check_setup: Check account setup - list_assets: List uploaded files - get_asset: Get an uploaded file - upload_asset: Upload a file - delete_asset: Delete an uploaded file ## Instructions for LLMs - Test first: build and run the integration with a test key (ps_test_*). A test order runs the whole lifecycle and is never charged, printed or shipped; POST /order/{id}/simulate moves it on. - Quote before ordering: POST /orders/quote returns the price and a quote_token; send the quote_token on POST /order and the order is charged the quoted total. - PrintedSimply absorbs card processing and carrier peak postage costs; neither adds a customer fee to a new order. - Buying for a date: read GET /calendar first. order_by gives the last day to order by each shipping method for the holidays, and peak the carrier's informational cost window; for any other day send deliver_by on POST /orders/quote and read deliver_by_check.latest_order_day. advisories lists the carrier delays in effect; a quote into a destination one touches says deliver_by_check.status at_risk, with the advisory in delivery_risk. - Always send an Idempotency-Key on POST /order (your own order id works), so a retry returns the first order instead of placing a second. - Verify X-PS-Signature-V2 (t=,v1=.">) with the endpoint's secret before acting on a webhook, refuse an old t, and skip an X-PS-Event-Id you have already handled. Each X-PS-* header is also sent as its deprecated X-MF-* alias, with the same value; read X-PS-* first. - Never put a key in a browser, a mobile app or a URL: call the API from a server. ## Documentation (https://portal.printedsimply.com/docs) Every docs page is also Markdown: append `.md` to its URL (`/docs.md` for the overview), or ask for the page with `Accept: text/markdown`. ### Start - [Overview](https://portal.printedsimply.com/docs.md): What the API does, where to start, and your first request. - [curl quickstart](https://portal.printedsimply.com/docs/quickstarts/curl.md): Key to shipped sandbox order in one terminal, no SDK. - [TypeScript quickstart](https://portal.printedsimply.com/docs/quickstarts/typescript.md): The same order from Node with fetch: nothing to install. - [Python quickstart](https://portal.printedsimply.com/docs/quickstarts/python.md): The same order from Python with the standard library: nothing to install. - [All quickstarts](https://portal.printedsimply.com/docs/quickstarts.md): Every first-order guide on one page, by framework and by language. - [PHP quickstart](https://portal.printedsimply.com/docs/quickstarts/php.md): The same order from PHP with the curl extension: nothing to install with Composer. - [MCP quickstart](https://portal.printedsimply.com/docs/quickstarts/mcp.md): Point Claude, Cursor, or ChatGPT at the hosted MCP server and order in plain English. - [Next.js quickstart](https://portal.printedsimply.com/docs/quickstarts/nextjs.md): App Router and server actions: the order from a server component, the key never in the browser. - [Express quickstart](https://portal.printedsimply.com/docs/quickstarts/express.md): A minimal Node server that forwards orders and verifies signed webhooks. - [Flask quickstart](https://portal.printedsimply.com/docs/quickstarts/flask.md): The order and the webhook check from Python with requests; the same in Django or FastAPI. - [Rails quickstart](https://portal.printedsimply.com/docs/quickstarts/rails.md): A service class, a controller and routes, with HMAC webhook verification. - [Go quickstart](https://portal.printedsimply.com/docs/quickstarts/go.md): A lightweight HTTP client and handlers for high-throughput order processing. ### Guides - [Webhooks](https://portal.printedsimply.com/docs/webhooks.md): Subscribe, verify the HMAC signature, handle retries, and replay a failed delivery. - [Error scenarios](https://portal.printedsimply.com/docs/error-scenarios.md): What happens when a card fails, artwork is rejected, or a webhook endpoint is down. - [Troubleshooting](https://portal.printedsimply.com/docs/troubleshooting.md): The common failures, how to tell them apart, and the fix for each. ### Reference - [API reference](https://portal.printedsimply.com/docs/api-reference.md): Every v1 endpoint with its method, path, and summary, generated from the OpenAPI spec. - [Error codes](https://portal.printedsimply.com/docs/errors.md): Every error code the API can return, with its HTTP status and an actionable fix. - [Rate limits](https://portal.printedsimply.com/docs/rate-limits.md): Per-plan quotas, the headers on every response, and how to back off honestly. - [Changelog](https://portal.printedsimply.com/docs/api-changelog.md): Dated API versions, what changed in each, the breaking-change notice period, and every platform release. ### Concepts - [Reliability contract](https://portal.printedsimply.com/docs/reliability.md): Idempotency, pagination, signing, retries, and limits — written as promises. ## More - Pricing: https://portal.printedsimply.com/pricing - Status: https://portal.printedsimply.com/status - Status as JSON, no key: GET https://portal.printedsimply.com/api/status (the status page's numbers: overall and per-service tiers, uptime and latency; the page explains the fields and the request limit) - API changelog feeds, the newest 50 dated changes (https://portal.printedsimply.com/docs/api-changelog lists them all): https://portal.printedsimply.com/docs/api-changelog.rss (RSS) or https://portal.printedsimply.com/docs/api-changelog.json (JSON Feed) - Platform release feeds, the newest 50 platform releases (https://portal.printedsimply.com/docs/api-changelog#platform-releases lists them all): https://portal.printedsimply.com/docs/platform-releases.rss (RSS) or https://portal.printedsimply.com/docs/platform-releases.json (JSON Feed) - Product feed, our plant's products in OpenAI's product feed format for ChatGPT (JSONL): https://portal.printedsimply.com/openai-product-feed.jsonl - Full descriptor, with the docs in it: https://portal.printedsimply.com/llms-full.txt