A comprehensive registry of all aerodromes worldwide that have ICAO codes. This serves as a single source of truth for multiple projects requiring aerodrome data.
This registry contains essential information for each aerodrome:
- ICAO Code: 4-letter international identifier
- Name: Official aerodrome name
- Country: Country location
- Timezone: IANA timezone identifier
The registry uses JSON format for maximum compatibility and ease of integration:
{
"version": "1.0.0",
"last_updated": "2025-09-22T22:40:31+02:00",
"total_count": 4,
"aerodromes": [
{
"icao": "KJFK",
"name": "John F. Kennedy International Airport",
"country": "United States",
"timezone": "America/New_York"
}
]
}aerodromes.json- Main registry file containing all aerodrome dataschema.json- JSON Schema for data validationREADME.md- This documentation file
Most projects can import this data directly into their databases:
Python Example:
import json
import requests
from datetime import datetime
def import_aerodromes():
with open('aerodromes.json', 'r') as f:
data = json.load(f)
for aerodrome in data['aerodromes']:
# Insert into your database
insert_aerodrome(
icao=aerodrome['icao'],
name=aerodrome['name'],
country=aerodrome['country'],
timezone=aerodrome['timezone']
)
print(f"Imported {data['total_count']} aerodromes")Node.js Example:
const fs = require('fs').promises;
async function importAerodromes() {
const data = JSON.parse(await fs.readFile('aerodromes.json', 'utf8'));
for (const aerodrome of data.aerodromes) {
await insertAerodrome({
icao: aerodrome.icao,
name: aerodrome.name,
country: aerodrome.country,
timezone: aerodrome.timezone
});
}
console.log(`Imported ${data.total_count} aerodromes`);
}Use the provided JSON Schema to validate data integrity:
# Using ajv-cli
npm install -g ajv-cli
ajv validate -s schema.json -d aerodromes.json# Using jsonschema library
import json
import jsonschema
with open('schema.json', 'r') as f:
schema = json.load(f)
with open('aerodromes.json', 'r') as f:
data = json.load(f)
jsonschema.validate(data, schema)
print("Data is valid!")This registry is built using the following open data sources:
-
OurAirports (https://ourairports.com)
- License: Public Domain (Unlicense)
- Usage: Airport names, locations, and ICAO codes
- Attribution: David Megginson and contributors
-
OpenFlights (https://openflights.org)
- License: Open Database License (ODbL)
- Usage: Timezone data for airports
- Attribution: OpenFlights.org contributors
- Airport data is sourced primarily from OurAirports (public domain)
- Timezone information is enhanced using OpenFlights data where available
- Fallback timezone mapping is applied based on country location
- The registry includes both 'icao_code' and 'ident' fields from OurAirports to ensure comprehensive coverage
This registry uses a GitOps workflow with automated data synchronization and manual review/release process.
Every Monday at 6:00 AM UTC (or manually triggered), GitHub Actions automatically:
- Downloads fresh data from OurAirports and OpenFlights
- Processes data using
sync_aerodromes.py - Creates
aerodromes-staging.jsonwith latest information - Compares staging vs production data
- If changes detected:
- Commits staging file to repository
- Generates detailed change summary
- Creates GitHub Issue for manual review
When automation detects changes, you receive a GitHub Issue with:
- Detailed change summary and statistics
- Instructions for next steps
- Automatic labels for easy tracking
Simply comment on the GitHub Issue with one of these commands:
To approve and release:
!release patch- For data updates, new airports, corrections!release minor- For new fields, backward-compatible changes!release major- For breaking changes, schema updates!release patch Fixed timezone data- Add optional description
To reject:
!rejector!reject Reason for rejection
What happens automatically:
- β Validates staging data
- β Creates production backup
- β Bumps version (patch/minor/major)
- β Releases to production
- β Commits & creates Git tag
- β Closes issue with summary
For local development or when automation fails:
- Review: Run
python3 review_changes.pyto see detailed changes - Approve: Run
python3 release.pyto promote staging β production - Reject: Do nothing, changes remain in staging only
- Production never touched by automation - Always requires manual approval
- Automatic backups created before each release
- Rollback capability if issues arise
- Data validation before promotion
- Clear audit trail through Git commits and Issues
aerodromes.json- π’ PRODUCTION (what applications consume)aerodromes-staging.json- π‘ STAGING (automated updates)sync_aerodromes.py- Downloads and processes source datareview_changes.py- Shows differences between staging and productionrelease.py- Promotes staging to production with backups
For emergency additions only. Prefer the automated sync process for data quality.
- Ensure the aerodrome has a valid 4-letter ICAO code
- Add entry to the
aerodromesarray inaerodromes.json - Update
total_countfield - Update
last_updatedtimestamp - Validate against schema
- Commit changes
This registry follows Semantic Versioning (MAJOR.MINOR.PATCH):
-
π΄ MAJOR (x.0.0): Breaking changes to JSON structure or schema
- Removing required fields
- Changing field names or types
- Altering data format significantly
- Example:
1.0.0β2.0.0
-
π‘ MINOR (0.x.0): Backward-compatible additions
- Adding new optional fields
- Expanding existing data without breaking apps
- Schema enhancements that don't break existing consumers
- Example:
1.0.0β1.1.0
-
π’ PATCH (0.0.x): Data updates and corrections
- New airports added
- Airport information corrected
- Timezone assignments updated
- Bug fixes in data processing
- Example:
1.0.0β1.0.1
The release.py script handles version updates:
- Prompts you to choose version bump type (patch/minor/major)
- Updates the
VERSIONfile automatically - Integrates with the release process
- Commits version changes with descriptive messages
Manual version updates:
# View current version
cat VERSION
# Manual update (if needed)
echo "1.0.1" > VERSION
git add VERSION
git commit -m "π·οΈ Bump version to 1.0.1"Version in API Response:
{
"version": "1.0.0",
"last_updated": "2025-09-24T09:00:00Z",
"total_count": 19356,
"aerodromes": [...]
}Consumer applications should check version compatibility:
import requests
def fetch_aerodromes_safe():
response = requests.get("https://raw.githubusercontent.com/username/repo/main/aerodromes.json")
data = response.json()
version = data['version']
major_version = int(version.split('.')[0])
if major_version > 1:
print(f"β οΈ Warning: Data version {version} may contain breaking changes")
# Handle version compatibility
return data- Fork the repository
- Make your changes
- Validate data against schema
- Submit a pull request with description of changes
This project (code, scripts, and documentation) is licensed under the MIT License. See the LICENSE file for details.
This registry uses data from the following sources with their respective licenses:
-
OurAirports Data: Public Domain (Unlicense)
- No attribution required, but we credit David Megginson and contributors
- Source: https://github.com/davidmegginson/ourairports-data
-
OpenFlights Data: Open Database License (ODbL) v1.0
- Requires attribution and share-alike for derivative works
- Source: https://openflights.org
- License: https://opendatacommons.org/licenses/odbl/1-0/
If you use this registry:
- β You can use it freely for any purpose (commercial or non-commercial)
- β Attribution is appreciated but not legally required for the registry itself
- β The underlying airport data is largely public domain
If you create derivative works:
- π Please maintain attribution to data sources (good practice)
- π For works using OpenFlights-derived data, follow ODbL requirements
- π Consider contributing improvements back to the community
This data is not suitable for navigation. The maintainers assume no responsibility for accuracy and no liability for results obtained or damages incurred from using this data.
For questions or issues, please create an issue in the repository or contact the maintainers.