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:
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
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
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
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
Batch. Send many variants per request rather than one each — you have 100 requests per minute, not 100 variants.
Send only changes. Diff against your last successful sync. Most nightly runs change a fraction of the catalog.
Handle
409by waiting. It means someone else is writing, not that you failed.Honour
Retry-Afteron429. Do not hammer.Poll to completion. A
202means accepted, not applied.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.
Related
API keys — credentials and IP restrictions
Jobs & history — what merchants see for the jobs you submit
CSV import & export — the no-code equivalent
Last updated