I am building an app on the free Airports dataset from Spatibase. Use the Spatibase Content Delivery API as the data source. It is read-only and returns published content only. Project - Project id: f7f53b91-4e86-4a73-9f50-70f4bff43652 - API base URL: https://api.spatibase.com/delivery/v1/projects/f7f53b91-4e86-4a73-9f50-70f4bff43652 - Access: public. No key is needed, and the API can be called straight from the browser. The dataset - Airports, a free public dataset: https://spatibase.com/datasets/airports/ - Licence: Public domain (https://ourairports.com/data/#data-license). No attribution required; a credit is appreciated. - Good to know about the data: Not for navigation. Provided as is, without warranty. Do not use it for flight planning or anything safety-critical. - Fields (the keys under "fields" in an entry): - title (text): Airport name, for example Václav Havel Airport Prague - ident (identifier): OurAirports identifier, unique; mostly the ICAO code, for example LKPR - iata_code (text): IATA code (3 letters); empty for airports without one, for example PRG - icao_code (text): ICAO code (4 characters); may be empty, for example LKPR - gps_code (text): GPS code, for example LKPR - local_code (text): Code used locally - airport_type (choice): large_airport, medium_airport, small_airport or seaplane_base, for example large_airport - scheduled_service (boolean): Has scheduled airline service, for example true - elevation_ft (number): Elevation in feet, for example 1247 - continent (choice): AF, AN, AS, EU, NA, OC or SA, for example EU - country_code (text): ISO 3166-1 alpha-2 country code, for example CZ - country (text): Country name, for example Czechia - region_code (text): ISO 3166-2 region code, for example CZ-10 - region (text): Region name, for example Praha - municipality (text): Town or city served, for example Prague - website (link): Airport website, for example https://www.prg.aero/ - wikipedia (link): Wikipedia article, for example https://en.wikipedia.org/wiki/Václav_Havel_Airport_Prague - Filters that work here, for example: filter[continent]=EU, filter[iata_code]=PRG, filter[airport_type]=large_airport, near=,&radius=&sort=distance, bbox=,,,, q= - This public copy is shared and read-only. To add my own data or fields, or for a busy app, I copy it into my own project: https://app.spatibase.com/signup?dataset=airports&ref=ds-airports Read these first - This project's typed OpenAPI file, with my real field names and types: https://api.spatibase.com/delivery/v1/projects/f7f53b91-4e86-4a73-9f50-70f4bff43652/openapi.json - The general OpenAPI file of the API: https://api.spatibase.com/delivery/v1/openapi.json - The docs, written for AI agents: https://spatibase.com/llms.txt (every docs page is also Markdown, for example https://spatibase.com/docs/reference/delivery-api.md) Generate TypeScript types or a typed client from the typed OpenAPI file before writing app code. Take field names from it, never guess them. Endpoints (all GET, relative to the base URL) - /entries: entries as JSON, paged (limit up to 500). Filters: type, group, q (title search), filter[]=value or filter[][]=value (eq, ne, gt, gte, lt, lte, in, contains, exists), bbox, near + radius (meters), sort (for example title, -publishedAt, distance), include=references - /entries.geojson: the same entries and filters as a GeoJSON FeatureCollection (up to 5000) - /entries/: one entry - /tiles.json: TileJSON for vector tiles (tiles at /tiles/{z}/{x}/{y}.pbf, one layer "entries"; filters type, subtypes, group) - /types, /groups, /groups/ (entries in the order I arranged them), /feature-types Good to know - An entry has id, type, title, geometry (GeoJSON, can be null) and fields keyed by each field's API key. - Image URLs are absolute; add ?w=800&fmt=webp to get a resized image. - Responses are cacheable (ETag and 304; about a minute in the browser, up to five minutes at the CDN). CORS is open. Errors look like { "error": { "code", "message" } }. - For maps, use MapLibre GL JS with the vector tiles or the GeoJSON, or Leaflet with the GeoJSON. - Regenerate the types when I tell you I changed my content model.