Home/The Project/API Reference

Karst Firewall 5.0 API Reference

Swagger-compatible OpenAPI 3.0 contract for the kf50-php API surface: user authentication, technology logs, wildfire and vegetation-health data, IoT ingestion, and the DJI drone bridge.

OpenAPI JSON API base OpenAPI 3.0.3 51 operations

Authentication 6 operations

POST /auth/login Public or form-token flow
Login and receive auth data
Authenticates a user with the API app credentials and returns the user auth payload, including the bearer token when successful.

Parameters

No path, query or header parameters.

JSON body

Schema: LoginRequest
FieldTypeRequired
username string yes
password string yes

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
POST /auth/signup Public or form-token flow
Create an account
Creates a user account from the public signup payload. The response is true on success or validation details on failure.

Parameters

No path, query or header parameters.

JSON body

Schema: SignupRequest
FieldTypeRequired
username string no
email string no
password string no

Responses

StatusDescription
200 Boolean success flag.
401 Invalid or missing bearer token.
422 Validation failed.
GET /auth/me User bearer token
Read current user auth data
Returns the authenticated user auth payload.

Parameters

No path, query or header parameters.

JSON body

No JSON request body.

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
POST /auth/refresh Public or form-token flow
Rotate the session token
Accepts a bearer token in the Authorization header or authToken in the request body and returns fresh auth data. Rotation: the response carries a NEW authToken and the presented token only stays valid for a short overlap window, so clients must store the returned token.

Parameters

No path, query or header parameters.

JSON body

Schema: RefreshRequest
FieldTypeRequired
authToken string no

Responses

StatusDescription
200 Successful JSON response.
401 Token missing or invalid.
422 Validation failed.
POST /auth/forgot-password Public or form-token flow
Request password reset email
Starts the password reset workflow for a user email address.

Parameters

No path, query or header parameters.

JSON body

Schema: PasswordResetRequest
FieldTypeRequired
email string yes

Responses

StatusDescription
200 Boolean success flag.
401 Invalid or missing bearer token.
422 Validation failed.
POST /auth/reset-password Public or form-token flow
Reset password
Completes a password reset with the token from the email workflow.

Parameters

NameInTypeRequired
token query string yes

JSON body

Schema: ResetPasswordRequest
FieldTypeRequired
password string yes

Responses

StatusDescription
200 Boolean success flag.
401 Invalid or missing bearer token.
422 Validation failed.

Technology logs 7 operations

GET /technology-log User bearer token
List technology logs
Lists active, non-deleted technology log rows through the TechnologyLogSearch data provider. Pass page=0 to disable pagination.

Parameters

NameInTypeRequired
page query object no

JSON body

No JSON request body.

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
POST /technology-log User bearer token
Create a technology log
Creates a technology log row using the Yii REST ActiveController create action.

Parameters

No path, query or header parameters.

JSON body

Schema: TechnologyLogCreate
FieldTypeRequired
technology_id integer no
datetime string no
data_value string no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
201 Created.
GET /technology-log/{id} User bearer token
Read one technology log
Reads a single technology log row by id.

Parameters

NameInTypeRequired
id path integer yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
PUT /technology-log/{id} User bearer token
Update one technology log
Updates a technology log row. The REST controller accepts PUT for updates.

Parameters

NameInTypeRequired
id path integer yes

JSON body

Schema: TechnologyLogCreate
FieldTypeRequired
technology_id integer no
datetime string no
data_value string no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
DELETE /technology-log/{id} User bearer token
Soft-delete one technology log
Marks a technology log as deleted when the model has a deleted attribute; otherwise deletes the row.

Parameters

NameInTypeRequired
id path integer yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Boolean success flag.
401 Invalid or missing bearer token.
422 Validation failed.
GET /technology-log/validation User bearer token
Read validation rules
Returns Yii validation rules for the TechnologyLog model.

Parameters

No path, query or header parameters.

JSON body

No JSON request body.

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
POST /technology-log/create-from-json User bearer token
Create technology log from ChirpStack JSON
Maps a ChirpStack-style payload by deviceInfo.devEui to a Technology row and stores object data as a technology log.

Parameters

No path, query or header parameters.

JSON body

Schema: ChirpstackTechnologyLogRequest
FieldTypeRequired
deviceInfo object yes
object object yes
rxInfo array<object> yes

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.

Wildfire data 3 operations

GET /v1/historical-wildfire User bearer token
List historical wildfires as GeoJSON
Returns a paginated GeoJSON FeatureCollection of historical wildfire rows, optionally filtered by bbox=south,west,north,east.

Parameters

NameInTypeRequired
bbox query string no
page query integer no
perPage query integer no

