REST API
Reservations API
Use the Sky Schedule reservations API to list and fetch bookings by start date, with the customer, instructors, aircraft, status, activity type, and duration.
The reservations API returns bookings from your school's schedule: dual lessons, rentals, discovery flights, and the maintenance blocks that work orders put on an aircraft. Each reservation includes its times, status, activity type, the customer and instructors, and the aircraft. Meeting room, ground lesson, and classroom bookings are not part of this endpoint.
| Method and path | Description |
|---|---|
GET/api/v1/reservations | List reservations, optionally within a date range |
GET/api/v1/reservations/{id} | Get one reservation by id |
The reservation object
| Field | Type | Description |
|---|---|---|
id | string (UUID) | Reservation id. |
reservationNumber | string or null | The school's reservation number, as shown in the app. |
status | string or null | Status as stored, for example PENDING, checked-out, completed, or CANCELLED. Casing varies, so compare without case. Treat anything that starts with cancel as cancelled. |
activityType | string or null | The school's activity type, such as Dual Flight Training. Maintenance blocks use Maintenance. |
startsAt | string or null | Start time, ISO 8601 with UTC offset. |
endsAt | string or null | End time, ISO 8601 with UTC offset. |
durationHours | number or null | Hours between startsAt and endsAt, rounded to 2 decimals. |
people | array | The customer and up to two instructors. Each entry has role (customer or instructor), name, email, and phone. A person with no name, email, or phone on file is left out. |
aircraft | object or null | tailNumber and model of the booked aircraft, or null when no aircraft is booked. |
The people entries don't include customer or instructor ids. To match a person with the customers or instructors lists, use their email.
List reservations
GET https://app.skyschedule.io/api/v1/reservations
Query parameters
| Parameter | Required | Description |
|---|---|---|
from | No | YYYY-MM-DD. Only reservations that start at or after 00:00 UTC on this date. |
to | No | YYYY-MM-DD. Only reservations that start at or before 23:59:59 UTC on this date. |
limit | No | Records to return, 1 to 100. Default 50. |
Results are sorted by start time, oldest first. Without from, the list begins at the oldest reservation your school has, so pass from with today's date when you want upcoming bookings. Cancelled reservations can appear in the list; check status.
from and to are UTC calendar days. If your school is in the United States, an evening flight can start on the next UTC day, so widen the range by a day and filter on startsAt in your own time zone.
Example request
curl -s "https://app.skyschedule.io/api/v1/reservations?from=2026-10-09&to=2026-10-09&limit=2" \
-H "Authorization: Bearer $SKYSCHEDULE_API_KEY"
Example response
{
"data": [
{
"id": "11111111-1111-4111-8111-111111111111",
"reservationNumber": "1042",
"status": "PENDING",
"activityType": "Dual Flight Training",
"startsAt": "2026-10-09T15:00:00+00:00",
"endsAt": "2026-10-09T17:00:00+00:00",
"durationHours": 2,
"people": [
{ "role": "customer", "name": "Alex Student", "email": "alex.student@example.com", "phone": "555-0100" },
{ "role": "instructor", "name": "Sam Instructor", "email": "sam.cfi@example.com", "phone": "555-0101" }
],
"aircraft": { "tailNumber": "N12345", "model": "Cessna 172S Skyhawk" }
},
{
"id": "22222222-2222-4222-8222-222222222222",
"reservationNumber": "1043",
"status": "PENDING",
"activityType": "Maintenance",
"startsAt": "2026-10-09T16:00:00+00:00",
"endsAt": "2026-10-09T23:00:00+00:00",
"durationHours": 7,
"people": [],
"aircraft": { "tailNumber": "N67890", "model": "Piper PA-28-181 Archer" }
}
],
"meta": {
"count": 2,
"pageSize": 2,
"rateLimit": { "limit": 100, "remaining": 96, "reset": "2026-10-09T00:00:00.000Z" }
}
}
Get one reservation
GET https://app.skyschedule.io/api/v1/reservations/{id}
{id} is the full reservation UUID from a list response. A partial id, or an id from another school, returns 404.
curl -s "https://app.skyschedule.io/api/v1/reservations/11111111-1111-4111-8111-111111111111" \
-H "Authorization: Bearer $SKYSCHEDULE_API_KEY"
{
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"reservationNumber": "1042",
"status": "PENDING",
"activityType": "Dual Flight Training",
"startsAt": "2026-10-09T15:00:00+00:00",
"endsAt": "2026-10-09T17:00:00+00:00",
"durationHours": 2,
"people": [
{ "role": "customer", "name": "Alex Student", "email": "alex.student@example.com", "phone": "555-0100" },
{ "role": "instructor", "name": "Sam Instructor", "email": "sam.cfi@example.com", "phone": "555-0101" }
],
"aircraft": { "tailNumber": "N12345", "model": "Cessna 172S Skyhawk" }
},
"meta": {
"rateLimit": { "limit": 100, "remaining": 95, "reset": "2026-10-09T00:00:00.000Z" }
}
}
When the reservation doesn't exist:
{ "error": "Reservation not found." }
Example: next 7 days for one aircraft
The API has no aircraft filter, so filter on your side:
const params = new URLSearchParams({ from: "2026-10-08", to: "2026-10-15", limit: "100" });
const res = await fetch(`https://app.skyschedule.io/api/v1/reservations?${params}`, {
headers: { Authorization: `Bearer ${process.env.SKYSCHEDULE_API_KEY}` },
});
const { data, meta } = await res.json();
const bookings = data.filter(
(r) => r.aircraft?.tailNumber === "N12345" && !String(r.status).toLowerCase().startsWith("cancel"),
);
if (meta.count === meta.pageSize) {
console.warn("Page is full. Split the date range to see every reservation.");
}
The REST API is read only. To book, change, or cancel reservations from software, use the MCP tools create_reservation, update_reservation, and cancel_reservation described in the MCP tools reference. Comments on a reservation are in the reservation comments API.