Skip to main content

Product API

Required. One endpoint that returns the venue's complete, current product list.

Required and Optional Data​

DataRequiredNotes
IdentifierYesStable and never reused. The Cheers product is linked to this value -- if it changes, the link is lost and the product appears as a new, unmatched one.
NameYesUsed for display and to help the partner match products.
Gross priceYesIn the major currency unit -- for HUF that means forints, without decimals. Not minor units (no fillér, no cents).
VAT rateYesAs a percentage. See VAT rates.
Takeaway VAT rateNoIf absent, no separate takeaway price is handled.
Stock informationNoBoolean or a status value (e.g. ACTIVE, available). If absent, stock sync stays disabled.
CurrencyNoAssumed to be HUF if absent.
Description, category, barcode, tags, unit of measureNoStored as supplementary data and shown to the partner in the Cheers CMS.

VAT Rates​

Send the rate as a percentage, not as a multiplier or a tax code.

  • Supported: integer values from 0 to 27, plus 5.5, 7.7 and 9.5.
  • Anything else: Cheers assumes 27.
Do not send internal tax codes

A value such as A, TAX_1 or 3 (meaning "the third VAT band") cannot be interpreted and falls back to 27%. If your POS stores VAT as a code, resolve it to a percentage before responding.

What You Are Free to Choose​

Response Shape​

A plain JSON array or an object wrapping the array under data, results or content -- all four are in live use.

Field Names and Language​

Entirely up to you. One live integration returns Hungarian field names; the adapter maps them.

HTTP Method​

Typically GET, but POST with a request body is equally acceptable.

Pagination​

Not required. If you do not paginate, Cheers requests the whole list in one call.

If you do paginate, two things are mandatory:

  1. Signal whether more pages exist -- e.g. a last: true flag, a next URL, or a total page count.
  2. Order deterministically -- the same query must return items in the same order across pages. Without a stable sort, products shift between pages while Cheers is walking them and some are never seen.

Examples​

All three of these are accepted. They differ only in shape.

Plain array​

[
{
"id": "SKU-1042",
"name": "Draft Beer 0.5L",
"price": 1890,
"vat": 27
},
{
"id": "SKU-1043",
"name": "Mineral Water 0.33L",
"price": 690,
"vat": 27,
"takeawayVat": 5,
"available": true
}
]

Wrapped in an object​

{
"data": [
{
"cikkszam": "SKU-1042",
"megnevezes": "Csapolt sör 0,5L",
"bruttoAr": 1890,
"afaKulcs": 27,
"keszleten": true
}
]
}

Paginated​

{
"content": [
{ "id": "SKU-1042", "name": "Draft Beer 0.5L", "price": 1890, "vat": 27 }
],
"page": 0,
"size": 100,
"totalElements": 254,
"last": false
}

If you are building this endpoint from scratch and have no existing shape to preserve, the following needs no clarification on our side and is the fastest path to a working adapter.

{
"id": "SKU-1042",
"name": "Draft Beer 0.5L",
"price": 1890,
"vat": 27,
"takeawayVat": 5,
"currency": "HUF",
"available": true,
"description": "Locally brewed lager",
"category": "Beers",
"barcode": "5998765432109",
"unit": "pcs"
}
This is a suggestion, not a specification

Do not restructure an existing endpoint to match it. Any other naming, nesting or language is equally accepted -- the adapter is written per POS. Only the content requirements in the table above are binding.

Variants​

If a product has several variants, sizes or packagings, each variant needs its own identifier and its own price. In Cheers every variant becomes a separate product.

[
{ "id": "SKU-1042-05", "name": "Draft Beer 0.5L", "price": 1890, "vat": 27 },
{ "id": "SKU-1042-03", "name": "Draft Beer 0.3L", "price": 1390, "vat": 27 }
]

A single product carrying a list of sizes without individual identifiers cannot be imported -- Cheers has no stable value to link each variant to.

Modifiers​

Modifiers (add-ons, options, extras -- "extra lemon", "no ice", "double shot") may be returned either on a separate endpoint or embedded in the product. Both work.

Modifiers also become separate products in Cheers, so each one requires an identifier, a name and a price:

{
"id": "SKU-1042",
"name": "Draft Beer 0.5L",
"price": 1890,
"vat": 27,
"modifiers": [
{ "id": "MOD-01", "name": "Extra lemon", "price": 150, "vat": 27 },
{ "id": "MOD-02", "name": "No ice", "price": 0, "vat": 27 }
]
}
Modifier ids appear in orders

When an order comes back through Counter Order, the modifier productId is exactly the identifier you sent here -- no mapping needed on your side.

Processing Rules​

Always return the full current list​

Every sync compares your complete response against the previous one. A product that is absent from the current response is flagged in the CMS as "disappeared from the POS".

This means you must return the entire current catalogue every time -- never a delta, never "only what changed since last time". Sending a changes-only response would flag the entire rest of the catalogue as missing.

Price and stock sync overwrite Cheers data​

If the partner enables price sync, the price from your response replaces the price on the Cheers product. The same applies to stock. So the price you return must always be the real, current gross selling price -- not a list price, not a net price, not a historical one.

Duplicate identifiers​

If the same identifier appears more than once in a response, Cheers keeps the first occurrence and discards the rest.