Resources

Aircraft, simulators, and rooms.

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

get/resources

List resources

Every bookable resource , aircraft, simulators, and rooms together. Use /resources/aircraft, /simulators, or /rooms for one kind.

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 resources.→ { data: Resource[] }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/resources

Create a resource

Adds a resource to your organization. Requires the admin role.

Request body

The new resource. Exactly one of type.plane, type.simulator, or type.room must be present, and location.id is required.

namerequiredstring
locationrequiredobject
use"fleet" | "shop"fleet (default) is one of your own: schedulable, and counted on your per-aircraft plan. shop is a customer's aircraft in for maintenance: it takes maintenance bookings only, it is never offered publicly, and it is NOT counted on your plan. Anything unrecognised reads as fleet.
typerequiredobject

Responses

201CreatedThe resource that was created.→ { data: Resource }
400Bad RequestThe body failed validation. message says which field.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"…","location":{},"type":{}}'
get/resources/{id}

Get a resource

Fetches one resource by id.

Path parameters

idrequiredintegerThe resource id.

Responses

200OKSuccess.→ { data: Resource }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
404Not FoundNo such resource, or it belongs to another organization.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl https://api.aerscheduler.com/resources/:id \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
patch/resources/{id}

Update a resource

Changes the fields you send and leaves the rest alone. Requires the admin role.

Path parameters

idrequiredintegerThe resource id.

Request body

Fields to change. type must be present even when you are only changing a top-level field, and it has to be the kind the resource already is: this cannot turn an aircraft into a room. use moves an aircraft between your fleet and your shop. Moving one INTO the shop is refused while it still has upcoming bookings that are not maintenance, because those people would be stranded; moving it out simply makes it schedulable and billable again. Omitting a key leaves the stored value alone, and on most fields null does the same. Four rules break that pattern, and each one is silent, because the write answers 200 whether it changed the field, left it alone, or blanked one nobody meant to blank. On serialNumber, year, engineMake, engineModel, propellerMake and propellerModel, "" or null CLEARS the stored value. That is the only way back to blank once a wrong serial number has been typed in. On the pair flyingDayStartMinute and flyingDayEndMinute, null is taken literally and puts the aircraft back on the organization's hours, which changes the bookings the server will accept. Send both or neither; a half pair is rejected. On cost.dryRate, cost.wetRate and cost.overnightMinimumTenths, null is literal too, and it is not 0: a null overnight minimum goes back to inheriting the organization's figure, while 0 exempts this aircraft. groundedReason is not independent of grounded. Any aircraft or simulator update that does not carry grounded: true writes the reason back to null, so send the two together. One value is not merely surprising but rejected: cost.billByHobbsTime is not nullable, and sending null fails the whole request with a 400. Omit the key to leave it alone. On the free-text fields (tailNumber, make, model) an empty string is stored AS an empty string and does not clear them.

namestring
locationobject
typeobject

Responses

200OKThe updated resource.→ { data: Resource }
400Bad RequestThe body failed validation.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources/:id \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"…","location":{}}'
delete/resources/{id}

Delete a resource

Removes the resource. Requires the admin role.

Path parameters

idrequiredintegerThe resource id.

Responses

204No ContentSuccess. No body.
400Bad RequestThe resource could not be deleted , usually because something still references it.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources/:id \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/resources/aircraft

List aircraft

Only resources whose type is an aircraft. Defaults to the aircraft you OPERATE: customer aircraft in your shop are excluded unless you ask for them with scope, and asking requires an owner, admin, dispatcher or technician role.

Query parameters

qstringFree-text filter. Matches the fields a person would search on.
groundedbooleanFilter on grounded state.
locationIdstringComma-separated location ids.
scope"fleet" | "shop" | "all"fleet (default), shop for customer aircraft in for maintenance, or all. Anything unrecognised reads as fleet.
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 aircraft.→ { data: Resource[] }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources/aircraft \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/resources/rooms

List rooms

Only resources whose type is a room.

Query parameters

