# StablePrint StablePrint is a server-priced Prodigi print API. Use it to browse products, quote all-in USD checkout totals, create crop previews, then pay with x402/MPP to submit orders. Happy path: 1. Search GET /api/catalog/products. Defaults are product ranges with SKU candidates. Use include_browse_only=true only for broader visual browsing. 2. Show product_photos before asking the user to choose. For one product show 3-5 photos with captions and product_page_url. 3. Get detail with GET /api/catalog/products/by-id/{productId}. Do not rely on slug uniqueness. If browse_only=true or has_sku_candidates=false, treat it as visual-only until you verify an SKU. 4. Resolve SKU with GET /api/products/{sku}. required_for_quote attributes need exact allowed_values; recommended_attributes are safe defaults. 5. Browse price with POST /api/quotes. Use total as the checkout price. If sellable=false or blocking_quote_issues is non-empty, choose another product/destination/shipping setup. 6. Upload local artwork with StableUpload first. Draft asset URLs must be public direct PNG/JPEG/PDF URLs and must not cross-host redirect. 7. Create POST /api/drafts with SIWX. Show previews before buying; verify sku, attributes, sizing, copies, ship country, total, pricing_policy, source_sha256_hash, preview_url_is_volatile, and preview_hashes. 8. Create POST /api/order-intents with SIWX using draft_id, expected_total/currency, a fresh client_request_id, and every confirmed_preview_hash. 9. Buy with POST /api/orders using only order_intent_id and order_intent_token. Poll/list via GET /api/orders. Key rules: - Product photos show the physical item; draft previews show the user's crop/placement. Show both before purchase. - preview_url is a volatile display aid; preview_hash and source_sha256_hash are the durable confirmation fields. - POST /api/quotes and POST /api/drafts return structured errors such as missing_required_attribute, invalid_attribute_value, missing_required_print_area, invalid_asset_url, and unsupported_quote_issues. Retry only when listed fields can be changed. - unsupported_quote_issues is a sellability block before payment/order submission, not a billing-card problem. Do not claim support unless POST /api/quotes returns sellable=true for that exact combination. - destinationCountryCode.UsSalesTaxWarning is non-blocking when sellable=true. Charge the returned total; do not add tax estimates. - For US destinations, total may include reserve_cost under pricing_policy. reserve_cost is not separately stated sales tax. Do not alter, waive, estimate, or explain it as tax. - Catalog example_skus are candidates from imported Prodigi pages. Always verify with GET /api/products/{sku}; if 404 or not quoteable, treat as browse-only and try another SKU. - Use fillPrintArea for normal cropping, fitPrintArea when no cropping is acceptable, stretchToPrintArea only when the user explicitly wants distortion. - StablePrint charges USD only. Drafts expire; recreate if destination, asset, SKU, copies, sizing, attributes, or quote changes.