Maintenance

Squawks and maintenance reminders.

19 endpoints · base URL https://api.aerscheduler.com

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

qstringFree-text over the rule name, document number, mechanic and method.
resourceIdstringRestrict to one or more aircraft. Comma-separated.
reminderIdstringRestrict to one inspection's history.
sourceTypestringRestrict to a kind of rule, for example ad.
startDatestringOnly records complied with on or after this date.
endDatestringOnly records complied with on or before this date.
limitintegerRows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected.
offsetintegerRows to skip, for paging. Defaults to 0.
sortstringField 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

200OKThe compliance records.{ data: MaintenanceComplianceRecord[] }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate 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

resourceIdstringOnly reminders on these aircraft. Repeat or comma-separate for several.
statusstringFilter on the computed band: overdue, dueSoon, ok or resolved. Repeat or comma-separate for several.
resolvedbooleanFilter on signed-off state.
qstringFree-text over the reminder, its template and the tail number.
limitintegerRows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected.
offsetintegerRows to skip, for paging. Defaults to 0.
sortstringField 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

200OKThe reminders.{ data: MaintenanceReminder[] }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate 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

qstringFree-text filter. Matches the fields a person would search on.
resolvedbooleanFilter on resolved state.
resourceIdstringComma-separated resource ids.
startDatestringStart of the window, ISO 8601. Include an offset or Z.
endDatestringEnd of the window, ISO 8601.
limitintegerRows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected.
offsetintegerRows to skip, for paging. Defaults to 0.
sortstringField 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

200OKThe squawks.{ data: Squawk[] }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate 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.

titlerequiredstring
descriptionrequiredstring
resourceIdrequiredinteger
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.
fileNamesstring[]Original file names. jpg, jpeg, png, heic, heif, or pdf. The server mints the S3 keys.

Responses

201CreatedThe 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 }
400Bad RequestValidation failed.
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate 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

complianceRecordIdrequiredintegerThe compliance record id.

Responses

200OKSuccess.{ data: MaintenanceComplianceRecord }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
404Not FoundNo such record.
429Too Many RequestsRate 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

One reminder.

Path parameters

maintenanceReminderIdrequiredintegerThe reminder id.

Responses

200OKSuccess.{ data: MaintenanceReminder }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
404Not FoundNo such reminder.
429Too Many RequestsRate 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

maintenanceReminderIdrequiredintegerThe reminder id.

Request body

Completion detail. The compliance fields are optional together: supplying methodOfCompliance requires mechanicName.

completedAtrequiredstringWhen the work was done.
completedHoursintegerMeter reading the next interval counts from, in tenths of an hour.
notesstringFree-text note on the reminder itself.
methodOfCompliancestringWhat was actually done. Writing this creates the permanent record.
mechanicNamestringWho certified the work. Required alongside methodOfCompliance.
mechanicCertificateNumberstringTheir FAA certificate number.
mechanicCertificateTypestringA&P, IA, or repair station.
tachAtComplianceintegerTach reading at compliance, NOT time in service as 14 CFR 1.1 defines it, in tenths. Defaults to the aircraft's current reading.
hobbsAtComplianceintegerHobbs reading at compliance, NOT time in service as 14 CFR 1.1 defines it, in tenths. Defaults to the aircraft's current reading.

Responses

200OKSuccess.{ data: MaintenanceReminder }
400Bad RequestValidation failed.
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate 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

limitintegerRows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected.
offsetintegerRows to skip, for paging. Defaults to 0.
sortstringField 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

200OKThe presets.{ data: InspectionPreset[] }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate 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

limitintegerRows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected.
offsetintegerRows to skip, for paging. Defaults to 0.
sortstringField 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

200OKThe reminder templates.{ data: MaintenanceReminderTemplate[] }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate 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.

namerequiredstring
notesstring
repeatrequiredboolean
groundboolean
remindHoursinteger
remindHoursBeforeinteger
hourBasedOn"tach" | "hobbs"
remindDaysinteger
remindMonthsinteger
remindDaysBeforeinteger
remindDatestring
remindAtHoursinteger
templateResourcesobject[]

Responses

201CreatedThe reminder template that was created.{ data: MaintenanceReminderTemplate }
400Bad RequestThe body failed validation. message says which field.
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate 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

squawkIdrequiredintegerThe squawk id.

Responses

200OKSuccess.{ data: Squawk }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
404Not FoundNo such squawk.
429Too Many RequestsRate 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

squawkIdrequiredintegerThe squawk id.

Request body

What to do.

actionrequiredstring
titlestring
descriptionstring

Responses

200OKSuccess.{ data: Squawk }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
404Not FoundNo such squawk, or no action was supplied.
429Too Many RequestsRate 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

maintenanceReminderIdrequiredintegerThe reminder id.

Request body

The files to attach.

fileNamesrequiredstring[]Display names with jpg, png, heic, or pdf extensions. Up to five on the inspection.

Responses

201CreatedSuccess.{ data: MaintenanceReminder }
400Bad RequestValidation failed.
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate 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

maintenanceReminderIdrequiredintegerThe reminder id.

Request body

Which file.

fileNamerequiredstringThe file name as shown, e.g. packing-slip.pdf.

Responses

200OKSuccess.{ data: MaintenanceReminder }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
404Not FoundNo such file.
429Too Many RequestsRate 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

maintenanceReminderTemplateIdrequiredintegerThe reminder template id.

Responses

200OKSuccess.{ data: MaintenanceReminderTemplate }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
404Not FoundNo such reminder template, or it belongs to another organization.
429Too Many RequestsRate 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

maintenanceReminderTemplateIdrequiredintegerThe reminder template id.

Request body

Fields to change.

namestring
notesstring
repeatboolean

Responses

200OKThe updated reminder template.{ data: MaintenanceReminderTemplate }
400Bad RequestThe body failed validation.
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate 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

maintenanceReminderTemplateIdrequiredintegerThe reminder template id.

Responses

204No ContentSuccess. No body.
400Bad RequestThe reminder template could not be deleted , usually because something still references it.
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate 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

resourceIdrequiredintegerThe resource id.

Query parameters

resolvedbooleanFilter on resolved state.
limitintegerRows to return, 1,1000. Defaults to 1000; a larger value is clamped rather than rejected.
offsetintegerRows to skip, for paging. Defaults to 0.
sortstringField 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

200OKThe squawks.{ data: Squawk[] }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl https://api.aerscheduler.com/maintenance/resources/:resourceId/squawks \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/maintenance/squawks/{squawkId}/comments

Add a note to a squawk

Appends one note to the squawk's thread, for recording progress on a defect without closing it. Technicians and administrators only, matching who may verify or resolve one. Notes are append-only: there is no edit and no delete, and a mistake is corrected by adding another note. A photo or PDF may stand in for text: body may be empty when fileNames is present. Read them back on the squawk itself, which returns comments oldest first.

Path parameters

squawkIdrequiredintegerThe squawk id.

Request body

The note. Send body, fileNames, or both. Empty with neither is refused.

bodystring
fileNamesstring[]Original file names. jpg, jpeg, png, heic, heif, or pdf. The server mints the S3 keys.

Responses

201CreatedThe note. When files were attached, signedUrlData is a list of S3 presigned POSTs in the same order as fileNames.{ data: SquawkComment }
400Bad RequestThe note was empty, longer than 2000 characters, or the files were refused.
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenNot a technician or administrator, or the squawk belongs to another organization.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X POST https://api.aerscheduler.com/maintenance/squawks/:squawkId/comments \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"body":"…","fileNames":[]}'