REST API
Read customized orders, designs with images and published customizers from your own systems.
The REST API gives your production software, ERP or reporting tools the full design behind every configured order. It is read-only JSON over HTTPS, API version 2026-10. The same objects arrive in webhooks. The API is part of the Pro and Plus plans.
Base URL and authentication
https://app.moddifystudio.com/api/v1
Create a token in the app under Settings, API tokens. Tokens start with cmz_ and are shown once, so copy yours right away. Send it as a Bearer token:
curl -H "Authorization: Bearer cmz_YOUR_TOKEN" \
"https://app.moddifystudio.com/api/v1/orders?limit=10"
Each token belongs to one store and only sees that store's data. Delete a token on the same settings page to revoke it.
- Rate limit: 120 requests a minute per token, then
429. - Money: always integer minor units (cents) in the shop currency.
- Errors: JSON
{"message": "..."}with401(missing or unknown token),404(not in your store) or429.
Objects
Design
One buyer configuration. It is frozen once ordered.
{
"id": "01JB2X7M0N8Q4R5S6T7V8W9XYZ",
"status": "ordered",
"customizer": { "id": 12, "title": "Custom sneaker", "version": 3 },
"order": { "id": "5551234567890", "name": "#1001", "lineItemId": "13579" },
"selection": { "upper": "forest", "extras": ["heeltab", "collar"], "initials": { "text": "AK" } },
"summary": [
{ "key": "UPPER", "value": "Forest" },
{ "key": "EXTRAS", "value": ["Reflective heel tab", "Coral collar lining"] }
],
"productionData": [
{ "key": "UPPER", "value": "SNK-UP-FOREST", "ref": { "questionId": "upper", "answerId": "forest" } },
{ "key": "EXTRAS", "values": ["SNK-X-HEELTAB", "SNK-X-COLLAR"], "ref": { "questionId": "extras", "answerIds": ["heeltab", "collar"] } },
{ "key": "INITIALS", "value": "AK" }
],
"price": {
"base": 8900,
"lines": [ { "q": "extras", "a": "heeltab", "amount": 800, "variantId": null } ],
"rounding": 0,
"total": 12500,
"currency": "USD"
},
"images": { "side": "https://.../design-images/01JB2X.../side.webp" },
"thumbnail": "https://.../design-images/01JB2X.../thumb.webp",
"createdAt": "2026-10-19T10:15:00+00:00",
"orderedAt": "2026-10-19T10:20:31+00:00"
}
statusisdraft(saved on the storefront, never ordered),orderedorcancelled.orderisnulluntil the design is ordered.summaryuses the answers' order values;productionDatauses their production codes. Both follow question order and skip hidden questions. Multiple choice answers use a list (valueinsummary,valuesinproductionData).selectionis the raw choice by question and answer id. Uploads appear as upload ids.imageshas one stable URL per view andthumbnaila small version of the first view. The URLs stay the same if an image is rendered again.
Order
All designs of one Shopify order.
{
"id": "5551234567890",
"name": "#1001",
"status": "ordered",
"currency": "USD",
"total": 18990,
"orderedAt": "2026-10-19T10:20:31+00:00",
"designs": [ { "id": "01JB2X...", "...": "Design" } ]
}
status is ordered or cancelled. total is the sum of the design totals, in cents.
Endpoints
| Method and path | Returns |
|---|---|
GET /orders |
Orders with custom items, newest first |
GET /orders/{shopifyOrderId} |
One Order |
GET /designs/{id} |
One Design, including drafts |
GET /customizers/{id} |
A customizer and its published definition |
GET /orders
| Query | Default | Notes |
|---|---|---|
limit |
25 | 1 to 100 |
cursor |
none | pagination.nextCursor from the previous page |
orderedAfter |
none | ISO 8601; only orders placed at or after this time |
{
"data": [ { "id": "5551234567890", "...": "Order" } ],
"pagination": { "total": 312, "limit": 25, "nextCursor": "25" }
}
nextCursor is null on the last page. To sync new orders, keep the time of your last run and pass it as orderedAfter, or use webhooks instead of polling.
GET /customizers/{id}
{
"id": 12,
"title": "Custom sneaker",
"status": "published",
"shopifyProductId": "gid://shopify/Product/7211100766392",
"version": 3,
"assetBase": "https://.../shops/1/",
"definition": { "schemaVersion": 1, "steps": [], "questions": [], "rules": [] }
}
definition is the published version: views, steps, questions, answers with prices and production codes, print areas and rules. Layer paths are relative to assetBase. version and definition are null if the customizer was never published.