Skip to main content
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 .txt sidecar 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.
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.
Go here to specify class mapping for the Ontology When using the YOLO format, configure the following fields:
  • 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.
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:
  • 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.
If the selected Ontology has no bounding-box, polygon, or rotatable-box objects, Encord displays a warning and you must select a different Ontology.

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:
  1. Labels check: If an existing sidecar file matches the last ingestion skip (no change).
  2. Download sidecar: Sidecar files are imported from cloud storage (max 300 MB).
Labels are imported as ground truth labels.
  1. UUID substitution: Placeholder UUIDs sent by the SDK are replaced with server-allocated values.
  2. Ontology resolution: The specified Ontology is loaded and Encord converts the payload into the Ontology’s label format.
  3. Label write: Labels appear on the data units.
If a sidecar is removed from the bucket, the corresponding label are removed from the data unit.

Configuration

When creating or editing a Cloud-Synced folder:
  1. Toggle Label ingestion on.
  2. Set the file suffix that marks a file as a label sidecar (default: .labels.json).
  3. Select the Ontology to validate and store labels against.
Once saved, subsequent scans begin ingesting labels matching sidecars.
The Ontology is fixed when you enable label ingestion and cannot be changed. To use a different Ontology, delete the label ingestion configuration and reconfigure the folder. Existing ingested labels are preserved, but new sidecars will ingest under the new Ontology only after reconfiguration.

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_unitslabels.
  • What a label says. The values of an object’s nested attributes and of each frame-level classification live in the top-level object_answers and classification_answers.
The two halves are joined by hashes: an object’s 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 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.
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.
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.
polygon and polygons describe the same shape here. New sidecars should populate polygons; use polygon only for compatibility with existing tooling. See Ontology Shapes for how each shape encodes its coordinates.
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 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: 9e961c1fBing, d586fde0King, 181a685fRainier.
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