JSON body

No JSON request body.

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
POST /v1/calibration/export User bearer token
Create calibration export
Creates a calibration-export bundle for eligible simulation runs and responds with a redirect to the download endpoint.

Parameters

NameInTypeRequired
run_ids query string no

JSON body

Schema: CalibrationExportRequest
FieldTypeRequired
run_ids string no

Responses

StatusDescription
302 Calibration export created. Location header points to /v1/calibration/download/{id}.
400 run_ids missing.
404 One or more runs not found.
422 Run is not eligible for calibration export.
GET /v1/calibration/download/{id} User bearer token
Download calibration export
Downloads a generated calibration export file by id.

Parameters

NameInTypeRequired
id path integer yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Export file.
404 Export not found.

Vegetation health 3 operations

GET /v1/veg-health/ingest-status User bearer token
Read NDVI ingest status
Returns recent NDVI ingest runs, freshness and degradation metadata. Requires pyrowise.ndvi.view and the NDVI feature flag.

Parameters

NameInTypeRequired
action query string no
limit query integer no

JSON body

No JSON request body.

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
GET /v1/veg-health/aoi/{aoi_id}/series User bearer token
Read NDVI time series for one AOI
Returns NDVI observations for an AOI across a date window.

Parameters

NameInTypeRequired
aoi_id path string yes
from query string no
to query string no
observed_only query integer no
limit query integer no

JSON body

No JSON request body.

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
GET /v1/veg-health/aoi/{aoi_id} User bearer token
Read current vegetation-health verdict
Returns the latest vegetation-health report for an AOI, including current band, anomaly and fuel-class breakdown when available.

Parameters

NameInTypeRequired
aoi_id path string yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.

IoT inventory 4 operations

GET /iot-sensor-inventory.json User bearer token
List active IoT sensors
Read-only active sensor inventory served to kf50-observation-ingest.

Parameters

No path, query or header parameters.

JSON body

No JSON request body.

Responses

StatusDescription
200 Array of active sensors.
401 Invalid or missing bearer token.
GET /iot-sensor-inventory User bearer token
List active IoT sensors
Read-only active sensor inventory served to kf50-observation-ingest.

Parameters

No path, query or header parameters.

JSON body

No JSON request body.

Responses

StatusDescription
200 Array of active sensors.
401 Invalid or missing bearer token.
GET /iot-gateway-inventory.json User bearer token
List active IoT gateways
Read-only active gateway inventory served to kf50-observation-ingest.

Parameters

No path, query or header parameters.

JSON body

No JSON request body.

Responses

StatusDescription
200 Array of active gateways.
401 Invalid or missing bearer token.
GET /iot-gateway-inventory User bearer token
List active IoT gateways
Read-only active gateway inventory served to kf50-observation-ingest.

Parameters

No path, query or header parameters.

JSON body

No JSON request body.

Responses

StatusDescription
200 Array of active gateways.
401 Invalid or missing bearer token.

IoT write-back 5 operations

POST /iot-discovery/sensor Internal service bearer
Register discovered IoT sensor
Called by kf50-observation-ingest when it sees a paired sensor device_id that has not been announced yet.

Parameters

No path, query or header parameters.

JSON body

Schema: IotSensorDiscoveryRequest
FieldTypeRequired
device_id string yes
gateway_serial string yes
first_seen_at string no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
201 Sensor row created.
POST /iot-gateway/{serial}/status Internal service bearer
Update gateway status
Updates the last-known status projection for an already registered LoRaMIP gateway.

Parameters

NameInTypeRequired
serial path string yes

JSON body

Schema: IotGatewayStatusRequest
FieldTypeRequired
network_status string no
pairing_mode string no
influx_status string no
mqtt_status string no
mqtt_message_count integer no
local_buffer_count integer no
pending_sync_count integer no
paired_devices_count integer no
firmware_version string no
last_status_payload object no
last_seen_at string no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
POST /iot-sensor/{device_id}/last-metrics Internal service bearer
Update one sensor last metrics projection
Updates denormalised last_* telemetry fields for one registered sensor.

Parameters

NameInTypeRequired
device_id path string yes

JSON body

Schema: IotSensorLastMetricsRequest
FieldTypeRequired
last_observation_at string no
last_seq_id integer no
last_cycles_received integer no
last_cycles_total integer no
last_rssi_dbm number no
last_snr_db number no
last_temp_c number no
last_pressure_hpa number no
last_humidity_pct number no
last_gas_mean_ohm number no
last_gas_range_min_ohm number no
last_gas_range_max_ohm number no
last_profile string no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
POST /iot-sensor/last-metrics Internal service bearer
Bulk update sensor last metrics projections
Updates denormalised last_* telemetry fields for multiple registered sensors and returns a per-row report.

