Skip to main content
Base URL for all API calls: https://gateway.beta.track3d.ai
This guide walks through the full integration flow in the order you will use it.
1

Sign in

Exchange your platform credentials for an auth token.
2

Download structure sheets

Get the floorplan PNG for each structure to use as your capture base.
3

Check for design changes

Confirm you are capturing against the latest sheets.
4

Upload captures

Push your captures to Track3D.

Before you start

You need two credentials from Track3D. You will also need your Project ID (e.g. PRJ999999), Structure IDs, and Design IDs, shared by the Track3D team along with your API key.

Required headers for all Track3D API calls

The only exception is the direct S3 upload (Step 4c), which sends no headers.

Step 1 — Sign in

Exchange your platform credentials for an auth token (JWT). This token identifies you and carries your permissions on the platform. Every API call below requires it.
Request body
Response
Use this token as the authorization: Bearer <jwt> header on every call. Tokens expire after 24 hours. When a call returns 401, sign in again to get a fresh token.

Step 2 — Project folder with default sheet

Generates a downloadable folder export for a project containing only each structure’s default capture sheet (the PDF plus its floorplan.png). The export is zipped asynchronously, and once ready an email with the download link is sent to the requesting user.
Mandatory headers Query parameters Request body: none (GET request). Response — 200 OK
The response returns immediately. The zip is built in the background. When it finishes, a download link is emailed to the user, valid for 7 days.

Step 3 — Check for design changes

Latest default design update time

Returns the most recent updatedAt timestamp across a project’s default capture designs. Use it to decide whether a previously generated export is stale. If this timestamp is newer than your last download, the default sheets have changed and a fresh export should be requested using Step 2.
Mandatory headers Query parameters Request body: none (GET request). Response — 200 OK
latestDefaultDesignUpdatedAt is an ISO 8601 UTC timestamp, or null when the project has no default design.

Step 4 — Upload captures

Run Step 4a once per batch of files, then repeat Steps 4b–4d for every file in the manifest. A file is complete once all its parts are reported in Step 4d. Step 4e can be called any time.

Supported video formats

The API accepts only two video formats, .insv and .mp4. Files in any other video format are rejected.
Do not strip or modify file metadata on INSV files. Upload .insv files exactly as the camera produced them, with all file properties intact, including lens information. Track3D uses this metadata to determine how the capture was recorded.
  • Dual-lens cameras (Insta360 X1, X2, RS): the camera produces two .insv files per capture, one per lens. Both files must be uploaded, and each must retain its lens metadata so Track3D can pair and stitch them correctly.
  • Single-file cameras (Insta360 X4, X5): the camera produces one merged video file per capture.
1

Create capture and register files

Creates a capture and registers every file you intend to upload. Returns an uploadManifest containing one uploadId per file. You drive each file through Steps 4b–4d using its uploadId.
Mandatory headersRequest body
Response — 200 OK
No more than 3 files allowed — 422 Unprocessable Entity
File name is missing — 422 Unprocessable Entity. Returned when any file does not contain a valid fileName.
Unsupported file type — 422 Unprocessable Entity. Returned when a file is not an INSV, MP4, or CSV file. Extension validation is case-insensitive.
Video file is missing — 422 Unprocessable Entity. Returned when the files contain no INSV or MP4 file. A CSV file cannot be submitted by itself.
2

Presign file parts

For one file (uploadId), returns a short-lived S3 URL for each part still needing upload. Small files return a single part, larger files return several. Presign a file just before you upload it, the URLs expire.
UPL_f001 is the uploadId from Step 4a.Mandatory headersRequest body: none.Response — 200 OK
If parts is empty, the file is already fully uploaded, skip to the next file.
3

Upload a part to S3

Uploads the bytes of one part directly to Amazon S3 using the presigned URL from Step 4b. Send no authentication headers. Slice the file so that part N covers bytes (N-1) * partSize to N * partSize. Save the returned ETag.
Mandatory headers: none.Request body: the raw bytes of the part (binary). For a single-part file, this is the whole file.Response — 200 OKNo body. Read the ETag response header and keep it for Step 4d.
You may upload multiple parts, and multiple files, in parallel for higher throughput.
4

Report completed parts

Reports the ETag of every uploaded part for a file. When the last part is reported, Track3D finalizes the file in S3 automatically. Send all parts of the file in one call.
Mandatory headersRequest body
Response — 200 OK
5

Check upload status (optional)

Returns overall progress for a capture, how many files have finished. Use it to confirm all uploads landed before triggering downstream work.
CAP_ext789 is the captureId from Step 4a.Mandatory headersRequest body: none.Response — 200 OK

Retry and resilience

Uploads are designed to survive network blips, expired URLs, and full process restarts. The client SDK (@track3d/uploader-web) implements a three-layer retry model on top of the server’s resumability. If you build your own client, replicate these layers.

Layer 1 — Part PUT retry

Each part PUT (Step 4c) is retried on transient failure before the part is considered failed.
A 403 (expired presigned URL) is not retried here, it is surfaced to Layer 2, which re-signs fresh URLs. A missing ETag response header is treated as a failed part and retried. Cancellation short-circuits immediately with no further retries.

Layer 2 — Session resume loop

For each file, the client loops until the file is complete:
presign-missing returns only parts not yet in S3, so a resumed upload never re-sends bytes that already landed. On a 403 / expired URL during a PUT, the client re-syncs status and loops to re-presign, no data is lost. This is the same mechanism as a manual resume: call Step 4b again for the same uploadId at any time.

Layer 3 — Queue retry

When layers 1–2 are exhausted, a file is marked failed. The app (or user) can re-queue failed items. Because of Layer 2 they resume from the last uploaded part, not from zero. If you implement your own uploader, wrap every S3 PUT and Track3D API call in exponential backoff with jitter. Classify errors before retrying.
On every retry, send the exact ETag S3 returned for the successful PUT, including the surrounding quotes.

Quick reference

Support

If you run into issues with credentials, permissions (401/403 responses), or upload failures, contact your Track3D point of contact with your project ID and the failing request details, excluding your API key and token.