For the complete documentation index, see llms.txt. This page is also available as Markdown.

360° Virtual Tour (Pano)

The Pano APIs serve navigable 360° panoramic virtual tours built from your maps. A tour is a graph of nodes. Each node is a 360° capture point with a position, orientation, a panorama image, and links to its neighbours. Use these read APIs to build a "walk-through" viewer where a user steps from node to node.

All Pano endpoints are read-only and require your authentication token. They are mounted under /v1/pano.

Pano data is generated for 360 (Insta360) maps that have been processed for panoramic tours. Maps without pano data return 404. See 360° Virtual Tour for the concepts behind these calls and how to preview a tour in the Developer Portal.

The node object

Most responses return one or more node objects with this shape:

{
    "nodeId": "n_012",
    "keyframe": 12,
    "timeS": 4.5,
    "position": [1.20, 1.60, -3.40],
    "rotation": [0.0, 0.0, 0.0, 1.0],
    "rgbKey": "…/Pano/n_012.jpg",
    "maskKey": null,
    "neighbors": [ { "nodeId": "n_013", "distance": 1.05 } ]
}
  • position: node location [x, y, z] in the map's coordinate frame.

  • rotation: orientation quaternion [qx, qy, qz, qw].

  • rgbKey: storage key for the node's 360° panorama image. maskKey: optional mask image key (null if none).

  • neighbors: the nodes you can step to from here, with the distance in metres.

Endpoints

List pano-enabled maps

GET /v1/pano: a paginated library of maps that have a virtual tour.

Query params: page (default 1), limit (1–100, default 20).

List pano-enabled maps

get

A paginated library of maps that have a virtual tour, newest first.

Authorizations
AuthorizationstringRequired

JWT token obtained from the authentication endpoint.

Query parameters
pageinteger · min: 1OptionalDefault: 1
limitinteger · min: 1 · max: 100OptionalDefault: 20
Responses
200

Paginated list of pano-enabled maps.

application/json
totalCountintegerOptionalExample: 8
pageintegerOptionalExample: 1
limitintegerOptionalExample: 20
get/pano

Tour summary

GET /v1/pano/{id}: header/summary for one map's tour ({id} = map id or map code). Includes nodeCount, hasMasks, and navigation hints (version, mapSet) when the map belongs to a version chain or MapSet.

Get tour summary

get

Header/summary for one map's tour, including navigation hints when the map belongs to a version chain or MapSet.

Authorizations
AuthorizationstringRequired

JWT token obtained from the authentication endpoint.

Path parameters
idstringRequired

Map id or map code.

Example: MAP-ABC123
Responses
200

Tour header.

application/json
mapCodestringOptionalExample: MAP-ABC123
mapIdstringOptional
mapNamestringOptionalExample: Ground Floor
thumbnailKeystringOptional
metricbooleanOptional
panoSizeintegerOptionalExample: 512
minSpacingMnumberOptionalExample: 1
nodeCountintegerOptionalExample: 240
hasMasksbooleanOptional
createdAtstring · date-timeOptional
updatedAtstring · date-timeOptional
get/pano/{id}

Viewer-ready manifest

GET /v1/pano/{id}/manifest: the tour header plus every node, sorted by nodeId. Load this once to render a complete tour.

Get viewer-ready manifest

get

The tour header plus every node, sorted by nodeId. Load once to render a complete tour.

Authorizations
AuthorizationstringRequired

JWT token obtained from the authentication endpoint.

Path parameters
idstringRequired

Map id or map code.

Example: MAP-ABC123
Responses
200

Header plus all nodes.

application/json
mapCodestringOptionalExample: MAP-ABC123
mapIdstringOptional
mapNamestringOptionalExample: Ground Floor
thumbnailKeystringOptional
metricbooleanOptional
panoSizeintegerOptionalExample: 512
minSpacingMnumberOptionalExample: 1
nodeCountintegerOptionalExample: 240
hasMasksbooleanOptional
createdAtstring · date-timeOptional
updatedAtstring · date-timeOptional
get/pano/{id}/manifest

Paginated nodes

GET /v1/pano/{id}/nodes: nodes in pages, for large tours. Query params: page (default 1), limit (1–200, default 50). Returns { totalCount, page, limit, nodes }.

Get nodes (paginated)

get

Tour nodes in pages, for large tours.

Authorizations
AuthorizationstringRequired

JWT token obtained from the authentication endpoint.

Path parameters
idstringRequired

Map id or map code.

Example: MAP-ABC123
Query parameters
pageinteger · min: 1OptionalDefault: 1
limitinteger · min: 1 · max: 200OptionalDefault: 50
Responses
200

Paginated nodes.

