Release log
Changelog
Track all changes to the Innovorder public API. This changelog is automatically updated when API endpoints are added, modified, deprecated, or removed.
August 14, 2026
Public image payloads no longer expose the server-only absoluteFilePath field, including nested menu images. Consumers must use fullUrl to display or retrieve an image.
GET /library/brand/{brandId}GET /library/restaurant/{restaurantId}GET /library/pos_devices/{posDeviceId}GET /menus/{menuId}/hash_mapGET /menus/{menuId}/exportPOST /library/brand/{brandId}POST /library/restaurant/{restaurantId}PUT /library/brand/{imageId}PUT /library/restaurant/{imageId}Direct image uploads now canonicalize unsafe filename punctuation before storage, while explicit renames reject unsafe names with 400 invalid_parameters. Menu JSON imports canonicalize legacy punctuation before storing an image, and previously stored unsafe names are canonicalized in public responses. In all flows, filenames are trimmed, NFKC-normalized, limited to 255 characters, and exposed using only Unicode letters and numbers, spaces, underscores, dots, and hyphens.
POST /library/brand/{brandId}POST /library/restaurant/{restaurantId}POST /library/pos_devices/{posDeviceId}POST /library/restaurants/{restaurantId}/pos_devices/dual_screenPOST /menusPOST /v2/menusPUT /library/brand/{imageId}PUT /library/restaurant/{imageId}August 13, 2026
A table order whose restaurant point of sale does not answer now returns restaurant_offline (503) instead of 200. The injection into the table bill is confirmed by the point of sale inside the request, so a silent one meant the call answered success for an order that was never added to any bill and never would be. Only silence maps to this code: a point of sale that answers and declines keeps its previous behaviour. After a 503 on a table order, retry with a new idempotency-key, since reusing the previous one returns the earlier non servable order as a success.
POST /ordersGET /table_layout is now read from the restaurant own box first, with the platform copy as a fallback when the box cannot answer, so the endpoint still responds while the restaurant is offline. The box is asked first because the box is what accepts or refuses an order on a table: a plan edited in the back office but not yet published to the point of sale is no longer reported as orderable. A new source field on the response says which of the two answered, box or cloud. A restaurant whose box is not enrolled is served from the platform copy.
GET /table_layoutAugust 12, 2026
Order metadata now has a platform-reserved key: kioskPaymentState. On KIOSK orders (channelId 1) placed to be paid at the counter (willPayLater true, amount left to pay > 0), POST /orders sets metadata.kioskPaymentState to NOT_PAID_AT_KIOSK; on any other kiosk order a client-provided value for that key is removed. All other metadata keys are preserved, and non-kiosk orders are untouched. The key is returned in the order metadata by the order read endpoints, and stays NOT_PAID_AT_KIOSK even when the counter sale is reported as paid through a synthetic ExternalPayment.
POST /ordersGET /v1/ordersGET /v1/orders/{orderId}Documented the metadata field of the OmnichannelOrder webhook payload, including the platform-reserved kioskPaymentState key: an orders.paid delivery can carry status PAID and an ExternalPayment payment for a kiosk order the guest was expected to settle at the counter. Clarified that the key is written once at order creation and never updated, and that NOT_PAID_AT_KIOSK is the only value the API writes.
POST /ordersGET /v1/orders/{orderId}orders.paidorders.cancelledClarified the metadata field of POST /orders: it must parse as valid JSON, otherwise the order is rejected with 400 order_metadata_invalid, and it should be a JSON object. On a kiosk pay-at-counter order whose metadata is valid JSON of another shape (array or scalar), the API replaces the whole value with the reserved kioskPaymentState key instead of merging into it.
POST /ordersAdded the metadata field to the POST /orders and GET /v1/orders response examples, which already documented it in the shared order property table, and restored the missing message property in the GET /v1/orders and GET /v1/orders/{orderId} response envelopes. Also clarified the payment status at creation for a kiosk pay-at-counter order: it remains null when settlement is deferred to a receiving POS; without such a POS, POST /orders immediately returns the numeric value 1 (PAYMENT_OK) through the synthetic ExternalPayment, while order reads and webhooks report status PAID.
POST /ordersGET /v1/ordersGET /v1/orders/{orderId}Documented which order reads expose the metadata field, and therefore the reserved kioskPaymentState key: GET /v1/orders, GET /v1/orders/{orderId}, GET /v1/orders/uuid/{orderUuid} and the order webhooks all return it, while the lightweight GET /v1/orders/search payload never loads it and always returns metadata null. Added metadata to the GET /v1/orders/search and GET /v1/orders/uuid/{orderUuid} response examples.
GET /v1/orders/searchGET /v1/orders/uuid/{orderUuid}GET /v1/ordersGET /v1/orders/{orderId}Documented which creation paths enforce the reserved kioskPaymentState metadata key: POST /orders/bulk shares the order-creation code of POST /orders, so a KIOSK-channel bulk order also has a client-provided value for that key removed, and the key is never set there because bulk payloads carry no willPayLater field. Multi-restaurant orders keep their metadata untouched.
POST /orders/bulkPOST /ordersPOST /multi-ordersCompleted the eReporting error and parameter contract: permission_denied is a 401 when the account's role may not read eReporting (only Brand, Brand Group and Restaurant accounts may) and a 403 when the restaurantId is outside its perimeter; an unknown restaurantId answers 400 restaurant_not_found, while a restaurant that exists but has been closed or deactivated answers 403 permission_denied, a documented limitation to plan exports around. Documented that any query key other than those listed is refused with 400 invalid_parameters (brandId is resolved by the API and must not be sent), that a closureId is at most 128 characters and must be percent-encoded when it contains a slash, and that the reporting platform is given 120 seconds to answer an export before a 502 io_data_platform_unreachable.
GET /v1/ereporting/reportsGET /v1/ereporting/closuresGET /v1/ereporting/closures/{closureId}/ordersGET /v1/ereporting/exportDocumented the eReporting response payloads field by field: the daily report's orders[] are fiscal category aggregates (GOODS_VAT, SERVICES_VAT) and not individual orders, its restaurantId is returned as a string, and its payments[] carry one entry per payment method AND VAT rate; a closure's payments[] are not split per rate and carry a tip but no currency; nextCursor is null on the last page of a closure's orders, whose orderId is the reporting platform's own and not the Innovorder orderId. Clarified that GET /v1/ereporting/closures/{closureId}/orders is authorized by the reporting platform rather than against the local perimeter, so a closure you may not read answers io_data_platform_request_rejected with a 403 or 404 instead of permission_denied, and that the deactivated-restaurant limitation does not apply to it. Stated the 150-second ceiling the API keeps a request open, on all four routes.
GET /v1/ereporting/reportsGET /v1/ereporting/closuresGET /v1/ereporting/closures/{closureId}/ordersGET /v1/ereporting/exportSeparated, on the eReporting routes, what this API validates from what the reporting platform validates, because the two answer different error codes. Dates are checked on their shape only (four digits, two, two) and not as calendar dates, so a value such as 2026-02-31 clears this API and is refused upstream as io_data_platform_request_rejected rather than invalid_parameters; likewise the export range is not bounded here, so neither its 92-day cap nor startDate preceding endDate is enforced locally, and a refused range carries the platform's own 400 under that same code. Documented that a closureId made only of dots is refused with a 400, and that the API never retries the reporting platform on the caller's behalf: a 502 is one failed attempt, not an exhausted retry budget.
GET /v1/ereporting/reportsGET /v1/ereporting/closuresGET /v1/ereporting/closures/{closureId}/ordersGET /v1/ereporting/exportPOST /orders now refuses a Sit-in table order whose tableId is not part of the table layout of the restaurant's master POS device: table_not_found (404), with restaurantId and tableId in extraData, and no order is created. Documented the three conditions that trigger the injection of an order into a table's shared bill (MODE_SIT_IN + tableId + willPayLater) and added the tableId request field to the create payload reference.
POST /ordersPOST /orders no longer rewrites failures raised while persisting the order into create_order_max_retries_reached (409, "please try again"). Each failure is now returned with its own status and code, so a deterministic refusal can be told apart from a transient fault; retry only on 5xx and network timeouts, reusing the same idempotency-key. A point-of-sale notification failure still never costs the order.
POST /ordersPOST /orders/preview accepts willPayLater: true with payments omitted, exactly as with an empty array; previously only the empty array was accepted and an omitted payments returned invalid_order_payload (400). Sending willPayLater: true with a non-empty payments array is still refused.
POST /orders/previewCreating, updating or deleting a room now moves updatedAt on the table layout that contains it, and updating a room also moves the room's own updatedAt, even when only its tables changed. Integrations that poll a layout and diff updatedAt no longer miss table changes.
POST /roomsPUT /rooms/{roomUuid}DELETE /rooms/{roomUuid}GET /table-layouts/{tableLayoutUuid}August 11, 2026
Redesigned the developer documentation with a responsive pixel-art visual system, contextual architecture diagrams, a faster mobile-friendly homepage, and improved social sharing previews.
Documentation pages now have dedicated canonical URLs, faster lazy loading, mobile-friendly navigation, and improved cross-page links. Search now covers the complete documentation index.
New Sales & Catalog Synchronization integration guide: service-account authentication, incremental order extraction through ticketStartDate/ticketEndDate on lastUpdateDate, idempotent pagination and correction handling, neutral data mappings, and menu hash-map catalog refresh.
POST /oauth/loginGET /v1/ordersGET /menusGET /menus/{menuId}/hash_mapClarified that ticketStartDate and ticketEndDate filter lastUpdateDate on GET /v1/orders, and corrected the menu hash-map description to list its actual top-level catalog structures.
GET /v1/ordersGET /menus/{menuId}/hash_mapAugust 6, 2026
New eReporting integration guide: aggregated B2C sales data for the French e-reporting obligation (RFE), per restaurant and business date: daily report, closures, orders of a closure, and file export (JSON, or a ZIP of two CSVs) over a period. These endpoints answer the payload directly, without the { status, code, message, data } envelope, and require an Authorization Bearer access token (X-API-Key is not accepted on them).
GET /v1/ereporting/reportsGET /v1/ereporting/closuresGET /v1/ereporting/closures/{closureId}/ordersGET /v1/ereporting/exportJuly 24, 2026
Corrected the POST /oauth/login documentation: removed the erroneous expires_in field from response examples (this field is not returned by the API) and documented the real access token validity - 24 hours, or 14 days when rememberMe is true. When the token expires the API responds with a 401 error (token_expired).
POST /oauth/loginCorrected the POST /oauth/login documentation: removed the erroneous expires_in field from response examples (this field is not returned by the API) and documented the real access token validity: 24 hours, or 14 days when rememberMe is true. When the token expires the API responds with a 401 error (token_expired).
POST /oauth/loginJuly 23, 2026
New Stripe Payments integration guide: platform (Stripe Connect) model, payment metadata contract for POST /orders (stripePaymentMethodId / cardId as a JSON-encoded string), saved cards via the POST /cards/v2 SetupIntent flow, and 3-D Secure handling (required_action response, POST /orders/confirm). Stripe Checkout is not supported; the platform publishable key is provided through an integration project (support@innovorder.fr).
POST /ordersPOST /cards/v2POST /orders/confirmCorrected the POST /cards/v2 documentation: cardToken is a Stripe PaymentMethod id (pm_…) obtained by confirming the SetupIntent returned when calling without cardToken; the success response contains cardId, name, brand and last4.
POST /cards/v2July 13, 2026
Documented three new customer account webhook events: customer.account.added, customer.account.updated (fired on profile, badge, e-wallet balance, or activation-status changes), and customer.account.deleted (account archived). Added/updated deliveries carry a full account snapshot (email, balance, payment type, badges, activation status).
customer.account.addedcustomer.account.updatedcustomer.account.deletedJuly 10, 2026
New Customers page documenting the first-login mandatory password change flow: detecting the expired default password after login (customer.passwordExpiresAt), the 401 password_expired behavior, and the expired-password reset endpoint.
POST /oauth/loginPUT /customers/{customerId}/reset_passwordJuly 7, 2026
New menu lifecycle endpoints: read a menu configuration, export its full catalog, duplicate it to a brand or restaurants, and soft-delete it.
GET /menus/{menuId}GET /menus/{menuId}/exportPOST /menus/{menuId}/duplicateDELETE /menus/{menuId}Documented product management endpoints on menus: create, update, bulk-update, adjust quantity, duplicate, and delete products.
POST /menus/{menuId}/productsPUT /menus/{menuId}/products/{signature}PATCH /menus/{menuId}/productsPUT /menus/{menuId}/products/{signature}/quantityPOST /menus/{menuId}/products/{signature}/duplicateDELETE /menus/{menuId}/products/{signature}Documented step management endpoints on menus: read, create, update, convert steps between customization and cross-selling types, duplicate, and delete steps.
GET /menus/{menuId}/steps/{signature}POST /menus/{menuId}/stepsPUT /menus/{menuId}/steps/{signature}POST /menus/{menuId}/steps/convertPOST /menus/{menuId}/steps/{signature}/duplicateDELETE /menus/{menuId}/steps/{signature}Documented category management endpoints on menus: list categories, read a category, assign products to a category, reorder the category layout, and delete a category.
GET /menus/{menuId}/categoriesGET /menus/{menuId}/categories/{categoryId}POST /menus/{menuId}/categories/{categoryId}/productsPUT /menus/{menuId}/categories/layoutDELETE /menus/{menuId}/categories/{categoryId}New endpoint to toggle the availability of a whole category on the kiosk or web channel of a menu.
PUT /availability/{menuId}/{channelId}/category/{categoryId}New restaurant image library endpoints: upload an image or MP4 video, update image metadata (rename, focal point, zoom), and soft-delete an image.
POST /library/restaurant/{restaurantId}PUT /library/restaurant/{imageId}DELETE /library/restaurant/{imageId}New stock management endpoints: restaurant inventory with cursor pagination, stock movement audit trail, per-product timeline, stock settings, and stock deliveries.
GET /v2/restaurants/{restaurantId}/stockGET /v2/restaurants/{restaurantId}/stock/movementsGET /v2/restaurants/{restaurantId}/stock/movements/by-product/{productId}GET /v2/restaurants/{restaurantId}/stock/settingsPUT /v2/restaurants/{restaurantId}/stock/settingsGET /v2/restaurants/{restaurantId}/stock/deliveriesGET /v2/restaurants/{restaurantId}/stock/deliveries/{deliveryId}GET /v2/restaurants/{restaurantId}/stock/deliveries/{deliveryId}/reportPOST /v2/restaurants/{restaurantId}/stock/deliveriesDocumented consumption mode management endpoints (list, create, update, delete) per restaurant and sales channel.
GET /consumption_modesPOST /consumption_modesPUT /consumption_modes/{consumptionModeId}DELETE /consumption_modes/{consumptionModeId}Documented delivery area endpoints: list areas, replace the full area list of a restaurant, and bind/unbind areas to consumption modes.
GET /areas/restaurant/{restaurantId}POST /areas/restaurant/{restaurantId}POST /areas/{areaId}/consumption_modes/{consumptionModeId}DELETE /areas/{areaId}/consumption_modes/{consumptionModeId}Documented the VAT configuration referential endpoint listing selectable operation zones and VAT groups with rates per zone and consumption mode (JSON or CSV).
GET /api/v1/vat-configurationDocumented restaurant detail and legal information endpoints.
GET /restaurants/{restaurantId}GET /restaurants/{restaurantId}/legalPUT /restaurants/{restaurantId}/legalDocumented restaurant module configuration endpoints (list, read by channel, upsert).
GET /restaurants/{restaurantId}/modulesGET /restaurants/{restaurantId}/modules/{moduleId}POST /restaurants/{restaurantId}/modulesDocumented brand update, legal, payment configuration, modules and social network endpoints.
PUT /brands/{brandId}GET /brands/{brandId}/legalGET /brands/{brandId}/payment_configurationPUT /brands/{brandId}/payment_configurationGET /brands/{brandId}/modulesPOST /brands/{brandId}/modulesGET /brands/{brandId}/social_networkPOST /brands/{brandId}/social_networkPUT /brands/{brandId}/social_networkDocumented the brand audit history endpoints with filtering and pagination.
GET /historyGET /history/{historyId}Documented the fiscally compliant POS versions referential.
GET /pos_devices/compliant_versionsNew endpoint to retrieve a single webhook configuration by its ID, including its HMAC secret, event types, and subscribed channels.
GET /module_external_webhooks/{moduleId}Documented the public read-only URSSAF minimum amount endpoints used with the pricing rule isUrssafEnabled flag: current value in effect (current calendar year only, amount 0 means no minimum applicable) and full configuration history.
GET /minimum_urssaf/currentGET /minimum_urssaf/June 29, 2026
Order grants now include a taxBreakdowns array, ventilating each grant amount across the VAT rates of the products and fees it applied to (with discountableType and feeType). Useful for VAT reporting and URSSAF compliance.
GET /v1/orders/{orderId}GET /v1/ordersMarch 25, 2026
Documented pricing rules, grants, and entrance fees management endpoints with full CRUD operations and brand-level default policy configuration.
GET /pricing_rulesPOST /pricing_rulesPUT /pricing_rules/{id}DELETE /pricing_rules/{id}POST /pricing_rules/importGET /grants/{id}POST /grantsGET /entrance_fees/{id}POST /entrance_feesAdded coupon management documentation with list, create, update, and delete operations.
GET /couponsPOST /couponsPUT /coupons/{couponId}DELETE /coupons/{couponId}March 20, 2026
Documented cross-selling rules including CRUD, duplication, status toggle, and product listing per brand.
GET /cross-sellingPOST /cross-sellingPUT /cross-selling/{id}DELETE /cross-selling/{id}POST /cross-selling/{id}/duplicatePUT /cross-selling/{id}/statusAdded SKU management endpoints for brands.
GET /brands/{brandId}/skuPOST /brands/{brandId}/skuPATCH /brands/{brandId}/skus/{skuId}March 14, 2026
Documented POS operations: access management (roles, groups, users), workslots, POS orders, and shift management.
GET /restaurants/{id}/pos_access/rolesPOST /restaurants/{id}/pos_access/usersGET /v1/restaurants/{id}/pos_shifts/{date}GET /restaurants/{id}/shiftsAdded restaurant operations documentation covering zones, table layout, kitchen display, pickup schedules, pickup points, and kiosk configuration.
GET /api/v1/restaurants/{id}/operation-zonesPOST /table_layoutsGET /restaurants/{id}/kitchen_displayPOST /restaurants/{id}/pickup_schedulesMarch 7, 2026
Documented menu operations including copy products/steps across restaurants and pricing revaluation.
POST /menus/copy_productPOST /menus/copy_stepPOST /menus/pricing_revaluationAdded POS layout management documentation with read, write, and layout function endpoints.
GET /v2/menus/{menuId}/pos_layout/groups/0PUT /v2/menus/{menuId}/pos_layoutPOST /v2/menus/{menuId}/pos_layout_functionsFebruary 28, 2026
Documented loyalty program integration: configuration, OAuth flow, member management, rewards & cart, and loyalty cards.
GET /v1/loyalty/restaurants/{id}/configPUT /v1/loyalty/restaurants/{id}/configPOST /v1/loyalty/pairingPOST /v1/loyalty/deals/applicableGET /loyalty_cardsAdded location and delivery documentation with address autocomplete, geocoding, place details, and delivery area checks.
GET /location/autocompleteGET /location/place_detailsGET /location/geocodeGET /deliveries/restaurant/{restaurantId}February 20, 2026
Documented multi-restaurant order workflow including preview, create, confirm, get, and receipt endpoints.
POST /multi-ordersPOST /multi-orders/previewPOST /multi-orders/confirmGET /multi-orders/{multiOrderId}POST /multi-orders/receiptAdded order fulfillment documentation: pickup points, cart management, and delivery areas.
POST /order_pickup_pointsGET /order_pickup_points/{id}DELETE /carts/{cartId}February 14, 2026
Documented order management: summary export, cancel with contra entry, and manual payment method options.
GET /orders/summary/{exportType}POST /v1/orders/{orderPosId}/cancel-with-contra-entryGET /v1/orders/payment-methods/manual-optionsAdded order statistics and attendance documentation with count by interval and restaurant attendance endpoints.
GET /orders/count_by_intervalGET /restaurants/{id}/attendanceFebruary 7, 2026
Documented complete order creation flow: preview, create, confirm payment (Stripe & Adyen), send receipt, and bulk order creation.
POST /orders/previewPOST /ordersPOST /orders/confirmPOST /orders/confirm/adyenPOST /orders/receiptPOST /orders/bulkAdded cursor-based order search and order history endpoints.
GET /v1/orders/searchGET /v1/orders/{orderId}/historyGET /v1/orders/uuid/{orderUuid}January 31, 2026
Documented payment card management (Stripe) with create, list, and delete operations.
POST /cards/v2GET /cardsDELETE /cards/{cardId}Added order payment and payment methods bulk update documentation.
GET /order_payments/{id}PUT /order_payments/{id}PUT /payment_methodsJanuary 24, 2026
Documented e-wallet transaction reset (RAZ) including brand-wide reset, per-customer reset, auto-scheduling, rollback, and contact email management.
PUT /brands/{brandId}/reset_transactionsPOST /brands/{brandId}/auto_razDELETE /brands/{brandId}/rollback_last_razAdded e-wallet transaction creation and balance management endpoints.
POST /transactions/ewalletPUT /ewallet/balanceJanuary 17, 2026
Documented webhook configuration and event types for customer, order, and transaction events with HMAC-SHA256 signature verification.
Added brand configuration documentation covering brand groups, legal information, restaurant families, web ordering config, and email whitelisting.
GET /brands/{brandId}/groupsPUT /brand/{brandId}/legalGET /brand/{brandId}/brand_restaurant_familiesJanuary 10, 2026
Documented brand and restaurant referential endpoints including brand options, brand customers, student entities, restaurant management, POS devices, and payment methods.
GET /brands/{brandId}PUT /brands/{brandId}/optionsGET /restaurantsGET /pos_devicesJanuary 3, 2026
Documented customer data management: e-wallet balance history, customer import, ticket/receipt export, and customer metadata.
GET /customers/{id}/balance_historyPOST /customers/importPOST /customers/{id}/tickets/exportPOST /brands/{brandId}/customers/{id}/metadataAdded guest group CRUD documentation including bulk import.
GET /guest_groups/{id}POST /guest_groupsPUT /guest_groupsDELETE /guest_groupsPOST /guest_groups/importDecember 27, 2025
Documented customer credentials and badge management: password reset flows and badge CRUD.
PUT /customers/{id}/reset_passwordPOST /customers/forgotten_passwordPOST /customers/{id}/badgesDELETE /customers/{id}/badges/{badgeId}Added customer address management documentation.
GET /customers/{id}/addressesPOST /customers/{id}/addressesPUT /customers/{id}/addresses/{addressId}DELETE /customers/{id}/addresses/{addressId}December 20, 2025
Documented customer management endpoints: create, update, find, and customer login.
POST /brands/{brandId}/customersPUT /customers/{customerId}GET /customersPOST /customers/loginAdded customer hierarchy documentation explaining Group > Section > Sub-Section organizational structure.
December 13, 2025
Documented e-wallet types, customer balance retrieval, transaction history, and transaction listing.
GET /customers/{id}/balanceGET /customers/{id}/balance_historyGET /transactionsAdded user management documentation: list users, create manager, update user, and restaurant assignments.
GET /usersPOST /users/managerPUT /users/{userId}PUT /users/{userId}/restaurants/bulkDecember 6, 2025
Documented order retrieval and listing with filtering by brand, restaurant, customer, dates, channels, and status.
GET /v1/ordersGET /v1/orders/{orderId}Added ordering workflow overview explaining the preview → create → confirm flow.
December 1, 2025
Initial API documentation portal launched with authentication, user profiles, brand groups, and catalog/PIM documentation (menus, categories, products, steps, tags, images, real-time availability).
POST /oauth/loginGET /oauth/meGET /menus/{menuId}/productsGET /menus/{menuId}/stepsGET /menus/{menuId}/tagsPublished getting started guides covering API principles, security, network requirements, error codes, and integration recipes.