qstringFree-text filter. Matches the fields a person would search on.
locationIdstringComma-separated location ids.
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 rooms.→ { data: Resource[] }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources/rooms \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/resources/simulators

List simulators

Only resources whose type is a simulator.

Query parameters

qstringFree-text filter. Matches the fields a person would search on.
groundedbooleanFilter on grounded state.
locationIdstringComma-separated location ids.
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 simulators.→ { data: Resource[] }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources/simulators \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/resources/{id}/approve

Approve a member for a resource

Checks someone out on an aircraft. Requires the admin role.

Path parameters

idrequiredintegerThe resource id.

Request body

Who to approve.

userIdrequiredinteger

Responses

200OKSuccess.→ { data: object }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
404Not FoundThat person is not in your organization.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X POST https://api.aerscheduler.com/resources/:id/approve \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":1}'
get/resources/{id}/approvedUsers

List who is approved on a resource

The members checked out to book this aircraft , the read in the opposite direction to GET /users/{userId}/approvedResources. Use this rather than asking every member what they are approved for.

Path parameters

idrequiredintegerThe resource id.

Query parameters

studentbooleanSet true to include members holding the student role. Combines as OR with renter.
renterbooleanSet true to include members holding the renter role. Combines as OR with student.
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 approved members.→ { data: OrganizationUser[] }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources/:id/approvedUsers \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/resources/{id}/components

List an aircraft's life-limited components

