Getting started
The API is read-only and returns the same catalog shown on www.yorkn.com. All prices are final sell prices in USD and CAD.
Prices include freight and duties to one location in the USA (USD) or Canada (CAD) —
see pricing.terms on every product.
To get an API key, reach out via our
contact page with your company name.
Keys look like yk_live_… and are free for Yorkn 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.yorkn.com/v1/products?per_page=5" curl -H "Authorization: Bearer YOUR_KEY" "https://api.yorkn.com/v1/products?per_page=5"
REST API reference
Base URL: https://api.yorkn.com — 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 Yorkn customer account can also check order status — you see only your own company's orders. If you get a 403, ask Yorkn to link your key to your account via the contact page.
curl -H "X-API-Key: YOUR_KEY" "https://api.yorkn.com/v1/orders?per_page=10" curl -H "X-API-Key: YOUR_KEY" "https://api.yorkn.com/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 yorkn-products.csv "https://api.yorkn.com/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.yorkn.com/img/….jpg", "thumbnail": "…" } ],
"updated_at": "2026-07-31",
"url": "https://www.yorkn.com/search?q=552999"
}
updated_since daily or weekly.Code examples
Python
import requests
API = "https://api.yorkn.com"
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.yorkn.com/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, Yorkn 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
Yorkn API key, id is your company name.
| Service | Version | Endpoint URL | Operations |
|---|---|---|---|
| Product Data | 2.0.0 | https://api.yorkn.com/promostandards/product-data/2.0.0 |
getProduct, getProductDateModified, getProductSellable, getProductCloseOut |
| Media Content | 1.1.0 | https://api.yorkn.com/promostandards/media-content/1.1.0 |
getMediaContent, getMediaDateModified |
| Product Pricing & Configuration | 1.0.0 | https://api.yorkn.com/promostandards/ppc/1.0.0 |
getConfigurationAndPricing, getFobPoints, getAvailableLocations, getAvailableCharges, getDecorationColors |
| Inventory | 2.0.0 | https://api.yorkn.com/promostandards/inventory/2.0.0 |
getInventoryLevels, getFilterValues |
| Order Status | 1.0.0 | https://api.yorkn.com/promostandards/order-status/1.0.0 |
getOrderStatusDetails (queryType 1 PO#, 2 sales order#, 3 changed since, 4 all open), getOrderStatusTypes |
| Purchase Order | 1.0.0 | https://api.yorkn.com/promostandards/purchase-order/1.0.0 |
sendPO (order types Configured, Blank, Sample, Simple), getSupportedOrderTypes |
| Order Shipment Notification | 2.0.0 | https://api.yorkn.com/promostandards/order-shipment-notification/2.0.0 |
getOrderShipmentNotification (queryType 1 PO#, 2 sales order#, 3 shipped since) |
| Invoice | 1.0.0 | https://api.yorkn.com/promostandards/invoice/1.0.0 |
getInvoices (queryType 1 PO#, 2 invoice#, 3 invoiced since, 4 available since) |
sendPO answers
immediately with a transactionId, but the order is not confirmed until Yorkn confirms it.
Your key must be linked to your customer account. Re-sending a PO with the same
orderNumber returns the original transactionId and never creates a second
order. Unknown SKUs, quantities under our minimum and unit prices below ours come back as
Warning messages rather than rejections, so an order is never lost over a detail —
we resolve it with you. Only a missing orderNumber, an empty order, a zero quantity,
an unsupported orderType or a currency other than USD/CAD is rejected outright.Data model notes
productId= Yorkn 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. - Inventory: stocked items report the quantity available in our Markham, Ontario warehouse
(
inventoryLocationIdMARKHAM); made-to-order items reportmanufacturedItem = truewith quantity 0 and the product's lead time. - Order Status: your key must be linked to your customer account (same as the REST
/v1/orders);factoryOrderNumberis our order number andpurchaseOrderNumberis your PO. - Shipments and Invoices: same customer-account link as Order Status. Each tracking number is one
Package; the invoice number is our order number, andinvoiceDocumentUrlopens the invoice to view or pay.
Example request
curl -X POST https://api.yorkn.com/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.