Best API to Access Male Velana International Airport (MLE) Flights Schedules Data in 2025
You need reliable departure and arrival schedules for a single airport and a clean way to put them into a board, alerting workflow, or data pipeline. By the end of this guide, you’ll pull Male Velana International Airport (MLE) schedules from FlightLabs, parse the JSON, group flights by hour, and understand how to combine schedules with live status for terminals, gates, and delays.
About Velana International Airport (MLE)
Velana International Airport serves Malé, the capital of the Maldives. Its IATA code is MLE and its ICAO code is VRMM. Developers track MLE for resort and transfer coordination, tight island connections, and to keep guests and logistics updated on early-morning departures and evening arrivals.
The schedules endpoint you’ll use
FlightLabs provides a REST endpoint for flight schedules designed for planning and boards. You’ll work with:
- Flight Schedules: https://www.goflightlabs.com/flights-schedules
- For live status (optional but useful for gates, delays, and cancellations): https://www.goflightlabs.com/real-time
Authentication uses an API key. If you don’t have one, get it here: Register. You can also explore and compose queries in the MCP and review parameter options in the Documentation.
Copy-pasteable requests for MLE departures and arrivals
The examples below use a generic API key query parameter. Consult the Documentation for the exact authentication method and filtering parameters in your plan, then substitute accordingly. The jq filters shown here select MLE departures or arrivals client‑side based on the JSON fields.
Departures from MLE (client-side filter)
curl -s "https://www.goflightlabs.com/flights-schedules?api_key=YOUR_API_KEY" \
| jq '.data.schedules
| map(select(.departure.airport == "MLE"))
| sort_by(.departure.scheduled)[:50]'
Arrivals to MLE (client-side filter)
curl -s "https://www.goflightlabs.com/flights-schedules?api_key=YOUR_API_KEY" \
| jq '.data.schedules
| map(select(.arrival.airport == "MLE"))
| sort_by(.arrival.scheduled)[:50]'
Notes:
- Replace YOUR_API_KEY with your key.
- The jq expressions filter by the airport code fields present in the response and sort by scheduled time.
- Use server-side filters in production (airport, date, direction, etc.) once you confirm the parameter names in the docs; this reduces payload size and speeds up responses.
What the schedules response looks like and which fields matter
Below is the official schedule response sample (structure representative for planning). You will commonly read flight_number, departure.scheduled, arrival.scheduled, terminals, aircraft, and airline identifiers.
{
"success": true,
"data": {
"schedules": [
{
"flight_number": "UA456",
"departure": {
"airport": "SFO",
"scheduled": "2024-03-20T08:00:00Z",
"terminal": "3"
},
"arrival": {
"airport": "ORD",
"scheduled": "2024-03-20T14:15:00Z",
"terminal": "1"
},
"aircraft": {
"type": "Boeing 787-9",
"registration": "N123UA"
},
"airline": {
"name": "United Airlines",
"iata": "UA"
}
}
]
}
}
Field highlights you will use for MLE boards and planning:
- flight_number: Public flight designator you’ll show to travelers and for cross-referencing live status.
- departure.airport and arrival.airport: IATA airport codes you’ll filter by (set to "MLE" for this guide when selecting MLE boards).
- departure.scheduled and arrival.scheduled: ISO 8601 timestamps in UTC ("Z"). Convert to local Maldives time (Indian/Maldives; UTC+05:00) for displays.
- departure.terminal and arrival.terminal: Terminal identifiers. Gates are typically part of live status; see next sample.
- airline.iata and airline.name: Airline branding and for grouping or icons.
- aircraft.type and registration: Useful for operations dashboards and spotters; optional for traveler-facing UIs.
Adding real-time status for gates and delays (optional)
Schedules are for planning; terminal changes, gates, delays, and cancellations are live concepts. Combine schedules with real-time status. Here is the official real-time response sample:
{
"success": true,
"data": {
"flight": {
"iata": "AA123",
"icao": "AAL123",
"number": "123",
"status": "en-route",
"departure": {
"airport": "JFK",
"scheduled": "2024-03-20T10:00:00Z",
"actual": "2024-03-20T10:05:00Z",
"terminal": "8",
"gate": "B12"
},
"arrival": {
"airport": "LAX",
"scheduled": "2024-03-20T13:15:00Z",
"estimated": "2024-03-20T13:20:00Z",
"terminal": "4",
"gate": "45A"
},
"position": {
"latitude": 39.8729,
"longitude": -98.7372,
"altitude": 35000,
"speed": 495,
"heading": 270
}
}
}
}
Use these live fields when enhancing MLE boards:
- status: "scheduled", "active/en-route", "landed", "cancelled", or "diverted" (exact values depend on data). This drives color states and notifications.
- departure.actual and arrival.estimated: For delay calculations alongside the scheduled timestamps.
- departure.gate and arrival.gate: Gate announcements on terminals where available.
JavaScript example: group MLE flights by hour
This example fetches schedules and builds an object keyed by local hour for easy boards or summaries. It filters client-side for MLE and groups arrivals and departures separately. Replace the placeholder key and consider server-side filters in production.
async function fetchSchedules() {
const res = await fetch("https://www.goflightlabs.com/flights-schedules?api_key=YOUR_API_KEY");
if (!res.ok) throw new Error("Failed to fetch schedules");
const json = await res.json();
return (json && json.data && Array.isArray(json.data.schedules)) ? json.data.schedules : [];
}
// Utility: parse UTC time and convert to Maldives local (UTC+05:00) hour label.
function toLocalHourLabel(isoUtc) {
// For display: '2025-05-18 07:00'
const dt = new Date(isoUtc); // interpreted as UTC when 'Z' present
// Maldives time is UTC+05:00; shift minutes accordingly for label
const localMs = dt.getTime() + (5 * 60 * 60 * 1000);
const local = new Date(localMs);
const y = local.getUTCFullYear();
const m = String(local.getUTCMonth() + 1).padStart(2, "0");
const d = String(local.getUTCDate()).padStart(2, "0");
const h = String(local.getUTCHours()).padStart(2, "0");
return `${y}-${m}-${d} ${h}:00`;
}
function groupByHourForMLE(schedules) {
const result = { departures: {}, arrivals: {} };
for (const s of schedules) {
const dep = s.departure || {};
const arr = s.arrival || {};
// Departures from MLE
if (dep.airport === "MLE" && dep.scheduled) {
const key = toLocalHourLabel(dep.scheduled);
if (!result.departures[key]) result.departures[key] = [];
result.departures[key].push({
flight_number: s.flight_number,
airline: s.airline ? (s.airline.iata || s.airline.name) : "",
scheduled_utc: dep.scheduled,
terminal: dep.terminal || null,
aircraft: s.aircraft ? s.aircraft.type : null,
to: arr.airport || ""
});
}
// Arrivals to MLE
if (arr.airport === "MLE" && arr.scheduled) {
const key = toLocalHourLabel(arr.scheduled);
if (!result.arrivals[key]) result.arrivals[key] = [];
result.arrivals[key].push({
flight_number: s.flight_number,
airline: s.airline ? (s.airline.iata || s.airline.name) : "",
scheduled_utc: arr.scheduled,
terminal: arr.terminal || null,
aircraft: s.aircraft ? s.aircraft.type : null,
from: dep.airport || ""
});
}
}
return result;
}
(async () => {
const schedules = await fetchSchedules();
const grouped = groupByHourForMLE(schedules);
// Example: log next 3 hours of departures
const depKeys = Object.keys(grouped.departures).sort().slice(0, 3);
for (const k of depKeys) {
console.log("Departure hour:", k);
console.table(grouped.departures[k]);
}
// Example: log next 3 hours of arrivals
const arrKeys = Object.keys(grouped.arrivals).sort().slice(0, 3);
for (const k of arrKeys) {
console.log("Arrival hour:", k);
console.table(grouped.arrivals[k]);
}
})();
Tips:
- All example timestamps end with "Z", representing UTC. Convert to local time for Malé displays (UTC+05:00).
- Terminals in schedules are informational. For gates and updated estimates, join with live status data using the flight_number and airline identifiers.
Building arrival boards, delay alerts, and schedule sync for MLE
- Arrival boards: Filter schedules where arrival.airport == "MLE", sort by arrival.scheduled, and display flight_number, airline.iata, arrival.terminal. Add gate and status by augmenting with the real-time endpoint.
- Delay alerts: Compare departure.actual or arrival.estimated (from real-time) with corresponding scheduled times (from schedules). Trigger notifications when the difference exceeds your threshold.
- Schedule sync: Use the schedules endpoint to populate your DB daily for MLE (arrivals and departures). Cache results and periodically reconcile with real-time updates for last-minute changes, cancellations, and diversions.
How to combine schedules and live status without surprises
Schedules and real-time are complementary:
- Schedules are stable and ideal for forward planning and rendering a daily board at MLE.
- Real-time carries transient fields like status, gate, actual and estimated times, and position.
Join keys and matching:
- Use flight_number and airline.iata as the primary join keys across endpoints.
- When multiple flights share similar numbers or when codeshares are present, use additional context (departure.scheduled, departure.airport/arrival.airport) to disambiguate. If codeshare indicators are available in your data tier, prefer operating carrier for ground-truth timing.
Time zones, polling, and caching
- Time zones: The schedule timestamps in the sample use UTC ("Z"). For MLE boards, convert to UTC+05:00 (Indian/Maldives) for user-facing displays. Keep storage in UTC for consistency.
- Polling: For schedules, update every 5–15 minutes depending on your freshness needs. For live status at MLE, consider polling every 30–60 seconds during active operations windows, then back off overnight.
- Caching: Cache schedule payloads by date and direction (arrivals/departures). Use ETags or conditional requests if available in your stack. For live status, apply a short TTL cache (e.g., 15–60 seconds) to smooth spikes.
- Cancelled and diverted: If status indicates "cancelled" or "diverted", bubble this state to your UI and optionally keep the row with a distinct style for a defined window (e.g., same day) so users understand changes.
Pagination and result sizing
Large airports and peak times produce long lists. The schedules endpoint supports pagination and filtering—refer to the Documentation for the exact parameters available in your plan. Implementation guidelines:
- Always request the minimal time window you need (e.g., hourly or daily) for MLE to bound result sizes.
- Implement a loop that honors pagination cursors or page/limit patterns returned by the API. Do not assume a fixed page size.
- Store a "last seen" checkpoint (timestamp or cursor) per direction and date to resume syncs safely.
How far ahead can you retrieve MLE schedules?
Availability windows (how many days/weeks ahead) depend on data coverage and your plan. Use the schedules endpoint for near-term planning and the Future Flights endpoint for longer horizons when needed:
- Flight Schedules (schedules): for day-of and near-term boards.
- Future Flights (future flights): for prospective planning beyond the schedule horizon.
Check the Documentation for limits that apply to your account and confirm the exact forward window for MLE.
Technical comparison: choosing the right FlightLabs endpoints for MLE use cases
This table compares core endpoints you might combine for MLE, focusing on what they contribute to a schedules-driven workflow.
| Endpoint | Primary Use at MLE | Key Fields | When to Call | Notes |
|---|---|---|---|---|
| Flight Schedules | Daily arrivals/departures board, planning, ETL baseline | flight_number, departure/arrival.airport, departure/arrival.scheduled, terminal, airline, aircraft | On schedule rollover; refresh every 5–15 minutes | Best source for stable times; pair with live for last-minute changes |
| Real-time | Gates, delays, cancellations, diversions, in-flight details | status, departure.actual, arrival.estimated, gate, terminal, position | Every 30–60 seconds during active periods | Join on flight_number + airline to enrich boards |
| Future Flights | Planning beyond standard schedule horizon | Forward-looking schedule data | Daily or weekly for planning snapshots | Coverage varies; confirm windows in docs |
Production checklist for your MLE integration
- Normalize time: store in UTC, render in Maldives local (UTC+05:00).
- Filter server-side by airport and direction once you confirm parameters; use client-side filters only during prototyping.
- Implement pagination defensively; never assume a fixed result size.
- Cache schedules; overlay real-time updates with short TTL.
- Represent cancellations/diversions explicitly in your UI and notifications.
- Log joins between schedules and real-time by flight_number and airline.iata for traceability.
FAQ
How do I filter the schedules endpoint specifically for MLE departures or arrivals?
Use the filtering parameters described in the Documentation to request MLE + direction + date server-side. Until then, you can filter client-side by checking departure.airport or arrival.airport equals "MLE".
Where do gates and delay information come from?
Gates, delays, cancellations, and diversions are part of live status. Combine schedule fields (scheduled times and terminals) with the real-time endpoint’s status, gate, actual, and estimated fields.
What timezone are schedule timestamps in?
The sample shows "Z" (UTC). Convert to local Maldives time (UTC+05:00) for traveler-facing displays. Keep storage and comparisons in UTC to avoid daylight or offset confusion.
How frequently should I poll?
For schedules, 5–15 minutes is typical. For live status, 30–60 seconds during MLE’s active operations hours is a practical default; back off when traffic is low.
How far into the future can I retrieve schedules for MLE?
It depends on coverage and your plan. Use the schedules endpoint for near-term and the Future Flights endpoint for longer horizons. Confirm your exact window in the docs.
Get an API key and start building your MLE boards and alerts now: Register. For parameter details, examples, and testing tools, check the Documentation and try requests in the MCP.