Upload a Vision Event Bundle

Ingest a tarball bundle written by an air-gapped deployment to create a Vision Event.

About

The Write Vision Event Bundle block writes one tarball per event to local disk instead of sending it to Roboflow. Use it when your inference server runs in a network with no route to the cloud. This endpoint takes those tarballs as they are: your uploader posts each file, and Roboflow unpacks it, uploads the images, and creates the Vision Event.

HTTP API

Post the raw archive bytes as the request body. Do not use JSON or multipart. The body is binary, so send your API key in the Authorization: Bearer header or in the api_key query parameter.

Required scope: vision-events:write or device:update

Upload a Vision Event Bundle

posthttps://api.roboflow.com/vision-events/bundle

Create one vision event from a self-contained tarball bundle written by the Write Vision Event Bundle workflow block. Post the raw archive bytes as the body.

Authorizations
AuthorizationstringRequired

Roboflow API key passed as a Bearer token.

Query parameters
useCaseIdstringOptional

The use case the event belongs to. This overrides the useCaseId inside payload.json. Required when the bundle does not carry one.

Body
stringOptional

Gzipped tar archive holding payload.json and its image members.

Responses
201Event created successfully.application/json
eventIdstringOptional
Example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
createdbooleanOptional
Example: true
imagesobject[]Optional

The archive member for each uploaded image and the source ID it was stored under.

Show properties
filestringOptional
Example: images/9f0c1b2a-4d3e-4f5a-8b6c-7d8e9f0a1b2c.jpg
sourceIdstringOptional
Example: src_abc123
warningsobject[]Optional
Show properties
typestringOptional
pathstringOptional
valuestringOptional
valueTypestringOptional
deprecationsstring[]Optional
400Bad archive, bad payload, more than 100 images, or no use case in the query or the payload.application/json
errorstringOptional
403Insufficient permissions for this resource.application/json
errorstringOptional
413A size limit was exceeded.application/json
errorstringOptional
post/vision-events/bundle
POST /vision-events/bundle HTTP/1.1
Host: api.roboflow.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/gzip
Accept: application/json

binary
201Event created successfully.
{
  "eventId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "created": true,
  "images": [
    {
      "file": "images/9f0c1b2a-4d3e-4f5a-8b6c-7d8e9f0a1b2c.jpg",
      "sourceId": "src_abc123"
    }
  ],
  "warnings": [
    {
      "type": "text",
      "path": "text",
      "value": "text",
      "valueType": "text"
    }
  ],
  "deprecations": [
    "text"
  ]
}

Bundle Format

Each bundle holds one event. The block writes gzipped tar files, and plain tar also works.

event_<timestamp>_<eventId>.tar.gz
├── payload.json
└── images/<file_id>.jpg

payload.json has the same shape as the Create a Vision Event request body, with two differences:

  • bundleFormatVersion is 1.
  • images[].file and images[].inputFile hold archive member paths (ex: images/9f0c1b2a.jpg) in place of sourceId and inputSourceId. Roboflow uploads each member and stores the source IDs on the event.

Images must sit under the images/ directory. Members that no image refers to, and top-level directories other than images/, add an ingestion warning but do not stop the event.

Field errors inside payload.json behave the same as on the JSON endpoint. See Validation and Warnings.

Use Case

The useCaseId query parameter overrides the useCaseId in payload.json. If neither one is set, the request fails with a 400. Air-gapped sites normally leave the use case out of the bundle, so no cloud identifiers are stored inside the local network, and set it at upload time instead.

Limits

LimitValueStatus on failure
Request body25 MB413
Decompressed archive75 MB413
payload.json10 MB413
Archive entries217413
Images per bundle100400
Pixels per image80 MP413

Retries

You can post the same bundle again after a failed or unclear upload. Images are matched by content, and an event that arrives twice replaces the earlier one. You are billed one time for it.