Skip to content

Seychelles ๐Ÿ‡ธ๐Ÿ‡จ SCAA Registry โ€‹

Namesc-scaa-registry
CountrySeychelles
Registration prefixS7-
Data sourcehttps://www.scaa.sc/index.php/regulatory/e-registers/aircraft-civil-register
FormatHTML table (single request, no file to download)
Run frequencyWeekly (pick a day/time โ€” see docker-compose.core.yaml) โ€” a small register (19 aircraft at check time), a weekly poll is negligible load
Depends on Mictronics for ICAO hexYes โ€” this runner does not publish ICAO hex addresses; S7- registrations are resolved via RediSearch against Mictronics records (idx:aircraft:mictronics). Must run after the mictronics runner.

โš ๏ธ Coverage is deliberately small, not a scraping bug. SCAA's own page states: "aircraft with a principle place of business outside Seychelles and/or those not operating within or to Seychelles are not registered on the Seychelles Civil Register." 19 aircraft across 3 operator groupings plus a few individually-owned aircraft is the expected full result. The page also states it was last updated 20 January 2025 โ€” this source may update infrequently/irregularly rather than on a predictable schedule.

How it works โ€‹

The register is rendered as three separate <table> elements on the page, one per operator grouping, each with its own repeated header row โ€” every table is parsed, not just the first.

This runner uses a real browser-style User-Agent rather than the "Mozilla/5.0 (compatible; P5Software SkyFollower)" string every other runner in this repo shares. Confirmed by direct testing: SCAA's WAF blocks that exact legacy "Mozilla/5.0 (compatible; ...)" bot-signature format specifically โ€” not the words "SkyFollower" or "P5Software" (a substitute bot name in the same format was blocked identically; a plain Mozilla/5.0 alone was not). This is scoped to this runner only; every other runner in the repo currently works fine with the shared UA.

There's no separate owner column beyond Registered Owner โ€” that maps directly to registrant.names. Aircraft Type is a combined manufacturer+model-ish string (e.g. DHC6-400, EC120B) with no manufacturer name present at all, so it's stored as aircraft.model only. One row (S7-IDC) has owner Seychelles Government โ€” a state aircraft, not military; military stays false regardless, since it's civil-registered. Every written record explicitly sets military: false โ€” this register is exclusively civil.

Columns โ€‹

Source columnImportedNotes
Aircraft Registrationโœ…S7--prefix; used as the Mictronics lookup key
Aircraft Typeโœ…โ†’ aircraft.model (combined string, no manufacturer present)
Registered Ownerโœ…โ†’ registrant.names

See specs/data-dictionary.yaml (sc-scaa-registry entry) for full column semantics and cross-source schema notes.

Example Output โ€‹

Read back the merged record for a given ICAO hex (combines this runner's data with Mictronics and any other sources that have written to the same key):

bash
docker run --rm --network host redis:latest redis-cli EVAL "$(cat ./shared/lua/merge_aircraft.lua)" 0 230A1B | python3 -m json.tool --sort-keys --no-ensure-ascii
json
{
    "aircraft": {
        "manufacturer": "De Havilland Canada",
        "manufacturer_model": "DHC-6-400 Twin Otter",
        "model": "DHC6-400",
        "type_designator": "DH6T"
    },
    "data_sources": [
        "mictronics",
        "sc-scaa-registry"
    ],
    "icao_hex": "230A1B",
    "military": false,
    "registrant": {
        "names": [
            "Air Seychelles Ltd."
        ]
    },
    "registration": "S7-LDI"
}

(type_designator, manufacturer, and manufacturer_model come from a Mictronics record on the same hex; model and registrant.names above are this runner's contribution.)

Configuration โ€‹

See Data Runners for the full list of environment variables every runner reads. This runner writes aircraft:registry:{icao_hex} with a fixed 14-day TTL (ENRICHMENT_TTL_SECONDS in shared/timing.py).

MQTT โ€‹

Published once, at the end of a run, to SkyFollower/runner/sc-scaa-registry/statistic/{name} (all retained):

Topic suffixValueFormat
records_importede.g. 19Integer as string
last_run_ate.g. 2026-08-09T08:00:29.791000+00:00ISO 8601 UTC
last_run_statusSuccess or FailureString

Home Assistant autodiscovery configs are also published (retained) to homeassistant/sensor/SkyFollower_runner_sc_scaa_registry_{name}/config for each of the three stats above.