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": "..."} with 401 (missing or unknown token), 404 (not in your store) or 429.

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"
}
  • status is draft (saved on the storefront, never ordered), ordered or cancelled. order is null until the design is ordered.
  • summary uses the answers' order values; productionData uses their production codes. Both follow question order and skip hidden questions. Multiple choice answers use a list (value in summary, values in productionData).
  • selection is the raw choice by question and answer id. Uploads appear as upload ids.
  • images has one stable URL per view and thumbnail a 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.