application/json
totalCountintegerOptional
pageintegerOptional
limitintegerOptional
get/pano/{id}/nodes

GET /v1/pano/{id}/window: the local neighbourhood around a starting point, for stepping through a tour without loading it all. All query params are optional:

  • nodeId: centre on a specific node.

  • x, y, z: centre on the node nearest a world position (provide all three).

  • qx, qy, qz, qw: an optional orientation quaternion (provide all four, together with a position) to prefer nodes the user is facing.

  • depth: how many graph hops to include from the centre (1–4, default 2).

You cannot pass both nodeId and a position. Precedence is nodeId → position → the tour's entry node.

Get navigation window

get

The local neighbourhood around a starting point, for stepping through a tour without loading it all. Center on a nodeId, or on the node nearest a world position (x,y,z), optionally biased by an orientation quaternion (qx,qy,qz,qw). You cannot pass both nodeId and a position. Precedence: nodeId → position → tour entry node.

Authorizations
AuthorizationstringRequired

JWT token obtained from the authentication endpoint.

Path parameters
idstringRequired

Map id or map code.

Example: MAP-ABC123
Query parameters
nodeIdstringOptional

Center on this node.

depthinteger · min: 1 · max: 4Optional

Graph hops from the center.

Default: 2
xnumberOptional

World X (provide x

ynumberOptional
znumberOptional
qxnumberOptional

Orientation quaternion (provide all four

qynumberOptional
qznumberOptional
qwnumberOptional
Responses
200

Window of nodes around the center.

application/json
mapCodestringOptional
mapIdstringOptional
centerstring · nullableOptional
centerDistanceMnumberOptional

Present when centered by position.

centerAngleDegnumberOptional

Present when centered by position + orientation.

depthintegerOptional
nodeCountintegerOptional
get/pano/{id}/window

Tours across versions and MapSets

Same view across map versions

GET /v1/pano/map-version/{versionCode}/window: returns the "same viewpoint" seen across the maps in a version chain, so a viewer can switch between versions (e.g. before / after an update) at the same spot. Optional query params: mapCodes (comma-separated subset of the version), anchorMapCode (which version drives navigation), nodeId, depth (1–4, default 2), maxDistanceM (how close a node must be to count as the "same view"). Positions are returned in the base map's frame.

Same view across map versions

get

Returns the "same viewpoint" across the maps in a version chain, so a viewer can switch between versions at the same spot. Positions are returned in the base map's frame.

Authorizations
AuthorizationstringRequired

JWT token obtained from the authentication endpoint.

Path parameters
versionCodestringRequired
Query parameters
mapCodesstringOptional

Comma-separated version mapCodes (default all in chain).

anchorMapCodestringOptional

Which version drives navigation (default base map).

nodeIdstringOptional
depthinteger · min: 1 · max: 4OptionalDefault: 2
maxDistanceMnumberOptional

Same-view gate (default no cap).

Responses
200

Cross-version viewpoints.

application/json
versionCodestringOptional
baseMapCodestringOptional
maxDistanceMnumber · nullableOptional
windowMapCodesstring[]Optional
viewpointCountintegerOptional
get/pano/map-version/{versionCode}/window

One continuous tour across a MapSet

GET /v1/pano/map-set/{id}/window: treats the pano-enabled maps in a MapSet as a single continuous tour, bridging between maps where they meet. Optional query params: mapCodes, mapCode (the current node's map), nodeId, depth (1–4, default 2), bridgeRadiusM (how close nodes in different maps must be to link). Each returned node is identified by { mapCode, nodeId }, and neighbours that cross into another map are marked "cross": true.

Continuous tour across a MapSet

get

Treats the pano-enabled maps in a MapSet as a single continuous tour, bridging between maps where they meet. Each node is identified by { mapCode, nodeId }; neighbours that cross into another map are marked cross: true. Positions are in the MapSet common frame.

Authorizations
AuthorizationstringRequired

JWT token obtained from the authentication endpoint.

Path parameters
idstringRequired

MapSet id or code.

Query parameters
mapCodesstringOptional

Comma-separated members (default all).

mapCodestringOptional

The current node's map (default primary).

nodeIdstringOptional
depthinteger · min: 1 · max: 4OptionalDefault: 2
bridgeRadiusMnumberOptional

Cross-map bridge radius (default = current map's minSpacingM).

Responses
200

Continuous cross-map window.

application/json
mapSetCodestringOptional
primaryMapCodestringOptional
bridgeRadiusMnumberOptional
depthintegerOptional
nodeCountintegerOptional
get/pano/map-set/{id}/window

For large tours, prefer the window endpoints and load neighbours as the user moves, rather than fetching the full manifest up front.

Last updated

Was this helpful?