Developer docs contents

Sending prices

Create and update products in batches of up to 1,000, in the right order, with the wording you want.

Send prices with PUT /v1/stores/{store}/products. A product code not yet in the store is created; one that is already there is updated.

curl -X PUT https://api.eslana.com/v1/stores/STORE-014/products \
  -H 'Authorization: Bearer esl_test_…' \
  -H 'Content-Type: application/json' \
  -d '{
    "products": [
      { "barcode": "4011", "priceCents": 199, "name": "Bananas", "changedAt": "2026-10-30T09:00:00Z" },
      { "barcode": "5000112637922", "priceCents": 129, "isPromo": true, "changedAt": "2026-10-30T09:00:00Z" }
    ]
  }'

Fields

FieldRequiredMeaning
barcodeYesYour product code, up to 100 characters. It is what a label is paired with, so it should match the barcode on the shelf.
priceCentsYesThe shelf price in whole cents of your company currency. 199 is 1.99.
nameFor new codesUp to 200 characters. For an existing product, leave it out to keep the current name.
descriptionNoUp to 1,000 characters. Shown only if your label template includes it. null clears it; leaving it out keeps it.
isPromoNoDraws the label on your promotion template. Leaving it out means not on promotion.
changedAtRecommendedWhen the price changed in your POS, as ISO 8601. See ordering below.

Batch your writes

Every request costs one token from your key’s rate limit, whatever it carries. Sending 1,000 prices in one request is 1,000 times cheaper than sending them one at a time, and reaches the shelf just as fast.

A request with any invalid product is refused whole with 400, listing every problem by its position in your array. Nothing in it is queued, so you never have to work out which half landed.

Ordering with changedAt

Requests sent close together can arrive in a different order from the one they were sent in. Send changedAt with every product and an older change can never overwrite a newer one: it is reported as stale and ignored. Without it, the last request to arrive wins.

Names and descriptions

Each key has a name policy, set on the POS API page, for what a name or description sent for an existing product does:

PolicyEffect
Replace (default)Your POS wording replaces what is on the shelf.
ReviewThe price changes at once; the new wording waits for someone to accept it on the Products page.
Keep shelf namesWording from the POS is ignored for products that already exist.

Unchanged products cost nothing

If you resend your whole catalogue, only products whose price, promotion or wording actually changed are sent to the labels. The rest are reported as unchanged.