Parameters

No path, query or header parameters.

JSON body

Schema: IotSensorLastMetricsBulkRequest
FieldTypeRequired
rows array<object> yes

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
POST /iot-sensor-log Internal service bearer
Persist sensor-log rows
Idempotent per-reading sink used by kf50-observation-ingest for live MQTT history and explicit InfluxDB backfills.

Parameters

NameInTypeRequired
X-Influx-Fallback-Reason header string no

JSON body

Schema: IotSensorLogFallbackRequest
FieldTypeRequired
rows array<object> yes

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
503 Fallback disabled.

Field positioning 6 operations

GET /placement-plans User bearer token
List active placement campaigns
Active placement campaigns, newest first, for the mobile app start screen. Returns headline fields plus per-status site counts, never the raw planner response.

Parameters

No path, query or header parameters.

JSON body

No JSON request body.

Responses

StatusDescription
200 Active campaigns.
401 Invalid or missing bearer token.
GET /placement-plan/{id} User bearer token
Read one placement campaign and its sites
One campaign plus every planned site — the LoRaMiP gateway mast and the e-nose sensors — each with its planned and (once confirmed) as-built coordinates. The optional assigned_to / status query filters narrow the sites to one crew member's queue; the plan summary still reflects the whole campaign.

Parameters

NameInTypeRequired
id path integer yes
assigned_to query string no
status query string no

JSON body

No JSON request body.

Responses

StatusDescription
200 Campaign and its sites.
401 Invalid or missing bearer token.
404 Placement plan not found.
POST /placement-plan/site/{id}/confirm User bearer token
Confirm an as-built site position
The mobile app writeback for an install visit: the device serial scanned off the hardware and the as-built GPS position from the phone. The planned position never changes; the confirmed position lands in installed_lat/lon so plan-vs-built drift stays auditable. Idempotent for a site already installed; sites that are live or in a terminal state refuse with 409. If the scanned serial is already held by another non-terminal site the call returns 409 code=serial_conflict with the holding site; re-POST with reassign=true to move the serial here (the old site is walked back to procured and its as-built facts are preserved in the audit log).

Parameters

NameInTypeRequired
id path integer yes

JSON body

Schema: PlacementConfirmRequest
FieldTypeRequired
device_serial string yes
lat number yes
lon number yes
accuracy_m number no
confirmed_by string no
notes string no
reassign boolean no

Responses

StatusDescription
200 Site confirmed.
400 Missing or invalid body — device_serial required (≤64 chars); lat/lon numeric and within WGS84 range.
401 Invalid or missing bearer token.
404 Placement site not found.
409 Site is live or in a terminal state; the deployment schema predates the positioning API; or the device serial is already held by another site (code=serial_conflict, includes holding_site — retry with reassign=true to move it).
POST /placement-plan/site/{id}/release User bearer token
Release a sensor from a site
Removes the sensor from a placement site: clears the device serial and as-built position and walks the site back to procured (device available, no longer placed). Idempotent — releasing an already-empty site is a no-op (released=false). Allowed from any lifecycle state; the extra confirmation for a live (transmitting) sensor is enforced by the app. The prior serial/position/state are preserved in the audit log.

Parameters

NameInTypeRequired
id path integer yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Site released, or already empty (released=false).
401 Invalid or missing bearer token.
404 Placement site not found.
GET /placement-plan/{id}/geojson User bearer token
Read one placement campaign as GeoJSON
The same sites as /placement-plan/{id}, serialized as a GeoJSON FeatureCollection so the mobile app can drop them straight onto flutter_map/MapLibre. Each feature carries planned/as-built coordinates, status colour and server-side plan-vs-built drift. The optional assigned_to / status query filters narrow the features to one crew member's queue.

Parameters

NameInTypeRequired
id path integer yes
assigned_to query string no
status query string no

JSON body

No JSON request body.

Responses

StatusDescription
200 Campaign sites as a GeoJSON FeatureCollection.
401 Invalid or missing bearer token.
404 Placement plan not found.
POST /placement-plan/site/{id}/photo User bearer token
Attach an install photo to a placement site
Uploads one install photo (jpeg/png/webp ≤5 MB) for a placement site. Kept separate from /confirm so the offline app can retry the photo independently. Optional caption and as-built lat/lon may accompany the file. Supply client_uuid to make the retry safe: a replay returns the photo already stored (deduplicated=true) rather than a second copy.

Parameters

