Yorkn Products API

Programmatic access to the Yorkn 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.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.

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 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

ParameterDefaultDescription
page1Page number
per_page50Items 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.
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.yorkn.com/img/….jpg", "thumbnail": "…" } ],
  "updated_at": "2026-07-31",
  "url": "https://www.yorkn.com/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 = USD × fixed corporate rate. Prices can change — re-sync with 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.

ServiceVersionEndpoint URLOperations
Product Data2.0.0https://api.yorkn.com/promostandards/product-data/2.0.0 getProduct, getProductDateModified, getProductSellable, getProductCloseOut
Media Content1.1.0https://api.yorkn.com/promostandards/media-content/1.1.0 getMediaContent, getMediaDateModified
Product Pricing & Configuration1.0.0https://api.yorkn.com/promostandards/ppc/1.0.0 getConfigurationAndPricing, getFobPoints, getAvailableLocations, getAvailableCharges, getDecorationColors
Inventory2.0.0https://api.yorkn.com/promostandards/inventory/2.0.0 getInventoryLevels, getFilterValues
Order Status1.0.0https://api.yorkn.com/promostandards/order-status/1.0.0 getOrderStatusDetails (queryType 1 PO#, 2 sales order#, 3 changed since, 4 all open), getOrderStatusTypes
Purchase Order1.0.0https://api.yorkn.com/promostandards/purchase-order/1.0.0 sendPO (order types Configured, Blank, Sample, Simple), getSupportedOrderTypes
Order Shipment Notification2.0.0https://api.yorkn.com/promostandards/order-shipment-notification/2.0.0 getOrderShipmentNotification (queryType 1 PO#, 2 sales order#, 3 shipped since)
Invoice1.0.0https://api.yorkn.com/promostandards/invoice/1.0.0 getInvoices (queryType 1 PO#, 2 invoice#, 3 invoiced since, 4 available since)
Purchase orders are received, then reviewed. 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

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

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.