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 · pathPurpose
1GET {base}/datasetsDataset list + update time
2GET {base}/datasets/{id}/manifestFile list + SHA-256 — the only basis for detecting changes
3GET {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

ItemRequirement
AuthenticationA single Authorization: Bearer <token> header. If your server is open without a token, register it with the token field left empty
TransportHTTPS recommended. The platform accepts only http:// · https:// and rejects link-local addresses (169.254.x.x)
Response format1 · 2 return an application/json (UTF-8) object; 3 returns binary
TimesISO 8601 with a time zone (for example 2026-07-21T09:30:00Z). Without a time zone, the time is read as UTC
ErrorsHTTP 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 frequencyCalled only when a person presses a button (no scheduled sync)
Time limitEach 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
}
FieldRequiredDescription
idRequiredA 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
nameRecommendedName shown on screen. id is used if missing
modalityRecommendedimage · pointcloud · timeseries · tabular. Becomes the default modality of a new dataset
file_count · size_bytesRecommendedFor display on the selection screen
updated_atRecommendedMust 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) and page_size. If you do not support them, you may ignore them and return everything. If you supply total, the screen uses it to decide on "Load more".
  • If updated_after is 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" }
    }
  ]
}
FieldRequiredDescription
files[].file_idRequiredA 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[].filenameRequiredFile name including the extension. The platform decides the file kind from the extension
files[].sha256Effectively requiredSHA-256 of the body (hex, case-insensitive). Without it, that file is downloaded again every time
files[].size_bytesRecommendedFor progress display
files[].kindInformationalOnly recorded. The actual kind is decided by the extension
files[].metaOptionalPer-file metadata. Kept as is in the platform file's meta.source
annotation_format · classesOptionalOnly 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-Type works.
  • 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.

MeaningAccepted names
List arrayitems · datasets · results · data
Total counttotal · count · total_count
Dataset idid · dataset_id · datasetId
Namename · title
Modalitymodality · type
File countfile_count · fileCount · files
Sizesize_bytes · sizeBytes · size
Update timeupdated_at · updatedAt · modified_at · last_modified (for the manifest, updated_at · updatedAt)
File arrayfiles · items · entries
File idfile_id · fileId · id
File namefilename · name · path
Checksumsha256 · checksum_sha256 · checksum · hash
File kindkind · type
Class tableclasses · categories · labels
Annotation formatannotation_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

KindFormats
ImagesPNG · JPG · BMP · TIFF · WebP
Time series · tablesCSV · TSV · Parquet (a header in the first row is required)
Point cloudsPLY — if there is a per-point integer label property, it is found automatically and classes are counted
AnnotationsCOCO 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)

#CheckIf it fails
1Does the list return 200 with the token?Fix the authentication method first
2Does updated_after work?Use full listing instead of incremental queries
3Does the sha256 in the manifest match the actual file?The file is dropped with a warning
4Do received files open without corruption?Check the transport layer
5If the same dataset is synced twice, does the second sync fetch 0 files?Incremental sync does not work (check whether file_id changes)

Written for the platform as of 2026-09-21.

© Geo-MLOps