Getting started
Rate Limits and Errors
Sky Schedule REST API rate limits allow 100 requests per school per UTC day and 100 records per page. Learn the headers, pagination, and JSON error codes.
The Sky Schedule REST API allows 100 requests per school per UTC day and returns at most 100 records per list request. This page covers the rate limits, how to read the rate limit headers, how pagination works, and what each error code means.
Daily rate limits
- 100 requests per school per UTC day. The counter resets at 00:00 UTC.
- The limit is per school, not per key or per IP address.
- Every request that passes the key check counts, including requests that come back
400or404. Requests rejected for a missing or invalid key (401) or an inactive subscription (403) don't count. - The
limitquery parameter changes page size only. It doesn't raise the daily limit. - The MCP server has its own counters (1,000 requests and 200 write tool calls per day). MCP traffic never uses up your REST requests, and REST traffic never uses up MCP requests.
Rate limit headers
Successful responses, 404 responses, and 429 responses include three headers:
| Header | Meaning | Example |
|---|---|---|
X-RateLimit-Limit | Requests allowed per UTC day | 100 |
X-RateLimit-Remaining | Requests left today, after this one | 87 |
X-RateLimit-Reset | When the counter resets, as an ISO 8601 timestamp (not Unix seconds) | 2026-10-09T00:00:00.000Z |
Successful responses repeat the same numbers in the body under meta.rateLimit.
curl -si "https://app.skyschedule.io/api/v1/squawks?limit=1" \
-H "Authorization: Bearer $SKYSCHEDULE_API_KEY"
HTTP/2 200
content-type: application/json
x-ratelimit-limit: 100
x-ratelimit-remaining: 87
x-ratelimit-reset: 2026-10-09T00:00:00.000Z
When you hit the limit
The API returns 429 until the reset time:
{ "error": "Daily rate limit exceeded." }
Don't retry in a loop. Every retry gets the same answer until X-RateLimit-Reset. A few ways to stay well under 100 a day:
- Cache the customer and instructor rosters. They change far less often than the schedule.
- Pull completed flights once a day for the previous day, not every few minutes.
- Ask for
limit=100when you need a lot of records, instead of several small pages.
Pagination
List endpoints take an optional limit query parameter.
- Default: 50 records when
limitis left out. - Maximum: 100. A higher value is rejected with
400, not quietly lowered. limitmust be a whole number of 1 or more.0, negative numbers, decimals, and text are rejected with400.meta.pageSizeis the page size the server used.meta.countis how many records came back.
There is no cursor or offset. Each list returns the first records in its sort order, up to limit. When meta.count equals meta.pageSize, there may be more records than you received.
- For reservations and completed flights, get more records by asking for smaller date ranges with
fromandto, for example one week per request. - Customers, instructors, maintenance lists, and comments have no date filter, so a request returns at most the first 100 records in the order below.
| Endpoint | Sort order |
|---|---|
/reservations | Start time, oldest first |
/flights | Flight date, newest first, then completion time, newest first |
/customers, /instructors | Name, A to Z |
/work-orders, /squawks | Created, newest first |
/inspections, /reminders | Created, newest first |
/inventory | Part name, A to Z |
/comments | Created, newest first |
Query parameters an endpoint doesn't use are ignored. For example, from on /customers has no effect.
Error format
Every error has the same body, a single error string:
{ "error": "Invalid from date. Use YYYY-MM-DD." }
HTTP status codes
| Status | Error messages | What to do |
|---|---|---|
| 200 | None | Success. |
| 400 | Invalid from date. Use YYYY-MM-DD.Invalid to date. Use YYYY-MM-DD.Invalid limit. Use a whole number between 1 and 100.limit cannot exceed 100. This cap is enforced server-side. | Fix the query parameter. This request still counts toward the daily limit. |
| 401 | Missing API key. Use Authorization: Bearer <key> or X-SkySchedule-API-Key.Invalid API key format.Invalid or revoked API key. | Send the current key. See API authentication. |
| 403 | Public API subscription is not active. | A school admin needs to turn on API access for the school. |
| 404 | Reservation not found.Flight not found.Customer not found.Instructor not found. | The id doesn't exist in your school, or isn't a full UUID. |
| 429 | Daily rate limit exceeded. | Wait until the time in X-RateLimit-Reset. |
| 500 | Varies | Something failed on our side. Retry later with a backoff. |
| 503 | Public API is not configured yet. | The API isn't available for the school right now. Retry later, and contact Sky Schedule support if it continues. |
400 and 500 responses don't carry the rate limit headers. Read the remaining count from your last successful response.