Organizations

The flight school itself: membership, invitations, and settings.

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

get/invitations

List pending invitations

Requires the admin role.

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

200OKSuccess.{ data: object[] }
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/invitations \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/joinRequests

List join requests

People asking to join a private organization. Requires the admin role.

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

200OKSuccess.{ data: object[] }
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/joinRequests \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/organizations

List your organizations

Every organization the signed-in account belongs to.

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 organizations.{ data: Organization[] }
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/organizations \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
patch/organizations

Update your organization

Requires the admin role.

Request body

Fields to change.

namestring
organizationType"flight_school" | "flying_club" | "rental" | "solo_instructor" | "aircraft_owner"What kind of operation this is. Same values as create. Changing it here does not rewrite signup attribution.
aboutstring
showInDirectoryboolean
bookingPolicyobjectOrg-wide booking rules. Send only the keys you are changing; null clears a rule. Minimum notice, booking horizon, start interval, fixed duration, and buffers apply to every internal schedule booking (member self-book and front desk), not only future public embeds. The four balance gates apply only when the organization is in ledger billing mode.
publicBookingEnabledbooleanWhen true, guests can submit booking requests for active offerings at /book/{publicBookingSlug}/{offering.slug}. Staff still approve every request.
publicBookingSlugstringLowercase letters, numbers, and hyphens. Unique across schools. Generated from the school name if you enable public booking without one.
publicBookingEmbedHostsstring[]HTTPS origins allowed to iframe /book pages, stored like https://www.yourschool.com. Empty keeps the share link only. No wildcards, no IP addresses except localhost/127.0.0.1. Public hosts must be https. Demo organizations are refused.
publicBookingAccentHexstring | nullGuest /book accent, #RRGGBB. Null clears it.
publicBookingAppearance"light" | "dark" | "system"
publicBookingDensity"compact" | "comfortable"
publicBookingCornerStyle"rounded" | "sharp"

Responses

200OKSuccess.{ data: Organization }
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/organizations \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"…","organizationType":"flight_school"}'
delete/organizations

Schedule your organization for deletion

Puts the school on a 30-day countdown. The school stays usable until then. Every admin and owner is emailed and notified. Requires the owner role. Refused while any invoice is unpaid, or if a countdown is already running.

Responses

200OKThe organization with its deletion date.{ data: object }
400Bad RequestUnpaid invoices, already scheduled, or a demo organization.
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/organizations \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
delete/joinRequests/{id}

Delete a join request

Requires the admin role.

Path parameters

idrequiredintegerThe join request id.

Responses

204No ContentSuccess. No body.
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/joinRequests/:id \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/organizations/{orgId}

Get an organization

Public detail for one organization.

Path parameters

orgIdrequiredintegerThe organization id.

Responses

200OKSuccess.{ data: Organization }
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/organizations/:orgId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/organizations/adTracking

Read the Airworthiness Directive tracking mode and readiness

Whether this school wants AerScheduler involved in Airworthiness Directives, and how well it could be. mode is one of off (we do nothing about ADs), manual (the school enters ADs itself), catalogue (we watch published ADs and propose the ones that mention this fleet) or external (applicability is tracked in another system, named by externalSystem).

aircraft reports, per aeroplane, how precisely a published AD could be matched: serial when we can narrow the AD's serial-number range, model when we can only tell that an AD mentions this make and model, and none when we do not know enough to propose anything. Admin only.

Responses

200OKThe mode and what could be matched for each aeroplane.{ data: object }
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/organizations/adTracking \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
patch/organizations/adTracking

Set the Airworthiness Directive tracking mode

Changes what AerScheduler does about ADs. Setting external requires externalSystem, which is printed on the AD status report so a reader knows applicability lives elsewhere. Returns the same shape as the GET, including refreshed readiness. Admin only.

Request body

moderequired"off" | "manual" | "catalogue" | "external"
externalSystemstring | nullRequired when mode is external. Cleared otherwise.

Responses

200OKThe updated mode and readiness.{ data: object }
400Bad RequestAn unknown mode, or external with no system named.
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/organizations/adTracking \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode":"off"}'
post/organizations/cancelDeletion

Cancel a scheduled organization deletion

Clears the 30-day countdown. Requires the admin role (owners hold admin).

Responses

200OKThe organization with the countdown cleared.{ data: object }
400Bad RequestNo deletion is currently scheduled.
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/organizations/cancelDeletion \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/organizations/guests

List guests

Non-members who have appeared on bookings.

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 guests.{ data: User[] }
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/organizations/guests \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/organizations/invite

Invite someone

Emails an invitation with the roles they will get on acceptance. Requires the admin role.

