MapSet
Create, read, update and delete MapSets, add maps with or without overlap, and set the pose of a map inside a set.
MapSet APIs allow you to create and manage collections of maps with relative positioning for large-scale VPS coverage.
Overview
A MapSet is a collection of two or more maps positioned relative to each other. This enables:
Large area coverage by combining multiple scans
Seamless localization across connected spaces
Flexible map arrangement and positioning
Endpoints
Create MapSet using Overlap
Creates a new MapSet from two existing maps that share overlapping scan area — pass only the Map Codes of a source and a target map, and the cloud computes the relative pose between them automatically. No relativePose is required in the request.
Constraints:
Both maps must be in your account and in
activestatus.Neither map can already belong to a MapSet.
The
sourceMapCodebecomes the origin (order=0) of the new MapSet.
Creates a new MapSet from two existing maps that share overlapping scan area, by passing the Map Codes of a source map and a target map. The cloud computes the relative pose between the two maps automatically — you do not need to supply a relativePose.
Both maps must already exist in your account, be in active status, and not already belong to any MapSet. The resulting MapSet uses the source map as the origin (order=0).
JWT token obtained from the authentication endpoint
Name of the new MapSet
Building A - Floors 1 & 2Map Code of the source map (becomes the MapSet origin)
MAP_WUTCLWDXTK6UMap Code of the target map to align against the source
MAP_7HXKP2MSNQ4YSet to true when both maps are already gravity aligned (+Y up). The overlap job then constrains the relative pose to a yaw-only rotation about Y, dropping roll and pitch while keeping the full X/Y/Z translation. Optional, defaults to false.
falseExample: trueMapSet created successfully via overlap
MapSet Processed successfullyUnique code for the new MapSet
MSET_ZIRWP1NV0WBHBad request. Returned when a required field is missing, when the body contains a field that is not allowed, or when the two maps are on different generations.
Unauthorized - Invalid or expired token
Forbidden - One or more maps are not active or do not belong to your account
One or more maps not found
Conflict - One or more maps are already part of a MapSet
POST /v1/vps/map-set/overlap HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 130
{
"name": "Building A - Floors 1 & 2",
"sourceMapCode": "MAP_WUTCLWDXTK6U",
"targetMapCode": "MAP_7HXKP2MSNQ4Y",
"isGravityAligned": true
}{
"message": "MapSet Processed successfully",
"mapSetCode": "MSET_ZIRWP1NV0WBH"
}Add Map to MapSet using Overlap
Adds a new map to an existing MapSet. The new map is aligned against the entire MapSet, so you do not pick an overlapping map to anchor it against: send only the new map's Map Code. The cloud computes its relativePose automatically from the overlap, no relativePose is required, and the existing maps in the set are not affected.
Constraints:
targetMapCodemust beactiveand not already part of any MapSet.The new map must be on the same generation as the MapSet. Mixing generations returns
400.
Adds a new map to an existing MapSet. The new map is aligned against the whole MapSet, so you do not pick an overlapping anchor map: send only the new map's Map Code. The cloud computes its relativePose automatically from the overlap, and existing maps in the set are not affected.
targetMapCodemust be anactivemap in your account that is not part of any MapSet yet.- The resulting transform is stored as the new map's
relativePosewithin the MapSet's coordinate system. - The request body accepts only
targetMapCodeand the optionalisGravityAligned. Any other field, includingsourceMapCode, is rejected with400and an error such as"sourceMapCode" is not allowed.
JWT token obtained from the authentication endpoint
MapSet Code of the existing MapSet to extend
MSET_ZIRWP1NV0WBHMap Code of the new map to add to the MapSet
MAP_3HQNB7L9XP2ASet to true when both the MapSet and the new map are already gravity aligned (+Y up). The overlap job then constrains the relative pose to a yaw-only rotation about Y, dropping roll and pitch while keeping the full X/Y/Z translation. Optional, defaults to false.
falseExample: trueMap added to MapSet successfully
MapSet data processed successfullyBad request. Returned when the body contains a field that is not allowed (for example sourceMapCode), when targetMapCode is missing, or when the new map is on a different generation than the MapSet.
Unauthorized - Invalid or expired token
Forbidden - MapSet or the target map is not active, or does not belong to your account
MapSet not found, or target map not found
Conflict - Target map is already part of a MapSet
PUT /v1/vps/map-set/overlap/{mapSetCode} HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 60
{
"targetMapCode": "MAP_3HQNB7L9XP2A",
"isGravityAligned": true
}{
"message": "MapSet data processed successfully"
}Create MapSet
Creates a new MapSet with two or more maps. Use Map Codes to reference the maps.
Creates a new MapSet with two or more maps. Each map must include a relative pose defining its position and rotation within the MapSet. Poses are in the map's native left-handed, Y-up (LHS / Unity) coordinate system, positions in meters. Convert right-handed poses to LHS before sending.
JWT token obtained from the authentication endpoint
Name of the MapSet
Building A - Floor 1MapSet created successfully
MapSet created successfullyUnique code for the MapSet
MSET_ZIRWP1NV0WBHBad Request - Invalid input or less than 2 maps provided
Unauthorized - Invalid or expired token
One or more maps not found
Conflict - One or more maps are already part of a MapSet
POST /v1/vps/map-set HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 295
{
"name": "Building A - Floor 1",
"maps": [
{
"mapCode": "MAP_WUTCLWDXTK6U",
"relativePose": {
"position": {
"x": 0,
"y": 0,
"z": 0
},
"rotation": {
"qx": 0,
"qy": 0,
"qz": 0,
"qw": 1
}
}
},
{
"mapCode": "MAP_7HXKP2MSNQ4Y",
"relativePose": {
"position": {
"x": 10.5,
"y": 0,
"z": 5.2
},
"rotation": {
"qx": 0,
"qy": 0.7071,
"qz": 0,
"qw": 0.7071
}
}
}
]
}{
"message": "MapSet created successfully",
"mapSetCode": "MSET_ZIRWP1NV0WBH"
}Get MapSet Details
Retrieves details of a MapSet including all associated maps and their relative poses. Use the MapSet Code (e.g., MSET_ZIRWP1NV0WBH). Returned poses are in the same left-handed, Y-up frame you supply them in, see RelativePose.
Retrieves details of a MapSet including all associated maps and their relative poses. Poses are returned in the left-handed, Y-up (LHS / Unity) coordinate system.
JWT token obtained from the authentication endpoint
MapSet Code
MSET_ZIRWP1NV0WBHMapSet details retrieved successfully
Unauthorized - Invalid or expired token
MapSet not found
GET /v1/vps/map-set/{mapSetCode} HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"mapSet": {
"name": "Building A - Floor 1",
"mapSetCode": "MSET_ZIRWP1NV0WBH",
"status": "active",
"createdAt": "2026-01-01T00:00:00.000Z",
"updatedAt": "2026-01-01T00:00:00.000Z",
"mapSetData": [
{
"_id": "6756c20336a9794c6effce46",
"order": 0,
"relativePose": {
"position": {
"x": 0,
"y": 0,
"z": 0
},
"rotation": {
"qx": 0,
"qy": 0,
"qz": 0,
"qw": 1
}
},
"map": {
"mapCode": "MAP_WUTCLWDXTK6U",
"mapName": "Lobby Area",
"status": "active",
"hasPano": false
},
"baseMap": {
"mapCode": "MAP_BTTE1MOXYVT8",
"mapName": "Lobby Area (base)",
"status": "active",
"hasPano": false
},
"versionCode": "MVER_W6NTBJ0ALVUN"
}
]
}
}Update MapSet Details
Updates the name of an existing MapSet. Use the MapSet Code.
Updates the name of an existing MapSet.
JWT token obtained from the authentication endpoint
MapSet Code
MSET_ZIRWP1NV0WBHNew name for the MapSet
Building A - Updated NameMapSet updated successfully
MapSet updated successfullyUnauthorized - Invalid or expired token
MapSet not found
PUT /v1/vps/map-set/details/{mapSetCode} HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 36
{
"name": "Building A - Updated Name"
}{
"message": "MapSet updated successfully"
}Add Map to MapSet
Adds a new map to an existing MapSet with its relative pose. Use the MapSet Code in the URL and Map Code in the request body. The relativePose must be left-handed, Y-up (Unity), see RelativePose.
Adds a new map to an existing MapSet with its relative pose. The pose must be in the left-handed, Y-up (LHS / Unity) coordinate system, positions in meters.
JWT token obtained from the authentication endpoint
MapSet Code
MSET_ZIRWP1NV0WBHMap Code
MAP_WUTCLWDXTK6UMap added to MapSet successfully
MapSet data added successfullyUnauthorized - Invalid or expired token
MapSet or Map not found
PUT /v1/vps/map-set/{mapSetCode} HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 121
{
"mapCode": "MAP_9RNVK3JTPL8X",
"relativePose": {
"position": {
"x": 20,
"y": 0,
"z": 10
},
"rotation": {
"qx": 0,
"qy": 0,
"qz": 0,
"qw": 1
}
}
}{
"message": "MapSet data added successfully"
}Update Map Pose in MapSet
Updates the relative pose of a map within a MapSet. The new relativePose must be left-handed, Y-up (Unity), see RelativePose.
Updates the relative pose of a map within a MapSet. Use the dataId from the MapSet details response. The pose must be in the left-handed, Y-up (LHS / Unity) coordinate system, positions in meters.
JWT token obtained from the authentication endpoint
MapSetData ID (obtained from Get MapSet Details response)
6756c20336a9794c6effce46Map pose updated successfully
MapSetData updated successfullyInvalid dataId format
Unauthorized - Invalid or expired token
MapSetData not found
PUT /v1/vps/map-set/data/{dataId} HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 93
{
"relativePose": {
"position": {
"x": 15,
"y": 0,
"z": 7.5
},
"rotation": {
"qx": 0,
"qy": 0,
"qz": 0,
"qw": 1
}
}
}{
"message": "MapSetData updated successfully"
}Delete Map from MapSet
Removes a map from a MapSet.
Removes a map from a MapSet. Cannot delete the primary map (order=0) or if deletion would leave less than 2 maps in the MapSet.
JWT token obtained from the authentication endpoint
MapSetData ID (obtained from Get MapSet Details response)
6756c20336a9794c6effce46Map removed from MapSet successfully
MapSetData deleted successfullyInvalid dataId format
Unauthorized - Invalid or expired token
MapSetData not found
Cannot delete primary map or would leave less than 2 maps in MapSet
DELETE /v1/vps/map-set/data/{dataId} HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"message": "MapSetData deleted successfully"
}Delete MapSet
Deletes a MapSet and all associated map data entries. The maps themselves are not deleted, only their association with the MapSet. Use the MapSet Code.
Deletes a MapSet and all associated map data entries. The maps themselves are not deleted, only their association with the MapSet.
JWT token obtained from the authentication endpoint
MapSet Code
MSET_ZIRWP1NV0WBHMapSet deleted successfully
MapSet and associated MapSetData deleted successfullyUnauthorized - Invalid or expired token
MapSet not found
DELETE /v1/vps/map-set/{mapSetCode} HTTP/1.1
Host: api.multiset.ai
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"message": "MapSet and associated MapSetData deleted successfully"
}Schemas
RelativePose
The relativePose object defines a map's position and orientation within the MapSet coordinate system. It is the transform that moves the map's local frame into the MapSet frame, which is the frame of the origin map (order=0).
Coordinate frame: left-handed, Y-up (LHS / Unity). This is the map's native frame, the same one the position and rotation of a localization response use when isRightHanded is false or omitted. The MapSet endpoints accept and return poses in this frame only; there is no isRightHanded switch. If your alignment was computed in a right-handed tool (ARKit, ARCore, Three.js, ROS), convert to LHS first: negate x on the position and negate qy and qz on the quaternion. If your data is right-handed Z-up (ROS, most laser scanners), swap the Y and Z axes instead of negating X: the swap alone flips handedness and makes Y the up axis. See Coordinate Systems.
position.x
number
X offset in meters, left-handed Y-up frame
position.y
number
Y offset in meters (up)
position.z
number
Z offset in meters
rotation.qx
number
X component of the unit quaternion
rotation.qy
number
Y component of the unit quaternion
rotation.qz
number
Z component of the unit quaternion
rotation.qw
number
W (scalar) component of the unit quaternion
Last updated
Was this helpful?

