Skip to Content
APIsAsset Models

Access: org_type = Asset Manufacturer, Admin+ for create/update/delete. Reads open to all authenticated orgs. See access-control.md.

Asset Model Endpoints Summary

EndpointMethodOperation NameDescription
/asset-modelsPOSTCreate Asset ModelCreate a new Asset Model
/asset-models/bulkPOSTBulk Create ModelsRegister multiple Asset Models in one request
/asset-modelsGETGet Asset ModelsGet all Asset Models from manufacturers
/asset-models/\{Asset_uuid\}GETGet One Asset ModelGet details of a specific Asset Model
/asset-models/\{model_uuid\}/payloadsGETGet Asset Model PayloadsList full payload models permitted by the Asset Model
/asset-models/\{model_uuid\}PUTUpdate Asset ModelUpdate a Asset Model
/asset-models/\{Asset_uuid\}DELETEDelete Asset ModelUpdate Asset Model status to INACTIVE

Create Asset Model

POST /asset-models

Request Body:

{ "model_name": "string", "model_variant": "string", "model_version": "string", "type_certificate_number": "string", "manufacturer_uuid": "string", "category": "enum", "sub_category": "enum", "class": "enum", "max_takeoff_weight": "double", "max_dimensions": "string", "max_endurance": "double", "max_range": "double", "max_speed": "double", "max_height": "double", "min_temp": "double", "max_temp": "double", "operation_envelope": "enum", "operation_time": [ "string" ], "frequency": "string", "gcs_model": "Ideaforge GCS-V3", "gcs_version": "v1.2.0", "allowed_payload_uuids": [ "uuid" ], "application": "string", "source": 1 }
  • 201 Created:
{ "message": "Asset Model created successfully", "data": { ... } }
  • 400 Bad Request:
{ "error": "'category' must be a valid asset category enum" }
  • 409 Conflict:
{ "error": "A Asset Model with this name and variant already exists for this manufacturer" }
  • 422 Unprocessable Entity:
{ "error": "'max_takeoff_weight' must be a positive number" }

Bulk Create Asset Models

POST /asset-models/bulk

Manufacturers can register multiple Asset Models in a single batch operation.

Request Body:

{ "models": [ { "model_name": "Switch V2", "category": 2, "sub_category": 2, "class": 3, ... }, { "model_name": "Switch V3", "category": 2, "sub_category": 2, "class": 3, ... } ] }

Responses:

  • 201 Created:
{ "message": "Bulk registration successful", "data": { "total_registered": 2, "models": [ ... ] } }
  • 400 Bad Request:
{ "error": "'models' array must not be empty" }

Get Asset Models

GET /asset-models

Get all Asset Models from manufacturer.

Query Parameters:

ParamTypeDescription
pageint (optional)Page number (default: 1)
limitint (optional)Records per page (default: 25)

Responses:

  • 200 OK:
{ "data": [ { "model_id": 101, "model_uuid": "d1e2f3a4-5678-4abc-9123-abc1234def56", "model_udai_id": "UDAI-MDL-001", "model_name": "A200", "model_variant": "XT-Pro", "model_version": "v2.0", "type_certificate_number": "TCN-998877", "manufacturer_uuid": "mfg-uuid-1234", "category": "SURVEILLANCE", "sub_category": "QUADCOPTER", "class": "C2", "max_takeoff_weight": 12.5, "max_dimensions": "120x80x60 cm", "max_endurance": 3.5, "max_range": 15, "max_speed": 60, "max_height": 120, "min_temp": -20, "max_temp": 50, "operation_envelope": "VLOS", "operation_time": [ "06:00-12:00", "16:00-20:00" ], "frequency": "2.4GHz", "gcs_model": "Ideaforge GCS-V3", "gcs_version": "v1.5.3", "payloads": [ "camera", "thermal_sensor" ], "payload_id": "a1b2c3d4-5678-9abc-def0-123456789abc", "application": "Border Surveillance", "created_at": "2025-07-04T10:30:00Z", "created_by": "550e8400-0000-41d4-a716-446655440000", "updated_at": "2025-07-04T10:30:00Z", "updated_by": "550e8400-0000-41d4-a716-446655440000" } ], "pagination": { "total_records": 50, "total_pages": 2, "current_page": 1, "per_page": 25, "has_next": true, "has_previous": false } }

Get One Asset Model

