Modality Reference
What is a modality?β
A modality is a property attached to an annotation in the image recognition (IR) response. It carries annotation-level metadata produced by a model or pipeline step (price, realogram position, facing count, fixture type, etc.).
Modalities are not strongly typed. Every value is a string; composite values are underscore-delimited (e.g. {price}_{quantity}_{text}). Consumers must know the format per key.
Response shape (API v3)β
Each annotation has a modalities list. Each modality has a key and one or more predictions:
{
"annotation_id": 34,
"annotation_type": "promo",
"bbox": { "x": 2454, "y": 5001, "width": 1174, "height": 482 },
"modalities": [
{
"key": "promo:price",
"predictions": [
{ "value": "5_1", "score": 1.0, "prediction_info": null },
{ "value": "7.5_1", "score": 1.0, "prediction_info": null }
]
}
]
}
General behaviourβ
- Multiple predictions per key are allowed (e.g. two prices on one label: base + promo). We do not determine which is RRP vs promo β we just provide the values.
- Empty modalities are omitted (since April 2026): if nothing is extracted, the key is not present at all. Previously, price modalities were returned with an empty
value.
Modalitiesβ
catalog-itemβ
What: Provides several options for which in-scope catalogue item the annotation belongs to. All predictions have a relative confidence score. The is_main field indicates that our models have determined this to be the correct label. If none have is_main=true, the models were unable to match to an existing catalogue item and the item is "unknown".
Value: catalogue-item UUID.
Example:
{
"key": "catalog-item",
"predictions": [
{ "value": "725d1bc8-9138-4748-8cbb-5e94574f9404", "score": 0.874146446, "is_main": true },
{ "value": "350a75d6-5500-4299-8f04-2be93ba6f48a", "score": 0.758885698, "is_main": false },
{ "value": "f9eedd9f-2157-4231-993a-6c8468a696c7", "score": 0.733337572, "is_main": false }
]
}
fixtureβ
What: The fixture/row type of a shelf-row annotation. Attached to shelf-row annotations (returned as bounding boxes) when the realogram return_fixture parameter is enabled, powered by the fixture-level model.
SHELF_ROWβ
These are shelving units that are ambient temperature.
- Ambient conventional primary shelf
- Side Stacks
- gondola end/end-cap
COLD_ROWβ
These are shelving units that are chilled.
- Coolers
- Chilled row
GRIDWALL_ROWβ
- Gridwall/pegboard
SECONDARY_ROWβ
These are free-standing promotional fixtures with their own floor footprint. In this case because rows are not universally applicable to the wide format of secondary display types, the annotation covers the entire display unit.
- Free Standing Display Units (FSDU)
- Freestanding Bin
- Floor Stack
Values: COLD_ROW, SHELF_ROW, GRIDWALL_ROW, SECONDARY_ROW.
Example:
{
"key": "fixture",
"predictions": [
{ "value": "SHELF_ROW", "score": 1, "is_main": true }
]
}
A fuller fixture-type taxonomy (Main Fixture, Cooler, Chilled Shelf, Gondola End, Gridwall, T-bar, Hot Spot, Floor Stack, Side Stack, Clip Strip, FSDU, Freestanding Bin, Generic, Gutter Tray) is defined but not yet shipped as modality values.
realogram:shelfβ
What: Which shelf (row) an annotation sits on within the realogram. Attached to product/POSM annotations. Additionally, shelf-row concept annotations (annotation_type: shelf_row) carry their own ID as a realogram:shelf value.
Value: shelf index as a string. Index starts at 1 (Top shelf is row 1, second from top is row 2 etc)
Example:
{
"key": "realogram:shelf",
"predictions": [
{ "value": "1", "score": 1, "is_main": true }
]
}
realogram:slotβ
What: The horizontal slot (position along the shelf) of an annotation.
Value: slot index as a string. Index starts at 1 (left most is slot 1, second left slot 2 etc)
Example:
{
"key": "realogram:slot",
"predictions": [
{ "value": "1", "score": 1, "is_main": true }
]
}
realogram:stackβ
What: The vertical stack position of an annotation within its slot (products stacked on top of each other).
Value: stack index as a string. Index starts at 0 (bottom in stack is stack position 0 etc.)
Example:
{
"key": "realogram:stack",
"predictions": [
{ "value": "0", "score": 1, "is_main": true }
]
}
- Realogram is calculated within the shelf rows of interest of an image.
- Gap detection is deprecated: gaps are to be replaced by negative space (shelf-row area minus annotations for that shelf).
promo:priceβ
What: A price detected on a price/promo label, or the price in a SKU from an associated price-tag/promo. Multiple predictions indicate multiple valid prices β all are returned with is_main: true when the models consider them correct. We do not determine which is RRP vs promo; we just provide the values.
Format: {price}_{quantity}. Extended 3-part format {price}_{quantity}_{associated text} is in development β contact Neurolabs support (e.g. 1.2_1_Clubcard price).
Example: Consider a price annotation that has 2 instances of pricing information: "Β£5" and "2 for Β£8.50". The promo:price modality would provide the following output:
{
"key": "promo:price",
"predictions": [
{ "value": "5_1", "score": 1, "is_main": true },
{ "value": "8.5_2", "score": 1, "is_main": true }
]
}
promo:quantityβ
What: A quantity-based deal on the label. Either "buy X get Y free" or "buy A for the price of B". Multiple predictions apply.
Format: {buy-quantity}_{get-quantity}_{text}.
Example:
{
"key": "promo:quantity",
"predictions": [
{ "value": "1_2_buy 1 get 1 free", "score": 1.0, "is_main": true },
{ "value": "3_4_buy 4 for the price of 3", "score": 1.0, "is_main": true }
]
}
promo:price-discountβ
What: A discount expressed on the label. Multiple predictions apply.
Format: {quantity}_{discount-as-fraction}_{text} β the discount is a fraction normalised to 0β1 (0.4 = 40% off).
Example:
{
"key": "promo:price-discount",
"predictions": [
{ "value": "1_0.4_40%", "score": 1.0, "is_main": true }
]
}
promo:textβ
What: Free-text promotional wording detected on the label. Other observed values: save 1/3, buy 1 get 1 40%.
Example:
{
"key": "promo:text",
"predictions": [
{ "value": "buy 1 get 1 free clubcard super value rollback", "score": 1.0, "is_main": true }
]
}
- The four
promo:*keys are produced by the price/promo recogniser and populate for promo-flagged tags. - If no price/promo info is extracted, the modality is omitted.
face-countβ
What: The number of facings represented by an annotation β primarily for multipack items, where one annotation (e.g. a 2-can multipack) represents more than one facing.
Value: integer as a string.
Example:
{
"key": "face-count",
"predictions": [
{ "value": "2", "score": 1.0, "is_main": true }
]
}
- For standard SKUs the facing count is the annotation itself (value
1). - We can either count facings within an image (default) or extract facings from the packaging size in the catalogue item details (
{total in pack}P/{facings long side}) and provide long/short side facings based on the aspect ratio of the annotation. Contact Neurolabs support for this.