Delite Products API

Programmatic access to the Delite promotional-products catalog — full product data with live pricing in USD & CAD.

Getting started

The API is read-only and returns the same catalog shown on www.delite.ca. All prices are final sell prices in USD and CAD.

Pricing terms differ by item — each product carries its own pricing.terms and pricing.price_basis, and a stocked flag: Always read pricing.terms per product rather than assuming one rule for the whole catalog.

To get an API key, reach out via our contact page with your company name. Keys look like dl_live_… and are free for Delite customers and distributor partners.

Authentication

Send your key with every request, either as a header (recommended) or bearer token:

curl -H "X-API-Key: YOUR_KEY" "https://api.delite.ca/v1/products?per_page=5"
curl -H "Authorization: Bearer YOUR_KEY" "https://api.delite.ca/v1/products?per_page=5"

REST API reference

Base URL: https://api.delite.ca — all responses are JSON (UTF-8), CORS enabled.

EndpointDescription
GET/v1/productsList / search products (paginated)
GET/v1/products/{sku}One product by SKU
GET/v1/categoriesAll categories with product counts
GET/v1/export.csvEntire catalog in one request — CSV, opens directly in Excel
GET/v1/export.jsonEntire catalog in one request — JSON
GET/v1/ordersYour order statuses (requires account-linked key)
GET/v1/orders/{id}One order by order number or PO number
GET/v1/healthService health (no auth required)

Order status

Keys linked to your Delite customer account can also check order status — you see only your own company's orders. If you get a 403, ask Delite to link your key to your account via the contact page.

curl -H "X-API-Key: YOUR_KEY" "https://api.delite.ca/v1/orders?per_page=10"
curl -H "X-API-Key: YOUR_KEY" "https://api.delite.ca/v1/orders/YOUR-ORDER-NUMBER"   # order or PO number

/v1/orders accepts page, per_page, status (e.g. Production, Shipped, Delivered) and po. Each order returns the fields below (values shown are placeholders):

{
  "order_id": "<your order number>",
  "po": "<your PO number>",
  "order_date": "YYYY-MM-DD",
  "status": "Shipped",
  "product": { "sku": "<sku>", "name": "<product name>" },
  "quantity": 1000,
  "requested_date": "YYYY-MM-DD",
  "shipping_date": "YYYY-MM-DD",
  "delivery_date": null,
  "ship_by": "Air",
  "tracking_numbers": ["<carrier tracking number>"]
}

Full catalog export

Don't want to paginate? One request downloads every product — all fields, all price tiers, image URLs included:

curl -H "X-API-Key: YOUR_KEY" -o delite-products.csv "https://api.delite.ca/v1/export.csv"

The CSV opens directly in Excel / Google Sheets (one row per product, up to 6 price tiers as columns, image URLs separated by |). Use /v1/export.json for the same data as JSON. Limit: one export per minute per key — for daily updates, prefer updated_since instead of re-downloading everything.

GET /v1/products — query parameters

ParameterDefaultDescription
page1Page number
per_page50Items per page (max 100)
searchFree-text search over name, SKU, keywords, theme, category
categoryExact category name (see /v1/categories)
updated_sinceYYYY-MM-DD — only products added or edited since this date. Use this for incremental catalog syncs.
sortnewestnewest, name, price_asc, price_desc

The list response wraps products with paging info:

{ "total": 18587, "page": 1, "per_page": 50, "total_pages": 372, "products": [ … ] }

Product object

