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 and pricing.price_basis, and a stocked flag:
- Stocked in Canada (
"stocked": true) — USD & CAD prices are FOB Markham, Ontario, Canada. USD prices include all applicable duties for delivery to the USA. - Direct import (
"stocked": false) — prices include freight and all applicable duties for delivery to one location in the USA (USD) or Canada (CAD).
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.
| Endpoint | Description |
|---|---|
GET/v1/products | List / search products (paginated) |
GET/v1/products/{sku} | One product by SKU |
GET/v1/categories | All categories with product counts |
GET/v1/export.csv | Entire catalog in one request — CSV, opens directly in Excel |
GET/v1/export.json | Entire catalog in one request — JSON |
GET/v1/orders | Your order statuses (requires account-linked key) |
GET/v1/orders/{id} | One order by order number or PO number |
GET/v1/health | Service 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
| Parameter | Default | Description |
|---|---|---|
page | 1 | Page number |
per_page | 50 | Items per page (max 100) |
search | — | Free-text search over name, SKU, keywords, theme, category |
category | — | Exact category name (see /v1/categories) |
updated_since | — | YYYY-MM-DD — only products added or edited since this date. Use this for incremental catalog syncs. |
sort | newest | newest, 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"
}
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.
| Service | Version | Endpoint URL | Operations |
|---|---|---|---|
| Product Data | 2.0.0 | https://api.delite.ca/promostandards/product-data/2.0.0 |
getProduct, getProductDateModified, getProductSellable, getProductCloseOut |
| Media Content | 1.1.0 | https://api.delite.ca/promostandards/media-content/1.1.0 |
getMediaContent, getMediaDateModified |
| Product Pricing & Configuration | 1.0.0 | https://api.delite.ca/promostandards/ppc/1.0.0 |
getConfigurationAndPricing, getFobPoints, getAvailableLocations, getAvailableCharges, getDecorationColors |
Data model notes
productId= Delite SKU; each product has a single part withpartId=productId.- Two FOB points:
US(currency USD) andCA(currency CAD) — prices are delivered, freight & duties included to one location in that country. - Pricing:
priceTypeis accepted but one price list applies (your delivered cost). Currencies:USD,CAD. - One decoration location ("Standard Location") with the product's default imprint method;
the setup or mold charge is returned as a
Setup-type charge. - No closeout program —
getProductCloseOutreturns an empty array.
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
| Status | Meaning |
|---|---|
401 | Missing, invalid, or revoked API key |
404 | Product / endpoint not found |
429 | Rate limit exceeded — 120 requests per minute per key. Honor the Retry-After header. |
500 | Server 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.