Access:
org_type= Asset Manufacturer, Admin+ for create/update/delete. Reads open to all authenticated orgs. See access-control.md.
Asset Model Endpoints Summary
| Endpoint | Method | Operation Name | Description |
|---|---|---|---|
/asset-models | POST | Create Asset Model | Create a new Asset Model |
/asset-models/bulk | POST | Bulk Create Models | Register multiple Asset Models in one request |
/asset-models | GET | Get Asset Models | Get all Asset Models from manufacturers |
/asset-models/\{Asset_uuid\} | GET | Get One Asset Model | Get details of a specific Asset Model |
/asset-models/\{model_uuid\}/payloads | GET | Get Asset Model Payloads | List full payload models permitted by the Asset Model |
/asset-models/\{model_uuid\} | PUT | Update Asset Model | Update a Asset Model |
/asset-models/\{Asset_uuid\} | DELETE | Delete Asset Model | Update 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:
| Param | Type | Description |
|---|---|---|
page | int (optional) | Page number (default: 1) |
limit | int (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"
}