Catalog reads work anywhere, server or browser, with any key. They retry network failures on their own.
The store
| Field | What it is |
|---|---|
| name, description, logoUrl, faviconUrl, accentColor | The store's brand |
| contact | { phone, email, address, city, whatsapp } |
| social | { website, facebook, instagram } |
| announcement | A running campaign's banner text, else the store's own announcement |
| campaignBanner | { text, campaignId } while a sale runs, else null |
| delivery | { insideDhaka, outsideDhaka } — the two delivery rates |
| tracking | { metaPixelId, gtmContainerId } |
| canonicalHost | The one address the store counts as on the web, for canonical links |
| currency, paymentMethods | 'BDT', ['COD'] |
Categories
A flat list. Build the tree from parentId. productCount counts published products directly in the category, not its children.
Products
ids: ['…', '…'] fetches specific products, for a "recently viewed" row.
A product
| Field | What it is |
|---|---|
| id, slug, name, sku | Identity. Link to /p/<slug>. |
| price | What checkout charges now, sale included |
| compareAtPrice, onSale | The pre-sale price during a sale (else the merchant's higher compare-at price) |
| campaign | { id, name, percent } of the running sale, or null |
| images | Image URLs, the first is the main photo |
| description, shortDescription | Sanitised HTML |
| contentTabs | [{ key, title, html }] — Specifications, Size Guide, Shipping & Returns… |
| category | { id, name, slug } or null |
| attributes | [{ name, values }] — the options a buyer picks, e.g. Size: S, M, L |
| variants | [{ id, name, sku, attrs: [{ name, value }], price, compareAtPrice, stock, inStock }] |
| stock | { total, inStock } |
| isNew, createdAt | isNew is true for 30 days after it’s added |
A product with variants needs a variantId in the bag; checkout answers OPTION_REQUIRED otherwise. Find the variant whose attrs match the buyer's picks:
Prices in description text are the merchant's own words; trust price.
Delivery
Dhaka district pays the store's inside-Dhaka rate. Every other district, Gazipur and Narayanganj included, pays the outside rate. A quote applies the same rule, so what you show is what's charged.
Freshness
Prices, stock and sales change in Dakio at any time. In a server-rendered site, refresh catalog pages every minute or so, or instantly with a webhook (Next.js: createRevalidateRoute). The quote is always live, so checkout is never wrong even when a page is a minute old.