Each component on the aircraft with life: its time since new or overhaul now (from the aircraft's meter on the clock it counts on, tach unless said), the life left on each limit, and status (amber dueSoon inside 10% of a limit or 10 hours, or 10% of a calendar limit or 30 days; overdue at or past it). Components that came off only with removed=true. All hours are TENTHS. Works on the organization's own aircraft and customer aircraft alike. Owners, admins, dispatchers and technicians only; anybody else is answered 403 for any id. Another organization's aircraft answers exactly as an absent one.

Path parameters

idrequiredintegerThe resource id.

Query parameters

removedbooleantrue to include components that came off.
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 components.→ { data: AircraftComponent[] }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot a shop role.
404Not FoundAircraft not found.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl https://api.aerscheduler.com/resources/:id/components \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/resources/{id}/components

Add a life-limited component

Only name is required. Not given, it went on today (installedOn) at the aircraft's reading now (installedAtMeter, on meter: the tach, or the Hobbs on a Hobbs-only aircraft), new (timeSince) with no time (timeAtInstall: 0). A limit (limitHours in tenths, limitMonths, or both, whichever comes first) is tracked by a linked one-off inspection per clock, due where the limit is reached, so it warns, reminds the owners of a customer aircraft and, with groundAtLimit (default true), grounds the aircraft like any inspection. An aircraft with no meters takes a calendar limit only. Owners, admins and technicians only.

Path parameters

idrequiredintegerThe resource id.

Request body

The component.

namerequiredstring
positionstring | null
partNumberstring | null
serialNumberstring | null
installedOnstringYYYY-MM-DD, not in the future.
installedAtMeterinteger | nullThe aircraft's reading on meter when it went on, in tenths.
meter"tach" | "hobbs"
timeAtInstallintegerIts own time when it went on, in tenths.
timeSince"new" | "overhaul"
sinceOnstring | nullWhen it was new or last overhauled; the calendar limit counts from here. Not after installedOn. Null means installedOn.
limitHoursinteger | nullTenths of an hour of its own time.
limitMonthsinteger | null
groundAtLimitboolean
notesstring | null

Responses

201CreatedThe component.→ { data: AircraftComponent }
400Bad RequestA field is not valid.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot allowed.
404Not FoundAircraft not found.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X POST https://api.aerscheduler.com/resources/:id/components \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Left magneto"}'
get/resources/{id}/files

List papers on an aircraft

POH, weight and balance, and other files on the tail. Any org member may read bookers files. Staff, dispatchers, and technicians also see staff files. Soft-deleted rows are omitted.

Path parameters

idrequiredintegerThe resource id.

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 papers.→ { data: ResourceFile[] }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources/:id/files \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/resources/{id}/files

Add papers to an aircraft

Send fileNames (jpg, jpeg, png, heic, heif, or pdf, up to five in that category). The server writes the S3 keys and returns signedUrlData for the client to POST each file to. fileUrls in the body is refused. Requires owner, admin, dispatcher, or technician. Uploading is turned off in the public demo.

Path parameters

idrequiredintegerThe resource id.

Request body

The papers.

categoryrequired"airworthiness_certificate" | "registration" | "poh" | "operating_limitations" | "weight_and_balance" | "insurance" | "form_337" | "logbook_scan" | "other"
visibility"bookers" | "staff"Defaults: POH and weight and balance are bookers; the rest are staff.
ownerVisiblebooleanShow it to the aircraft's owners in their portal. A customer's aircraft only; refused with 400 on the organization's own.
labelstring
fileNamesrequiredstring[]Original file names. The server mints the S3 keys.

Responses

201CreatedThe papers. signedUrlData is a list of S3 presigned POSTs in the same order as the created rows.→ { data: ResourceFile[] }
400Bad RequestValidation failed.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot allowed to upload, or this is the public demo.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X POST https://api.aerscheduler.com/resources/:id/files \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"category":"airworthiness_certificate","fileNames":[]}'
post/resources/{id}/fuel

Record fuel on board

Updates fuel for one or both engines.

Path parameters

idrequiredintegerThe resource id.

Request body

Fuel figures, in the aircraft's configured units.

fuelEngine1integer
fuelEngine2integer

Responses

200OKSuccess.→ { data: object }
400Bad RequestValidation failed.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources/:id/fuel \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fuelEngine1":1,"fuelEngine2":1}'
patch/resources/{id}/grounding

Ground an aircraft or return it to service

Takes a tail off the line, or puts it back. Requires the admin or technician role.

Its own endpoint rather than a field on PATCH /resources/{id}, which is admin-only: a technician signs maintenance off and has to be able to release the aircraft afterwards.

Grounding requires a reason, which is shown wherever the aircraft appears. The reason you send is treated as a PERSON'S decision and is never cleared automatically. Holds the system applies itself (an inspection coming due, an open grounding squawk) are released on their own once nothing is outstanding; yours are not, and stay until someone sends grounded: false here.

Path parameters

idrequiredintegerThe resource id.

Request body

Which way, and why.

groundedrequiredbooleantrue takes it off the line, false returns it to service.
reasonstringRequired when grounding. Ignored when returning to service.

Responses

200OKSuccess.→ { data: Resource }
400Bad Requestgrounded missing, or grounding without a reason.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot an admin or technician, or the resource belongs to another organization.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X PATCH https://api.aerscheduler.com/resources/:id/grounding \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"grounded":true}'
get/resources/{id}/history

List an aircraft's maintenance history

Everything done to the aircraft, newest first: inspection sign-offs (including one-time inspections no longer on the active list), resolved squawks, and completed work orders, each with the date, what it was, who signed it off or did it, and the Hobbs and tach at the time in tenths where known. Paged in the database, at most 250 rows a page; pagination.limit is the limit applied. Filter with kind (comma separated: inspection, squawk, work_order); sort=date with order=asc reverses it. Owners, admins, dispatchers and technicians only, answered 403 for any id otherwise; work orders only for owners, admins and technicians.

Path parameters

idrequiredintegerThe resource id.

Query parameters

kindstringOnly these kinds, comma separated.
sort"date"date to order by date.
order"asc" | "desc"desc (default) or asc.
limitintegerRows to return, 1 to 250.
offsetintegerRows to skip, for paging. Defaults to 0.

Responses

200OKA page of the history.→ { data: AircraftHistoryEntry[] }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot a shop role.
404Not FoundAircraft not found.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl https://api.aerscheduler.com/resources/:id/history \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/resources/{id}/invoices

List an aircraft's invoices

Every bill tied to the aircraft: for a booking that flew it (flight, prepaid_package), and for a shop job on it (work_order), newest first unless sorted. sort is a dot path into the row (id, createdAt, totalCents, number, status, billedTo.name). Admins only, like every organization-wide invoice list.

Path parameters

idrequiredintegerThe resource id.

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 invoices.→ { data: AircraftInvoice[] }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot an admin.
404Not FoundAircraft not found.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl https://api.aerscheduler.com/resources/:id/invoices \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/resources/{id}/meters

Read an aircraft's meter log

Every recorded Hobbs and tach reading (kind: reading, with who, when, a note, a 15-minute photo link, the values it replaced, and workOrder when it was a job's reading in or out) beside the readings close-outs took (kind: close-out, with the booking), newest first, the last 100 of each. All hours are tenths. meterMode says which meters the aircraft has. stale is true for a customer's aircraft with meters not read in over 30 days. Owners, admins, dispatchers and technicians only; anybody else is answered 403 for any id.

Path parameters

idrequiredintegerThe resource id.

Responses

200OKThe meter log.→ { data: object }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot a shop role.
404Not FoundAircraft not found.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl https://api.aerscheduler.com/resources/:id/meters \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/resources/{id}/meters

Record a meter reading

Moves the aircraft's own Hobbs and tach and runs the same hour check a close-out does, so hour-based inspections fire as after a flight. Send either meter or both, in tenths; a meter the aircraft does not have (see meterMode) is refused with 400. A reading lower than the aircraft's answers 409 METER_LOWER until sent again with confirmLower: true (a mistyped reading put right: kept as a correction, total time unchanged) or meterReplaced: true (a new meter: the airframe's total time carries on from it; refused with 400 on a reading that is not lower); one that passes an inspection that grounds the aircraft answers 409 MAINTENANCE_TRIGGER with details.triggers until sent with confirmMaintenanceTrigger: true. A reading dated before the newest one on record is kept in the log as history and does not change the aircraft (appliedToAircraft: false). Name a photo with fileName and upload it to the returned signedUrlData. Owners, admins and technicians only.

Path parameters

idrequiredintegerThe resource id.

Request body

The reading.

hobbsTimeinteger | nullHobbs in tenths of an hour.
tachTimeinteger | nullTach in tenths of an hour.
readAtstring | nullWhen it was read. Defaults to now; never in the future.
notestring | null
fileNamestring | nullA photo of the meter to upload (JPEG, PNG, HEIC or PDF).
confirmLowerbooleanA lower reading is a mistyped one put right.
meterReplacedbooleanA lower reading is a replaced meter: total time carries on from it.
confirmMaintenanceTriggerboolean

Responses

201CreatedThe reading, with signedUrlData beside data.→ { data: object }
400Bad RequestNot a reading.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot allowed, or a photo in the demo.
404Not FoundAircraft not found.
409Lower than the aircraft, or would ground it: confirm and send again.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X POST https://api.aerscheduler.com/resources/:id/meters \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"hobbsTime":1,"tachTime":1}'
get/resources/{id}/owners

List an aircraft's owners

Who owns this aeroplane: nobody (the organization's own), a leaseback owner, or the customer whose aircraft is in the shop. Ownership decides who is invoiced for maintenance work; it decides nothing about scheduling, which is use. Owners, admins, dispatchers and technicians only, because the rows carry a person's private phone number and email.

Path parameters

idrequiredintegerThe resource id.

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 owners, primary first.→ { data: object[] }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources/:id/owners \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/resources/{id}/owners

Add an owner to an aircraft

Send orgUserId for somebody who is already a member, or name (plus optional email and phone) for an owner the organization has never met. The second form creates a membership for them that is marked external and left unclaimed: they appear on the roster and can be invoiced, they get none of the organization's notifications, and they cannot sign in. An invoice you raise for them IS emailed to email, by Stripe. email must be a real address shape. If somebody already holds that address, the answer is 409 naming them: send their orgUserId to use them, or repeat the request with createAnyway: true if this really is a different person. The same name at the same address is re-used without a 409, which is one customer's second aircraft. When the owner later signs up with a verified address and the same name, joining the organization claims this record rather than creating a second one. Requires the admin role.

Path parameters

idrequiredintegerThe resource id.

Request body

Either an existing member, or a new owner's details.

orgUserIdintegerAn existing member of this organization.
namestringThe owner's name, when they are not a member.
emailstringWhere to reach them, and where Stripe sends their invoices. Never used to sign in.
phonestring
titlestringWhat they are to the aircraft: "Co-owner", "Operator".
isPrimarybooleanWho gets the invoice. At most one per aircraft.
createAnywaybooleanAfter a 409: this is a different person from the one already holding the address. Create them anyway.

Responses

201CreatedSuccess.→ { data: object }
400Bad RequestThat person is already an owner of this aircraft, or the email address is not a real address shape.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
409Somebody already holds that email address. The body names them in conflict (kind, orgUserId, name).
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X POST https://api.aerscheduler.com/resources/:id/owners \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"orgUserId":1,"name":"…"}'
get/resources/{id}/profile

Read an aircraft's profile

What the shop keeps about an aircraft beyond its registration: the airframe's total time (in tenths, as recorded and carried forward by the Hobbs flown since, airframeTotalNowTenths), the engine and propeller, and notes. Empty fields are null; an aircraft nobody has filled in answers all nulls. Owners, admins, dispatchers and technicians only; anybody else is answered 403 for any id.

Path parameters

idrequiredintegerThe resource id.

Responses

200OKThe profile.→ { data: object }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot a shop role.
404Not FoundAircraft not found.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl https://api.aerscheduler.com/resources/:id/profile \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
patch/resources/{id}/profile

Change an aircraft's profile

Send only what changes. airframeTotalTenths is the total time read now; send airframeTotalAtHobbs (tenths) with it when it was read at another Hobbs, otherwise the aircraft's current Hobbs is taken. Null clears a field. Owners, admins and technicians only.

Path parameters

idrequiredintegerThe resource id.

Request body

The fields to change.

airframeTotalTenthsinteger | nullTotal time in tenths of an hour.
airframeTotalAtHobbsinteger | nullThe Hobbs (tenths) it was read at.
engineModelstring | null
engineSerialstring | null
propModelstring | null
propSerialstring | null
notesstring | null

Responses

200OKThe profile.→ { data: object }
400Bad RequestA field is not valid.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot allowed.
404Not FoundAircraft not found.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X PATCH https://api.aerscheduler.com/resources/:id/profile \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"airframeTotalTenths":1,"airframeTotalAtHobbs":1}'
post/resources/{id}/unapprove

Withdraw a member's approval

Requires the admin role.

Path parameters

idrequiredintegerThe resource id.

Request body

Whose approval to withdraw.

userIdrequiredinteger

Responses

200OKSuccess.→ { data: object }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
404Not FoundThat person is not in your organization.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X POST https://api.aerscheduler.com/resources/:id/unapprove \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":1}'
get/resources/{id}/components/{componentId}

Get a life-limited component

One component, as the list reads it. Owners, admins, dispatchers and technicians only.

Path parameters

idrequiredintegerThe resource id.
componentIdrequiredintegerThe component id.

Responses

200OKSuccess.→ { data: AircraftComponent }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot a shop role.
404Not FoundComponent not found.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl https://api.aerscheduler.com/resources/:id/components/:componentId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
patch/resources/{id}/components/{componentId}

Change a component, or record that it came off

Send only what changes; null clears. A changed limit or time MOVES its linked inspections' due point (the same inspections, with the notices the new point has not earned sent again when it is reached; one signed off gets a new open cycle), and releases the aircraft if that was all that held it. removedOn (with removedAtMeter, else the meter now) records that it came off: its time stops there and its inspections are retired, so nothing stays due. removedOn: null puts it back on. Owners, admins and technicians only.

Path parameters

idrequiredintegerThe resource id.
componentIdrequiredintegerThe component id.

Request body

The fields to change: any of those POST takes, and removedOn (YYYY-MM-DD) and removedAtMeter (tenths).

removedOnstring | null
removedAtMeterinteger | null

Responses

200OKThe component.→ { data: AircraftComponent }
400Bad RequestA field is not valid.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot allowed.
404Not FoundComponent not found.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X PATCH https://api.aerscheduler.com/resources/:id/components/:componentId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"removedOn":"…","removedAtMeter":1}'
delete/resources/{id}/components/{componentId}

Delete a component entered by mistake

It stops listing and its inspections are retired (signed-off cycles are kept). For a part that came off, record removedOn instead. Owners, admins and technicians only.

Path parameters

idrequiredintegerThe resource id.
componentIdrequiredintegerThe component id.

Responses

204No ContentSuccess. No body.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot allowed.
404Not FoundComponent not found.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X DELETE https://api.aerscheduler.com/resources/:id/components/:componentId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
patch/resources/{id}/files/{fileId}

Rename or recategorize a paper

Changes label, visibility, or category. Does not replace the bytes. Requires owner, admin, dispatcher, or technician.

Path parameters

idrequiredintegerThe resource id.
fileIdrequiredintegerThe paper id.

Request body

What to change.

category"airworthiness_certificate" | "registration" | "poh" | "operating_limitations" | "weight_and_balance" | "insurance" | "form_337" | "logbook_scan" | "other"
visibility"bookers" | "staff"
ownerVisiblebooleanShow it to the aircraft's owners, or stop. A customer's aircraft only.
labelstring

Responses

200OKThe paper.→ { data: ResourceFile }
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
404Not FoundThat file is not on this aircraft.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X PATCH https://api.aerscheduler.com/resources/:id/files/:fileId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"category":"airworthiness_certificate","visibility":"bookers"}'
delete/resources/{id}/files/{fileId}

Remove a paper from an aircraft

Soft-deletes the row and drops the S3 object. A stale W&B should come down. Requires owner, admin, dispatcher, or technician.

Path parameters

idrequiredintegerThe resource id.
fileIdrequiredintegerThe paper id.

Responses

204No ContentSuccess. No body.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenAuthenticated, but not allowed to do this.
404Not FoundThat file is not on this aircraft.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X DELETE https://api.aerscheduler.com/resources/:id/files/:fileId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
patch/resources/{id}/owners/{ownerId}

Change an owner, or correct who they are

Rename their title, or make them the one who gets the invoice. For an owner who has not signed up, you can also correct name, email and phone: these belong to the PERSON, so a correction applies to every aircraft they own and to invoices raised from now on, and the address on their Stripe customer is corrected too. A member's name and contact details are theirs to change from their own profile, and are refused here. An address somebody else already holds is refused, naming them. Requires the admin role.

Path parameters

idrequiredintegerThe resource id.
ownerIdrequiredintegerThe owner row's id.

Request body

What to change.

titlestring
isPrimaryboolean
namestringOwners who have not signed up only.
emailstringOwners who have not signed up only. Must be a real address shape.
phonestringOwners who have not signed up only.

Responses

200OKSuccess.→ { data: object }
400Bad RequestOwner not found, a member's details, a malformed address, or an address somebody else holds.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources/:id/owners/:ownerId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"…","isPrimary":true}'
delete/resources/{id}/owners/{ownerId}

Stop listing somebody as an owner

Removes the link only. The person stays on the roster with their invoices and history intact, because a mistyped name must not be a way to delete a customer. Requires the admin role.

Path parameters

idrequiredintegerThe resource id.
ownerIdrequiredintegerThe owner row's id.

Responses

200OKSuccess.→ { data: object }
400Bad RequestOwner not found.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). 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/resources/:id/owners/:ownerId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
delete/resources/{id}/meters/{readingId}/photo

Remove a reading's photo

For a photo that never finished uploading: the reading stops pointing at it. Owners, admins and technicians only.

Path parameters

idrequiredintegerThe resource id.
readingIdrequiredintegerThe reading id.

Responses

204No ContentSuccess. No body.
401UnauthorizedNo token, an expired token, a malformed one, or a session token naming a membership that is no longer yours ("Your session is out of date"). Sign in again.
403ForbiddenNot allowed.
404Not FoundReading not found.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X DELETE https://api.aerscheduler.com/resources/:id/meters/:readingId/photo \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"