Yorkn Products API

Programmatic access to the Yorkn promotional-products catalog — 18,000+ products, 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 — freight and duties included to one location in the USA (USD) or Canada (CAD).

To get an API key, email info@yorkn.com 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/healthService health (no auth required)

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://order.yorkn.com/…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

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.