REST API
Maintenance API
Use the Sky Schedule maintenance API to read work orders, squawks, aircraft inspections, due reminders, and parts inventory from read-only REST endpoints.
The maintenance API gives read-only access to what your shop tracks in Sky Schedule: work orders, squawks, inspections, inspection reminders, and parts inventory. Use it to put open squawks on a hangar screen, send a weekly list of inspections coming due, or flag parts that are running low.
| Method and path | Returns | Sort order |
|---|---|---|
GET/api/v1/work-orders | Work orders | Created, newest first |
GET/api/v1/squawks | Squawks | Created, newest first |
GET/api/v1/inspections | Inspections (archived ones left out) | Created, newest first |
GET/api/v1/reminders | The same inspections, shaped as due reminders | Created, newest first |
GET/api/v1/inventory | Active parts with stock totals | Part name, A to Z |
Each endpoint takes one optional query parameter, limit (1 to 100, default 50). None of them filter by aircraft or date, so filter on tailNumber or aircraftId in your own code. A list returns at most 100 records; see rate limits and errors for how paging works.
Work orders
curl -s "https://app.skyschedule.io/api/v1/work-orders?limit=1" \
-H "Authorization: Bearer $SKYSCHEDULE_API_KEY"
{
"data": [
{
"id": "88888888-8888-4888-8888-888888888888",
"aircraftId": "99999999-9999-4999-8999-999999999999",
"tailNumber": "N67890",
"title": "100-hour inspection",
"description": "100-hour inspection and oil change.",
"category": "Inspection",
"status": "in-progress",
"scheduledStartDate": "2026-10-09",
"scheduledEndDate": "2026-10-10",
"createdAt": "2026-10-02T14:22:31.512+00:00"
}
],
"meta": {
"count": 1,
"pageSize": 1,
"rateLimit": { "limit": 100, "remaining": 89, "reset": "2026-10-09T00:00:00.000Z" }
}
}
| Field | Type | Description |
|---|---|---|
id | string (UUID) | Work order id. |
aircraftId | string or null | Aircraft id. |
tailNumber | string or null | Aircraft tail number. |
title, description | string or null | What the work is. |
category | string or null | The school's category, such as General. |
status | string or null | new, in-progress, pending-parts, or completed. |
scheduledStartDate, scheduledEndDate | string or null | Planned dates, YYYY-MM-DD. |
createdAt | string or null | When the work order was created, ISO 8601. |
Squawks
curl -s "https://app.skyschedule.io/api/v1/squawks?limit=1" \
-H "Authorization: Bearer $SKYSCHEDULE_API_KEY"
{
"data": [
{
"id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"aircraftId": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
"tailNumber": "N12345",
"title": "Left landing light out",
"description": "Found on preflight. Bulb or connector.",
"priority": "medium",
"severity": "non-grounding",
"status": "open",
"category": "Electrical",
"createdAt": "2026-10-07T13:05:09.004+00:00"
}
],
"meta": {
"count": 1,
"pageSize": 1,
"rateLimit": { "limit": 100, "remaining": 88, "reset": "2026-10-09T00:00:00.000Z" }
}
}
| Field | Type | Description |
|---|---|---|
id, aircraftId, tailNumber | string or null | Squawk id and the aircraft it's on. |
title, description | string or null | What was reported. |
priority | string or null | low, medium, high, or critical. |
severity | string or null | non-grounding or grounding. A grounding squawk keeps the aircraft down until its work order is completed. |
status | string or null | open, deferred, in-progress, or resolved. |
category | string or null | The school's category. |
createdAt | string or null | When it was reported, ISO 8601. |
Inspections
curl -s "https://app.skyschedule.io/api/v1/inspections?limit=1" \
-H "Authorization: Bearer $SKYSCHEDULE_API_KEY"
{
"data": [
{
"id": "cccccccc-cccc-4ccc-8ccc-cccccccccccc",
"aircraftId": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
"tailNumber": "N12345",
"inspectionType": "100-hour",
"status": "complete",
"completedAt": "2026-09-20T18:00:00+00:00",
"expiresAt": null,
"completedAtHobbs": 2400.2,
"completedAtTach": 1932.7,
"intervalHours": 100,
"notes": "Compressions good. Replaced oil filter."
}
],
"meta": {
"count": 1,
"pageSize": 1,
"rateLimit": { "limit": 100, "remaining": 87, "reset": "2026-10-09T00:00:00.000Z" }
}
}
| Field | Type | Description |
|---|---|---|
id, aircraftId, tailNumber | string or null | Inspection id and the aircraft. |
inspectionType | string or null | The inspection name, such as Annual or 100-hour. |
status | string or null | pending, incomplete, or complete. |
completedAt | string or null | When it was last completed, ISO 8601. |
expiresAt | string or null | Calendar due date, ISO 8601. null when the inspection has no calendar due date. |
completedAtHobbs, completedAtTach | number or null | Meter readings when it was completed. |
intervalHours | number or null | For recurring hour-based inspections, how many hours between them. |
notes | string or null | Notes entered with the inspection. |
Reminders
/reminders returns the same inspection records as /inspections, reshaped for "what's due" lists.
curl -s "https://app.skyschedule.io/api/v1/reminders?limit=1" \
-H "Authorization: Bearer $SKYSCHEDULE_API_KEY"
{
"data": [
{
"id": "cccccccc-cccc-4ccc-8ccc-cccccccccccc",
"aircraftId": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
"tailNumber": "N12345",
"reminder": "100-hour",
"dueAt": null,
"dueHobbs": 2400.2,
"intervalHours": 100,
"status": "complete"
}
],
"meta": {
"count": 1,
"pageSize": 1,
"rateLimit": { "limit": 100, "remaining": 86, "reset": "2026-10-09T00:00:00.000Z" }
}
}
| Field | Type | Description |
|---|---|---|
reminder | string or null | The inspection name. |
dueAt | string or null | Calendar due date (the inspection's expiresAt). |
dueHobbs | number or null | The Hobbs reading when the inspection was last completed (the inspection's completedAtHobbs), not the reading it's next due at. For a recurring inspection tracked on Hobbs, the next one is due at dueHobbs plus intervalHours. The API doesn't say which meter an inspection is tracked on; for one tracked on Tach, use completedAtTach from /inspections. |
intervalHours | number or null | Hours between recurring inspections. |
status | string or null | pending, incomplete, or complete. |
id, aircraftId, and tailNumber are the same as on the inspection.
Inventory
curl -s "https://app.skyschedule.io/api/v1/inventory?limit=1" \
-H "Authorization: Bearer $SKYSCHEDULE_API_KEY"
{
"data": [
{
"id": "dddddddd-dddd-4ddd-8ddd-dddddddddddd",
"partNumber": "CH48110-1",
"name": "Oil filter",
"description": "Spin-on oil filter",
"category": "Engine",
"unit": "each",
"quantity": 3,
"minimumQuantity": 4,
"stockStatus": "low"
}
],
"meta": {
"count": 1,
"pageSize": 1,
"rateLimit": { "limit": 100, "remaining": 85, "reset": "2026-10-09T00:00:00.000Z" }
}
}
| Field | Type | Description |
|---|---|---|
id | string (UUID) | Part id. |
partNumber, name, description, category | string or null | Part details as entered. |
unit | string or null | Unit of measure. |
quantity | number | Quantity on hand, added up across every stock location. |
minimumQuantity | number | The reorder point set for the part. 0 when none is set. |
stockStatus | string | out when quantity is 0 or less, low when a minimum is set and quantity is at or below it, otherwise ok. |
Only active parts are listed.
Example: open squawks by aircraft
const res = await fetch("https://app.skyschedule.io/api/v1/squawks?limit=100", {
headers: { Authorization: `Bearer ${process.env.SKYSCHEDULE_API_KEY}` },
});
const { data } = await res.json();
const open = data.filter((s) => s.status !== "resolved");
const grounded = new Set(open.filter((s) => s.severity === "grounding").map((s) => s.tailNumber));
console.log("Grounded:", [...grounded]);
The maintenance endpoints are read only. An agent can open a work order, which also blocks the aircraft on the schedule, with the MCP tool create_work_order in the MCP tools reference. Fleet records themselves (Hobbs, Tach, status) are available to agents through list_aircraft.