Pricing and credits
Calls cost credits. The store's plan includes credits every month. A failed call is never charged.
How a call is priced
- Every billed endpoint has a base price in credits.
- Some endpoints include a number of fields in the base price. Each field beyond that costs a little more. Which fields you pick does not matter, only how many.
- Most endpoints are priced per call. CompuDime can price a list per page of rows, or per row, instead. The answer then says so, and an empty page costs nothing.
- An accepted order (
POST /v1/orders) costs 16 credits. - Free:
GET /v1/capabilities,GET /v1/me,GET /v1/usage/current,GET /v1/webhooks,POST /v1/webhooks,DELETE /v1/webhooks/{webhookId},GET /v1/webhooks/{webhookId},GET /v1/webhooks/{webhookId}/deliveries,POST /v1/webhooks/{webhookId}/rotate-secret,POST /v1/webhooks/{webhookId}/test, and every estimate. - Only a successful answer is charged. An error answer, a 429, and a call you hang up on are not.
Prices today
These are the list prices, read from the live OpenAPI document (pricing version 2026-10-09.2). A store's plan or contract can set other prices. For the price of a call with your key, ask for an estimate.
| Endpoint | Price | Charged |
|---|---|---|
GET /v1/accounting/journal-entries | 1 credit | per page of 100 rows returned |
GET /v1/accounting/mapping | 1 credit | per call |
GET /v1/accounting/sales-summaries | 1 credit | per page of 100 rows returned |
GET /v1/brands | 1 credit | per page of 100 rows returned |
GET /v1/catalog/snapshots/current | 1 credit | per call |
GET /v1/categories | 1 credit | per page of 100 rows returned |
GET /v1/customers | 1 credit | per page of 100 rows returned |
GET /v1/customers/lookup | 1 credit | per call |
GET /v1/customers/{posCustomerId} | 1 credit | per call |
GET /v1/delivery/routes | 1 credit | per call |
GET /v1/inventory/onhand | 1 credit | per page of 100 rows returned |
GET /v1/invoices | 1 credit | per page of 100 rows returned |
GET /v1/invoices/external/{externalId} | 1 credit | per call |
GET /v1/invoices/{posInvoiceId} | 1 credit | per call |
POST /v1/orders | 16 credits | per call |
GET /v1/orders/external/{externalOrderId} | 1 credit | per call |
GET /v1/orders/{orderId} | 1 credit | per call |
GET /v1/products | 1 credit; 5 fields included, 1 more per extra field | per page of 100 rows returned |
GET /v1/products/lookup/{code} | 5 credits; 5 fields included, 1 more per extra field | per call |
GET /v1/products/{productCode} | 1 credit; 5 fields included, 1 more per extra field | per call |
GET /v1/promotions | 1 credit | per page of 100 rows returned |
GET /v1/promotions/mix-match/{groupId} | 1 credit | per call |
GET /v1/purchase-orders | 1 credit | per page of 100 rows returned |
GET /v1/purchase-orders/{posPurchaseOrderId} | 1 credit | per call |
GET /v1/reasons | 1 credit | per call |
GET /v1/receiving | 1 credit | per page of 100 rows returned |
GET /v1/receiving/{posReceivingId} | 1 credit | per call |
GET /v1/sales/daily | 1 credit | per page of 100 rows returned |
GET /v1/sales/movement | 1 credit; 5 fields included, 1 more per extra field | per page of 100 rows returned |
GET /v1/sales/zreport | 1 credit | per call |
GET /v1/store | 1 credit | per call |
GET /v1/tags | 1 credit | per page of 100 rows returned |
GET /v1/tenders | 1 credit | per call |
GET /v1/tickets | 1 credit | per page of 100 rows returned |
GET /v1/tickets/{ticketId} | 1 credit | per call |
Price a call before you make it
Add estimate=true to any billed GET. You get a quote for exactly that request, with your key's price. Nothing is sent to the store and nothing is charged.
curl -s "https://api.compudime.com/v1/products?fields=productCode,description,price,brand,size,pack&estimate=true" \
-H "Authorization: Bearer $PUBLIC_API_KEY"
priceSource says where the price came from: default (the list price above), plan (the store's plan sets its own), subscription (a price agreed for the store) or house (a CompuDime integration, priced at zero). The most specific one wins.
What a call cost
- The
billingblock in the body:baseCost,fieldCount,includedFields,extraFieldCredits,totalCredits, and, when the price is per page or per row,unitandquantity. The call costtotalCreditstimesquantity. SeeBillingMeta. - The headers
X-Credits-Charged,X-Credits-RemainingandX-Pricing-Version. On a long answer the first two come as trailers.X-Credits-Remainingis the balance of whoever pays for your calls, so a key the store pays for under its approval does not get it. GET /v1/usage/current(free): the store's month so far on the meter, for the store's own keys. A key your organization holds for a store is billed to your organization and answers403 usage_not_available_for_keyhere; see your usage at account.compudime.com/usage.
Choosing fields
Every read endpoint takes fields=: a comma-separated list of names, or * for every field your key may see. The rows then carry exactly those fields, in your order. A name that is not allowed is a free 400 field_not_allowed.
Leave fields out and a flat-priced endpoint returns all its fields. An endpoint priced by field count returns its standard set at the base price. Each endpoint's page in the reference lists its fields and its standard set.
Test keys
A test key's calls use the monthly sandbox allowance of the organization that pays for them (the store's, or a developer's under a store approval). They never cause overage and work before the store has a card on file. When the allowance is used up, calls answer 402 sandbox_exhausted until next month.
An order sent with a test key is simulated and never reaches the store. It uses the allowance like any other test call. See Test orders.
The store's plan
The store owner picks the plan and pays for it. A store with no plan on the API answers billed calls with 402 no_api_plan. Free calls still work. The store's dashboard (Store Pulse) is billed on its own separate balance and never uses these credits.
Every billing answer:
no_api_plan: The store has no plan on the API meter, so nothing can pay for the call.billing_card_missing: The store has no payment card on file.billing_card_failed: The store's payment card failed.usage_exhausted: The store used all the credits its plan includes this month, and overage is off.sandbox_exhausted: A test key used up this month's sandbox allowance.subscription_paused: The store's API subscription is paused.overage_cap_reached: The store reached the overage limit it set for this month.grant_cap_exceeded: The store pays for your calls to it and has reached the monthly limit it set for them.payer_billing_blocked: The store pays for your calls to it, under its approval, and cannot be charged right now. Why is the store's business: a key the store pays for gets this code instead of the codes about the store's card, plan and credits.billing_blocked: Billing refused the call for a reason the codes above do not cover.