Request body

Who to invite and as what.

emailrequiredstring
adminboolean
instructorboolean
studentboolean
renterboolean
technicianboolean
dispatcherboolean
orgUserGroupIdsinteger[]

Responses

204No ContentSuccess. No body.
400Bad RequestAlready invited, or already a member.
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/organizations/invite \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"you@yourschool.com"}'
get/organizations/ledger

Get ledger billing mode

Whether this organization is in ledger billing mode. When on, members live on an account balance; money-in and refunds are separate from per-flight invoices. Default off. Any member may read.

Responses

200OKSuccess.{ data: OrganizationLedgerSettings }
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/organizations/ledger \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
patch/organizations/ledger

Set ledger billing mode

Turns ledger mode on or off, sets the optional card surcharge on member top-ups, and/or sets late fees on negative balances. Owner only. Desk cash/check credit is never surcharged. Late fees post once per member per calendar month after the grace period.

Request body

Ledger settings patch. Send any subset.

enabledboolean
topUpCardFeePercentinteger
topUpCardFeeFlatCentsinteger
lateFeePercentintegerWhole percent of the amount owing. 0 or null = off.
lateFeeFlatCentsinteger
lateFeeGraceDaysintegerDays owing before a late fee posts. Null = 30. 0 = first eligible sweep.

Responses

200OKUpdated settings.{ data: OrganizationLedgerSettings }
400Bad RequestBody failed validation.
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenOnly the organization owner can change this.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl -X PATCH https://api.aerscheduler.com/organizations/ledger \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true,"topUpCardFeePercent":1}'
get/organizations/ratings

List ratings

The certificates and ratings your organization teaches.

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

200OKSuccess.{ data: object[] }
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/organizations/ratings \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/organizations/ratings

Create a rating

Requires the admin role.

Request body

The rating.

namerequiredstring
anyInstructorCanTeachrequiredboolean
defaultInstructorRaterequiredintegerHourly rate in cents.

Responses

200OKSuccess.{ data: object }
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/organizations/ratings \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"…","anyInstructorCanTeach":true,"defaultInstructorRate":1}'
post/joinRequests/{id}/accept

Accept a join request

Requires the admin role.

Path parameters

idrequiredintegerThe join request id.

Responses

200OKSuccess.{ data: object }
204No ContentSuccess. No body.
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/joinRequests/:id/accept \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/joinRequests/{id}/decline

Decline a join request

Requires the admin role.

Path parameters

idrequiredintegerThe join request id.

Responses

200OKSuccess.{ data: object }
204No ContentSuccess. No body.
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/joinRequests/:id/decline \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/organizations/leave/{orgId}

Leave an organization

Removes yourself. The last owner cannot leave.

Path parameters

orgIdrequiredintegerThe organization to leave.

Responses

200OKSuccess.{ data: object }
204No ContentSuccess. No body.
400Bad RequestYou cannot leave , you are the last owner or administrator.
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/organizations/leave/:orgId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
get/organizations/ledger/accounts

List member account balances

School-wide ledger roster for the Operations Billing desk. Admin only. Current members only (not archived, not API keys). summary is org-wide and ignores q / status. Default sort is most owing first (balanceCents ascending).

Query parameters

qstringFree-text filter. Matches the fields a person would search on.
statusstringComma-separated balance buckets: owing (negative), credit (positive), zero.
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

200OKPaged accounts plus org-wide totals.{ data: LedgerAccount[] }
401UnauthorizedNo token, an expired token, or a malformed one. Sign in again.
403ForbiddenAuthenticated, but not an administrator.
429Too Many RequestsRate limited. Retry-After says how long to wait.
Example request
curl https://api.aerscheduler.com/organizations/ledger/accounts \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
patch/organizations/ratings/{ratingId}

Update a rating

Requires the admin role.

Path parameters

ratingIdrequiredintegerThe rating id.

Request body

Fields to change.

namestring

Responses

200OKSuccess.{ data: object }
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/organizations/ratings/:ratingId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"…"}'
delete/organizations/ratings/{ratingId}

Delete a rating

Requires the admin role.

Path parameters

ratingIdrequiredintegerThe rating id.

Responses

204No ContentSuccess. No body.
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/organizations/ratings/:ratingId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"
post/organizations/removeUser/{userId}

Remove a member

Removes someone from your organization. Requires the admin role.

Path parameters

userIdrequiredintegerThe user to remove.

Responses

204No ContentSuccess. No body.
400Bad RequestThey cannot be removed , the last owner or administrator, for instance.
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/organizations/removeUser/:userId \
  -H "Authorization: Bearer $AERSCHEDULER_KEY"