Catalog
The full product catalog — every orderable item with its price, stock, product
type and input form — is published as a single downloadable snapshot. You
download it, read it locally, and use each item’s id and fields to place
orders. There is no paginated “list products” API endpoint for programmatic
use; the snapshot is the catalog.
Download URL:
Served via the cdn.voodoo.center CDN. No authentication is required to
download it.
Personal catalog
The URL above serves the global catalog, which uses standard pricing. If
your account has personal (negotiated) pricing — per-item price overrides —
there is a separate personal catalog published at a URL that includes your
account’s client id. It holds the same records, but price and
subscriber_price reflect your account’s pricing. Use the personal file when
it exists; otherwise use the global one.
Personal download URL:
Find your Client ID — and your ready-to-use personal catalog URL — on the
API page of the dashboard (the same page where you manage API keys and
webhooks). Not every account has personal pricing: if yours doesn’t, this URL
returns 404 — in that case fall back to catalog.lmdb.zst.
It is the same format and schema as the global catalog (a zstd-compressed single-file LMDB); the only difference is the price values. So: try your personal URL, fall back to the global one on a 404, then decompress, open and read the file exactly as below.
What you get
catalog.lmdb.zst is a single-file LMDB database,
compressed with zstandard:
- One file, one keyspace. Items live in LMDB’s default database. Each item is one record — key = the 8-byte big-endian item id, value = a compact JSON object.
- Self-contained records. Every item embeds its full input form (
fields, each choice field with itsoptions) inline, so a single key lookup gives you everything you need to order that item. - Small and fast. A full catalog compresses ~45× (a ~1.5 MB database → ~34 KB). You decompress once, then memory-map the database and read it with no server round-trips.
Prices in the catalog are in cents (integers) and reflect standard pricing. Your final charge is always confirmed by the order response and your balance — see Placing orders.
Download and open it
Install the two readers, then download → decompress → open read-only.
★ Insight ─────────────────────────────────────
LMDB is memory-mapped, so opening the file is essentially free and lookups read
straight from the OS page cache — you can keep the env open and query it
millions of times without re-parsing anything. That’s why the catalog ships as
LMDB rather than one giant JSON array.
─────────────────────────────────────────────────
Record schema
Each value is a JSON object:
Each entry in fields:
Using the catalog with the Orders API
Everything you need to build a POST /api/v1/orders request is in the record:
item_id= the record’sid.quantity— bounded bymin_quantity/max_quantity. Required fortopup(decimal) andkey(integer, default1); omit forservice.fields— required fortopupandservice. Key each entry by the field’sname. For achoicefield, send the selected option’sid(the integer), not itsvalue. For text fields, send the string.
Staying up to date
The snapshot is regenerated regularly. Its freshness is the object’s HTTP
ETag / Last-Modified — use a conditional request so you only re-download
when it actually changed:
A simple, robust pattern for a running integration: refresh on a schedule (e.g. every few minutes) with the conditional request above, and when a new file arrives, decompress it and swap the open LMDB env.