For the complete documentation index, see llms.txt. This page is also available as Markdown.

Pricing API

Read and write price list data over REST — push prices from an ERP or PIM, and poll the job until it lands.

A REST API for reading and writing your price list. Use it to sync pricing from an ERP, PIM, inventory system or internal tool.

Writes are asynchronous: you submit a batch, receive a job ID, and poll it. That keeps large updates consistent and prevents concurrent writes from racing each other.

Base URL

https://pricelist-app.dollarlabs.io/api/v1/

Authentication

Every request needs both headers:

Header
Value

X-API-Key

Your API key, prefixed dlb_

X-Signing-Secret

Your signing secret, prefixed sec_

If API key management is available for your store, create them under API Keys. See API keys for availability, credential retrieval and IP restrictions.

Endpoints

Method
Path
Purpose

GET

/api/v1/pricing

Read the price list, paginated

GET

/api/v1/pricing/:variantId

Read one variant, by Shopify GID

POST

/api/v1/pricing

Submit a batch of upserts and removals

GET

/api/v1/jobs/:jobId

Poll a submitted batch

Reading pricing

The current read response returns prices, tiers, case multiples, loose values and discount modes. It does not return priceBases, minQuantities or looseModes, even though the write API accepts them. Do not use a GET response as a complete backup or blindly write it back to reconstruct those rules. Use a CSV export for a full pricing-rule backup.

Returns priceListId, a rows array, and pageInfo carrying limit and nextCursor. Follow nextCursor until it is absent to page through the catalog.

A single variant, by GID:

Writing pricing

POST /api/v1/pricing with a body containing updates, remove, or both.

Fields on an update

Field
Meaning

variantId

Shopify variant GID. Required.

productId

Shopify product GID.

prices

Price per tag

volumeTiers

Tier ladder per tag

caseMultiples

Case multiple per tag

loosePrices

Loose unit price per tag

discountModes

specific_price, percentage or fixed_amount, per tag

priceBases

unit or case, per tag

minQuantities

Minimum order quantity, per tag

looseModes

split or all, per tag

Every pricing object is keyed by customer tag, using "__default__" for the Default column. Tag keys must match your price list columns exactly, including case.

Money values are a string or number with up to two decimal places — "10.00" or 9.5. Passing null clears that value.

remove takes an array of variant GIDs to strip pricing from entirely.

The response

You get 202 Accepted and a job ID. The write has not happened yet.

Polling the job

Status is one of pending, processing, completed or failed.

Poll at a sensible interval — every few seconds, not every 100ms — and always confirm completed before treating a sync as done.

Limits and concurrency

Limit
Behaviour

100 requests / minute per API key, sliding window

Exceeding it returns 429 with a Retry-After header. Honour it.

One job per shop at a time

Submitting while a job is running returns 409 in_progress. Wait for the current job, then retry.

Writing a reliable sync

  1. Batch. Send many variants per request rather than one each — you have 100 requests per minute, not 100 variants.

  2. Send only changes. Diff against your last successful sync. Most nightly runs change a fraction of the catalog.

  3. Handle 409 by waiting. It means someone else is writing, not that you failed.

  4. Honour Retry-After on 429. Do not hammer.

  5. Poll to completion. A 202 means accepted, not applied.

  6. Log the job ID. It is how support traces what your integration did.

Deprecated endpoints

POST /api/update-pricing and GET /api/jobs/:jobId still work but are superseded by the /api/v1/ endpoints above. New integrations should use /api/v1/; existing ones should migrate when convenient.

Last updated