Skip to content

Turks & Caicos ๐Ÿ‡น๐Ÿ‡จ CAA Registry โ€‹

Nametc-caa-registry
CountryTurks and Caicos Islands
Registration prefixVQ-
Data sourcehttps://tcicaa.tc/operations-safety/aircrafts/aircraft-register
FormatHTML table (single static page, fixed URL)
Run frequencyWeekly (Thursday, 09:10 UTC)
Depends on Mictronics for ICAO hexYes โ€” the Turks & Caicos register does not publish ICAO hex (Mode S) addresses; registrations are resolved via RediSearch against Mictronics records (idx:aircraft:mictronics). Must run after the mictronics runner.

How it works โ€‹

Unlike most runners, there is no index page or file to discover โ€” the register lives directly on a fixed static HTML page. The page is parsed with BeautifulSoup: every <table> on the page is inspected, and the first one whose first row's text contains REG is taken as the register table. Header cells become dict keys and each subsequent row is zipped into a {header: value} record. Every written record explicitly sets military: false โ€” this register is exclusively civil, and the explicit value ensures a stale military: true flag (from Mictronics or a prior record on a reused hex) is corrected on re-registration.

Columns โ€‹

Source columnImportedNotes
REGโœ…VQ-prefix; used as the Mictronics lookup key
MANUFACT.โœ…โ†’ aircraft.manufacturer
MODELโœ…โ†’ aircraft.model
S/Nโœ…โ†’ aircraft.serial_number
OWNER /OPERATORโœ…โ†’ registrant.names[0]
D.O.RโŒPresent in source; not read by this runner

See specs/data-dictionary.yaml (tc-caa-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):

Note: the Turks & Caicos register has no Boeing or Airbus aircraft at all; the "big" example below is an ATR 72-212A, and the "small" example is a Cessna 402 twin (not a 150/172).

bash
docker run --rm --network host redis:latest redis-cli EVAL "$(cat ./shared/lua/merge_aircraft.lua)" 0 40038D | python3 -m json.tool --sort-keys --no-ensure-ascii
json
{
    "aircraft": {
        "manufacturer": "Cessna",
        "manufacturer_model": "CESSNA 402 Businessliner",
        "model": "402C",
        "serial_number": "402C-0074",
        "type_designator": "C402"
    },
    "data_sources": [
        "mictronics",
        "tc-caa-registry"
    ],
    "icao_hex": "40038D",
    "military": false,
    "registrant": {
        "names": [
            "Caicos Express Airways"
        ]
    },
    "registration": "VQ-TCE"
}
bash
docker run --rm --network host redis:latest redis-cli EVAL "$(cat ./shared/lua/merge_aircraft.lua)" 0 40039F | python3 -m json.tool --sort-keys --no-ensure-ascii
json
{
    "aircraft": {
        "manufacturer": "ATR-GIE",
        "manufacturer_model": "ATR-72-202",
        "model": "ATR 72-212A",
        "serial_number": "702",
        "type_designator": "AT72"
    },
    "data_sources": [
        "mictronics",
        "tc-caa-registry"
    ],
    "icao_hex": "40039F",
    "military": false,
    "registrant": {
        "names": [
            "InterCaribbean Airways"
        ]
    },
    "registration": "VQ-THW"
}

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/tc-caa-registry/statistic/{name} (all retained):

Topic suffixValueFormat
records_importede.g. 271Integer as string
last_run_ate.g. 2026-07-07T14:32:01.123456+00:00ISO 8601 UTC
last_run_statusSuccess or FailureString

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