Base URL for all API calls:
https://gateway.beta.track3d.ai1
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.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 itsfloorplan.png). The export is zipped asynchronously, and once ready an email with the download link is sent to the requesting user.
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 recentupdatedAt 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.
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.
Error responses
Error responses
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.
- Dual-lens cameras (Insta360 X1, X2, RS): the camera produces two
.insvfiles 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 Mandatory headers
uploadManifest containing one uploadId per file. You drive each file through Steps 4b–4d using its uploadId.Request body
Response —
200 OKError responses
Error responses
No more than 3 files allowed — File name is missing — Unsupported file type — Video file is missing —
422 Unprocessable Entity422 Unprocessable Entity. Returned when any file does not contain a valid fileName.422 Unprocessable Entity. Returned when a file is not an INSV, MP4, or CSV file. Extension validation is case-insensitive.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 OK3
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 Mandatory headers: none.Request body: the raw bytes of the part (binary). For a single-part file, this is the whole file.Response —
(N-1) * partSize to N * partSize. Save the returned ETag.200 OKNo body. Read the ETag response header and keep it for Step 4d.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 headers
Request body
Response —
200 OK5
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 OKRetry 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 markedfailed. The app (or user) can re-queue failed items. Because of Layer 2 they resume from the last uploaded part, not from zero.
Recommended backoff for custom clients
If you implement your own uploader, wrap every S3 PUT and Track3D API call in exponential backoff with jitter.
Classify errors before retrying.