NameInTypeRequired
id path integer yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Photo stored, or returned unchanged when this upload was already stored under the same client_uuid.
400 Missing or invalid file — file required; must be jpeg/png/webp ≤5 MB. Also returned for a malformed client_uuid.
401 Invalid or missing bearer token.
404 Placement site not found.
409 Deployment schema predates the placement-photo table, or client_uuid already identifies a photo on another site.

IoT field ops 4 operations

GET /iot-sensor/by-serial/{serial} User bearer token
Look up one IoT sensor by serial
Resolves one device by device_id or sensor_id_alias (the scanned QR may carry either) and returns its inventory record plus live freshness so the installer sees everything on scan. Responds 200 with {"found": false} when the serial is unknown.

Parameters

NameInTypeRequired
serial path string yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Device lookup result.
401 Invalid or missing bearer token.
POST /iot-sensor-inventory/import User bearer token
Bulk import IoT sensors by serial
Pre-loads the whole device batch (serials, optional placements, gateway) so scans resolve in the field. Upserts by device_id with a per-row report. approve:true sets discovery_state=approved so imported devices are immediately scan-resolvable.

Parameters

No path, query or header parameters.

JSON body

Schema: IotSensorImportRequest
FieldTypeRequired
default_deployment_state string no
approve boolean no
devices array<object> yes

Responses

StatusDescription
200 Per-row import report.
401 Invalid or missing bearer token.
422 Validation failed.
GET /iot-sensor/{device_id}/status User bearer token
Read one sensor status and metrics
The post-install "test connection" read: the denormalized last_* snapshot, freshness, gateway link, per-metric ok/warn/alert levels, and the last N sensor-log rows when present. The app polls this until freshness=live.

Parameters

NameInTypeRequired
device_id path string yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Sensor status and metrics.
401 Invalid or missing bearer token.
404 Sensor not found.
GET /iot-gateway/{serial}/status User bearer token
Read gateway connectivity status
Exposes the already-ingested gateway health for the installer app's "validate gateway" step: network/mqtt/influx status, last-seen, and paired/pending-sync counts.

Parameters

NameInTypeRequired
serial path string yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Gateway connectivity status.
401 Invalid or missing bearer token.
404 Gateway not found.

Field maintenance 7 operations

GET /field-assets User bearer token
List field assets due, overdue, or nearby
The maintenance app's work list: field-asset summaries with per-asset next_due_at, open-event count and overdue flag. Geo filter (near + radius_km) is a bounding-box prefilter plus haversine sort and returns distance_km; due/state filters narrow the queue.

Parameters

NameInTypeRequired
near query string no
radius_km query number no
due_within_days query integer no
overdue_only query integer no
open_only query integer no
taxonomy query string no
deployment_state query string no
q query string no

JSON body

No JSON request body.

Responses

StatusDescription
200 Matching field assets.
401 Invalid or missing bearer token.
GET /field-asset/by-serial/{serial} User bearer token
Look up one field asset by serial
Scan lookup: matches field_asset.serial or alias, and falls through iot_sensor.device_id → field_asset_id, so a device scanned in either mobile app resolves to the same physical asset. Returns the asset with its events, photos and taxonomy checklist template.

Parameters

NameInTypeRequired
serial path string yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Field-asset detail.
401 Invalid or missing bearer token.
404 Field asset not found.
GET /field-asset/{id} User bearer token
Read one field asset and its history
One field asset plus its recent maintenance events, photos and the taxonomy checklist template used to seed new events.

Parameters

NameInTypeRequired
id path integer yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Field-asset detail.
401 Invalid or missing bearer token.
404 Field asset not found.
POST /maintenance-event User bearer token
Open a maintenance event
Opens a maintenance event against a field asset. The checklist is seeded from the taxonomy template when checklist_state is omitted; the event attributes to the authenticated user. Supply client_uuid to make the retry safe: a replay returns the event already opened rather than a second one.

Parameters

No path, query or header parameters.

JSON body

Schema: MaintenanceEventCreateRequest
FieldTypeRequired
field_asset_id integer yes
event_type string yes
severity string no
title string no
notes string no
started_at string no
next_due_at string no
checklist_state object no
client_uuid string no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
201 Maintenance event opened.
409 client_uuid already identifies another operator's event.
PATCH /maintenance-event/{id} User bearer token
Update a maintenance event
Logs work on an open maintenance event: notes, downtime, parts cost, checklist state. Optimistically locked via row_version; a stale row_version returns 409 so the offline app can reload and merge.

Parameters

NameInTypeRequired
id path integer yes

JSON body

