Label ingestion lets you store annotation data as sidecar files alongside your files in a cloud storage folder. When a folder is configured for label ingestion, Encord automatically detects sidecar files during bucket scans, pairs them with their corresponding data files, and ingests their contents as labels against a chosen Ontology.
Input Formats
Encord supports two input formats for label ingestion:- Encord (JSON sidecars) pairs each data file with a JSON sidecar file using a configurable filename suffix.
- YOLO (.txt sidecars) pairs each data file with a YOLO-format
.txtsidecar file using file path patterns, and maps YOLO class numbers to ontology classes.
The input format cannot be changed after label ingestion is enabled on a folder.
Encord (JSON Sidecars)
Encord (JSON Sidecars)
When using the Encord format, configure the Sidecar suffix field. Encord pairs each data file with a label file that shares the same name plus the suffix you specify.For example, with the default suffix,
image001.jpg pairs with image001.jpg.labels.json.The suffix must be between 1 and 128 characters.YOLO (.txt Sidecars)
YOLO (.txt Sidecars)
Go here to specify class mapping for the Ontology
When using the YOLO format, configure the following fields:The Class numbers editor maps each YOLO class number to an Ontology class. Encord pre-fills class numbers from the external IDs on the selected ontology’s classes under the chosen namespace. You can override individual entries by unlocking the relevant row.The following Ontology object shapes are supported for YOLO label ingestion:If the selected Ontology has no bounding-box, polygon, or rotatable-box objects, Encord displays a warning and you must select a different Ontology.
-
Image and Label File Patterns: Use the Image file pattern and Label file pattern fields to define how Encord pairs image files with their corresponding YOLO label files. Both patterns use a shared
{name}placeholder as the capture group. The value matched by{name}in the image pattern must match the value in the label pattern for the two files to be paired. Both patterns must use the same placeholders. -
External ID Namespace: The External ID namespace field determines which namespace Encord reads class numbers from when mapping YOLO class numbers to ontology classes. Encord automatically selects a namespace when you choose an Ontology. It prefers a namespace named
YOLO(case-insensitive), or falls back to the first available namespace alphabetically. You can unlock the namespace selector to choose a different namespace if needed.
If the selected Ontology has no external IDs on its classes, the namespace selector is unavailable and class numbers must be entered manually in the class map.
- Bounding box
- Polygon
- Rotatable bounding box
At least one class must be mapped to a YOLO class number. Each YOLO class number can only map to one ontology class. Class numbers must be non-negative integers.
How it Works
During each scheduled bucket scan, Encord classifies every file in the folder. Files whose names match the configured suffix are identified as label sidecars and excluded from the data file list. Each sidecar is paired with its corresponding data file, and the label payload is downloaded, validated against the Ontology, and written to the database. Under the hood, enabling label ingestion provisions labels linked to the Folder and the chosen Ontology. The ingestion pipeline using a sidecar file:- Labels check: If an existing sidecar file matches the last ingestion skip (no change).
- Download sidecar: Sidecar files are imported from cloud storage (max 300 MB).
Labels are imported as
ground truth labels.- UUID substitution: Placeholder UUIDs sent by the SDK are replaced with server-allocated values.
- Ontology resolution: The specified Ontology is loaded and Encord converts the payload into the Ontology’s label format.
- Label write: Labels appear on the data units.
Configuration
When creating or editing a Cloud-Synced folder:- Toggle Label ingestion on.
- Set the file suffix that marks a file as a label sidecar (default:
.labels.json). - Select the Ontology to validate and store labels against.
Configuration Options
File Pairing
Label sidecar files must conform to the Encord label row format. The same schema accepted by the SDK. Maximum sidecar size: 300 MB (matching the editor HTTP save limit). Files are paired by stripping the suffix from the sidecar key to derive the data key. Example with suffix.labels.json:
Sidecar File Structure
This section walks through every field in an Encord JSON label sidecar, using a real example. The example is the sidecar for a single image (cherries-001.jpg) that carries three polygon objects (each a cluster of cherries) plus three frame-level classifications.
A sidecar is a single JSON object with the same shape as an Encord label row. It helps to think of it as two halves:
- Where a label sits. The geometry and the frame it belongs to live under
data_units→labels. - What a label says. The values of an object’s nested attributes and of each frame-level classification live in the top-level
object_answersandclassification_answers.
objectHash is the key into object_answers, and a classification’s classificationHash is the key into classification_answers. Everything that identifies an Ontology class or attribute (featureHash, schemaFeatureUuid, value, name) must resolve against the Ontology the folder is configured with, or the sidecar fails validation on ingestion.
Coordinates are normalized to values between
0 and 1. To convert to pixels, see Label Coordinates. For every Ontology shape (bounding box, bitmask, polyline, and so on), see Ontology Shapes.Complete example
The complete sidecar for the example is shown below. The suffix.labels.json pairs it with the image cherries-001.jpg. Polygon object labels are used for cherries. Each field is explained in the sections that follow.
Top-level keys
Encord sets several fields for you on ingestion. A sidecar has the same shape as an exported label row, so it can carry more than the importer actually reads. On import, Encord substitutes the identity hashes it allocates (
label_hash, data_hash, dataset_hash) and stamps the row’s own timestamps: the creation time when it creates the label row, and last_edited_at and last_edited_by when it writes the labels. Any values you supply for created_at, last_edited_at, last_edited_by, branch_name, annotation_task_status, and is_shadow_data are ignored, so you can include them (an exported row will) or leave them out. What the importer reads is the label content: data_units, object_answers, classification_answers, and object_actions.data_units
data_units
data_units is a map keyed by the file’s data_hash. Each entry is one file that composes the data unit; a single image has exactly one entry. Object geometry for the image lives inside this entry, under labels.labels
labels
For an image,
labels is a single object holding an objects list (geometry) and a classifications list (which frame-level classifications are present). An image is a single frame, so its labels are not keyed by frame number the way video and image-group labels are.objects
objects
Each entry in
objects is one object instance and carries its identity, provenance, and geometry. The example has three Cherries polygons; one is shown in full below.classifications
classifications
Each entry in the
classifications list records that a frame-level classification is present on the image. It carries identity and provenance only; the chosen value lives in the classification_answers section, looked up by classificationHash.The example has three frame-level classifications (
Ripe?, Rating, and Qualities), so this list contains three entries (b1c170b0, 6edacab8, b29363aa), each resolved in classification_answers.object_answers
object_answers
object_answers holds the nested attribute answers for objects, keyed by objectHash. Every object appears here even if it has no attributes. In the example, each Cherries object has one nested radio attribute, Type?.The three objects resolve to different
Type? options: 9e961c1f → Bing, d586fde0 → King, 181a685f → Rainier.classification_answers
classification_answers
classification_answers holds the value of each frame-level classification, keyed by classificationHash. Each entry links back to the classifications entry of the same hash under data_units → … → labels.The three classifications in the example show the three answer patterns: Ripe? (
b1c170b0) is a radio set to Unripe; Rating (6edacab8, feature KAW4jwDy) is a radio set to 7; Qualities (b29363aa, feature Buv2kLQ9) is a checklist with two answers, Juicy and Large, so its answers array holds both.For the complete, authoritative sidecar schema across every data type and shape, see Importing Labels with the SDK. A sidecar must conform to the same Encord label row format the SDK accepts.
Pausing and Resuming
Pausing stops new sidecars from being downloaded and ingested without removing existing labels. This is the recommended way to temporarily halt label ingestion. For example, while updating your sidecar generation pipeline. To pause or resume: Folder details > Label ingestion > Pause / Resume.Disabling Label Ingestion
Deleting the label ingestion configuration removes the config from the folder. Already-ingested labels are preserved. No new sidecars are picked up after deletion. To disable: Folder details > Label ingestion > Delete (trash icon) > Confirm.Supported Data Types
Label sidecars can be paired with any data type supported by cloud-synced folders:- Images
- Videos
- Audio
- Text
- PDFs
- Time series

