Skip to main content
With the Catalogue battery, OMNI holds the products you sell — prices, stock, pictures and sets — and the orders customers place. Through the API your own systems can keep those products up to date, place orders, and act on orders however they arrived: from a WhatsApp cart, drafted by an AI agent, or placed by hand in the panel. It is the same catalogue and the same orders the panel shows.
  • Catalogue’s endpoints are under /v1/catalogue/…. They exist when your account has Catalogue on; otherwise they answer 404 module_off.
  • Money is always in minor units — paise for INR, so 249900 is ₹2,499.00 — except in a CSV import, where prices are in rupees.
  • Changes made through the API are recorded under the key’s name, as “API · Shopify sync”, in a product’s history and an order’s.

Scopes

See Keys and scopes.

Products

A product’s SKU is your product code — up to 100 letters, digits, dots, dashes and underscores, unique in your account — and is what WhatsApp calls the retailer ID. It can’t change once the product is on WhatsApp. Availability is in_stock or out_of_stock; set stock to count what’s left (or null not to), and a stock of 0 makes the product out of stock. Every product on sale that is added or changed is queued for your WhatsApp catalogue, and its whatsapp.state follows it there: pending, then synced — or error, with the reason. Taking a product off sale hides it from customers and agents, but keeps it for the orders and conversations that name it. Pictures and imports are multipart form posts, not JSON: the picture in the field image, the CSV in the field file. An import checks every row before saving any, so a file with a bad row changes nothing.

Sets

A set is a collection of products sent together — as one WhatsApp product list, or one link on SMS and RCS. Put products in sets through their sets — a list of set names, on add or change, or the sets column of an import. A product is put in exactly the sets named, and a name that isn’t a set yet makes one.

Orders

Placing one

POST /v1/catalogue/orders takes a contact and the lines ordered, each naming a product by id or a SKU:
A line’s price is the product’s own — its sale price while it has one — unless you send unit_price_minor. Each line keeps its own copy of the name and price, so a later change to the product never rewrites what someone ordered. The order’s source is api, and its history begins “Placed through the API”. When your account has set Catalogue to open a deal for each order, the order opens one in Pipelines too. Send an Idempotency-Key header so a retried request places it once.

What happens to an order

An order starts new, and is then confirmed, declined, fulfilled or cancelled — by a person in the panel, an AI agent a person approved, or the API. A declined or cancelled order can’t be fulfilled: asking is refused with invalid_state (409), and the message says why. Asking for the status an order already has changes nothing and sends nothing again. If the channel can’t send a reply, the decision still stands and the order’s history says why the reply didn’t go.

Webhook events

Subscribe a webhook endpoint to: An order event carries the order, as order, and product.changed the product, as product — each in the shape its GET answers (order, without its history; product).
A CSV import doesn’t send product.changed for each row it saves. After an import, read the products you need with GET /v1/catalogue/products.