Schema: MaintenanceEventUpdateRequest
FieldTypeRequired
title string no
notes string no
severity string no
downtime_hours number no
parts_cost number no
checklist_state object no
next_due_at string no
row_version integer no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
409 row_version conflict — reload and retry.
POST /maintenance-event/{id}/complete User bearer token
Complete a maintenance event
Closes a maintenance event (ended_at=NOW()). Optional downtime, parts cost and next_due_at may be supplied at close. Idempotent for an already-completed event.

Parameters

NameInTypeRequired
id path integer yes

JSON body

Schema: MaintenanceEventCompleteRequest
FieldTypeRequired
downtime_hours number no
parts_cost number no
next_due_at string no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
POST /maintenance-event/{id}/attachment User bearer token
Attach a photo or PDF to a maintenance event
Uploads one image or PDF (≤8 MB) to a maintenance event. Returns the stored attachment with its mime and image/pdf flags. Supply client_uuid to make the retry safe: a replay returns the attachment already stored (deduplicated=true) rather than a second copy.

Parameters

NameInTypeRequired
id path integer yes

JSON body

No JSON request body.

Responses

StatusDescription
200 Attachment stored, or returned unchanged when this upload was already stored under the same client_uuid.
400 Missing or invalid file — file required; must be an image or PDF ≤8 MB. Also returned for a malformed client_uuid.
401 Invalid or missing bearer token.
404 Maintenance event not found.
409 client_uuid already identifies an attachment on another event.

DJI bridge 5 operations

POST /iot-drone/register-discovery Internal service bearer
Register discovered DJI drone
Called by kf50-dji-bridge when a DJI airframe serial is first seen. Idempotent: existing serials return the existing row.

Parameters

No path, query or header parameters.

JSON body

Schema: DjiDroneDiscoveryRequest
FieldTypeRequired
dji_serial string yes
dock_id string no
model string no
drone_type string no
mission_profile string no
payload_profile string no
firmware_version string no
connection_mode string no
real_connection_enabled boolean no
dji_workspace_id string no
dji_device_sn string no
remote_control_sn string no
bound_dock_id string no
discovered_at string no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
201 Drone row created.
POST /iot-drone/{dji_serial}/status Internal service bearer
Update DJI drone status
Updates last battery, network, dock, mission and observation timestamp for a registered DJI airframe.

Parameters

NameInTypeRequired
dji_serial path string yes

JSON body

Schema: DjiDroneStatusRequest
FieldTypeRequired
battery_pct integer no
network_status string no
dock_id string no
mission_id string no
observation_at string no
firmware_version string no
connection_mode string no
real_connection_enabled boolean no
last_connection_check_at string no
last_connection_error string no
flight_plan_status string no
orthophoto_enabled boolean no
orthophoto_status string no
orthophoto_job_id string no
orthophoto_output_url string no
media_upload_url string no
media_inventory_url string no
last_media_upload_at string no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
POST /iot-mission/start Internal service bearer
Start DJI mission
Creates an in-flight mission row linked to a registered DJI drone. mission_id is bridge-owned and must be unique.

Parameters

No path, query or header parameters.

JSON body

Schema: DjiMissionStartRequest
FieldTypeRequired
mission_id string yes
dji_serial string yes
dock_id string no
operator_id integer no
started_at string yes
live_stream_url string no
live_stream_expires_at string no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
201 Mission row created.
POST /iot-mission/{mission_id}/end Internal service bearer
End DJI mission
Marks a mission ended and stores generated drone artefact URLs/counts.

Parameters

NameInTypeRequired
mission_id path string yes

JSON body

Schema: DjiMissionEndRequest
FieldTypeRequired
ended_at string no
telemetry_count integer no
thermal_frame_count integer no
hotspot_count integer no
track_minio_url string no
mission_manifest_url string no

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Validation failed.
POST /pyrowise/trigger-from-hotspot Internal service bearer
Trigger PyroWISE nowcast from DJI hotspot
Validates a drone-detected thermal hotspot, gates by confidence, calls PyroWISE nowcast, persists a simulation_run row, and links it to the DJI mission.

Parameters

No path, query or header parameters.

JSON body

Schema: DjiHotspotTriggerRequest
FieldTypeRequired
mission_id string yes
drone_serial string no
hotspot object yes

Responses

StatusDescription
200 Successful JSON response.
401 Invalid or missing bearer token.
422 Below confidence threshold or invalid mission reference.
201 PyroWISE run accepted and persisted.
400 Malformed hotspot payload.
502 PyroWISE unreachable or returned an error.
Machine-readable contract: /portal/openapi.json

This page embeds the same OpenAPI object it renders, so downstream tools can validate against the JSON contract while humans can inspect each endpoint here.