Flight request endpoints
Submit, get, list and cancel flight requests
Submit Flight Request
POST /api/flight-requests
Create a flight request. If the area crosses multiple zone managers, the response lists one request per team along with a shared group_id.
Operator Identification
All flight requests require a valid operator_uuid. Operator details such as company name, email, phone, authorisation numbers and CTR exemption status are derived server‑side from the operator record. Register an operator via POST /api/operators to obtain a UUID (see Operators).
Request Body (JSON)
{
"operator_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"start_time": "2026-02-10T09:00:00Z",
"end_time": "2026-02-10T11:00:00Z",
"max_altitude": 50,
"purpose": "Infrastructure inspection",
"drone_name": "Mavic 3 Enterprise",
"drone_manufacturer": "DJI",
"drone_model": "Mavic 3E",
"serial_number": "1ZNBJ5G00C00FZ",
"maximum_takeoff_weight": 1.05,
"has_transponder": false,
"pilot_name": "Jan de Vries",
"pilot_phone": "+31612345678",
"pilot_licence": "A1/A3",
"radio_operator_name": "Jane Doe",
"radio_operator_phone": "+31687654321",
"notes": "Coordinated with ATC",
"flight_area": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
4.75,
52.32
],
[
4.76,
52.32
],
[
4.76,
52.33
],
[
4.75,
52.33
],
[
4.75,
52.32
]
]
]
},
"properties": []
}
]
},
"callback_url": "https://your-app.com/webhooks/droneclearance"
}
Required Fields
| Field | Type | Description |
|---|---|---|
| operator_uuid | uuid | Registered operator UUID (see Operators) |
| start_time | datetime | Flight start (ISO 8601, must be today or future) |
| end_time | datetime | Flight end (ISO 8601, must be after start_time) |
| max_altitude | integer | Maximum flight altitude in metres (0–500) |
| purpose | string | Flight purpose (max 1 000 characters) |
| drone_name | string | Name or label for the drone (max 255 characters) |
| serial_number | string | Drone serial number (max 255 characters) |
| flight_area | GeoJSON | FeatureCollection with Polygon geometry |
Optional Fields
| Field | Type | Description |
|---|---|---|
| pilot_name | string | Pilot name (falls back to operator company name) |
| pilot_phone | string | Pilot phone (falls back to operator phone) |
| pilot_licence | string | Pilot licence number or type |
| radio_operator_name | string | Radio operator name |
| radio_operator_phone | string | Radio operator phone |
| drone_manufacturer | string | Drone manufacturer |
| drone_model | string | Drone model |
| maximum_takeoff_weight | numeric | Maximum takeoff weight in kg |
| has_transponder | boolean | Whether the drone has a transponder |
| notes | string | Additional notes (max 2 000 characters) |
| callback_url | url | Webhook URL for status updates |
| send_confirmation_email | boolean | Send confirmation to operator email |
Error Response (422) — Invalid UUID
{
"message": "The given data was invalid.",
"errors": {
"operator_uuid": [
"The operator uuid must be a valid UUID.",
"No operator found for the given UUID."
]
}
}
Get Flight Request
GET /api/v1/flight-requests/{uuid}
Return status, team and review info for a specific request.
Optional Query
include_geometry=true — include GeoJSON flight area in the response.
Response (200)
{
"data": {
"uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"group_id": "550e8400-e29b-41d4-a716-446655440000",
"status": {
"name": "Approved",
"is_approved": true,
"is_rejected": false,
"is_final": true
},
"team": {
"id": 1,
"name": "Schiphol ATC"
},
"operator": {
"name": "John Doe",
"email": "john@example.com",
"phone": "+31612345678",
"company": "Drone Operations BV"
},
"flight": {
"date": "2026-02-10",
"start_time": "09:00:00",
"end_time": "11:00:00",
"altitude_max_m": 120,
"purpose": "Aerial photography"
},
"review": {
"notes": "Approved with standard conditions",
"reviewed_at": "2026-02-05T14:22:00Z",
"was_auto_processed": false
}
},
"related_requests": []
}
List Flight Requests
GET /api/flight-requests
List requests with pagination and filters.
Query Parameters
| Parameter | Description |
|---|---|
| status | Filter by status name (Pending, Approved, Capacity Hold, etc.) |
| from_date, to_date | Filter by flight date (YYYY‑MM‑DD) |
| operator_email | Filter by operator email |
| group_id | List all requests in a group |
| per_page | Results per page (max 100; default 20) |
| page | Page number |
Cancel Flight Request
DELETE /api/flight-requests/{uuid}
Cancel a cancellable request (e.g. Pending, Capacity Hold). Returns error if not allowed.
Optional Body
{
"reason": "Flight no longer required"
}