Simulation Data
Manage simulation data used to test localization.
Simulation data lets you test the localization pipeline without being physically present at the mapped site. Each simulation data record is a zip file containing pre-recorded camera frames and metadata that can be replayed against the localization APIs.
A typical workflow is:
Record simulation data at the site.
Upload the resulting zip via
POST /v1/simulation-data, the response gives you a uniquesimulationCode.Reference the
simulationCodewhen replaying the captured frames against your maps.Update, download, or delete the simulation as your test set evolves.
Setting the part's Content-Type from curl: append ;type=application/zip to the -F value, for example -F 'file=@capture.zip;type=application/zip'. Browsers and SDKs normally set this header from the file's extension or detected type, so no extra work is needed there.
Zip File Format
The uploaded .zip represents a single capture session, a small set of AR camera frames plus the device pose and camera intrinsics at the moment each frame was captured. Replaying this archive against a map reproduces a real-world localization session offline.
What a capture contains
Each capture session contains exactly one dataset:
A fixed number of camera frames (4–6, default 5) stored as JPEGs.
The 6-DoF camera pose at the instant each frame was acquired,
(x, y, z)position and(qx, qy, qz, qw)quaternion rotation, in a left-handed (LHS) world coordinate system (Unity convention). See Coordinate system below if your capture pipeline is right-handed.The camera intrinsics for the session, focal length
(fx, fy), principal point(px, py), and the image dimensions(width, height). Captured once and assumed constant for the rest of the session.
Coordinate system
All poses in the manifest must be expressed in a left-handed coordinate system (LHS), the same convention the MultiSet Unity SDK and the localization replay pipeline use. Uploading right-handed (RHS) poses without converting them first will produce poses that look mirrored along the X axis when replayed, and localization will not match the original capture.
If your capture pipeline produces RHS poses (for example, native iOS / Android, ARKit / ARCore raw transforms, or any OpenGL-style stack), convert each pose to LHS before writing it into the manifest. The full conversion is: negate position.x, negate rotation.qy and rotation.qz, keep the rest unchanged.
Zip layout
Entries inside the zip are flat, there is no top-level folder:
Image filenames follow
Image_<index>_<timestamp>.jpg, where<index>is the zero-based capture order. Images must appear in the same order as the entries in the JSON manifest'simageDataListso they can be paired positionally.The timestamp suffix
<yyyyMMdd_HHmmss>is identical for every file in the session.JPEGs should be encoded at quality ~80.
SimulationData_<timestamp>.json manifest
The single JSON manifest at the root of the zip describes the intrinsics and the per-frame pose, in capture order:
width, height
int
Working image resolution in pixels (must match the JPEGs).
fx, fy
float
Camera focal length in pixels, scaled to match width/height.
px, py
float
Camera principal point in pixels, scaled to match width/height.
imageDataList
array
One entry per image. Same order as Image_0, Image_1, …
imageDataList[].x, .y, .z
float
Camera position at frame acquisition.
imageDataList[].qx, .qy, .qz, .qw
float
Camera rotation as a quaternion.
Example:
imageDataList.length must equal the number of Image_<n>_*.jpg files in the zip, and each index n must have a corresponding entry at position n in the list. Mismatched counts or out-of-order indices cause the simulation to be rejected at replay time.
Upload Simulation Data
Upload a new simulation data zip. Returns a simulationCode you use to reference it later.
Upload a zip file containing simulation data for testing localization APIs.
On success the response returns a unique simulationCode that you use to reference
the simulation in all subsequent calls.
Name for the simulation data
Test Simulation 1Optional description for the simulation data
Simulation data for AR localization testingZip file containing simulation data (max 10 MB). The part's
Content-Type header must be application/zip or
application/x-zip-compressed. From curl, append
;type=application/zip to the -F file=@... value to set it.
Simulation data uploaded successfully
Simulation data uploaded successfully8-character code that identifies this simulation in subsequent calls.
A1B2C3D4Bad request — invalid file type, size limit exceeded, account inactive, or missing required fields
Unauthorized — missing or invalid token
Internal server error
POST /v1/simulation-data HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: multipart/form-data
Accept: */*
Content-Length: 104
{
"name": "Test Simulation 1",
"description": "Simulation data for AR localization testing",
"file": "binary"
}{
"message": "Simulation data uploaded successfully",
"simulationCode": "A1B2C3D4"
}List Simulation Data
Paginated list of simulation data for the authenticated account. Supports search by name and filtering by status.
Get a paginated list of simulation data for the authenticated account with optional filtering.
Page number for pagination
1Number of items per page
10Case-insensitive partial match against the simulation name
Filter by simulation data status
List of simulation data retrieved successfully
Unauthorized — missing or invalid token
Internal server error
GET /v1/simulation-data HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"simulationData": [
{
"simulationCode": "A1B2C3D4",
"name": "Test Simulation 1",
"description": "Simulation data for AR localization testing",
"fileSize": 1024000,
"originalFilename": "test_simulation.zip",
"status": "active",
"createdAt": "2026-02-06T10:30:00Z"
}
],
"pagination": {
"currentPage": 1,
"totalPages": 5,
"totalItems": 45,
"itemsPerPage": 10,
"hasNextPage": true,
"hasPrevPage": false
}
}Get Simulation Data by Code
Retrieve details (name, description, status, file size, timestamps) for a single simulation data record.
Retrieve details (name, description, status, file size, timestamps) for a single simulation data record.
The 8-character code that identifies the simulation data
A1B2C3D4Simulation data details retrieved successfully
A1B2C3D4Test Simulation 1Simulation data for AR localization testing1024000test_simulation.zipactivePossible values: Invalid simulation code format
Unauthorized — missing or invalid token
Forbidden — user doesn't have access to this simulation data
Simulation data not found
GET /v1/simulation-data/{simulationCode} HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"simulationCode": "A1B2C3D4",
"name": "Test Simulation 1",
"description": "Simulation data for AR localization testing",
"fileSize": 1024000,
"originalFilename": "test_simulation.zip",
"status": "active",
"createdAt": "2026-01-01T00:00:00.000Z",
"updatedAt": "2026-01-01T00:00:00.000Z"
}Update Simulation Data
Update the name and/or description of an existing simulation data record. At least one of the two fields must be supplied.
This endpoint updates metadata only. To replace the underlying zip file, delete the simulation and upload a new one.
Update the name and/or description of an existing simulation data record.
At least one of name or description must be provided in the request body.
The 8-character code that identifies the simulation data to update
A1B2C3D4Simulation data updated successfully
Simulation data updated successfullyA1B2C3D4Invalid simulation code format or validation errors
Unauthorized — missing or invalid token
Forbidden — user doesn't have access to this simulation data
Simulation data not found
PUT /v1/simulation-data/{simulationCode} HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 95
{
"name": "Updated Test Simulation",
"description": "Updated description for test simulation data"
}{
"message": "Simulation data updated successfully",
"simulationCode": "A1B2C3D4"
}Delete Simulation Data
Removes the simulation data record and deletes the underlying zip file from storage. This action is irreversible.
Delete a simulation data record and remove the underlying file from storage.
The 8-character code that identifies the simulation data to delete
A1B2C3D4Simulation data deleted successfully
Simulation data deleted successfullyA1B2C3D4Invalid simulation code format
Unauthorized — missing or invalid token
Forbidden — user doesn't have access to this simulation data
Simulation data not found
DELETE /v1/simulation-data/{simulationCode} HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"message": "Simulation data deleted successfully",
"simulationCode": "A1B2C3D4"
}Download Simulation Data
Generates a short-lived pre-signed URL for downloading the zip. The response includes the URL, the original filename, and the file size.
Generate a secure pre-signed download URL for the simulation data zip file.
The 8-character code that identifies the simulation data to download
A1B2C3D4Download URL generated successfully
Download URL generated successfullyhttps://s3.amazonaws.com/bucket/path/to/file.zip?X-Amz-Algorithm=...test_simulation.zip1024000Invalid simulation code format or file not available
Unauthorized — missing or invalid token
Forbidden — user doesn't have access to this simulation data
Simulation data not found
GET /v1/simulation-data/{simulationCode}/download HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"message": "Download URL generated successfully",
"downloadUrl": "https://s3.amazonaws.com/bucket/path/to/file.zip?X-Amz-Algorithm=...",
"filename": "test_simulation.zip",
"fileSize": 1024000
}Last updated
Was this helpful?

