The three APIs the DataOps side implements
Requests and responses of the list · manifest · file endpoints, authentication, error format, and accepted field aliases
When you register one base URL with the platform, the platform calls three paths under it. In the examples, https://data.example.com/api is the base URL.
| # | Method · path | Purpose |
|---|---|---|
| 1 | GET {base}/datasets | Dataset list + update time |
| 2 | GET {base}/datasets/{id}/manifest | File list + SHA-256 — the only basis for detecting changes |
| 3 | GET {base}/datasets/{id}/files/{file_id} | File body (binary) |
The paths must have exactly this shape. In return, the field names in responses can follow your own conventions — the platform accepts several names with the same meaning (see Field aliases below).
Common conventions
| Item | Requirement |
|---|---|
| Authentication | A single Authorization: Bearer <token> header. If your server is open without a token, register it with the token field left empty |
| Transport | HTTPS recommended. The platform accepts only http:// · https:// and rejects link-local addresses (169.254.x.x) |
| Response format | 1 · 2 return an application/json (UTF-8) object; 3 returns binary |
| Times | ISO 8601 with a time zone (for example 2026-07-21T09:30:00Z). Without a time zone, the time is read as UTC |
| Errors | HTTP status code + JSON body. 401 for authentication failure, 404 for a missing resource. The start of the body (200 characters) is shown to the user as is |
| Call frequency | Called only when a person presses a button (no scheduled sync) |
| Time limit | Each request must start responding within 30 seconds. Large files are timed per read, so a long transfer is fine |
1. Dataset list
curl -H "Authorization: Bearer $TOKEN" \
"https://data.example.com/api/datasets?page=1&page_size=50&updated_after=2026-07-01T00:00:00Z"
{
"items": [
{
"id": "ds-inspect-2026w29",
"name": "Line inspection images 2026-W29",
"modality": "image",
"file_count": 412,
"size_bytes": 1073741824,
"updated_at": "2026-07-21T09:30:00Z"
}
],
"page": 1,
"total": 3
}
| Field | Required | Description |
|---|---|---|
id | Required | A unique ID that never changes. It must stay the same even if the name changes — it is the key the platform uses to find what to sync again |
name | Recommended | Name shown on screen. id is used if missing |
modality | Recommended | image · pointcloud · timeseries · tabular. Becomes the default modality of a new dataset |
file_count · size_bytes | Recommended | For display on the selection screen |
updated_at | Recommended | Must change whenever a file is added, changed or deleted. Used for the on-screen "remote update time" and for incremental queries |
- The platform sends
page(starting at 1) andpage_size. If you do not support them, you may ignore them and return everything. If you supplytotal, the screen uses it to decide on "Load more". - If
updated_afteris given, return only what changed after that time (recommended). - The connection test calls once with
page=1&page_size=1.
2. Manifest
curl -H "Authorization: Bearer $TOKEN" \
"https://data.example.com/api/datasets/ds-inspect-2026w29/manifest"
{
"dataset_id": "ds-inspect-2026w29",
"annotation_format": "coco",
"classes": [{ "id": 0, "name": "defect_a" }, { "id": 1, "name": "defect_b" }],
"files": [
{
"file_id": "f-0001",
"filename": "20260721_line3_0001.png",
"kind": "image",
"size_bytes": 2493833,
"sha256": "9f8a1c…",
"meta": { "line": "line-3", "measured_at": "2026-07-21T09:30:12+09:00" }
}
]
}
| Field | Required | Description |
|---|---|---|
files[].file_id | Required | A file key used in the download path that never changes. Keep it the same even when the file's contents change (only then is it judged "changed" and the same row replaced) |
files[].filename | Required | File name including the extension. The platform decides the file kind from the extension |
files[].sha256 | Effectively required | SHA-256 of the body (hex, case-insensitive). Without it, that file is downloaded again every time |
files[].size_bytes | Recommended | For progress display |
files[].kind | Informational | Only recorded. The actual kind is decided by the extension |
files[].meta | Optional | Per-file metadata. Kept as is in the platform file's meta.source |
annotation_format · classes | Optional | Only recorded, not interpreted. Platform validators read labels directly from the annotation files received |
3. File body
curl -H "Authorization: Bearer $TOKEN" -o 0001.png \
"https://data.example.com/api/datasets/ds-inspect-2026w29/files/f-0001"
- Stream the file body as is. Any
Content-Typeworks. - Redirects are followed, so you may return a 302 to a presigned URL instead of the body.
- Resuming (
Range) is not used yet. A failed file is fetched again in full on the next sync. - Each file can be up to 2 GiB (configurable in the server settings).
Error responses
// 401
{ "error": "invalid_token", "message": "The token has expired." }
// 404
{ "error": "dataset_not_found", "message": "ds-xxxx was not found." }
// 429 (sending a Retry-After header along with it is helpful)
{ "error": "rate_limited", "message": "Please try again later." }
The platform does not interpret this body; it shows the start of it to the user. Put in one sentence that reveals the cause.
Field aliases
You can use any of the names below for response fields. The platform looks for them in order and uses the first non-empty value.
| Meaning | Accepted names |
|---|---|
| List array | items · datasets · results · data |
| Total count | total · count · total_count |
| Dataset id | id · dataset_id · datasetId |
| Name | name · title |
| Modality | modality · type |
| File count | file_count · fileCount · files |
| Size | size_bytes · sizeBytes · size |
| Update time | updated_at · updatedAt · modified_at · last_modified (for the manifest, updated_at · updatedAt) |
| File array | files · items · entries |
| File id | file_id · fileId · id |
| File name | filename · name · path |
| Checksum | sha256 · checksum_sha256 · checksum · hash |
| File kind | kind · type |
| Class table | classes · categories · labels |
| Annotation format | annotation_format · annotationFormat · label_format |
If you really need a name not in this table, tell the platform team. It can be accepted by adding one line.
Supported file formats
| Kind | Formats |
|---|---|
| Images | PNG · JPG · BMP · TIFF · WebP |
| Time series · tables | CSV · TSV · Parquet (a header in the first row is required) |
| Point clouds | PLY — if there is a per-point integer label property, it is found automatically and classes are counted |
| Annotations | COCO JSON · LabelMe JSON · VOC XML |
CSV · Parquet files cannot be told apart as time series or tables by extension, so either report modality as tabular in the list, or have the modality chosen directly when the dataset is created.
Integration checklist (provider side)
| # | Check | If it fails |
|---|---|---|
| 1 | Does the list return 200 with the token? | Fix the authentication method first |
| 2 | Does updated_after work? | Use full listing instead of incremental queries |
| 3 | Does the sha256 in the manifest match the actual file? | The file is dropped with a warning |
| 4 | Do received files open without corruption? | Check the transport layer |
| 5 | If the same dataset is synced twice, does the second sync fetch 0 files? | Incremental sync does not work (check whether file_id changes) |