Resources
Aircraft, simulators, and rooms.
33 endpoints · base URL https://api.aerscheduler.com
/resourcesList resources
Every bookable resource , aircraft, simulators, and rooms together. Use /resources/aircraft, /simulators, or /rooms for one kind.
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 resources.→ { data: Resource[] } |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resourcesCreate 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.
namerequired | string | |
locationrequired | object | |
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. |
typerequired | object |
Responses
201 | Created | The resource that was created.→ { data: Resource } |
400 | Bad Request | The body failed validation. message says which field. |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X POST https://api.aerscheduler.com/resources \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"…","location":{},"type":{}}'/resources/{id}Get a resource
Fetches one resource by id.
Path parameters
idrequired | integer | The resource id. |
Responses
200 | OK | Success.→ { data: Resource } |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
404 | Not Found | No such resource, or it belongs to another organization. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/:id \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/{id}Update a resource
Changes the fields you send and leaves the rest alone. Requires the admin role.
Path parameters
idrequired | integer | The 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.
name | string | |
location | object | |
type | object |
Responses
200 | OK | The updated resource.→ { data: Resource } |
400 | Bad Request | The body failed validation. |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X PATCH https://api.aerscheduler.com/resources/:id \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"…","location":{}}'/resources/{id}Delete a resource
Removes the resource. Requires the admin role.
Path parameters
idrequired | integer | The resource id. |
Responses
204 | No Content | Success. No body. |
400 | Bad Request | The resource could not be deleted , usually because something still references it. |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X DELETE https://api.aerscheduler.com/resources/:id \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/aircraftList 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
q | string | Free-text filter. Matches the fields a person would search on. |
grounded | boolean | Filter on grounded state. |
locationId | string | Comma-separated location ids. |
scope | "fleet" | "shop" | "all" | fleet (default), shop for customer aircraft in for maintenance, or all. Anything unrecognised reads as fleet. |
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 aircraft.→ { data: Resource[] } |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/aircraft \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/roomsList rooms
Only resources whose type is a room.
Query parameters
q | string | Free-text filter. Matches the fields a person would search on. |
locationId | string | Comma-separated location ids. |
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 rooms.→ { data: Resource[] } |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/rooms \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/simulatorsList simulators
Only resources whose type is a simulator.
Query parameters
q | string | Free-text filter. Matches the fields a person would search on. |
grounded | boolean | Filter on grounded state. |
locationId | string | Comma-separated location ids. |
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 simulators.→ { data: Resource[] } |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/simulators \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/{id}/approveApprove a member for a resource
Checks someone out on an aircraft. Requires the admin role.
Path parameters
idrequired | integer | The resource id. |
Request body
Who to approve.
userIdrequired | integer |
Responses
200 | OK | Success.→ { data: object } |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
404 | Not Found | That person is not in your organization. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X POST https://api.aerscheduler.com/resources/:id/approve \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"userId":1}'/resources/{id}/approvedUsersList 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
idrequired | integer | The resource id. |
Query parameters
student | boolean | Set true to include members holding the student role. Combines as OR with renter. |
renter | boolean | Set true to include members holding the renter role. Combines as OR with student. |
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 approved members.→ { data: OrganizationUser[] } |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/:id/approvedUsers \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/{id}/componentsList 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
idrequired | integer | The resource id. |
Query parameters
removed | boolean | true to include components that came off. |
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 components.→ { data: AircraftComponent[] } |
401 | Unauthorized | No 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. |
403 | Forbidden | Not a shop role. |
404 | Not Found | Aircraft not found. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/:id/components \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/{id}/componentsAdd 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
idrequired | integer | The resource id. |
Request body
The component.
namerequired | string | |
position | string | null | |
partNumber | string | null | |
serialNumber | string | null | |
installedOn | string | YYYY-MM-DD, not in the future. |
installedAtMeter | integer | null | The aircraft's reading on meter when it went on, in tenths. |
meter | "tach" | "hobbs" | |
timeAtInstall | integer | Its own time when it went on, in tenths. |
timeSince | "new" | "overhaul" | |
sinceOn | string | null | When it was new or last overhauled; the calendar limit counts from here. Not after installedOn. Null means installedOn. |
limitHours | integer | null | Tenths of an hour of its own time. |
limitMonths | integer | null | |
groundAtLimit | boolean | |
notes | string | null |
Responses
201 | Created | The component.→ { data: AircraftComponent } |
400 | Bad Request | A field is not valid. |
401 | Unauthorized | No 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. |
403 | Forbidden | Not allowed. |
404 | Not Found | Aircraft not found. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X POST https://api.aerscheduler.com/resources/:id/components \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Left magneto"}'/resources/{id}/filesList 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
idrequired | integer | The resource id. |
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 papers.→ { data: ResourceFile[] } |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/:id/files \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/{id}/filesAdd 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
idrequired | integer | The 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. |
ownerVisible | boolean | Show it to the aircraft's owners in their portal. A customer's aircraft only; refused with 400 on the organization's own. |
label | string | |
fileNamesrequired | string[] | Original file names. The server mints the S3 keys. |
Responses
201 | Created | The papers. signedUrlData is a list of S3 presigned POSTs in the same order as the created rows.→ { data: ResourceFile[] } |
400 | Bad Request | Validation failed. |
401 | Unauthorized | No 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. |
403 | Forbidden | Not allowed to upload, or this is the public demo. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
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":[]}'/resources/{id}/fuelRecord fuel on board
Updates fuel for one or both engines.
Path parameters
idrequired | integer | The resource id. |
Request body
Fuel figures, in the aircraft's configured units.
fuelEngine1 | integer | |
fuelEngine2 | integer |
Responses
200 | OK | Success.→ { data: object } |
400 | Bad Request | Validation failed. |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
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}'/resources/{id}/groundingGround 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
idrequired | integer | The resource id. |
Request body
Which way, and why.
groundedrequired | boolean | true takes it off the line, false returns it to service. |
reason | string | Required when grounding. Ignored when returning to service. |
Responses
200 | OK | Success.→ { data: Resource } |
400 | Bad Request | grounded missing, or grounding without a reason. |
401 | Unauthorized | No 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. |
403 | Forbidden | Not an admin or technician, or the resource belongs to another organization. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X PATCH https://api.aerscheduler.com/resources/:id/grounding \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"grounded":true}'/resources/{id}/historyList 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
idrequired | integer | The resource id. |
Query parameters
kind | string | Only these kinds, comma separated. |
sort | "date" | date to order by date. |
order | "asc" | "desc" | desc (default) or asc. |
limit | integer | Rows to return, 1 to 250. |
offset | integer | Rows to skip, for paging. Defaults to 0. |
Responses
200 | OK | A page of the history.→ { data: AircraftHistoryEntry[] } |
401 | Unauthorized | No 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. |
403 | Forbidden | Not a shop role. |
404 | Not Found | Aircraft not found. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/:id/history \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/{id}/invoicesList 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
idrequired | integer | The resource id. |
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 invoices.→ { data: AircraftInvoice[] } |
401 | Unauthorized | No 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. |
403 | Forbidden | Not an admin. |
404 | Not Found | Aircraft not found. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/:id/invoices \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/{id}/metersRead 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
idrequired | integer | The resource id. |
Responses
200 | OK | The meter log.→ { data: object } |
401 | Unauthorized | No 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. |
403 | Forbidden | Not a shop role. |
404 | Not Found | Aircraft not found. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/:id/meters \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/{id}/metersRecord 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
idrequired | integer | The resource id. |
Request body
The reading.
hobbsTime | integer | null | Hobbs in tenths of an hour. |
tachTime | integer | null | Tach in tenths of an hour. |
readAt | string | null | When it was read. Defaults to now; never in the future. |
note | string | null | |
fileName | string | null | A photo of the meter to upload (JPEG, PNG, HEIC or PDF). |
confirmLower | boolean | A lower reading is a mistyped one put right. |
meterReplaced | boolean | A lower reading is a replaced meter: total time carries on from it. |
confirmMaintenanceTrigger | boolean |
Responses
201 | Created | The reading, with signedUrlData beside data.→ { data: object } |
400 | Bad Request | Not a reading. |
401 | Unauthorized | No 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. |
403 | Forbidden | Not allowed, or a photo in the demo. |
404 | Not Found | Aircraft not found. |
409 | Lower than the aircraft, or would ground it: confirm and send again. | |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
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}'/resources/{id}/ownersList 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
idrequired | integer | The resource id. |
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 owners, primary first.→ { data: object[] } |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/:id/owners \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/{id}/ownersAdd 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
idrequired | integer | The resource id. |
Request body
Either an existing member, or a new owner's details.
orgUserId | integer | An existing member of this organization. |
name | string | The owner's name, when they are not a member. |
email | string | Where to reach them, and where Stripe sends their invoices. Never used to sign in. |
phone | string | |
title | string | What they are to the aircraft: "Co-owner", "Operator". |
isPrimary | boolean | Who gets the invoice. At most one per aircraft. |
createAnyway | boolean | After a 409: this is a different person from the one already holding the address. Create them anyway. |
Responses
201 | Created | Success.→ { data: object } |
400 | Bad Request | That person is already an owner of this aircraft, or the email address is not a real address shape. |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
409 | Somebody already holds that email address. The body names them in conflict (kind, orgUserId, name). | |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X POST https://api.aerscheduler.com/resources/:id/owners \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"orgUserId":1,"name":"…"}'/resources/{id}/profileRead 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
idrequired | integer | The resource id. |
Responses
200 | OK | The profile.→ { data: object } |
401 | Unauthorized | No 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. |
403 | Forbidden | Not a shop role. |
404 | Not Found | Aircraft not found. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/:id/profile \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/{id}/profileChange 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
idrequired | integer | The resource id. |
Request body
The fields to change.
airframeTotalTenths | integer | null | Total time in tenths of an hour. |
airframeTotalAtHobbs | integer | null | The Hobbs (tenths) it was read at. |
engineModel | string | null | |
engineSerial | string | null | |
propModel | string | null | |
propSerial | string | null | |
notes | string | null |
Responses
200 | OK | The profile.→ { data: object } |
400 | Bad Request | A field is not valid. |
401 | Unauthorized | No 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. |
403 | Forbidden | Not allowed. |
404 | Not Found | Aircraft not found. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
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}'/resources/{id}/unapproveWithdraw a member's approval
Requires the admin role.
Path parameters
idrequired | integer | The resource id. |
Request body
Whose approval to withdraw.
userIdrequired | integer |
Responses
200 | OK | Success.→ { data: object } |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
404 | Not Found | That person is not in your organization. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X POST https://api.aerscheduler.com/resources/:id/unapprove \
-H "Authorization: Bearer $AERSCHEDULER_KEY" \
-H "Content-Type: application/json" \
-d '{"userId":1}'/resources/{id}/components/{componentId}Get a life-limited component
One component, as the list reads it. Owners, admins, dispatchers and technicians only.
Path parameters
idrequired | integer | The resource id. |
componentIdrequired | integer | The component id. |
Responses
200 | OK | Success.→ { data: AircraftComponent } |
401 | Unauthorized | No 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. |
403 | Forbidden | Not a shop role. |
404 | Not Found | Component not found. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl https://api.aerscheduler.com/resources/:id/components/:componentId \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/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
idrequired | integer | The resource id. |
componentIdrequired | integer | The component id. |
Request body
The fields to change: any of those POST takes, and removedOn (YYYY-MM-DD) and removedAtMeter (tenths).
removedOn | string | null | |
removedAtMeter | integer | null |
Responses
200 | OK | The component.→ { data: AircraftComponent } |
400 | Bad Request | A field is not valid. |
401 | Unauthorized | No 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. |
403 | Forbidden | Not allowed. |
404 | Not Found | Component not found. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
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}'/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
idrequired | integer | The resource id. |
componentIdrequired | integer | The component id. |
Responses
204 | No Content | Success. No body. |
401 | Unauthorized | No 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. |
403 | Forbidden | Not allowed. |
404 | Not Found | Component not found. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X DELETE https://api.aerscheduler.com/resources/:id/components/:componentId \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/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
idrequired | integer | The resource id. |
fileIdrequired | integer | The 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" | |
ownerVisible | boolean | Show it to the aircraft's owners, or stop. A customer's aircraft only. |
label | string |
Responses
200 | OK | The paper.→ { data: ResourceFile } |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
404 | Not Found | That file is not on this aircraft. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
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"}'/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
idrequired | integer | The resource id. |
fileIdrequired | integer | The paper id. |
Responses
204 | No Content | Success. No body. |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
404 | Not Found | That file is not on this aircraft. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X DELETE https://api.aerscheduler.com/resources/:id/files/:fileId \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/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
idrequired | integer | The resource id. |
ownerIdrequired | integer | The owner row's id. |
Request body
What to change.
title | string | |
isPrimary | boolean | |
name | string | Owners who have not signed up only. |
email | string | Owners who have not signed up only. Must be a real address shape. |
phone | string | Owners who have not signed up only. |
Responses
200 | OK | Success.→ { data: object } |
400 | Bad Request | Owner not found, a member's details, a malformed address, or an address somebody else holds. |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
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}'/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
idrequired | integer | The resource id. |
ownerIdrequired | integer | The owner row's id. |
Responses
200 | OK | Success.→ { data: object } |
400 | Bad Request | Owner not found. |
401 | Unauthorized | No 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. |
403 | Forbidden | Authenticated, but not allowed to do this. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X DELETE https://api.aerscheduler.com/resources/:id/owners/:ownerId \
-H "Authorization: Bearer $AERSCHEDULER_KEY"/resources/{id}/meters/{readingId}/photoRemove a reading's photo
For a photo that never finished uploading: the reading stops pointing at it. Owners, admins and technicians only.
Path parameters
idrequired | integer | The resource id. |
readingIdrequired | integer | The reading id. |
Responses
204 | No Content | Success. No body. |
401 | Unauthorized | No 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. |
403 | Forbidden | Not allowed. |
404 | Not Found | Reading not found. |
429 | Too Many Requests | Rate limited. Retry-After says how long to wait. |
curl -X DELETE https://api.aerscheduler.com/resources/:id/meters/:readingId/photo \
-H "Authorization: Bearer $AERSCHEDULER_KEY"