Core concepts

Limits

How often to call each endpoint, and how to pull large amounts of data without hammering the API.

Guidelines, not hard limits

We don't enforce these technically — no request of yours will be rejected for exceeding them. But we do monitor usage, and we will step in if we see misuse.


EndpointRecommended frequencyWhy
/Catalog/ProductsOnce a dayProduct data is stable
/Catalog/Products/InventoryEvery 5–15 minutesQuantities change throughout the day
/Catalog/Products/PricesOnce a dayPrices change occasionally
/Catalog/Products/ImagesOnce a dayImages are refreshed once per day
/Orders/TrackingEvery 15 minutesCarrier updates arrive in batches

Inventory is the only endpoint worth polling frequently. Everything else should be pulled on a daily schedule and cached — see Caching for suggested TTLs.


Fetching many SKUs

The most common cause of excessive call volume is fetching a large number of SKUs one page — or one SKU — at a time. Two habits keep your call count low:

Use a large page size, or no paging at all. A small page size multiplies your call count for no benefit. If you need the full catalog, ask for the full catalog.

Batch your SKUs into a single call. For /Catalog/Products/Inventory, either call it without filters to get everything at once, or pass multiple SKUs in one request, separated by commas.

const baseUrl = 'https://api.hlc.bike/us/v4.1'
const apiKey = process.env.HLC_API_KEY

// Good: one call for every SKU you care about
const res = await fetch(
  `${baseUrl}/Catalog/Products/Inventory?skus=460181-S-001,460181-M-001,020056-07`,
  {
    headers: { Authorization: `ApiKey ${apiKey}`, language: 'en' },
  },
)

if (!res.ok) {
  throw new Error(`HTTP ${res.status}: ${res.statusText}`)
}

const inventory = await res.json()
// Avoid: one call per SKU
for (const sku of skus) {
  await fetch(`${baseUrl}/Catalog/Products/Inventory?skus=${sku}`, {
    headers: { Authorization: `ApiKey ${apiKey}`, language: 'en' },
  })
}

Paging

When you do page through results, stay under 10 calls per minute.

If that pace makes a full sync too slow, the answer is a larger page size — not more calls. See Pagination for pageStartIndex, pageSize, and the X-Pagination response header.

What misuse looks like

Polling inventory for individual SKUs every few minutes, re-downloading the full catalog several times a day, or paging through a large result set as fast as your client can issue requests. Sustained patterns like these lead to throttling or account penalties.

Previous
State codes