Stay up-to-date with the latest changes and improvements to the Eshop-rychle API
Subscribe:
GET /invoices and /invoices/{id} are out of beta and their contract is now stable. They serve every accounting document the e-shop issues — invoice, credit note, advance invoice and payment receipt; documentType says which one. Each document carries its lines in items and their per-VAT-rate recap in vatRecap, rounded to cents as the printed document, plus roundingAmount, advanceDeductions split by VAT rate, paidAmount and remainingToPay, the currency the document is issued in, relatedDocuments and, on a credit note, isStockReturned. Filter by documentType, dateIssue and invoiceChanged to fetch only what changed since your last read; the invoiceCreate, invoiceChange and invoiceDelete webhooks tell you when to. Needs order read permission.
GET /product-items and /products carry isProductSet and the composition in productSetItemList, with an isProductSet filter. New /product-sets resource: POST adds a component, PATCH changes its quantity, DELETE removes it; filter by productItem for one set or by productSetItem for the sets a product is part of. Turn a product into a set with isProductSet: true on PATCH /product-items/{id}. The stock of a set is derived from its components and recalculated after every change; a written stock value is replaced by the derived one. Orders carry the sold components in orderProductSetList, invoices in productSetItemList. Writing requires the product sets feature to be enabled for the e-shop, otherwise 422.
category.products[] in the frontend dataLayer now carries productUuid and productItemUuid, like the other product blocks. Every product box in the page HTML carries the same values as data-product-uuid and data-product-item-uuid, so a script that adds content to a listing can tell which box is which product, including boxes added by "Load more". Contract version 1.2.
Added POST /discount-coupons/batch for creating up to 400 coupons in one request, e.g. a unique code for every newsletter recipient. Items take the fields of POST /discount-coupons without products, categories and shippings. A code that already exists is not overwritten: that item returns responseCode 409 and the rest are created, so resend only the conflicts.
Switching to another variant on a product detail page now pushes a productView event with the selected variant, and getEshopDataLayer('product') returns that variant. Before, the dataLayer kept the originally loaded product until the next page load. The event shape is unchanged, so the contract stays at version 1.1.
Product blocks in the frontend dataLayer now carry productUuid and productItemUuid, the same ids as /products/{id} and /product-items/{id} in the REST API and webhooks. For a variant, productItemUuid is the variant's item. Fixed: order.items[].id on the thank-you page now carries the same product id as productView and cart. Contract version 1.1.
The exchange response now carries userEmail and userRole of the administration user who clicked Open application — any user allowed to manage modules can, not only the owner. userRole is owner, user, auditor, design or support; support means Eshop-rychle staff. Both are null for older codes and for a role outside that list. customerEmail still carries the owner's e-mail.
Assigning a product to a category or removing it — including the primary category and deleting a category — now moves productChanged on GET /products and sends productChange. Renaming or moving a category in the tree does not touch its products; GET /categories gained changed[after] for that. Always add order[changed]=asc, or paging skips rows.
Added the orderPaymentChange webhook. It fires whenever an order switches between paid and unpaid, whatever the source — payment gateway, bank statement pairing, Homecredit or a manual change in the admin. The payload carries the order ID and the new isPaid value, one order per message. Orders created as already paid are not reported; orderCreate covers them. Fires only if the package and API access are allowed to read orders, and nothing reaches you until you register the type.
New GET and PATCH /api-engine/variant-configs with variantMode. productItems means every variant is a product item of its own — write variants via /product-items and /product-variant-definitions. combinationalVariants means the old variants, one base price plus surcharges — write them via /product-combinational-variants. Read it before writing variants; /product-dials is shared by both modes and does not tell them apart. Switching to productItems also makes choosing a variant mandatory and overwrites the stock of main products with the sum of their variants. Sending the mode that is already set changes nothing. Needs the e-shop config read or write permission.
New /product-reviews resource: customer reviews with rating, text, author, product and the merchant's reply, filterable by change time, product and published state. POST creates a review, PATCH hides it or replies. Webhooks productReviewCreate, productReviewChange and productReviewDelete send one review per message. Needs product read/write permission and the Product rating package.
GET /products filters on productChanged[after] — any change to the product or its items, stock movements included. productItemChanged[after] on /product-items misses product-level changes. Always add order[…]=asc, or paging skips rows. Send shop-local time without an offset. The first poll returns the whole catalogue; deletions come only via productDelete.
Orders now carry isBlacklisted. It is true when the name, e-mail or phone number of the delivery or billing address matches the e-shop's blacklist, ignoring case and diacritics — the same warning the merchant sees in the administration. It never blocks the order, and it cannot be filtered on.
An active package can now send a merchant to your application with a 60-second one-time code. Exchange it from your backend on the fixed api.eshop-rychle.cz host with X-AUTH-TOKEN; never trust the website query parameter before the exchange. customerEmail can be an empty string.
Orders now carry deliveryType, paymentType, deliveryMethodId and paymentMethodId — a snapshot taken when the order was placed, so cash on delivery stays recognisable after the e-shop renames or deletes the method. Gateway orders add paymentSubMethod { id, name }. UUIDs match id in /delivery-methods and /payment-methods; on older orders the snapshot is filled only where it could be reconstructed.
Added the invoiceCreate, invoiceChange and invoiceDelete webhooks, covering all four document types — invoice, credit note, advance invoice and payment receipt; documentType says which one. Documents are batched per e-shop and de-duplicated. The payload carries only IDs — fetch the current data via GET /api-engine/invoices/{id} (a deleted document returns 404). If a notification is missed, GET /api-engine/invoices with invoiceChanged[after] lists everything touched since your last read. Fires only if the package and API access are allowed to read orders, and nothing reaches you until you register the type.
Creating a sub-resource with some text fields left out, or creating one that already exists, failed with a bare 500. Both now return 422 naming the field or the conflict.
GET /delivery-methods and GET /payment-methods list what the e-shop really offers at checkout. Deliveries carry their bands — price, weight and order-value limits, and the UUIDs of the payments allowed in each band. Payments carry paymentType, the surcharge, an image and the active sub-methods of gateways. Both collections are unpaginated and need the e-shop config read permission.
Documents now carry peppolReportedAt — the moment the document was handed over to the e-invoicing (Peppol) network. Read it on GET /invoices, set or clear it with the new PATCH; it is the only writable field. Once set, the administration warns the merchant before editing the document, so what you reported stays in sync.
GET /product-videos now accepts the product query filter (UUID or IRI, plus id for completeness), matching what /product-images already offers with productItem. Until now the parameter was silently ignored and the collection always returned all videos of the e-shop.