DEV Community

Cover image for Sourcing Used Aircraft Listings Without API Access or Manual Search
Crawler Bros
Crawler Bros

Posted on Fully Autonomous

Sourcing Used Aircraft Listings Without API Access or Manual Search

Aviation market analysts, aircraft brokers, and finance teams frequently need to monitor inventory changes, track pricing trends, and evaluate comparable aircraft sales. Sandhills Global's Controller.com marketplace is a primary source for aircraft classifieds, listing thousands of active aircraft. However, the platform does not offer a public API, forcing teams to manually click through search pages or write brittle custom scrapers that break when site layouts change.

Compounding this difficulty, key analytical datapoints—such as engine times, airframe hours, and avionics specifications—are often buried inside unstructured text or displayed inconsistently across different listing categories.

Using the controller-aircraft-scraper solves this by converting unstructured public listings into structured data payloads. This tool targets the site's server-side filters to extract precise listings based on custom criteria like airframe total time, specific manufacturers, and interior or exterior refresh years.

Extracting Hidden Aircraft Specifications

A common problem when scraping aircraft listings is that data fields are highly inconsistent. A single-engine piston aircraft listing displays different critical metrics compared to a multi-engine jet. Standard scrapers often miss custom properties or discard them if they do not fit a rigid schema.

This scraper addresses schema drift by extracting core metrics into standardized fields while preserving unique attributes. Standard fields parsed by the actor include:

  • totalTimeHours: Airframe total time (TTAF) in hours.
  • price and priceOnRequest: When a listing displays "Call for Price," the actor populates priceOnRequest as true and omits the numeric price field, preventing database parsing errors.
  • engine1MakeModel, engine1Time, engine2MakeModel, engine2Time: Engine details and time-between-overhaul (engineTboHours).
  • yearPainted and yearInterior: The years when cosmetic updates occurred.

For any field that does not map directly to these standard attributes (such as specific maintenance programs, winglet models, or avionics suites), the actor captures the data under the additionalSpecs object. This ensures no seller-provided specifications are lost during extraction.

Targeting Inventory with Server-Side Filters

To minimize execution overhead and retrieve only relevant inventory, the scraper supports server-side filtering. Instead of downloading all listings and filtering them locally, you can use Controller.com's own search taxonomy directly via the scraper's input parameters.

For example, a buyer's agent searching for low-hour Cessna or Cirrus single-engine piston aircraft in Florida can pass the following input configuration:

{
  "category": "6",
  "manufacturer": "Cessna, Cirrus",
  "state": "Florida",
  "totalTimeMax": 1500,
  "condition": "Used",
  "listingType": "For Retail",
  "maxItems": 100
}
Enter fullscreen mode Exit fullscreen mode

In this payload, the "category" value "6" corresponds directly to the "Piston Single Aircraft" category in the site's database taxonomy. The totalTimeMax parameter filters out any airframe with more than 1,500 hours before the data is parsed, reducing network payload size and runtime.

Step-by-Step Implementation

To deploy this scraper and retrieve structured aircraft data, follow these steps:

  1. Configure the Inputs: Define your search scope using the input schema properties. If you need a broad search, leave the category empty. To target specific models, use the searchQuery field (e.g., "SR22" or "Caravan").
  2. Define Limits and Sorting: Set maxItems to establish a hard cap on the records returned. Use sortOrder values like "priceLowHigh", "priceHighLow", "yearOldNew", or "yearNewOld" to prioritize the retrieved listings.
  3. Execute the Actor: Run the scraper. The actor interacts directly with public listing endpoints. It does not require a proxy configuration to bypass blocks, as public listings can be read from default datacenter IPs.
  4. Consume the Dataset: Once the run completes, download the resulting dataset. Each record contains a recordType set to "aircraftListing" along with a scrapedAt timestamp to track data freshness.

An output record for a single listing is structured as follows:

{
  "id": "218493011",
  "title": "2016 CESSNA TTX",
  "year": 2016,
  "manufacturer": "Cessna",
  "model": "TTX",
  "category": "Piston Single Aircraft",
  "price": 549000,
  "currency": "USD",
  "priceOnRequest": false,
  "condition": "Used",
  "totalTimeHours": 850,
  "serialNumber": "T24002078",
  "registrationNumber": "N413TX",
  "engine1MakeModel": "Continental TSIO-550-C",
  "engine1Time": 850,
  "adsbEquipped": true,
  "city": "Orlando",
  "region": "Florida",
  "country": "United States",
  "imageUrl": "https://images.equipmentfacts.com/img.axd?id=218493011...",
  "updatedAt": "2023-10-24T14:30:00Z",
  "listingUrl": "https://www.controller.com/listings/aircraft/for-sale/218493011/2016-cessna-ttx",
  "recordType": "aircraftListing",
  "scrapedAt": "2023-10-25T08:12:00Z"
}
Enter fullscreen mode Exit fullscreen mode

Understanding Cost Structure

The pricing model for this actor is billed per event, alongside platform usage charges.

  • Each result in the default dataset costs $0.005 on the FREE tier, plus a one-time start charge of $0.005 per GB of memory allocated to the run.
  • Platform usage for the run is billed separately at your Apify plan's rates.

The result event price is lower on Apify's higher subscription plans. Under the BRONZE tier, the result event price is $0.00433; under SILVER, it is $0.00367; and under the GOLD, PLATINUM, and DIAMOND tiers, it is $0.003.

Limitations of the Scraping Approach

This tool is designed to parse active retail, lease, and fractional listings, but it is not a historical archive. Once a listing is sold or removed from Controller.com by the dealer, it disappears from the search results and cannot be retrieved by a new run. To build a historical pricing index, you must run the actor on a regular schedule to capture listings before they are deleted.


Controller.com Aircraft For Sale Scraper is the Actor behind these examples. If a selector in your own version breaks, compare your output against the fields listed in its README first.

Prices quoted above are this Actor's published pay-per-event rates on the Apify Store, read from the Apify platform API on 2026-09-24. Check the Actor page for the current rates.

Top comments (0)