MakeItFun for AI agents
Print-on-demand merch (Printful) designed and ordered by software for your users: t-shirts, hoodies, caps, mugs, posters, bags, patches and more. MakeItFun is one of the seller networks of the APP v0 agent protocol; keys, sandbox, SDKs and the complete documentation live on the shared developer hub.
Developer hub: MakeItFun API Portal: keys and sandboxWhat your agent can do for a linked user
Endpoints
| What | Where |
|---|---|
| Gateway (REST, APP v0) | https://europe-west1-make-it-fun-app.cloudfunctions.net/a2aGateway/a2a/v0/{route} (also https://makeitfun.shop/a2a/v0/{route}) |
| Agent card | /a2a/v0/card |
| Google A2A card / JSON-RPC | /.well-known/agent.json · /a2a |
| MCP server | https://makeitfun.shop/mcp |
| Health | /a2a/v0/health · status page |
| Routes | discover, categories, products, sizes, shipping, upload, preview, preview/status, mockups, mockups/status, designs, styles/feedback, quote, order, orders, status, cancel, receipt, link/start, link/status, link/revoke, sandbox/pay |
First call
Every route is POST with a JSON body, signed with your key: Authorization: Bearer <key>, X-Timestamp (unix seconds) and X-Signature = hex(HMAC-SHA256(key, timestamp + "." + rawBody)). Test keys (mif_a2a_test_…) act only on sandbox accounts, generate real previews and settle orders with sandbox/pay, all free.
import { AppV0Client } from "https://okidooki.app/app-v0/sdk/app-v0.mjs";
const mif = new AppV0Client({ gateway: "https://europe-west1-make-it-fun-app.cloudfunctions.net/a2aGateway", key: process.env.MAKEITFUN_KEY });
const looks = await mif.call("discover", { suggest: { productType: "hoodie", occasion: "birthday", city: "Basel" } });
let p = await mif.call("preview", { userRef, sellerId: looks.recommendedProduct.sellerId, variantId: looks.recommendedProduct.variantId, design: { kind: "style", styleId: looks.styles[0].id, slots: { name: "LENA", year: "2026" } } });
while (p.status !== "done") { await new Promise((r) => setTimeout(r, 10000)); p = await mif.call("preview/status", { userRef, jobId: p.jobId }); }
const q = await mif.call("quote", { userRef, sellerId: looks.recommendedProduct.sellerId, variantId: looks.recommendedProduct.variantId, designId: p.designId, quantity: 1 });
const o = await mif.call("order", { userRef, quoteId: q.quoteId }, { idempotencyKey: crypto.randomUUID() }); // o.confirmUrl: the user pays in MakeItFun
Quickstart · Full route reference · OpenAPI · Postman · SDK JavaScript / Python · All networks
Rules that protect users
- Orders are paid by the user in MakeItFun; partners never see card data. Unpaid orders expire after 30 minutes.
- Prices are retail CHF from the daily ECB rate; the quote is firm for 30 minutes and includes real shipping.
- Designs must respect intellectual property: trademarks, logos and protected characters are rejected.
- Live traffic: 2,000 calls per month free, then CHF 0.01 per call and CHF 0.50 per paid order (pricing).
Operated by OKIDOOKI AG, Basel. Developer contact: support@okidooki.app.