Skip to main content

Core concepts

Every SDK is built on the same four nouns, nested in a fixed hierarchy.

NounWhat it is
TourOne captured space, and the unit of sharing. Owns everything below it.
FloorA level within the tour, ordered by number. May carry a floor-plan document.
RoomA space on a floor, with a RoomType.
ScanA single panorama, with a pose in the floor plan and a processing status.

Fetching a tour by id returns the whole tree in one response, so you rarely walk it request by request:

const tour = await NTController.tours.get(tourId);

for (const floor of tour.floors) {
for (const room of floor.rooms) {
console.log(room.name, room.scans.length);
}
}

Scan status

A scan is created before its images exist. panoramaURL, panoramaLowResURL and thumbnailURL are all null until processing reaches FINISHED, so filter on status before rendering rather than checking each URL.

StatusMeaning
EMPTYCreated, nothing uploaded yet
QUEUEDUploaded and waiting to be processed
PROCESSINGBeing processed
FINISHEDReady — image URLs are populated
FAILEDProcessing failed; no images will be produced
const viewable = room.scans.filter(scan => scan.status === "FINISHED");

Visibility and slugs

A tour is PRIVATE by default: it is readable only with a token scoped to its organisation. Setting visibility to PUBLIC mints a slug, and a tour with a slug can be read without an authenticated user.

const updated = await NTController.tours.update(tourId, { visibility: "PUBLIC" });
// updated.slug is now set

Setting it back to PRIVATE revokes the slug, and every link built from it stops resolving. Read slug from the update response rather than assuming its value — making a tour public again does not necessarily reissue the same one.

Identifiers

Tours, floors, rooms and scans each carry an id assigned by the API. Tours, rooms and scans additionally carry a localId assigned by the capture device. Address everything by id; localId exists to link a room to its outline in the floor-plan document.

A note on naming

The product calls these tours, and so does every SDK surface. A few underlying API paths and exported type names still say property — the same entity under its earlier name. PropertyItem is a tour; PropertyListItem is a tour in a listing.