get/maintenance/compliance
List compliance records
Every inspection this school has signed off, newest first, kept for the life of the aircraft.
This is the airworthiness history an inspector asks for. Readable by any member for the same reason squawks are: it is information about an aircraft somebody is about to fly.
Query parameters
q | string | Free-text over the rule name, document number, mechanic and method. |
resourceId | string | Restrict to one or more aircraft. Comma-separated. |
reminderId | string | Restrict to one inspection's history. |
sourceType | string | Restrict to a kind of rule, for example ad. |
startDate | string | Only records complied with on or after this date. |
endDate | string | Only records complied with on or before this date. |
limit | integer | Rows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected. |
offset | integer | Rows to skip, for paging. Defaults to 0. |
sort | string | Field to order by before paging, as a dot path into the row , total, user.firstName. Omit to keep the endpoint's own order. Numbers and ISO timestamps order as numbers and instants, not as text, and empty values always sort last regardless of direction. Ordering happens before the page is cut, so it orders the whole collection rather than the page you are holding. |
order | "asc" | "desc" | asc (default) or desc. Only meaningful with sort. |
Responses
200 | OK | The compliance records.→ { data: MaintenanceComplianceRecord[] } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl https://api.aerscheduler.com/maintenance/compliance \
-H "Authorization: Bearer $AERSCHEDULER_KEY"
get/maintenance/reminders
List maintenance reminders
Live reminders across the fleet, most urgent first.
Each reminder carries a computed due block , how many hours are left on the meter, or how many days until the date , so you don't have to recombine the template's interval with the aircraft's meters yourself.
Query parameters
resourceId | string | Only reminders on these aircraft. Repeat or comma-separate for several. |
status | string | Filter on the computed band: overdue, dueSoon, ok or resolved. Repeat or comma-separate for several. |
resolved | boolean | Filter on signed-off state. |
q | string | Free-text over the reminder, its template and the tail number. |
limit | integer | Rows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected. |
offset | integer | Rows to skip, for paging. Defaults to 0. |
sort | string | Field to order by before paging, as a dot path into the row , total, user.firstName. Omit to keep the endpoint's own order. Numbers and ISO timestamps order as numbers and instants, not as text, and empty values always sort last regardless of direction. Ordering happens before the page is cut, so it orders the whole collection rather than the page you are holding. |
order | "asc" | "desc" | asc (default) or desc. Only meaningful with sort. |
Responses
200 | OK | The reminders.→ { data: MaintenanceReminder[] } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl https://api.aerscheduler.com/maintenance/reminders \
-H "Authorization: Bearer $AERSCHEDULER_KEY"
get/maintenance/squawks
List squawks
Reported discrepancies. Visible to technicians, dispatchers, and administrators.
Query parameters
q | string | Free-text filter. Matches the fields a person would search on. |
resolved | boolean | Filter on resolved state. |
resourceId | string | Comma-separated resource ids. |
startDate | string | Start of the window, ISO 8601. Include an offset or Z. |
endDate | string | End of the window, ISO 8601. |
limit | integer | Rows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected. |
offset | integer | Rows to skip, for paging. Defaults to 0. |
sort | string | Field to order by before paging, as a dot path into the row , total, user.firstName. Omit to keep the endpoint's own order. Numbers and ISO timestamps order as numbers and instants, not as text, and empty values always sort last regardless of direction. Ordering happens before the page is cut, so it orders the whole collection rather than the page you are holding. |
order | "asc" | "desc" | asc (default) or desc. Only meaningful with sort. |
Responses
200 | OK | The squawks.→ { data: Squawk[] } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl https://api.aerscheduler.com/maintenance/squawks \
-H "Authorization: Bearer $AERSCHEDULER_KEY"
post/maintenance/squawks
Report a squawk
Note the resource is given as a flat resourceId here, where reservations take a nested resource: { id }. That inconsistency is real and is on the list to reconcile. Photos and PDFs are attached by sending fileNames (jpg, jpeg, png, heic, heif, or pdf, up to five). The server writes the S3 keys and returns signedUrlData for the client to POST each file to. fileUrls in the body is refused. Uploading is turned off in the public demo; a text squawk still files.
Request body
The discrepancy.
titlerequired | string | |
descriptionrequired | string | |
resourceIdrequired | integer | |
priority | "grounding" | "high" | "normal" | "low" | How urgent it is. Defaults to normal. grounding records that the aircraft should not fly, and is what the Squawks report's Grounding filter selects; it does not by itself set the aircraft's grounded flag. |
fileNames | string[] | Original file names. jpg, jpeg, png, heic, heif, or pdf. The server mints the S3 keys. |
Responses
201 | Created | The squawk. When files were attached, signedUrlData is a list of S3 presigned POSTs in the same order as fileNames. Upload each file after this response.→ { data: Squawk } |
400 | Bad Request | Validation failed. |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl -X POST https://api.aerscheduler.com/maintenance/squawks \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"…","description":"…","resourceId":1}'
get/maintenance/compliance/{complianceRecordId}
Get a compliance record
One signed-off inspection, in full.
Path parameters
complianceRecordIdrequired | integer | The compliance record id. |
Responses
200 | OK | Success.→ { data: MaintenanceComplianceRecord } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
404 | Not Found | No such record. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl https://api.aerscheduler.com/maintenance/compliance/:complianceRecordId \
-H "Authorization: Bearer $AERSCHEDULER_KEY"
get/maintenance/reminders/{maintenanceReminderId}
Get a maintenance reminder
Path parameters
maintenanceReminderIdrequired | integer | The reminder id. |
Responses
200 | OK | Success.→ { data: MaintenanceReminder } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
404 | Not Found | No such reminder. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl https://api.aerscheduler.com/maintenance/reminders/:maintenanceReminderId \
-H "Authorization: Bearer $AERSCHEDULER_KEY"
post/maintenance/reminders/{maintenanceReminderId}
Sign off a maintenance reminder
Marks the work done, which starts the next interval if the template repeats. POST rather than PATCH for historical reasons.
Send methodOfCompliance and mechanicName to also write a permanent compliance record, which is what 14 CFR 91.417 asks for on an Airworthiness Directive. That record is append-only and cannot be edited or removed afterwards, and it snapshots the rule's number and revision as they stood at signature. Omit them and the reminder simply rolls forward as before, keeping no history.
Photos and PDFs already on the open inspection (POST /maintenance/reminders/{id}/files) are copied onto that compliance record, then cleared so they do not follow the next cycle. Do not send fileUrls.
Path parameters
maintenanceReminderIdrequired | integer | The reminder id. |
Request body
Completion detail. The compliance fields are optional together: supplying methodOfCompliance requires mechanicName.
completedAtrequired | string | When the work was done. |
completedHours | integer | Meter reading the next interval counts from, in tenths of an hour. |
notes | string | Free-text note on the reminder itself. |
methodOfCompliance | string | What was actually done. Writing this creates the permanent record. |
mechanicName | string | Who certified the work. Required alongside methodOfCompliance. |
mechanicCertificateNumber | string | Their FAA certificate number. |
mechanicCertificateType | string | A&P, IA, or repair station. |
tachAtCompliance | integer | Tach reading at compliance, NOT time in service as 14 CFR 1.1 defines it, in tenths. Defaults to the aircraft's current reading. |
hobbsAtCompliance | integer | Hobbs reading at compliance, NOT time in service as 14 CFR 1.1 defines it, in tenths. Defaults to the aircraft's current reading. |
Responses
200 | OK | Success.→ { data: MaintenanceReminder } |
400 | Bad Request | Validation failed. |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl -X POST https://api.aerscheduler.com/maintenance/reminders/:maintenanceReminderId \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"completedAt":"2026-08-04T15:00:00-06:00"}'
get/maintenance/reminders/presets
List inspection presets
The AVIATES airworthiness inspections , annual, VOR, 100-hour, AD review, transponder, ELT and static/altimeter , plus the shop intervals that come up as often.
Reference data, not records: nothing exists until you POST a preset's payload to /maintenance/reminders/templates like any other template. The intervals are the common case and are editable afterwards; caveat says where a default doesn't apply to every aircraft.
Query parameters
limit | integer | Rows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected. |
offset | integer | Rows to skip, for paging. Defaults to 0. |
sort | string | Field to order by before paging, as a dot path into the row , total, user.firstName. Omit to keep the endpoint's own order. Numbers and ISO timestamps order as numbers and instants, not as text, and empty values always sort last regardless of direction. Ordering happens before the page is cut, so it orders the whole collection rather than the page you are holding. |
order | "asc" | "desc" | asc (default) or desc. Only meaningful with sort. |
Responses
200 | OK | The presets.→ { data: InspectionPreset[] } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl https://api.aerscheduler.com/maintenance/reminders/presets \
-H "Authorization: Bearer $AERSCHEDULER_KEY"
get/maintenance/reminders/templates
List reminder templates
Every reminder template in your organization.
Query parameters
limit | integer | Rows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected. |
offset | integer | Rows to skip, for paging. Defaults to 0. |
sort | string | Field to order by before paging, as a dot path into the row , total, user.firstName. Omit to keep the endpoint's own order. Numbers and ISO timestamps order as numbers and instants, not as text, and empty values always sort last regardless of direction. Ordering happens before the page is cut, so it orders the whole collection rather than the page you are holding. |
order | "asc" | "desc" | asc (default) or desc. Only meaningful with sort. |
Responses
200 | OK | The reminder templates.→ { data: MaintenanceReminderTemplate[] } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl https://api.aerscheduler.com/maintenance/reminders/templates \
-H "Authorization: Bearer $AERSCHEDULER_KEY"
post/maintenance/reminders/templates
Create a reminder template
Adds a reminder template to your organization.
Request body
The rule. Set remindMonths or remindDays for the calendar clock, remindHours for the meter clock, or BOTH clocks ("every 100 hours or 12 calendar months, whichever comes first"), each with its matching *Before field; or set remindDate alone for a one-off date, or remindAtHours alone for a one-off meter deadline. Neither one-off recurs. remindHours is an INTERVAL in tenths of an hour (1000 = every 100.0), not a flag. PREFER remindMonths for anything the regulations write in calendar months, which is the annual, the transponder, the static system and the ELT: a calendar month runs to the end of the month, so 365 days comes due up to a month early. Setting remindMonths overwrites remindDays with a derived approximation. On a combined interval whichever clock comes due first grounds and notifies, and signing off restarts both.
namerequired | string | |
notes | string | |
repeatrequired | boolean | |
ground | boolean | |
remindHours | integer | |
remindHoursBefore | integer | |
hourBasedOn | "tach" | "hobbs" | |
remindDays | integer | |
remindMonths | integer | |
remindDaysBefore | integer | |
remindDate | string | |
remindAtHours | integer | |
templateResources | object[] | |
Responses
201 | Created | The reminder template that was created.→ { data: MaintenanceReminderTemplate } |
400 | Bad Request | The body failed validation. message says which field. |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl -X POST https://api.aerscheduler.com/maintenance/reminders/templates \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"…","repeat":true}'
get/maintenance/squawks/{squawkId}
Get a squawk
One reported discrepancy.
Path parameters
squawkIdrequired | integer | The squawk id. |
Responses
200 | OK | Success.→ { data: Squawk } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
404 | Not Found | No such squawk. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl https://api.aerscheduler.com/maintenance/squawks/:squawkId \
-H "Authorization: Bearer $AERSCHEDULER_KEY"
post/maintenance/squawks/{squawkId}
Act on a squawk
Resolves or reopens a squawk. This is a POST rather than a PATCH for historical reasons; an action field in the body is required.
Path parameters
squawkIdrequired | integer | The squawk id. |
Request body
What to do.
actionrequired | string | |
title | string | |
description | string | |
Responses
200 | OK | Success.→ { data: Squawk } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
404 | Not Found | No such squawk, or no action was supplied. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl -X POST https://api.aerscheduler.com/maintenance/squawks/:squawkId \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"action":"…"}'
post/maintenance/reminders/{maintenanceReminderId}/files
Attach files to an open inspection
Photos or PDFs on the OPEN reminder (packing slip, in-progress photos). Admin or technician. Copied onto the compliance record at sign-off, then cleared. Send fileNames only.
Path parameters
maintenanceReminderIdrequired | integer | The reminder id. |
Request body
The files to attach.
fileNamesrequired | string[] | Display names with jpg, png, heic, or pdf extensions. Up to five on the inspection. |
Responses
201 | Created | Success.→ { data: MaintenanceReminder } |
400 | Bad Request | Validation failed. |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl -X POST https://api.aerscheduler.com/maintenance/reminders/:maintenanceReminderId/files \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"fileNames":[]}'
delete/maintenance/reminders/{maintenanceReminderId}/files
Remove a file from an open inspection
Removes one working file by its file name. Does not touch a signed compliance record.
Path parameters
maintenanceReminderIdrequired | integer | The reminder id. |
Request body
Which file.
fileNamerequired | string | The file name as shown, e.g. packing-slip.pdf. |
Responses
200 | OK | Success.→ { data: MaintenanceReminder } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
404 | Not Found | No such file. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl -X DELETE https://api.aerscheduler.com/maintenance/reminders/:maintenanceReminderId/files \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"fileName":"…"}'
get/maintenance/reminders/templates/{maintenanceReminderTemplateId}
Get a reminder template
Fetches one reminder template by id.
Path parameters
maintenanceReminderTemplateIdrequired | integer | The reminder template id. |
Responses
200 | OK | Success.→ { data: MaintenanceReminderTemplate } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
404 | Not Found | No such reminder template, or it belongs to another organization. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl https://api.aerscheduler.com/maintenance/reminders/templates/:maintenanceReminderTemplateId \
-H "Authorization: Bearer $AERSCHEDULER_KEY"
patch/maintenance/reminders/templates/{maintenanceReminderTemplateId}
Update a reminder template
Changes the fields you send and leaves the rest alone.
Path parameters
maintenanceReminderTemplateIdrequired | integer | The reminder template id. |
Request body
Fields to change.
name | string | |
notes | string | |
repeat | boolean | |
Responses
200 | OK | The updated reminder template.→ { data: MaintenanceReminderTemplate } |
400 | Bad Request | The body failed validation. |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl -X PATCH https://api.aerscheduler.com/maintenance/reminders/templates/:maintenanceReminderTemplateId \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"…","notes":"…"}'
delete/maintenance/reminders/templates/{maintenanceReminderTemplateId}
Delete a reminder template
Removes the reminder template.
Path parameters
maintenanceReminderTemplateIdrequired | integer | The reminder template id. |
Responses
204 | No Content | Success. No body. |
400 | Bad Request | The reminder template could not be deleted , usually because something still references it. |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl -X DELETE https://api.aerscheduler.com/maintenance/reminders/templates/:maintenanceReminderTemplateId \
-H "Authorization: Bearer $AERSCHEDULER_KEY"
get/maintenance/resources/{resourceId}/squawks
List an aircraft's squawks
Discrepancies against one resource.
Path parameters
resourceIdrequired | integer | The resource id. |
Query parameters
resolved | boolean | Filter on resolved state. |
limit | integer | Rows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected. |
offset | integer | Rows to skip, for paging. Defaults to 0. |
sort | string | Field to order by before paging, as a dot path into the row , total, user.firstName. Omit to keep the endpoint's own order. Numbers and ISO timestamps order as numbers and instants, not as text, and empty values always sort last regardless of direction. Ordering happens before the page is cut, so it orders the whole collection rather than the page you are holding. |
order | "asc" | "desc" | asc (default) or desc. Only meaningful with sort. |
Responses
200 | OK | The squawks.→ { data: Squawk[] } |
401 | Unauthorized | No token, an expired token, or a malformed one. Sign in again. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
Example request
curl https://api.aerscheduler.com/maintenance/resources/:resourceId/squawks \
-H "Authorization: Bearer $AERSCHEDULER_KEY"