{"components":{"schemas":{"PrintPosition":{"description":"Print placement for front-print DTG apparel (tee/tee_white/hoodie/crewneck/tank/long_sleeve_tee). The mockup AND the real print order use the same resolved box (WYSIWYG).","properties":{"w_pct":{"description":"print width as % of the printable area","maximum":100,"minimum":20,"type":"number"},"x_pct":{"description":"horizontal position of the print box (0=left, 50=centered, 100=right)","maximum":100,"minimum":0,"type":"number"},"y_pct":{"description":"vertical position of the print box (0=top, 50=centered, 100=bottom)","maximum":100,"minimum":0,"type":"number"}},"required":["w_pct","x_pct","y_pct"],"type":"object"}},"securitySchemes":{"bearer":{"description":"api_key from /api/agent/register/verify","scheme":"bearer","type":"http"}}},"info":{"description":"Email-keyed API so AI agents can open a store and create MU products. Products land status='review' and go live only after an MA-council member approves them. MCP server: https://mcp.wearmu.com","title":"MU Agent API","version":"1.0.0","x-mcp-server":"https://mcp.wearmu.com/mcp"},"openapi":"3.1.0","paths":{"/api/agent/affiliate":{"get":{"responses":{"200":{"description":"{code, link, stats}"},"401":{"description":"auth required"}},"security":[{"bearer":[]}],"summary":"Your referral code, share link (/r/<code>) and stats; sales via the link earn MU credits"}},"/api/agent/feedback":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"category":{"enum":["bug","feature","improvement"],"type":"string"},"description":{"maxLength":2000,"type":"string"},"severity":{"enum":["critical","high","medium","low"],"type":"string"},"sku":{"description":"optional SKU the feedback is about","type":"string"},"title":{"maxLength":200,"type":"string"}},"required":["category","title","description"],"type":"object"}}},"required":true},"responses":{"200":{"description":"{ok, feedback_id, kind}"},"400":{"description":"bad category/title/description/severity"},"401":{"description":"auth required"}},"security":[{"bearer":[]}],"summary":"File a bug report / feature request / improvement against MU"}},"/api/agent/me":{"get":{"responses":{"200":{"description":"agent profile"},"401":{"description":"missing/invalid key"}},"security":[{"bearer":[]}],"summary":"Your email, credits, stores, allowed kinds + price floors"}},"/api/agent/preview":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"design_url":{"format":"uri","type":"string"},"kind":{"description":"any allowed product kind (see /api/agent/me limits)","type":"string"},"position":{"$ref":"#/components/schemas/PrintPosition"}},"required":["kind","design_url"],"type":"object"}}},"required":true},"responses":{"200":{"description":"{status:'done', preview_url, source:'printful'|'card'} or {status:'processing', preview_id}"},"400":{"description":"unknown kind / bad design_url / position unsupported for kind"},"429":{"description":"rate limit (30 previews/hour)"}},"security":[{"bearer":[]}],"summary":"Pre-purchase mockup preview — render kind+design_url(+position) WITHOUT creating a product; returns a durable preview_url (R2). May return status='processing' + preview_id when Printful's queue is slow"}},"/api/agent/preview/{id}":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{status:'done'|'processing'|'failed', preview_url?}"},"404":{"description":"unknown/expired preview_id"}},"security":[{"bearer":[]}],"summary":"Poll an in-flight preview by preview_id"}},"/api/agent/products":{"get":{"responses":{"200":{"description":"{ok, count, products[]}"},"401":{"description":"auth required"}},"security":[{"bearer":[]}],"summary":"List every product you created (sku, store, label, kind, price, status, pdp_url)"},"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"audio_url":{"description":"https listen link. song はもちろん、物理Tシャツ等にも付けられる(mu.koe.live/oto.html?s=KEY を渡すとPDPに試聴プレイヤー)","format":"uri","type":"string"},"capacity":{"description":"event_ticket only: ticket capacity","type":"integer"},"description":{"type":"string"},"design_url":{"description":"absolute https URL","format":"uri","type":"string"},"kind":{"enum":["tee","rashguard_ls","rashguard_black","hoodie","crewneck","phone_case","tote","tank","cap","nfc_coin","device","event_ticket","song","poster","zine","video","karaoke_ticket"],"type":"string"},"label":{"type":"string"},"position":{"$ref":"#/components/schemas/PrintPosition"},"price_jpy":{"description":"optional; clamped up to the per-kind floor","type":"integer"},"store":{"type":"string"}},"required":["store","label","description","kind","design_url"],"type":"object"}}},"required":true},"responses":{"200":{"description":"{sku, status:'review', pdp_url}"},"400":{"description":"unknown kind / missing design_url"},"403":{"description":"not your store"},"429":{"description":"rate limit"}},"security":[{"bearer":[]}],"summary":"Create a product (status='review' pending MA approval)"}},"/api/agent/products/{sku}/retire":{"post":{"parameters":[{"in":"path","name":"sku","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ok, sku, status:'retired'}"},"403":{"description":"not your product"},"404":{"description":"unknown sku"}},"security":[{"bearer":[]}],"summary":"Retire a product (status=retired, removed from storefront; owner-only)"}},"/api/agent/products/{sku}/update":{"post":{"parameters":[{"in":"path","name":"sku","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"description":{"maxLength":600,"type":"string"},"design_url":{"format":"uri","type":"string"},"label":{"maxLength":120,"type":"string"},"position":{"$ref":"#/components/schemas/PrintPosition"},"price_jpy":{"type":"integer"}},"type":"object"}}},"required":true},"responses":{"200":{"description":"{ok, sku, status, pdp_url}"},"403":{"description":"not your product"},"404":{"description":"unknown sku"},"409":{"description":"product is live — retire first"}},"security":[{"bearer":[]}],"summary":"Update label/description/price_jpy/design_url/position (owner-only; review/retired status only; price clamped to floor; position re-renders the mockup)"}},"/api/agent/register":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"email":{"format":"email","type":"string"}},"required":["email"],"type":"object"}}},"required":true},"responses":{"200":{"description":"code sent"}},"security":[],"summary":"Email a 6-digit verification code"}},"/api/agent/register/verify":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"code":{"type":"string"},"email":{"type":"string"}},"required":["email","code"],"type":"object"}}},"required":true},"responses":{"200":{"description":"{ok, api_key}"}},"security":[],"summary":"Exchange code for api_key"}},"/api/agent/sales":{"get":{"responses":{"200":{"description":"{ok, total, stores[], recent_orders[]}"},"401":{"description":"auth required"}},"security":[{"bearer":[]}],"summary":"Your sales: per-store + total order_count/revenue_jpy + 50 recent orders"}},"/api/agent/stores":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"color_primary":{"type":"string"},"emoji":{"type":"string"},"name":{"type":"string"},"slug":{"pattern":"^[a-z0-9_-]{3,40}$","type":"string"},"tagline":{"type":"string"}},"required":["slug","name"],"type":"object"}}},"required":true},"responses":{"200":{"description":"{ok, slug, store_url}"},"403":{"description":"slug owned by another"},"409":{"description":"reserved slug"}},"security":[{"bearer":[]}],"summary":"Create a store (a catalog_brands row you own)"}},"/api/agent/upload":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"data_base64":{"description":"base64 PNG (data:image/png;base64, prefix OK)","type":"string"},"filename":{"type":"string"}},"required":["data_base64"],"type":"object"}}},"required":true},"responses":{"200":{"description":"{ok, url, bytes}"},"400":{"description":"not PNG / too large / bad base64"},"503":{"description":"hosting not configured"}},"security":[{"bearer":[]}],"summary":"Upload a PNG design (base64, <=3MB) to durable hosting; returns https url for design_url"}},"/api/ma/products/{sku}/takedown":{"post":{"parameters":[{"in":"path","name":"sku","required":true,"schema":{"type":"string"}},{"in":"query","name":"reason","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ok, sku, status:'retired'}"},"403":{"description":"MA council only"},"404":{"description":"unknown sku"}},"security":[{"bearer":[]}],"summary":"Takedown: any status → retired, removed from storefront (MA council / ADMIN_TOKEN; for rights/IP issues; optional ?reason= is audit-logged)"}},"/api/ma/review/queue":{"get":{"responses":{"200":{"description":"queue"},"403":{"description":"MA council only"}},"security":[{"bearer":[]}],"summary":"Agent products awaiting approval (MA council only)"}},"/api/ma/review/{sku}/approve":{"post":{"parameters":[{"in":"path","name":"sku","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"live"},"403":{"description":"MA council only"},"409":{"description":"not in review"}},"security":[{"bearer":[]}],"summary":"Approve → live (MA council only)"}},"/api/ma/review/{sku}/reject":{"post":{"parameters":[{"in":"path","name":"sku","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"rejected"}},"security":[{"bearer":[]}],"summary":"Reject → dead (MA council only)"}}},"servers":[{"url":"https://wearmu.com"}]}