Skip to content
innovorder
⌘K

Product graph

Categories, Tags & Images

Categories

Categories organize products within a menu and can be nested one level deep (category > sub-category). Unlike products and steps, categories are addressed by their numeric categoryId.

GET/menus/{menuId}/categoriesList Categories

Retrieve all categories of a menu, with their sub-categories, products and product count. Only one of the has_no_children, no_subcategory and can_be_parent filters is applied per request (in that order of precedence).

Parameters

NameTypeRequiredDescription
menuIdintegerYesThe unique identifier of the menu.
searchstringNoFilter categories by name (query parameter).
limitintegerNoPagination limit (query parameter).
offsetintegerNoPagination offset (query parameter).
orderstringNoSort order (query parameter).
has_no_childrenstringNoSet to 1 to only return categories without sub-categories (query parameter).
no_subcategorystringNoSet to 1 to only return top-level categories (query parameter).
can_be_parentstringNoSet to 1 to only return categories that can receive sub-categories (query parameter).

Response

json
{
  "status": 200,
  "code": "categories_succeed",
  "data": [
    {
      "categoryId": 30085,
      "menuId": 106477,
      "name": "Burgers",
      "position": 1,
      "parentCategoryId": null,
      "productCount": 12,
      "products": [],
      "subCategory": []
    }
  ]
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"categories_succeed"Machine-readable application code for the result.
dataarray[…]Endpoint-specific response payload.
data[]object{…}Endpoint-specific response payload.
data[].categoryIdinteger30085Identifier of the category.
data[].menuIdinteger106477Identifier of the menu.
data[].namestring"Burgers"The name value.
data[].positioninteger1The position value.
data[].parentCategoryIdnullnullIdentifier of the associated parent category.
data[].productCountinteger12The product count value.
data[].productsarray[]List of products entries.
data[].subCategoryarray[]List of sub category entries.

GET/menus/{menuId}/categories/{categoryId}Get Category Details

Retrieve a single category with its products and sub-categories.

Parameters

NameTypeRequiredDescription
menuIdintegerYesThe unique identifier of the menu.
categoryIdintegerYesThe unique identifier of the category.

Response

json
{
  "status": 200,
  "data": {
    "categoryId": 30085,
    "menuId": 106477,
    "name": "Burgers",
    "position": 1,
    "parentCategoryId": null,
    "products": [
      {
        "productId": 464462,
        "name": "Cheeseburger",
        "price": 1200
      }
    ],
    "subCategory": []
  }
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
dataobject{…}Endpoint-specific response payload.
data.categoryIdinteger30085Identifier of the category.
data.menuIdinteger106477Identifier of the menu.
data.namestring"Burgers"The name value.
data.positioninteger1The position value.
data.parentCategoryIdnullnullIdentifier of the associated parent category.
data.productsarray[…]List of products entries.
data.products[]object{…}Object containing products fields.
data.products[].productIdinteger464462Identifier of the product.
data.products[].namestring"Cheeseburger"The name value.
data.products[].priceinteger1200The price value.
data.subCategoryarray[]List of sub category entries.

POST/menus/{menuId}/categoriesCreate Category

Create a category in a menu. Only "name" is required. If "position" is omitted, the category is appended at the end (max position + 1). Use "parentCategoryId" to create a sub-category.

Parameters

NameTypeRequiredDescription
menuIdintegerYesThe unique identifier of the menu.

Request Body

json
{
  "name": "Desserts",
  "description": "Sweet treats",
  "position": 2,
  "parentCategoryId": null,
  "imageId": 1001
}
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
namestring"Desserts"The name value.
descriptionstring"Sweet treats"The description value.
positioninteger2The position value.
parentCategoryIdnullnullIdentifier of the associated parent category.
imageIdinteger1001Identifier of the associated image.

Response

json
{
  "status": 200,
  "code": "category_creation_success",
  "message": "The category has been created with success.",
  "data": {
    "categoryId": 30090,
    "menuId": 106477,
    "name": "Desserts",
    "position": 2,
    "parentCategoryId": null,
    "imageId": 1001
  }
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"category_creation_success"Machine-readable application code for the result.
messagestring"The category has been created with success."Human-readable result message. Do not use this value for program logic.
dataobject{…}Endpoint-specific response payload.
data.categoryIdinteger30090Identifier of the category.
data.menuIdinteger106477Identifier of the menu.
data.namestring"Desserts"The name value.
data.positioninteger2The position value.
data.parentCategoryIdnullnullIdentifier of the associated parent category.
data.imageIdinteger1001Identifier of the associated image.

Full Replacement

The products array of the update below is required and replaces the complete product list of the category: an empty array empties the category. To add products without listing the existing ones, use POST /menus/{menuId}/categories/{categoryId}/products instead.

PUT/menus/{menuId}/categories/{categoryId}Update Category

Update a category attributes AND replace the full list of its products. The "products" array is required and defines the exact products (with their position) contained in the category after the call - an empty array empties the category. This endpoint is also used to reorder products within a category. To add products without listing the existing ones, use POST /menus/{menuId}/categories/{categoryId}/products instead.

Parameters

NameTypeRequiredDescription
menuIdintegerYesThe unique identifier of the menu.
categoryIdintegerYesThe unique identifier of the category.

Request Body

json
{
  "name": "Desserts & Pastries",
  "description": "Sweet treats",
  "position": 2,
  "parentCategoryId": null,
  "imageId": 1001,
  "products": [
    {
      "productId": 464490,
      "category_product": {
        "position": 1
      }
    },
    {
      "productId": 464491,
      "category_product": {
        "position": 2
      }
    }
  ]
}
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
namestring"Desserts & Pastries"The name value.
descriptionstring"Sweet treats"The description value.
positioninteger2The position value.
parentCategoryIdnullnullIdentifier of the associated parent category.
imageIdinteger1001Identifier of the associated image.
productsarray[…]List of products entries.
products[]object{…}Object containing products fields.
products[].productIdinteger464490Identifier of the product.
products[].category_productobject{…}Object containing category product fields.
products[].category_product.positioninteger1The position value.

Response

json
{
  "status": 200,
  "code": "category_has_been_updated",
  "message": "The category has been successfully updated",
  "data": {
    "categoryId": 30090,
    "menuId": 106477,
    "name": "Desserts & Pastries",
    "products": [
      {
        "productId": 464490
      },
      {
        "productId": 464491
      }
    ],
    "subCategory": []
  }
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"category_has_been_updated"Machine-readable application code for the result.
messagestring"The category has been successfully updated"Human-readable result message. Do not use this value for program logic.
dataobject{…}Endpoint-specific response payload.
data.categoryIdinteger30090Identifier of the category.
data.menuIdinteger106477Identifier of the menu.
data.namestring"Desserts & Pastries"The name value.
data.productsarray[…]List of products entries.
data.products[]object{…}Object containing products fields.
data.products[].productIdinteger464490Identifier of the product.
data.subCategoryarray[]List of sub category entries.

POST/menus/{menuId}/categories/{categoryId}/productsAdd Products to Category

Add existing products of the menu to a category without affecting the products already linked to it.

Parameters

NameTypeRequiredDescription
menuIdintegerYesThe unique identifier of the menu.
categoryIdintegerYesThe unique identifier of the category.

Request Body

json
{
  "productIds": [
    464490,
    464491
  ]
}
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
productIdsarray[…]List of product ids entries.
productIds[]integer464490The product ids value.

Response

json
{
  "status": 200,
  "code": "category_products_have_been_added",
  "message": "Products have been successfully added to the category"
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"category_products_have_been_added"Machine-readable application code for the result.
messagestring"Products have been successfully added to the category"Human-readable result message. Do not use this value for program logic.

PUT/menus/{menuId}/categories/layoutReorder Category Tree

Reorganize the whole category tree in a single call by setting the position and parent of each category.

Parameters

NameTypeRequiredDescription
menuIdintegerYesThe unique identifier of the menu.

Request Body

json
{
  "layout": [
    {
      "categoryId": 30085,
      "position": 1,
      "parentCategoryId": null
    },
    {
      "categoryId": 30090,
      "position": 2,
      "parentCategoryId": null
    },
    {
      "categoryId": 30091,
      "position": 1,
      "parentCategoryId": 30090
    }
  ]
}
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
layoutarray[…]List of layout entries.
layout[]object{…}Object containing layout fields.
layout[].categoryIdinteger30085Identifier of the category.
layout[].positioninteger1The position value.
layout[].parentCategoryIdnullnullIdentifier of the associated parent category.

Response

json
{
  "status": 200,
  "code": "category_layout_updated"
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"category_layout_updated"Machine-readable application code for the result.

DELETE/menus/{menuId}/categories/{categoryId}Delete Category

Remove a category from the menu.

Parameters

NameTypeRequiredDescription
menuIdintegerYesThe unique identifier of the menu.
categoryIdintegerYesThe unique identifier of the category to delete.

Response

json
{
  "status": 200,
  "code": "category_has_been_deleted"
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"category_has_been_deleted"Machine-readable application code for the result.
CategoryAttributes
typescript
interface CategoryAttributes {
  categoryId: number;
  menuId: number;
  name: string;
  description: string | null;
  position: number;
  parentCategoryId: number | null; // For nested sub-categories
  imageId: number | null;
  webAvailability: boolean;
  kioskAvailability: boolean;
}

Tags

Tags allow for grouping products across categories, often used for reporting or printing rules.

GET/menus/{menuId}/tagsGet Tags

Retrieve tags for a specific menu.

Parameters

NameTypeRequiredDescription
menuIdintegerYesThe unique identifier of the menu.

Response

json
{
  "status": 201,
  "code": "tags_succeed",
  "message": "Tags have been successfully retrieved.",
  "data": [
    {
      "tagId": 101,
      "name": "Vegan",
      "color": "#00ff00",
      "brandId": 3325,
      "posLocalId": null,
      "is_enabled": true,
      "created_at": "2026-07-11T10:00:00.000Z",
      "updated_at": "2026-07-11T10:00:00.000Z"
    }
  ]
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger201HTTP status code returned by the API.
codestring"tags_succeed"Machine-readable application code for the result.
messagestring"Tags have been successfully retrieved."Human-readable result message. Do not use this value for program logic.
dataarray[…]Endpoint-specific response payload.
data[]object{…}Endpoint-specific response payload.
data[].tagIdinteger101Identifier of the associated tag.
data[].namestring"Vegan"The name value.
data[].colorstring"#00ff00"The color value.
data[].brandIdinteger3325Identifier of the brand.
data[].posLocalIdnullnullIdentifier of the associated pos local.
data[].is_enabledbooleantrueWhether enabled is enabled or applies.
data[].created_atstring"2026-07-11T10:00:00.000Z"Timestamp when this resource was created.
data[].updated_atstring"2026-07-11T10:00:00.000Z"Timestamp when this resource was last updated.

POST/menus/{menuId}/tagsCreate Tag

Parameters

NameTypeRequiredDescription
menuIdintegerYesThe unique identifier of the menu.

Request Body

json
{
  "name": "Gluten Free",
  "color": "#ffff00",
  "is_enabled": true
}
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
namestring"Gluten Free"The name value.
colorstring"#ffff00"The color value.
is_enabledbooleantrueWhether enabled is enabled or applies.

Response

json
{
  "status": 201,
  "code": "tag_create_succeed",
  "message": "Tag has been successfully created.",
  "data": {
    "tagId": 103,
    "name": "Gluten Free",
    "color": "#ffff00",
    "brandId": 3325,
    "posLocalId": null,
    "is_enabled": true,
    "created_at": "2026-07-11T10:00:00.000Z",
    "updated_at": "2026-07-11T10:00:00.000Z"
  }
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger201HTTP status code returned by the API.
codestring"tag_create_succeed"Machine-readable application code for the result.
messagestring"Tag has been successfully created."Human-readable result message. Do not use this value for program logic.
dataobject{…}Endpoint-specific response payload.
data.tagIdinteger103Identifier of the associated tag.
data.namestring"Gluten Free"The name value.
data.colorstring"#ffff00"The color value.
data.brandIdinteger3325Identifier of the brand.
data.posLocalIdnullnullIdentifier of the associated pos local.
data.is_enabledbooleantrueWhether enabled is enabled or applies.
data.created_atstring"2026-07-11T10:00:00.000Z"Timestamp when this resource was created.
data.updated_atstring"2026-07-11T10:00:00.000Z"Timestamp when this resource was last updated.

GET/menus/{menuId}/tags/{tagId}Get Tag Details

Parameters

NameTypeRequiredDescription
menuIdintegerYesMenu ID
tagIdintegerYesTag ID

Response

json
{
  "status": 201,
  "code": "tags_succeed",
  "message": "Tags have been successfully retrieved.",
  "data": {
    "tagId": 101,
    "name": "Vegan",
    "color": "#00ff00",
    "brandId": 3325,
    "posLocalId": null,
    "is_enabled": true,
    "created_at": "2026-07-11T10:00:00.000Z",
    "updated_at": "2026-07-11T10:00:00.000Z"
  }
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger201HTTP status code returned by the API.
codestring"tags_succeed"Machine-readable application code for the result.
messagestring"Tags have been successfully retrieved."Human-readable result message. Do not use this value for program logic.
dataobject{…}Endpoint-specific response payload.
data.tagIdinteger101Identifier of the associated tag.
data.namestring"Vegan"The name value.
data.colorstring"#00ff00"The color value.
data.brandIdinteger3325Identifier of the brand.
data.posLocalIdnullnullIdentifier of the associated pos local.
data.is_enabledbooleantrueWhether enabled is enabled or applies.
data.created_atstring"2026-07-11T10:00:00.000Z"Timestamp when this resource was created.
data.updated_atstring"2026-07-11T10:00:00.000Z"Timestamp when this resource was last updated.

PUT/menus/{menuId}/tags/{tagId}Update Tag

Parameters

NameTypeRequiredDescription
menuIdintegerYesThe unique identifier of the menu.
tagIdintegerYesThe unique identifier of the tag.

Request Body

json
{
  "name": "Extra Spicy",
  "color": "#8b0000"
}
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
namestring"Extra Spicy"The name value.
colorstring"#8b0000"The color value.

Response

json
{
  "status": 200,
  "code": "tag_update_succeed",
  "message": "Tag has been successfully updated.",
  "data": {
    "tagId": 102,
    "name": "Extra Spicy",
    "color": "#8b0000",
    "brandId": 3325,
    "posLocalId": null,
    "is_enabled": true,
    "created_at": "2026-07-11T10:00:00.000Z",
    "updated_at": "2026-07-11T10:01:00.000Z"
  }
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"tag_update_succeed"Machine-readable application code for the result.
messagestring"Tag has been successfully updated."Human-readable result message. Do not use this value for program logic.
dataobject{…}Endpoint-specific response payload.
data.tagIdinteger102Identifier of the associated tag.
data.namestring"Extra Spicy"The name value.
data.colorstring"#8b0000"The color value.
data.brandIdinteger3325Identifier of the brand.
data.posLocalIdnullnullIdentifier of the associated pos local.
data.is_enabledbooleantrueWhether enabled is enabled or applies.
data.created_atstring"2026-07-11T10:00:00.000Z"Timestamp when this resource was created.
data.updated_atstring"2026-07-11T10:01:00.000Z"Timestamp when this resource was last updated.

DELETE/menus/{menuId}/tags/{tagId}Delete Tag

Soft-deletes the tag by disabling it. Products that already reference the tag are not deleted.

Parameters

NameTypeRequiredDescription
menuIdintegerYesThe unique identifier of the menu.
tagIdintegerYesThe unique identifier of the tag.

Response

json
{
  "status": 200,
  "code": "tag_delete_succeed",
  "message": "Tag has been successfully deleted."
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"tag_delete_succeed"Machine-readable application code for the result.
messagestring"Tag has been successfully deleted."Human-readable result message. Do not use this value for program logic.
TagAttributes
typescript
interface TagAttributes {
  tagId: number;
  name: string;
  color: string;
  brandId?: number;
  posLocalId?: number;
  is_enabled: boolean;
  created_at?: string;
  updated_at?: string;
}

Images

The Image Library allows you to manage assets for menus and products. Images can be scoped to a Brand (available to all restaurants) or a Restaurant (specific location).

Retrieve Images

GET/library/brand/{brandId}Get Brand Images

Retrieve all images available for the brand. Internal filesystem paths are omitted, and legacy filenames outside the public allowlist are canonicalized before being returned.

Parameters

NameTypeRequiredDescription
brandIdintegerYesBrand ID
limitintegerNoPagination limit
offsetintegerNoPagination offset

Response

json
{
  "status": 200,
  "code": "images_succeed",
  "message": "Image has been successfully retrieved.",
  "data": [
    {
      "imageId": 1001,
      "filename": "burger.jpg",
      "originalFilename": "burger.jpg",
      "fullUrl": "https://static.innovorder.fr/images/burger.jpg",
      "size": 245120,
      "mimeType": "image/jpeg",
      "restaurantId": null,
      "brandId": 3325,
      "focalX": 50,
      "focalY": 50,
      "zoom": 100
    }
  ]
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"images_succeed"Machine-readable application code for the result.
messagestring"Image has been successfully retrieved."Human-readable result message. Do not use this value for program logic.
dataarray[…]Endpoint-specific response payload.
data[]object{…}Endpoint-specific response payload.
data[].imageIdinteger1001Identifier of the associated image.
data[].filenamestring"burger.jpg"The filename value.
data[].originalFilenamestring"burger.jpg"The original filename value.
data[].fullUrlstring"https://static.innovorder.fr/images/burger.jpg"The full url value.
data[].sizeinteger245120The size value.
data[].mimeTypestring"image/jpeg"The mime type value.
data[].restaurantIdnullnullIdentifier of the restaurant.
data[].brandIdinteger3325Identifier of the brand.
data[].focalXinteger50The focal x value.
data[].focalYinteger50The focal y value.
data[].zoominteger100The zoom value.

GET/library/restaurant/{restaurantId}Get Restaurant Images

Retrieve images specific to a restaurant. Internal filesystem paths are omitted, and legacy filenames outside the public allowlist are canonicalized before being returned.

Parameters

NameTypeRequiredDescription
restaurantIdintegerYesRestaurant ID

Response

json
{
  "status": 200,
  "code": "images_succeed",
  "message": "Image has been successfully retrieved.",
  "data": [
    {
      "imageId": 2001,
      "filename": "pizza.jpg",
      "originalFilename": "pizza.jpg",
      "fullUrl": "https://static.innovorder.fr/images/pizza.jpg",
      "size": 245120,
      "mimeType": "image/jpeg",
      "restaurantId": 6801,
      "brandId": 3325,
      "focalX": 50,
      "focalY": 50,
      "zoom": 100
    }
  ]
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"images_succeed"Machine-readable application code for the result.
messagestring"Image has been successfully retrieved."Human-readable result message. Do not use this value for program logic.
dataarray[…]Endpoint-specific response payload.
data[]object{…}Endpoint-specific response payload.
data[].imageIdinteger2001Identifier of the associated image.
data[].filenamestring"pizza.jpg"The filename value.
data[].originalFilenamestring"pizza.jpg"The original filename value.
data[].fullUrlstring"https://static.innovorder.fr/images/pizza.jpg"The full url value.
data[].sizeinteger245120The size value.
data[].mimeTypestring"image/jpeg"The mime type value.
data[].restaurantIdinteger6801Identifier of the restaurant.
data[].brandIdinteger3325Identifier of the brand.
data[].focalXinteger50The focal x value.
data[].focalYinteger50The focal y value.
data[].zoominteger100The zoom value.

GET/library/pos_devices/{posDeviceId}Get POS Device Image

Retrieves the image assigned to one POS device. Internal filesystem paths are omitted, and legacy filenames outside the public allowlist are canonicalized before being returned. The device must exist and have an image; otherwise the API returns a not-found error.

Parameters

NameTypeRequiredDescription
posDeviceIdintegerYesPOS device whose image is retrieved.

Response

json
{
  "status": 200,
  "code": "images_succeed",
  "message": "Image has been successfully retrieved",
  "data": {
    "imageId": 3001,
    "filename": "pos-background.jpg",
    "originalFilename": "pos-background.jpg",
    "fullUrl": "https://static.innovorder.fr/images/pos-background.jpg",
    "size": 245120,
    "mimeType": "image/jpeg",
    "restaurantId": null,
    "brandId": 3325,
    "posDeviceId": 8063,
    "focalX": 50,
    "focalY": 50,
    "zoom": 100,
    "created_at": "2026-07-11T09:00:00.000Z",
    "updated_at": "2026-07-11T09:00:00.000Z",
    "deleted_at": null
  }
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"images_succeed"Machine-readable application code for the result.
messagestring"Image has been successfully retrieved"Human-readable result message. Do not use this value for program logic.
dataobject{…}Endpoint-specific response payload.
data.imageIdinteger3001Identifier of the associated image.
data.filenamestring"pos-background.jpg"The filename value.
data.originalFilenamestring"pos-background.jpg"The original filename value.
data.fullUrlstring"https://static.innovorder.fr/images/pos-background.jpg"The full url value.
data.sizeinteger245120The size value.
data.mimeTypestring"image/jpeg"The mime type value.
data.restaurantIdnullnullIdentifier of the restaurant.
data.brandIdinteger3325Identifier of the brand.
data.posDeviceIdinteger8063Identifier of the associated pos device.
data.focalXinteger50The focal x value.
data.focalYinteger50The focal y value.
data.zoominteger100The zoom value.
data.created_atstring"2026-07-11T09:00:00.000Z"Timestamp when this resource was created.
data.updated_atstring"2026-07-11T09:00:00.000Z"Timestamp when this resource was last updated.
data.deleted_atnullnullTimestamp when this resource was deleted, or null when it is active.

Upload Images

Creating an image is a multi-step process or handled via multipart/form-data.

POST/library/brand/{brandId}Upload Brand Image

Upload a new image file. Supports `?resize=true` query param. The original filename is trimmed, NFKC-normalized, limited to 255 characters, and canonicalized to Unicode letters and numbers, spaces, underscores, dots, and hyphens. Unsupported punctuation is replaced with underscores; a missing or empty name returns 400 invalid_parameters.

Parameters

NameTypeRequiredDescription
brandIdintegerYesThe unique identifier of the brand.
resizestringNoSet to "true" to resize the image on upload.

Request Body

json
Multipart Form Data: file=[binary]
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
filebinary[binary]Binary file uploaded in this multipart field.

Response

json
{
  "status": 201,
  "code": "upload_image_succeed",
  "message": "Image has been successfully added to the image bank.",
  "data": {
    "imageId": 1001,
    "filename": "burger.jpg",
    "originalFilename": "burger.jpg",
    "fullUrl": "https://static.innovorder.fr/images/burger.jpg",
    "size": 245120,
    "mimeType": "image/jpeg",
    "restaurantId": null,
    "brandId": 3325,
    "focalX": 50,
    "focalY": 50,
    "zoom": 100
  }
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger201HTTP status code returned by the API.
codestring"upload_image_succeed"Machine-readable application code for the result.
messagestring"Image has been successfully added to the image bank."Human-readable result message. Do not use this value for program logic.
dataobject{…}Endpoint-specific response payload.
data.imageIdinteger1001Identifier of the associated image.
data.filenamestring"burger.jpg"The filename value.
data.originalFilenamestring"burger.jpg"The original filename value.
data.fullUrlstring"https://static.innovorder.fr/images/burger.jpg"The full url value.
data.sizeinteger245120The size value.
data.mimeTypestring"image/jpeg"The mime type value.
data.restaurantIdnullnullIdentifier of the restaurant.
data.brandIdinteger3325Identifier of the brand.
data.focalXinteger50The focal x value.
data.focalYinteger50The focal y value.
data.zoominteger100The zoom value.

POST/library/restaurant/{restaurantId}Upload Restaurant Image

Upload a media file (image or MP4 video) to a restaurant image library. Send the file as multipart/form-data in a field named "file" (required). The original filename is trimmed, NFKC-normalized, limited to 255 characters, and canonicalized to Unicode letters and numbers, spaces, underscores, dots, and hyphens. Unsupported punctuation is replaced with underscores; a missing or empty name returns 400 invalid_parameters. Accepted images: png, jpg, jpeg, gif, bmp - up to 30 MB (errors: file_extension_not_allowed, file_too_large). Accepted video: video/mp4 - up to 100 MB. Returns HTTP 201 with code "upload_image_succeed" for images or "upload_video_succeed" for videos.

Parameters

NameTypeRequiredDescription
restaurantIdintegerYesRestaurant ID.
resizestringNoSet to "true" to resize the image on upload, images only (query parameter).

Request Body

json
Multipart Form Data: file=[binary]
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
filebinary[binary]Binary file uploaded in this multipart field.

Response

json
{
  "status": 201,
  "code": "upload_image_succeed",
  "message": "Image has been successfully added to the image bank.",
  "data": {
    "imageId": 2001,
    "filename": "pizza.jpg",
    "originalFilename": "pizza.jpg",
    "fullUrl": "https://static.innovorder.fr/images/...",
    "mimeType": "image/jpeg",
    "size": 245120,
    "focalX": 50,
    "focalY": 50,
    "brandId": 3325,
    "restaurantId": 6801
  }
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger201HTTP status code returned by the API.
codestring"upload_image_succeed"Machine-readable application code for the result.
messagestring"Image has been successfully added to the image bank."Human-readable result message. Do not use this value for program logic.
dataobject{…}Endpoint-specific response payload.
data.imageIdinteger2001Identifier of the associated image.
data.filenamestring"pizza.jpg"The filename value.
data.originalFilenamestring"pizza.jpg"The original filename value.
data.fullUrlstring"https://static.innovorder.fr/images/..."The full url value.
data.mimeTypestring"image/jpeg"The mime type value.
data.sizeinteger245120The size value.
data.focalXinteger50The focal x value.
data.focalYinteger50The focal y value.
data.brandIdinteger3325Identifier of the brand.
data.restaurantIdinteger6801Identifier of the restaurant.

POST/library/pos_devices/{posDeviceId}Upload POS Device Image

Uploads or replaces the image assigned to a POS device. Send one image in the multipart field file. The original filename is trimmed, NFKC-normalized, limited to 255 characters, and canonicalized to Unicode letters and numbers, spaces, underscores, dots, and hyphens. Unsupported punctuation is replaced with underscores; a missing or empty name returns 400 invalid_parameters. The endpoint returns the normal success envelope without a data field.

Parameters

NameTypeRequiredDescription
posDeviceIdintegerYesPOS device that receives the image.

Request Body

json
file=[binary]
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeRequiredExampleDescription
filebinaryYes[binary]Image file to upload for the POS device.

Response

json
{
  "status": 200,
  "code": "images_succeed",
  "message": "Image has been successfully retrieved"
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger200HTTP status code returned by the API.
codestring"images_succeed"Machine-readable application code for the result.
messagestring"Image has been successfully retrieved"Human-readable result message. Do not use this value for program logic.

POST/library/restaurants/{restaurantId}/pos_devices/dual_screenUpload Dual-Screen Image to POS Devices

Uploads one image to a selected set of POS devices in the restaurant. The original filename is trimmed, NFKC-normalized, limited to 255 characters, and canonicalized to Unicode letters and numbers, spaces, underscores, dots, and hyphens; unsupported punctuation is replaced with underscores. The response is a chunked text/plain stream: progress lines are followed by the final JSON object. The request accepts a maximum 10-minute server timeout.

Parameters

NameTypeRequiredDescription
restaurantIdintegerYesRestaurant that owns every selected POS device.

Request Body

json
file=[binary]
posDeviceIds=[1,2,3]
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeRequiredExampleDescription
filebinaryYes[binary]Image file uploaded once and applied to each selected POS device.
posDeviceIdsstringYes[1,2,3]JSON-encoded array of integer POS device IDs, for example [8063,8064].

Response

json
HTTP 200 text/plain; charset=utf-8 with chunked progress lines. The final chunk is JSON: {"success":true} when every requested device succeeded, or {"success":false,"error":"..."} when the upload handler catches an error. A requested device outside the restaurant is reported in the stream and makes success false.
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeRequiredExampleDescription
HTTP 200 text/plain; charsetstringNot specifiedutf-8 with chunked progress lines. The final chunk is JSON: {"success":true} when every requested device succeeded, or {"success":false,"error":"..."} when the upload handler catches an error. A requested device outside the restaurant is reported in the stream and makes success false.The http 200 text/plain; charset value.
successbooleanYesNot providedFinal JSON field: true only when every requested device received the image.
errorstringNoNot providedFinal JSON field supplied when the upload handler catches an error.

Restaurant Upload Behavior

  • The media is stored at the brand level of the restaurant (brandId is filled), with restaurantId set on the record to scope it to the restaurant.
  • Uploaded images are automatically tagged "<restaurant name> Library" - the tag is created at brand level if it does not exist yet. Videos are not tagged.
  • This endpoint returns HTTP 201, not 200.

Manage Images

PUT/library/brand/{imageId}Update Image Metadata

Update attributes like filename or focal point.

Parameters

NameTypeRequiredDescription
imageIdintegerYesThe unique identifier of the brand-level image.

Request Body

json
{
  "filename": "burger_hd.jpg",
  "focalX": 40,
  "focalY": 60,
  "zoom": 100,
  "fullUrl": "https://static.innovorder.fr/images/burger_hd.jpg",
  "size": 250000,
  "mimeType": "image/jpeg"
}
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeRequiredExampleDescription
filenamestringYes"burger_hd.jpg"New display filename (1-255 characters). Unicode letters and numbers, spaces, underscores, dots, and hyphens only; the value is trimmed and NFKC-normalized.
focalXintegerNo40Horizontal focal-point percentage.
focalYintegerNo60Vertical focal-point percentage.
zoomintegerNo100Zoom level used when rendering the image.
fullUrlstringNo"https://static.innovorder.fr/images/burger_hd.jpg"Replacement public URL, when explicitly managed by the caller.
sizeintegerNo250000Replacement file size in bytes, when explicitly managed by the caller.
mimeTypestringNo"image/jpeg"Replacement MIME type, when explicitly managed by the caller.

Response

json
{
  "status": 201,
  "code": "image_update_succeed",
  "message": "Image has been successfully updated.",
  "data": {
    "imageId": 1001,
    "filename": "burger_hd.jpg",
    "originalFilename": "burger.jpg",
    "fullUrl": "https://static.innovorder.fr/images/burger_hd.jpg",
    "size": 250000,
    "mimeType": "image/jpeg",
    "restaurantId": null,
    "brandId": 3325,
    "focalX": 40,
    "focalY": 60,
    "zoom": 100
  }
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger201HTTP status code returned by the API.
codestring"image_update_succeed"Machine-readable application code for the result.
messagestring"Image has been successfully updated."Human-readable result message. Do not use this value for program logic.
dataobject{…}Endpoint-specific response payload.
data.imageIdinteger1001Identifier of the associated image.
data.filenamestring"burger_hd.jpg"The filename value.
data.originalFilenamestring"burger.jpg"The original filename value.
data.fullUrlstring"https://static.innovorder.fr/images/burger_hd.jpg"The full url value.
data.sizeinteger250000The size value.
data.mimeTypestring"image/jpeg"The mime type value.
data.restaurantIdnullnullIdentifier of the restaurant.
data.brandIdinteger3325Identifier of the brand.
data.focalXinteger40The focal x value.
data.focalYinteger60The focal y value.
data.zoominteger100The zoom value.

DELETE/library/brand/{imageId}Delete Image

Permanently remove an image from the library.

Parameters

NameTypeRequiredDescription
imageIdintegerYesThe unique identifier of the brand-level image.

Response

json
{
  "status": 201,
  "code": "image_delete_succeed",
  "message": "The image has been successfully deleted."
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger201HTTP status code returned by the API.
codestring"image_delete_succeed"Machine-readable application code for the result.
messagestring"The image has been successfully deleted."Human-readable result message. Do not use this value for program logic.

PUT/library/restaurant/{imageId}Update Restaurant Image Metadata

Update the metadata of a restaurant library image: rename it or adjust its focal point and zoom. This endpoint does NOT replace the binary file - it accepts a JSON body only. The image must belong to a restaurant (restaurantId set), otherwise 400 invalid_parameters: brand-level images cannot be updated through this route. "filename" is required (400 missing_parameters otherwise); "focalX", "focalY" and "zoom" are optional integers.

Parameters

NameTypeRequiredDescription
imageIdintegerYesThe unique identifier of the image.

Request Body

json
{
  "filename": "pizza_hd.jpg",
  "focalX": 40,
  "focalY": 60,
  "zoom": 100
}
Request Body Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
filenamestring"pizza_hd.jpg"The filename value.
focalXinteger40The focal x value.
focalYinteger60The focal y value.
zoominteger100The zoom value.

Response

json
{
  "status": 201,
  "code": "image_update_succeed",
  "message": "Image has been successfully updated",
  "data": {
    "imageId": 2001,
    "filename": "pizza_hd.jpg",
    "fullUrl": "https://static.innovorder.fr/images/...",
    "focalX": 40,
    "focalY": 60,
    "brandId": 3325,
    "restaurantId": 6801
  }
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger201HTTP status code returned by the API.
codestring"image_update_succeed"Machine-readable application code for the result.
messagestring"Image has been successfully updated"Human-readable result message. Do not use this value for program logic.
dataobject{…}Endpoint-specific response payload.
data.imageIdinteger2001Identifier of the associated image.
data.filenamestring"pizza_hd.jpg"The filename value.
data.fullUrlstring"https://static.innovorder.fr/images/..."The full url value.
data.focalXinteger40The focal x value.
data.focalYinteger60The focal y value.
data.brandIdinteger3325Identifier of the brand.
data.restaurantIdinteger6801Identifier of the restaurant.

DELETE/library/restaurant/{imageId}Delete Restaurant Image

Delete an image from a restaurant library. This is a soft delete: the image disappears from listings but the underlying file is not removed from storage. The image must belong to a restaurant (restaurantId set), otherwise 400 invalid_parameters.

Parameters

NameTypeRequiredDescription
imageIdintegerYesThe unique identifier of the image to delete.

Response

json
{
  "status": 201,
  "code": "image_delete_succeed",
  "message": "the image has been successfully deleted"
}
Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

PropertyTypeExampleDescription
statusinteger201HTTP status code returned by the API.
codestring"image_delete_succeed"Machine-readable application code for the result.
messagestring"the image has been successfully deleted"Human-readable result message. Do not use this value for program logic.

Restaurant Library Gotchas

  • The update and delete routes return HTTP 201 (historical behavior) - including the DELETE.
  • If the imageId does not exist, the API returns a 500 server error instead of a clean 404. Verify the ID first with GET /library/restaurant/{restaurantId}.
  • Deletion is a soft delete: the public file URL keeps being served, and existing references (products or categories pointing to the image) are not cleaned up.
ImageAttributes
typescript
interface ImageAttributes {
  imageId: number;
  filename: string | null;
  originalFilename: string | null;
  fullUrl: string;
  size: number;
  mimeType: string;
  focalX: number;
  focalY: number;
  restaurantId: number | null;
  brandId: number;
}