Documentation

Identifiers and fields

Product id

Most GET paths identify a unit as GTIN, a dot, then the target market country number (GS1 numeric code):

{GTIN}.{country}

Example used throughout the API: 01234567890123.208 (208 is Denmark). A product id without a dot is rejected.

GTIN (D8165) must be digits only.

Required fields on write

Create or update with JSON field ids, not labels.

Field Meaning
D8165 GTIN
D8255 Target market country number
D8276 Unit type. Required when creating a new product. Must not be sent as blank.

Example:

{
  "D8165": "01234567890123",
  "D8255": "208",
  "D8276": "BASE_UNIT_OR_EACH",
  "D8258_1": "Test product",
  "D8259_1": "en"
}

Unit types

When a path or body asks for unit type, use:

  • BASE_UNIT_OR_EACH
  • CASE
  • DISPLAY_SHIPPER
  • PALLET

You can also look a product up by internal item number D8256 with:

GET /api/details/{unitType}/{targetMarket}/{itemId}/{exportProfileId}

Grid fields

Repeating values (names, languages, nutrients, and similar) are grid fields. In JSON they use the field id plus _ plus a 1-based row index: D8258_1, D8259_1. Sending a grid field without a row index is rejected. Sending a non-grid field with a row index is also rejected.

To clear a whole grid on update, send deleteGrids as an array of grid names. Rows not listed in the request can be cleared that way. See Update products.

Field catalogue

GET /api/fields

GET /api/fields/{targetmarket}

Returns the field list for the instance (or one target market), including ids, Danish and English names, format, whether the field is a grid, keyword list name, and help text. Use this to map ERP columns to fmcgProducts ids.

Keywords

GET /api/keywords

GET /api/keywords/{codelist}

GET /api/keywords/{field}/{targetmarket}

Returns code lists with display value and code value. The field-specific path fails if the field name is unknown or the field does not use a keyword.

Read vs write names

GET can return display values for keyword fields when displayValues=true (or when the export profile has that option). Writes still expect codes, not translated labels.

Readonly and computed fields in an update body are ignored. Unknown field ids are rejected.