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)

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

JSON
{
    "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)

JSON
{
    "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

JSON
{
    "reason": "Flight no longer required"
}