For distributors & resellers

Your catalog, your pricing, one REST API.

Browse 1,900+ customizable products with your negotiated partner pricing, submit quote requests, and track quotes and orders — over plain JSON. Base URL: https://api.qstomize.com/v1

Try it — 30 seconds from key to catalog
$ curl https://api.qstomize.com/v1/products?limit=1 \
    -H "Authorization: Bearer qs_live_YOUR_KEY"

{
  "products": [{
    "slug": "custom-poly-mailers",
    "name": "Custom Poly Mailers",
    "min_quantity": 100,
    "lead_time_days": 14,
    "pricing": [
      { "qty": 100,  "list_price": 0.69, "net_price": 0.62 },
      { "qty": 5000, "list_price": 0.31, "net_price": 0.28 }
    ],
    "product_url": "https://www.qstomize.com/products/custom-poly-mailers"
  }],
  "total": 1906, "limit": 1, "offset": 0
}

Authentication

Every request needs your API key, sent either as a bearer token or an X-API-Key header. Keys start with qs_live_, are shown once when issued, and can be revoked at any time. To get one, email partners@qstomize.com with your company name and expected volume.

Both forms are equivalent
-H "Authorization: Bearer qs_live_YOUR_KEY"
-H "X-API-Key: qs_live_YOUR_KEY"

Keep keys server-side. If a key leaks, email us and we revoke it immediately.

Rate limits

120 requests per minute per key. Exceeding it returns 429 with a Retry-After header. For catalog syncs, page with limit=100 — the full catalog fits in ~20 requests.

Errors

Errors are JSON with a stable machine-readable code and a human explanation.

Error shape
{ "error": { "code": "invalid_api_key", "message": "API key not recognized." } }
StatusCodeMeaning
401missing_api_keyNo key in the request
401invalid_api_keyKey unknown or revoked
400invalid_requestA field failed validation — message says which
404not_foundResource doesn't exist or isn't yours
429rate_limitedOver 120 requests/minute
500internal_errorOur fault — retry once, then contact us
GET/v1/products

Paginated catalog with your partner pricing. Every tier shows the public list price and your net price side by side. Filter with ?category= (slugs from /v1/categories); page with limit (max 100) and offset.

Request
$ curl "https://api.qstomize.com/v1/products?category=packaging&limit=50" \
    -H "Authorization: Bearer qs_live_YOUR_KEY"
GET/v1/products/{slug}

Full product record: description, images, specs, minimum quantity, lead time, and pricing per decoration method (screen print, embroidery, laser engraving, …) where available.

Request
$ curl https://api.qstomize.com/v1/products/custom-poly-mailers \
    -H "Authorization: Bearer qs_live_YOUR_KEY"
GET/v1/categories

All active category slugs and names — use these to drive catalog filters.

Request
$ curl https://api.qstomize.com/v1/categories \
    -H "Authorization: Bearer qs_live_YOUR_KEY"
POST/v1/quotes

Submit a quote request. Reference a catalog product by product_slug, or describe a custom item with product_name. Our team replies by email, usually within one business day; poll the returned quote_number for status.

Request
$ curl -X POST https://api.qstomize.com/v1/quotes \
    -H "Authorization: Bearer qs_live_YOUR_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "product_slug": "custom-poly-mailers",
      "quantity": 5000,
      "contact_name": "Dana Reyes",
      "contact_email": "dana@yourcompany.com",
      "company": "Your Company",
      "artwork_url": "https://yourcdn.com/logo.ai",
      "message": "Matte white, 10x13, two-color logo."
    }'
Response — 201 Created
{
  "quote": {
    "quote_number": "Q-1770650000-A1B2",
    "status": "pending",
    "submitted_at": "2026-08-07T09:30:00.000Z"
  },
  "message": "Quote received. Our team will respond by email, usually within one business day."
}
GET/v1/quotes/{quoteNumber}

Status of a quote you submitted, including quoted_price once our team has priced it. Quotes belonging to other partners return 404.

Request
$ curl https://api.qstomize.com/v1/quotes/Q-1770650000-A1B2 \
    -H "Authorization: Bearer qs_live_YOUR_KEY"
GET/v1/orders/{orderId}

Production, payment, and shipping status for an order linked to your account, including tracking once shipped. Order references look like DP-1770648206-GLOVES and appear on your order confirmation.

Response
{
  "order": {
    "order_id": "DP-1770648206-GLOVES",
    "product_name": "Custom Work Gloves",
    "quantity": 500,
    "status": "in_production",
    "payment_status": "paid",
    "tracking": null,
    "estimated_delivery_date": "2026-09-02",
    "paid_at": "2026-08-07T10:02:11.000Z"
  }
}

OpenAPI spec

A machine-readable OpenAPI 3.0 document is available at /v1/openapi.json — point your client generator at it.