The Pinrates API

Check an order in one call, from your store or your platform. Send the order and get back whether it can ship and the tax due, with the rate and source behind each figure. Keys are issued by name and start with pr_.

POST/v1/checksCheck an order: license, product and buyer, and tax
POST/v1/commitmentsConfirm the order at fulfillment; it then counts toward the buyer's limit. Safe to send twice
POST/v1/tax/quotesTax only; nothing is saved
GET/v1/productsList your wines, with anything missing from each
POST/v1/productsAdd or update a wine; it is classified and checked when saved
PATCH/v1/products/{id}Update a wine and check it again
DELETE/v1/products/{id}Archive a wine (or ?hard=true to delete it)
GET/v1/decisionsList your checks, test or live by your key
GET/v1/decisions/{id}Look up a past check with the rates and rules it used
GET/v1/jurisdictions/{code}/rulesThe rules in force in a state on a date
GET/v1/coverageWhich states Pinrates covers, prepares and files electronically
# a shipment check, masked
{
  "decision_id": "dec_••••••",
  "outcome": "allow",
  "gates": {
    "licensure": "pass", "eligibility": "pass", "tax": "pass"
  },
  "tax": { "total": 94.55 },
  "pinned_versions": {
    "rules": ["rv_8c1f… · ca.sales.taxable_measure v1"],
    "rates": ["rv_3a90… · ca.sales.district.campbell v1 · eff 2026-04-01"]
  },
  "engine_version": "1.1.0-stategen"
}

Each figure names the rate version it came from. Ask for the same check later and you get the same answer, with the same versions. Reference docs come with your key.

Test keys

Build against the same published rules live checks use, with a test key: the same pr_ key format, set to test, so its checks never mix with live ones. Test keys are issued by name, like live keys.

We use this only to reach you about Pinrates. No newsletter, no list, no sharing. Privacy policy.

the published rulesthe same rules live checks use
separate test recordsyour test checks never mix with live ones
counters you can resetrun the same buyer up to the yearly limit again