REST API
Completed Flights API
Use the Sky Schedule completed flights API to list and fetch flight logs by date, with Hobbs and Tach readings, route, customer, instructor, and aircraft.
The completed flights API returns the flight log entries your school records when a flight is completed: Hobbs and Tach out and in, route, the customer and instructor, and the aircraft. Use it to total aircraft time, reconcile billing, or feed a utilization report.
| Method and path | Description |
|---|---|
GET/api/v1/flights | List completed flights, optionally within a date range |
GET/api/v1/flights/{id} | Get one completed flight by id |
The completed flight object
| Field | Type | Description |
|---|---|---|
id | string (UUID) | Completed flight id. |
reservationId | string or null | The reservation this flight completed. Use it with the reservations API. |
reservationNumber | string or null | The school's reservation number. |
activityType | string or null | The activity type, such as Dual Flight Training. |
flightDate | string or null | Date of the flight, YYYY-MM-DD. |
startTime | string or null | Start time of day as recorded on the log, HH:MM:SS, with no time zone. |
endTime | string or null | End time of day as recorded on the log, HH:MM:SS, with no time zone. |
completedAt | string or null | When the flight was completed in Sky Schedule, ISO 8601 with UTC offset. |
route | string or null | Route as entered, for example KCRQ-KSEE-KCRQ. |
hobbs | object or null | start, end, and delta as numbers. null when no Hobbs was recorded. |
tach | object or null | start, end, and delta as numbers. null when no Tach was recorded. |
customer | object or null | name, email, and phone of the customer. |
instructor | object or null | name, email, and phone of the primary instructor. null when the flight had no instructor. |
aircraft | object or null | tailNumber and model. |
When a stored delta is missing, the API computes it as end minus start, rounded to 2 decimals. Any of start, end, or delta can be null on its own.
List completed flights
GET https://app.skyschedule.io/api/v1/flights
Query parameters
| Parameter | Required | Description |
|---|---|---|
from | No | YYYY-MM-DD. Only flights with flightDate on or after this date. |
to | No | YYYY-MM-DD. Only flights with flightDate on or before this date. |
limit | No | Records to return, 1 to 100. Default 50. |
Results are sorted newest first, by flightDate and then completedAt. Unlike reservations, from and to compare against the flight date itself, with no time zone conversion. Without a date range you get the most recent flights.
Example request
curl -s "https://app.skyschedule.io/api/v1/flights?from=2026-10-01&to=2026-10-07&limit=25" \
-H "Authorization: Bearer $SKYSCHEDULE_API_KEY"
Example response
{
"data": [
{
"id": "33333333-3333-4333-8333-333333333333",
"reservationId": "11111111-1111-4111-8111-111111111111",
"reservationNumber": "1031",
"activityType": "Dual Flight Training",
"flightDate": "2026-10-07",
"startTime": "08:00:00",
"endTime": "10:00:00",
"completedAt": "2026-10-07T17:12:44.318+00:00",
"route": "KCRQ-KSEE-KCRQ",
"hobbs": { "start": 2451.3, "end": 2452.6, "delta": 1.3 },
"tach": { "start": 1980.4, "end": 1981.5, "delta": 1.1 },
"customer": { "name": "Alex Student", "email": "alex.student@example.com", "phone": "555-0100" },
"instructor": { "name": "Sam Instructor", "email": "sam.cfi@example.com", "phone": "555-0101" },
"aircraft": { "tailNumber": "N12345", "model": "Cessna 172S Skyhawk" }
}
],
"meta": {
"count": 1,
"pageSize": 25,
"rateLimit": { "limit": 100, "remaining": 94, "reset": "2026-10-09T00:00:00.000Z" }
}
}
Get one completed flight
GET https://app.skyschedule.io/api/v1/flights/{id}
curl -s "https://app.skyschedule.io/api/v1/flights/33333333-3333-4333-8333-333333333333" \
-H "Authorization: Bearer $SKYSCHEDULE_API_KEY"
The response has the same flight object under data, and meta holds only rateLimit. An id that doesn't exist in your school returns:
{ "error": "Flight not found." }
Example: Hobbs time per aircraft for a week
A list returns at most 100 flights, so keep each date range short enough to fit. One week is plenty for most schools.
const params = new URLSearchParams({ from: "2026-10-01", to: "2026-10-07", limit: "100" });
const res = await fetch(`https://app.skyschedule.io/api/v1/flights?${params}`, {
headers: { Authorization: `Bearer ${process.env.SKYSCHEDULE_API_KEY}` },
});
const { data, meta } = await res.json();
if (meta.count === meta.pageSize) {
throw new Error("Page is full. Use a shorter date range so no flights are missed.");
}
const hobbsByTail = {};
for (const flight of data) {
const tail = flight.aircraft?.tailNumber ?? "unknown";
hobbsByTail[tail] = (hobbsByTail[tail] ?? 0) + (flight.hobbs?.delta ?? 0);
}
console.log(hobbsByTail); // { N12345: 14.2, N67890: 9.8 }
Flights are logged when a reservation is completed in Sky Schedule. An agent can do the same through the MCP tool complete_flight, described in the MCP tools reference. For daily limits and paging tips, see rate limits and errors.