API prefix: /openapi/v0.1/open_model
Purpose: Upload imagery / LiDAR data via the OpenAPI to asynchronously trigger 2D / 3D / 3DGS / LiDAR model reconstruction, then download the resulting output files.
For algorithm parameter definitions, seeAlgorithm parameter introduction.
POST /openapi/v0.1/open_model/stores/obtain_tokendata:| Field | Description |
|---|---|
cloud_name | Cloud vendor; fixed to aws (S3) for overseas deployments |
access_key_id / secret_access_key / session_token | Temporary credentials |
region | Region |
cloud_bucket_name | Storage bucket |
end_point | Access endpoint |
store_path | Upload path template, e.g. fh/organizations/{orgId}/open_reconstruction/tmp/{uuid}/{fileName} |
callback_param | Encrypted pass-through parameter; must be returned verbatim to the upload callback |
expire_time | Credential expiration timestamp (seconds) |
expire_time; request a new one once it expires.{fileName} in store_path with the actual file name. Files must be uploaded directly under the parent directory (do not create subdirectories).path.Dir(store_path) + "/" + fileNameETag and strip the surrounding double quotes ("abc" → abc); you'll need it for the upload callback.File names must be unique. Repeating the same file name in another callback will be treated as a duplicate (see duplicate_skip_file_name_list).
POST /openapi/v0.1/open_model/stores/upload_callback| Field | Type | Required | Description |
|---|---|---|---|
resource_uuid | string(uuid) | Yes | Resource UUID generated by the caller; reused when starting reconstruction |
resource_name | string | No | Resource name, max length 255 |
callback_param | string | Yes | The original value returned in Step 1 |
files | array | Yes | File list, 1–100 files per call |
files[]:| Field | Description |
|---|---|
name | File name (relative to path.Dir(store_path), typically the basename) |
etag | ETag obtained in Step 2 (quotes already stripped) |
data:| Field | Description |
|---|---|
resource_uuid | Resource UUID |
upload_count | Number of files successfully registered in this call |
file_name_list | List of successfully registered files |
duplicate_skip_file_name_list | Files skipped due to deduplication |
resource_uuid unchanged.Important: Re-uploading a file with the same name does not overwrite the already-registered original file. The server deduplicates and skips it (its name appears in duplicate_skip_file_name_list); the originally registered file remains unchanged. Overwriting data via same-named files is not recommended — use a new file name instead, or re-upload under a new resource.
POST /openapi/v0.1/open_model/models/reconstruction/start| Field | Type | Required | Description |
|---|---|---|---|
resource_uuid | string(uuid) | Yes | The resource UUID from Step 3 |
parameter_2d | string | No | 2D parameters (JSON string) |
parameter_3d | string | No | 3D parameters (JSON string) |
parameter_3dgs | string | No | 3DGS parameters (JSON string) |
parameter_lidar | string | No | LiDAR parameters (JSON string) |
delete_resource_if_finish | bool | No | Whether to delete the original resource once all types succeed; default false |
parameter_2d/parameter_3d/parameter_3dgs/parameter_lidareach have a maximum length of 16384 characters.
data (only includes the types that were actually submitted):{
"model_3d": { "uuid": "....", "status": 12, "sub_error_code": 0 }
}parameter_*; otherwise no task will be started (the returned data will be empty).parameter_* is a string, not an object: serialize the parameter object with json.Marshal (or an equivalent) before assigning it.sub_error_code != 0 means that specific type failed to start (e.g., insufficient media count, concurrency limit exceeded), without affecting the other types.parameter_*. If there's no need to change the source material, there's no need to re-upload or repeat the full upload flow — simply reuse the existing resource_uuid and call start again.GET /openapi/v0.1/open_model/models/:model_uuiddata:| Field | Description |
|---|---|
model_status | Task status (see enum) |
reconstruction_progress | Reconstruction progress, 0–100 |
error_code | Reconstruction error code; 0 means no error |
model_size | Output size (bytes) |
zip_status | Archive status |
zip_progress | Archive progress, 0–100 |
zip_file_key | Archive download URL (signed URL, valid for 1 hour) |
model_status == 15 (reconstruction succeeded) AND zip_status == 2 (archiving complete)
=> zip_file_key is downloadableGET /openapi/v0.1/open_model/models/list, where model_zip_url is the download URL.zip_file_key / model_zip_url to download (it's a pre-signed URL requiring no additional authentication). The URL is valid for 1 hour; once expired, query the model details again to obtain a fresh URL.DELETE /openapi/v0.1/open_model/models/:model_uuid
DELETE /openapi/v0.1/open_model/resources/:resource_uuiddelete_resource_if_finish = true in Step 4 (the resource is only deleted once all types have succeeded).| Value | Meaning |
|---|---|
| 1 | Upload succeeded — ImportSuccess |
| 2 | Pending deletion — WaitingDelete |
| 3 | Deleted — Deleted |
| Value | Meaning |
|---|---|
| 8 | Reconstruction failed — ReconstructionFailed |
| 12 | Awaiting resources — RequestingResource |
| 13 | Resource request failed — RequestingResourceFailed |
| 14 | Reconstructing — ReconstructionExecuting |
| 15 | Reconstruction succeeded — ReconstructionSuccess |
| 16 | Reconstruction canceled — ReconstructionCanceled |
| Value | Meaning |
|---|---|
| 1 | 2D |
| 2 | 3D |
| 3 | 3DGS |
| 4 | LiDAR |
| Value | Meaning |
|---|---|
| 0 | Not started — Init |
| 1 | Archiving — Running |
| 2 | Archiving complete — Finish |
| 3 | Archiving failed — Failed |
| Error Code | Meaning / Resolution |
|---|---|
| 223102 | Organization mismatch — verify the token and the organization that owns the resource |
| 223103 | Resource not found — verify that resource_uuid matches the one used in the callback |
| 223104 | Resource already deleted |
| 223105 | Model not found |
| 223106 | Callback submitted with no files |
| 223107 | The current task status does not permit this operation (e.g., stopping an already-stopped task) |
| 223108 | Media count does not meet the limit |
| 223109 | Concurrent task limit exceeded |
| 222109 | Invalid parameter (parameter is empty, or JSON parsing failed) |
| 222101 | Internal server error |
| 229016 | Storage quota exceeded — expand your storage plan |
| 229017 | Mapping-image quota exceeded — purchase / top up a mapping credit plan |
| 229999 | Generic billing-entitlement check failed (fallback code for insufficient entitlement / quota) |
Important: a single problematic photo can cause the entire reconstruction job to fail, not just degrade the result locally. Common "problem photos" include: Photos not captured by a DJI aircraft mixed into the material: e.g., photos from a phone, camera, or a different drone brand (these lack DJI-specific POS/gimbal-attitude metadata and don't match the flight-line data); Corrupted or incomplete files: e.g., files truncated by an interrupted upload, missing or corrupted EXIF/XMP metadata, or non-standard JPEG encoding. Verify the material's source (all photos from the same DJI flight) and file integrity before uploading, so that a handful of bad files don't derail the entire reconstruction job.
| Type | Material Requirements / Recommendations |
|---|---|
| 2D visible-light | Supports JPG/JPEG. If using video-frame extraction, ensure sharp, stable footage with adequate overlap. After capture, check exposure, cloud/haze occlusion, photo coverage, RTK status, and camera intrinsics; it is recommended to disable the aircraft's built-in distortion correction and watermark features. |
| 3D visible-light mesh | Reference oblique-photography parameters: altitude 100 m, shutter speed ≤ 1/400 s, gimbal pitch -45°, forward overlap 80%, side overlap 70% — best suited to dense urban scenes with limited vegetation. These parameters are used for camera calibration and should not be treated as a uniform capture standard for all 3D tasks. |
| 3DGS / Gaussian Splatting | Supports both regular photos and video-frame-extracted photos; no dedicated recommendations currently exist for altitude, capture angle, or overlap ratio (the server-side count limit is covered in Q9: 10–4,000 images, which is an admission check, not a capture-quality guideline). |
| LiDAR | Only supports data captured by DJI Zenmuse LiDAR payloads; verify the raw point cloud and accompanying calibration / IMU / RTK files are complete (mandatory files in Q2). During capture, pay attention to scan mode, point rate vs. altitude, IMU calibration, RTK/POS status, and flight-line parameters. |
| File | Category | Description | Required for Modeling |
|---|---|---|---|
CLC / CLI | System & calibration (internal parameters) | LiDAR calibration file, camera calibration file; missing files degrade point-cloud precision or cause stratification | Required |
LDR | Raw LiDAR data (core data) | Raw point-cloud data measured by the LiDAR unit (range, angle, intensity, etc.) | Required |
IMU | Positioning & inertial navigation | Inertial measurement unit data (3-axis acceleration, angular velocity / attitude) | Required |
RTK | Positioning & inertial navigation | RTK positioning log from the rover (aircraft) | Required |
RTB | Positioning & inertial navigation | Raw observation data from the RTK base station | Required |
RTL | RTK link information | RTK link information | Required |
SIG | System & calibration (internal parameters) | Data integrity check file | Optional (beneficial) |
MRK | Imagery & ground control | Photo exposure timestamps; key for aligning photos with the point cloud | Optional (beneficial) |
PRT | System & calibration (internal parameters) | Flight task log: flight parameters, sensor status | Optional (beneficial) |
PPK.dat | Positioning & inertial navigation | Data specific to PPK (Post-Processed Kinematic) processing | Optional (beneficial) |
JPG / HEIF | Imagery & ground control | Visible-light photos, used to colorize the monochrome point cloud | Required for a colorized point cloud |
LDRT | Raw LiDAR data | Index file for the LiDAR data, speeds up reading / alignment with LDR | Not required |
RPOS | Positioning & inertial navigation | Fused real-time differential pose data | Not required |
DBG | System & calibration (internal parameters) | Debug log | Not required |
CLC, CLI, LDR, IMU, RTK, RTB, and RTL; missing any of these prevents reconstruction from proceeding..LDR: counts as 1 mapping image + storage per 5 MB, and participates in reconstruction;.CLC/.CLI/.IMU/.RTK/.RTB/.RTL/.SIG/.LDRT/.RPOS/.DBG/.PRT: each file counts as 1 mapping image + storage, and participates in reconstruction;.XMP: counts storage only, not a mapping image; it only participates in reconstruction when thumbnail-based reconstruction is enabled (is_thumbnail_reconstruction=true), alongside its corresponding thumbnail;NAV/OBS/BIN/MRK/DAT: neither counted as a mapping image nor as storage;223108 (media count limit) is validated by file count, while billed mapping-image counts follow the rules above (e.g., .LDR counts 1 image per 5 MB). As a result, large .LDR files rapidly accumulate mapping-image counts, which can easily trigger 229017 (insufficient mapping-image quota).upload_count returned by the upload callback is lower than expected?name doesn't match the actual uploaded object name (use the basename, without any subdirectory);etag still has its surrounding double quotes, or doesn't match the object;duplicate_skip_file_name_list — this is expected.start returns an empty data, and no task is started?parameter_* was submitted. Submit at least one, and ensure the string is non-empty.invalid param (222109)?parameter_* string is missing the parameter key internally, or parameter is an empty object {}. parameter must contain at least one field, e.g. {"parameter":{"quality_level":1}}.parameter_* must be a string. Generate it via obj -> json.Marshal -> string and place it in the outer request body (in a GET request or a debugging tool, this shows up as many \" characters).generate_obj in parameter_3d has no effect?output_mesh=true; point-cloud sub-formats require output_pointcloud=true.output_geo_desc to its default value (automatically determined by the algorithm) or use a local coordinate system. See the "Geographic Coordinate Systems" section of parameter_en.md for details.media number disqualify (223108)?.LDR, .RTK, or other LiDAR files).| Type | Minimum | Maximum |
|---|---|---|
| 2D | 5 | 20,000 |
| 3D | 5 | 20,000 |
| 3DGS | 10 | 4,000 |
| LiDAR | 5 | 20,000 |
job exceed limit (223109)?229016 / 229017?229016: storage quota exceeded → expand your storage plan;229017: mapping-image quota exceeded → purchase / top up a mapping credit plan.229016) is checked at all three of: obtaining an upload credential (obtain_token), upload callback (upload_callback) (when a resource is first created), and starting reconstruction (start);229017) is checked only at start.obtain_token means you cannot obtain an upload credential; a failed start means no task is created). Retry once the quota has been replenished.zip_file_key is empty?zip_status == 2. Note that the job may still be in the archiving stage even after model_status == 15.zip_file_key.X-Request-Id; the original material is the images / LiDAR files uploaded in that session). In addition, please supply the following information where possible (the more complete, the faster the diagnosis):| Item | Description |
|---|---|
X-Request-Id | Most critical. The ID you pass in the request header (the server logs it as request_id in the access log). Log the ID of every failed request (start / status queries / upload_callback) on the client side; if omitted, the server generates one automatically and the issue can then only be located by timestamp and request path. |
resource_uuid / model_uuid | Resource UUID and model UUID |
| Organization and timing | Your organization, and the approximate time the request was made / failed (including timezone) |
| Full response | The complete response of the failed call: code / message; from the model details endpoint, model_status / error_code; and the sub_error_code returned by start |
parameter_* | The complete parameter JSON used in that start call |
| Input material summary | Job type (2D/3D/3DGS/LiDAR), file types and counts, naming convention; for LiDAR, confirm whether the mandatory files CLC/CLI/LDR/IMU/RTK/RTB/RTL are present |
| Original material | If support needs to review the raw data, provide resource_uuid (support can locate the resource's media / raw data from it); supply the actual files separately if needed |
X-Request-Id (UUID) for every request, so the server can precisely trace the call chain by request_id.| Method | Path | Description |
|---|---|---|
| POST | /openapi/v0.1/open_model/stores/obtain_token | Obtain an upload credential |
| POST | /openapi/v0.1/open_model/stores/upload_callback | Upload callback |
| GET | /openapi/v0.1/open_model/resources/:resource_uuid | Resource details |
| DELETE | /openapi/v0.1/open_model/resources/:resource_uuid | Delete a resource |
| GET | /openapi/v0.1/open_model/resources/list | List resources |
| POST | /openapi/v0.1/open_model/models/reconstruction/start | Start reconstruction |
| POST | /openapi/v0.1/open_model/models/:model_uuid/reconstruction/stop | Stop reconstruction |
| GET | /openapi/v0.1/open_model/models/:model_uuid | Model details |
| GET | /openapi/v0.1/open_model/models/running | List running models |
| GET | /openapi/v0.1/open_model/models/list | List models (includes download links) |
| DELETE | /openapi/v0.1/open_model/models/:model_uuid | Delete a model |