Your account, plan and usage
A cheap way to check a key works.
AircraftForSale has a new look. Already a member? Sign in and follow the prompts to reach your account.
Serving aircraft buyers & sellers since 1995
Keep a dealer’s aircraft on AircraftForSale in step with their own website or inventory system. JSON over HTTPS, one request per aircraft, safe to repeat.
A dealer creates a key in their dashboard under Settings → Integrations and gives it to whoever builds the connection. Send it on every request as a bearer token, from a server — never from a web page.
curl https://aircraftforsale.com/api/dealer/v1/me \
-H "Authorization: Bearer $AFS_KEY"curl -X PUT https://aircraftforsale.com/api/dealer/v1/listings/STK-1042 \
-H "Authorization: Bearer $AFS_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "2019 Cirrus SR22T G6 GTS",
"make": "Cirrus",
"model": "SR22T G6",
"year": 2019,
"price": 849000,
"registration": "N219GT",
"serialNumber": "1734",
"totalTime": 640,
"location": "Scottsdale, AZ, United States",
"description": "One owner, hangared since new.",
"sections": { "avionics": "Perspective+ by Garmin\nGFC 700 autopilot" },
"images": ["https://yoursite.com/aircraft/1042/1.jpg"],
"agentEmail": "[email protected]"
}'curl -X PUT https://aircraftforsale.com/api/dealer/v1/listings/STK-1042 … -d '{ …same fields…, "status": "sold" }'curl -X DELETE https://aircraftforsale.com/api/dealer/v1/listings/STK-1042 \
-H "Authorization: Bearer $AFS_KEY"Try any PUT with ?dryRun=true first: it validates the body and tells you how we would file the make and model, without writing anything.
externalId — a stock number or CMS post id. Keep it stable: it is how we know a second request is the same aircraft.listingType). Sending the same body again changes nothing, so a nightly full sync is fine.outcome: "adopted" — rather than creating a second.reviewNote says why; fix it and PUT again to resubmit. GET /me shows whether your account is reviewed or publishes directly.photos.pending stays true for a few minutes on a large gallery. URLs we already hold are never downloaded again.GET /makes to land in the right category. Anything else is filed under its make and flagged for our team, which shows as a reviewNote.Every response reports the listing’s status as one of these.
reviewNote, fix and PUT again to resubmitfor_sale to relist)Every authenticated request counts as one call against the account’s monthly allowance, which resets on the 1st (UTC). Responses carry X-RateLimit-Limit and X-RateLimit-Remaining. There is also a ceiling of 120 requests a minute.
| Plan | Calls a month | |
|---|---|---|
| Free | 2,500 | Every dealer account |
| Growth | 25,000 | On request |
| Volume | 250,000 | On request |
A nightly sync of the whole inventory costs one call per aircraft. To save calls, send only what changed — and remember a resend of an unchanged aircraft still counts.
Errors are JSON: { "error": { "code", "message", "field"? } }. Branch on code, not on the message. Retry 5xx and 429 with backoff.
| Code | HTTP | Meaning |
|---|---|---|
| unauthorized | 401 | No key, not an AircraftForSale key, or a revoked one. |
| forbidden | 403 | API access is switched off for your account. Contact us. |
| not_found | 404 | Nothing has been sent with that externalId. |
| conflict | 409 | Your account has no team members to list aircraft under. |
| validation_failed | 422 | A field is invalid; field names it. |
| quota_exceeded | 429 | This month's calls are used. Retry-After is the seconds to the 1st (UTC). |
| rate_limited | 429 | More than 120 requests a minute. Retry after Retry-After seconds. |
| internal | 500 | Our fault. Retry with backoff; it has been logged. |
Base URL https://aircraftforsale.com/api/dealer/v1
Your account, plan and usage
A cheap way to check a key works.
Every aircraft you have sent
Ordered by externalId. Use it to reconcile your inventory with ours.
One aircraft: its status, public URL, review notes and photo progress
Create or update an aircraft
Send the whole aircraft each time; a field you leave out is cleared, except listingType. The first request for an externalId creates the listing — unless your account already has a listing with the same registration (or serial number), which is adopted instead of duplicated. Photos are copied after the response; photos.pending is true until they are in.
Add ?dryRun=true to see what would happen — including how we would categorise the make and model — without writing anything.
Take an aircraft down (not sold)
The listing leaves the site; its record stays, and a later PUT with for_sale relists it. For a sale, PUT with "status": "sold" instead.
Our makes and models
Fixed-wing aircraft. Sending these exact names files a listing in the right category; anything else is filed under its make and flagged for our team. Helicopters are accepted and categorised by our team.
The body of PUT /listings/{externalId}. Required: title, make, model. Unknown fields are refused, so a typo fails loudly.
| Field | Type | Description |
|---|---|---|
| status | for_sale | sold | for_sale lists or updates the aircraft; sold marks it sold (it stays on the site as sold, with its last asking price). A listing still waiting for review never went live, so sold withdraws it instead. To take a listing down without a sale, DELETE it.default "for_sale" |
| title * | string | The headline, e.g. "2018 Cirrus SR22T G6 GTS".max 200 characters |
| make * | string | Manufacturer, e.g. "Cirrus". See GET /makes for our names.max 100 characters |
| model * | string | Model, e.g. "SR22T G6". See GET /makes.max 100 characters |
| year | integer or null | |
| price | number or null | Asking price in US dollars. Omit or null for "Please call". |
| registration | string or null | Tail number, e.g. "N123AB".max 20 characters |
| serialNumber | string or null | max 50 characters |
| totalTime | number or null | Total airframe time, hours. |
| location | string or null | Where the aircraft is, e.g. "Scottsdale, AZ, United States".max 200 characters |
| listingType | for_sale | fractional | fractional for a fractional-ownership offer. Omit to keep the current type. |
| description | string or null | Plain text (line breaks kept) or simple HTML (paragraphs, lists, bold, links). Anything else is removed.max 100,000 characters |
| sections | Sections | |
| images | array of string (uri) | Photo URLs in display order, first is the cover. We copy them to our own storage, so they must be publicly fetchable; JPEG, PNG or WebP. Send the same URLs again and nothing is re-downloaded.max 100 |
| videoUrl | string (uri) or null | A YouTube or Vimeo link.max 500 characters |
| agentEmail | string (email) or null | The sales agent for this aircraft. If it matches an agent on your account (Dealer → Settings → Sales agents), enquiries go to them; otherwise to the account's lead address.max 200 characters |
sectionsThe spec sections on the listing page. Omit one to leave it empty.
| Field | Type | Description |
|---|---|---|
| airframe | string | Plain text (line breaks kept) or simple HTML (paragraphs, lists, bold, links). Anything else is removed.max 50,000 characters |
| engine | string | Plain text (line breaks kept) or simple HTML (paragraphs, lists, bold, links). Anything else is removed.max 50,000 characters |
| avionics | string | Plain text (line breaks kept) or simple HTML (paragraphs, lists, bold, links). Anything else is removed.max 50,000 characters |
| interior | string | Plain text (line breaks kept) or simple HTML (paragraphs, lists, bold, links). Anything else is removed.max 50,000 characters |
| exterior | string | Plain text (line breaks kept) or simple HTML (paragraphs, lists, bold, links). Anything else is removed.max 50,000 characters |
| inspection | string | Plain text (line breaks kept) or simple HTML (paragraphs, lists, bold, links). Anything else is removed.max 50,000 characters |
| additionalEquipment | string | Plain text (line breaks kept) or simple HTML (paragraphs, lists, bold, links). Anything else is removed.max 50,000 characters |
| weights | string | Plain text (line breaks kept) or simple HTML (paragraphs, lists, bold, links). Anything else is removed.max 50,000 characters |
| remarks | string | Plain text (line breaks kept) or simple HTML (paragraphs, lists, bold, links). Anything else is removed.max 50,000 characters |