{
  "sku": "552999",
  "name": "Lightweight Crossbody Shoulder Bag",
  "description": "Plain-text description…",
  "category": "Bags",            "category_2": null,
  "theme": "Gift,Household",     "keywords": null,
  "colors": "Black",             "material": "Oxford Cloth",
  "imprint_method": "Heat Transfer",
  "imprint_size_in": { "length": 4, "width": 3 },        // inches, null if n/a
  "product_size_in": { "length": 5.9, "width": 2, "height": 7.9 },  // inches
  "min_quantity": 1000,
  "pricing": {
    "currency_note": "Prices include freight and duties to 1 location in the USA (USD) / Canada (CAD).",
    "tiers": [
      { "quantity": 1000, "price_usd": 12.25, "price_cad": 17.15 },
      { "quantity": 2000, "price_usd": 11.63, "price_cad": 16.28 }
    ],
    "setup_charge_usd": 166.67,   // one-time decoration setup (USD)
    "mold_charge_usd": null       // replaces setup charge when custom mold required
  },
  "lead_time_days": 22,           // production + transit
  "ship_by": "Air",               // Air or Boat
  "template_url": null,           // artwork template download when available
  "images": [ { "url": "https://api.delite.ca/img/….jpg", "thumbnail": "…" } ],
  "updated_at": "2026-07-31",
  "url": "https://www.delite.ca/search?q=552999"
}
Pricing notes: unit prices are per-piece at each quantity break. The setup charge (or mold charge, when present) is a one-time charge per order. CAD is converted at a different corporate rate for stocked and direct-import items — use the CAD figure returned per tier, don't convert the USD one yourself. Prices can change — re-sync with updated_since daily or weekly.

Code examples

Python

import requests

API = "https://api.delite.ca"
KEY = {"X-API-Key": "YOUR_KEY"}

# incremental sync of everything changed in the last 7 days
page, since = 1, "2026-08-19"
while True:
    r = requests.get(f"{API}/v1/products",
                     params={"updated_since": since, "page": page, "per_page": 100},
                     headers=KEY).json()
    for p in r["products"]:
        print(p["sku"], p["name"], p["pricing"]["tiers"][0])
    if page >= r["total_pages"]: break
    page += 1

JavaScript / Node

const res = await fetch("https://api.delite.ca/v1/products/552999", {
  headers: { "X-API-Key": "YOUR_KEY" },
});
const product = await res.json();

PromoStandards services (for distributors)

For distributor systems that integrate via PromoStandards, Delite exposes standard SOAP 1.1 endpoints. Use the standard PromoStandards WSDLs; authentication is the standard id/password pair in each request body — password is your Delite API key, id is your company name.

ServiceVersionEndpoint URLOperations
Product Data2.0.0https://api.delite.ca/promostandards/product-data/2.0.0 getProduct, getProductDateModified, getProductSellable, getProductCloseOut
Media Content1.1.0https://api.delite.ca/promostandards/media-content/1.1.0 getMediaContent, getMediaDateModified
Product Pricing & Configuration1.0.0https://api.delite.ca/promostandards/ppc/1.0.0 getConfigurationAndPricing, getFobPoints, getAvailableLocations, getAvailableCharges, getDecorationColors

Data model notes

Example request

curl -X POST https://api.delite.ca/promostandards/product-data/2.0.0 \
  -H "Content-Type: text/xml; charset=utf-8" \
  -d '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:ns="http://www.promostandards.org/WSDL/ProductDataService/2.0.0/"
      xmlns:shar="http://www.promostandards.org/WSDL/ProductDataService/2.0.0/SharedObjects/">
  <soapenv:Body>
    <ns:GetProductRequest>
      <shar:wsVersion>2.0.0</shar:wsVersion>
      <shar:id>YourCompany</shar:id>
      <shar:password>YOUR_KEY</shar:password>
      <shar:localizationCountry>US</shar:localizationCountry>
      <shar:localizationLanguage>en</shar:localizationLanguage>
      <shar:productId>552999</shar:productId>
    </ns:GetProductRequest>
  </soapenv:Body>
</soapenv:Envelope>'

Errors & rate limits

StatusMeaning
401Missing, invalid, or revoked API key
404Product / endpoint not found
429Rate limit exceeded — 120 requests per minute per key. Honor the Retry-After header.
500Server error — retry with backoff; contact us if persistent

PromoStandards operations return spec-standard ServiceMessage / ErrorMessage elements (105 = auth failed, 120 = missing field, 130 = product not found) inside a normal 200 response.