Made for agents.
Grounded in the real world.
Assistants use the same REST API as the Tangibl connector in Muse: list products, save a customer’s image as a draft, show a preview on the actual product, and start a Stripe checkout.
One service. Two ways in.
The website and the connector share the same customer, draft and order records. Five 8×10 products: photo print, matte poster, framed print, canvas gallery wrap and metal print, one image each. listProducts returns each product’s artwork rules and live price. Every preview is drawn from the exact file that gets printed.
Connection
The API is described by an OpenAPI document at /api/v1/openapi. Customers set up the connector from /connect; /connect/usage explains day-to-day use. Connector configuration:
provider: tangibl
api_hosts: gettangibl.com
auth_scheme: oauth2_code
issuer_domain: gettangibl.com
authorization_url: https://gettangibl.com/oauth/authorize
token_url: https://gettangibl.com/oauth/token
registration_url: https://gettangibl.com/oauth/register
revoke_url: https://gettangibl.com/oauth/revoke
token_endpoint_auth_method: none
scopes: drafts/api/mcp is not an MCP server; it answers with a pointer to this REST API.
Accounts & permissions
Customers sign in to Tangibl with Google and approve the connection. They can disconnect it from My Tangibl at any time.
- Customer identity comes from the access token, never from an agent-supplied customer ID.
- Every draft and order is checked against the signed-in owner.
- Supplier credentials, payment secrets and print files stay server-side.
- Disconnecting stops future access; it does not cancel paid orders.
Operations
| Operation | Request | Purpose |
|---|---|---|
listProducts | GET /api/v1/products | Products, artwork rules and generation hints |
uploadDraft | POST /api/v1/uploads | multipart/form-data: file (JPEG/PNG), product_id, name, optional occasion and note; header Idempotency-Key (new UUID); optional ?parent_id= |
uploadCanvasPrintFile | POST /api/v1/canvas/uploads | multipart/form-data: file (3300×3900), product_id=canvas-print, name, optional occasion and note; header Idempotency-Key |
listMyDrafts | GET /api/v1/drafts | Recent drafts with their names, occasions and notes |
reviseDraftProduct | POST /api/v1/drafts | application/json: {"parent_id", "product_id", optional "name", "occasion", "note"}; header Idempotency-Key. Same artwork, another product; not for new images |
getDraft | GET /api/v1/drafts/{id} | One draft |
deleteDraft | DELETE /api/v1/drafts/{id} | Permanently delete a creation (not possible once it has an order). Only when the customer clearly asks, after confirming which one |
updateDraftDetails | PATCH /api/v1/drafts/{id} | application/json: any of {"name", "occasion", "note"}; empty string clears |
getDraftPreview | GET /api/v1/drafts/{id}/preview | Artwork image (JPEG) |
getDraftProof | GET /api/v1/drafts/{id}/proof | Preview status |
getDraftProofImage | GET /api/v1/drafts/{id}/proof/image | Product preview image (JPEG) |
requestSupplierMockup | POST /api/v1/drafts/{id}/supplier-mockup | Retry a failed canvas or poster preview |
startCheckout | POST /api/v1/drafts/{id}/checkout | application/json: optional {"quantity"} (1–5); header Idempotency-Key (new UUID per order). Returns total and a Stripe checkout_url |
listMyOrders | GET /api/v1/orders | Recent orders and their status |
getOrder | GET /api/v1/orders/{id} | One order: payment status, total, tracking; report_problem_url (paid orders) is where the customer reports a misprint with photos |
sendFeedback | POST /api/feedback | application/json: {"message", "topic", "agent_name", "context"} |
Write operations take an Idempotency-Key. Prices come from the server; an agent cannot set a total or mark an order as paid.
Orders
- The customer saves an image as a draft and sees the product preview.
startCheckoutreturns the total and a Stripe checkout link. The customer pays on Stripe’s page, never in the chat.- After payment, the order goes to our print partner and its status appears in My Tangibl and through
listMyOrders.
Prices include free US shipping. Made to order, so no change-of-mind returns; misprints are reprinted.
Integration questions →