GET /asset-models/{Asset_uuid}

Get details of a specific Asset Model.

Request Body:

{ "model_udai_id": "UDAI-MDL-001" }
  • 200 OK:
{ "data": { "model_uuid": "d1e2f3a4-5678-4abc-9123-abc1234def56", "model_udai_id": "UDAI-MDL-001", "model_name": "Switch", "model_variant": "v2.Pro", "model_version": "1.0.4", "type_certificate_number": "TCN-998877", "manufacturer_uuid": "mfg-uuid-1234", "category": 2, "sub_category": 2, "class": 3, "max_takeoff_weight": 12.5, "max_dimensions": "120x80x60 cm", "max_endurance": 3.5, "max_range": 15, "max_speed": 60, "max_height": 120, "min_temp": -20, "max_temp": 50, "operation_envelope": "VLOS", "operation_time": [ "06:00-12:00", "16:00-20:00" ], "frequency": "2.4GHz", "gcs_model": "Ideaforge GCS-V3", "gcs_version": "v1.5.3", "allowed_payload_uuids": [ "a1b2c3d4-5678-9abc-def0-123456789abc" ], "application": "Border Surveillance", "status": 1, "created_at": "2025-07-04T10:30:00Z", "created_by": "550e8400-0000-41d4-a716-446655440000", "updated_at": "2025-07-04T10:30:00Z", "updated_by": "550e8400-0000-41d4-a716-446655440000" } }
  • 404 Not Found:
{ "error": "Asset Model not found" }
  • 410 Gone:
{ "error": "Asset Model has been deactivated" }

Get Asset Model Payloads

GET /asset-models/{model_uuid}/payloads

Returns the full payload model details for every payload UUID in the Asset Model’s allowed_payload_uuids. Unlike GET /payload-models, this endpoint is not scoped to the caller’s organisation: it mirrors the open-read access of the parent Asset Model, so an Asset Owner operating an asset received via transfer can still populate flight-plan payload selectors even though it does not own the payload models.

Access: any authenticated org (same as GET /asset-models/\{model_uuid\}).

  • 200 OK:
{ "data": [ { "payload_uuid": "f8e9d0c1-b2a3-4455-6677-889900aabbcc", "payload_udai_id": "UDAI-PAY-045", "payload_name": "Ninja Thermal H1", "payload_type": 2, "manufacturer": "Ideaforge", "org_owner_uuid": "9f3a1b2c-4d5e-6f7a-8b9c-0d1e2f3a4b5c", "weight_kg": 0.85, "horizontal_swath": 120.5, "vertical_swath": 90.2, "status": 1, "created_at": "2025-07-04T10:00:00Z", "updated_at": "2025-07-04T10:00:00Z" } ] }

The data array preserves the order of allowed_payload_uuids. Payload UUIDs that no longer resolve to an active payload model are omitted. An Asset Model with no allowed payloads returns \{ "data": [] \}.

  • 404 Not Found:
{ "error": "Asset Model not found" }

Update Asset Model

PUT /asset-models/{model_uuid}

Update Asset Model.

Request Body:

{ "model_name": "string", "model_variant": "string", "model_version": "string", "type_certificate_number": "string", "manufacturer_uuid": "string", "category": "enum", "sub_category": "enum", "class": "enum", "max_takeoff_weight": "double", "max_dimensions": "string", "max_endurance": "double", "max_range": "double", "max_speed": "double", "max_height": "double", "min_temp": "double", "max_temp": "double", "operation_envelope": "enum", "operation_time": [ "string" ], "frequency": "string", "gcs_model": "string", "gcs_version": "string", "payloads": [ "string" ], "payload_id": "uuid", "application": "string" }
  • 200 OK:
{ "message": "Asset Model updated successfully", "data": { ... } }
  • 400 Bad Request:
{ "error": "Invalid enum value for 'class'" }
  • 404 Not Found:
{ "error": "Asset Model not found" }
  • 422 Unprocessable Entity:
{ "error": "'max_height' must be a positive number" }

Delete Asset Model

DELETE /asset-models/{Asset_uuid}

Update a specific Asset Model’s status to INACTIVE. No request body is needed.

  • 200 OK:
{ "message": "Status updated to INACTIVE" }
  • 404 Not Found:
{ "error": "Asset Model not found" }
  • 410 Gone:
{ "error": "Asset Model is already inactive" }
Last updated on