Aether API

Flight sharing service for the Socialmesh mesh radio community. Share your Meshtastic flights so ground stations can try to receive your signal at altitude.

Operational v1.0.0
11
Shared Flights
3
Active Now
63
Receptions
41k
Max Altitude (ft)

Base URL

https://aether.socialmesh.app

Endpoints

POST /api/flight

Share a flight. Returns a short ID and a shareable URL for the Aether web portal. Requires an API key when configured.

Request Headers

HeaderStatusDescription
Content-Type required Must be application/json
X-API-Key conditional Required when AETHER_API_KEY is set on the server

Request Body

FieldTypeStatusDescription
flight_number string required Flight number, 2–10 alphanumeric chars (e.g. UA123)
departure string required Departure airport code, 3–4 letters (e.g. LAX)
arrival string required Arrival airport code, 3–4 letters (e.g. JFK)
scheduled_departure string required ISO 8601 departure date/time
scheduled_arrival string optional ISO 8601 arrival date/time
airline string optional Airline name (max 50 chars)
node_id string optional Meshtastic node hex ID (max 20 chars)
node_name string optional Node display name (max 39 chars)
user_name string optional User/operator name (max 39 chars)
notes string optional Free-text notes about the flight (max 500 chars)
is_active boolean optional Whether the flight is currently active
altitude_ft number optional Cruise altitude in feet (0–100,000)
frequency string optional LoRa frequency (max 20 chars, e.g. "915 MHz")
reception_count number optional Number of ground station receptions

Example Request

curl -X POST https://aether.socialmesh.app/api/flight \ -H "Content-Type: application/json" \ -H "X-API-Key: your-api-key" \ -d '{ "flight_number": "UA123", "departure": "LAX", "arrival": "JFK", "airline": "United Airlines", "scheduled_departure": "2026-03-15T08:30:00Z", "scheduled_arrival": "2026-03-15T16:45:00Z", "node_id": "!a1b2c3d4", "node_name": "SkyNode-Alpha", "user_name": "MeshPilot", "is_active": true, "altitude_ft": 35000, "frequency": "915 MHz", "notes": "Running 915MHz LoRa with a quarter-wave antenna." }'

Response 201 Created

{ "id": "ae_1a2b3c4d5e6f7890", "url": "https://aether.socialmesh.app/flight/ae_1a2b3c4d5e6f7890", "flight": { "id": "ae_1a2b3c4d5e6f7890", "flight_number": "UA123", "departure": "LAX", "arrival": "JFK", "airline": "United Airlines", "is_active": 1, "altitude_ft": 35000, // ... all fields } }

GET /api/flight/:id

Retrieve a single shared flight by its ID.

Path Parameters

ParamTypeDescription
id string The flight ID (e.g. ae_1a2b3c4d5e6f7890)

Example Request

curl https://aether.socialmesh.app/api/flight/ae_1a2b3c4d5e6f7890

Response 200 OK

{ "id": "ae_1a2b3c4d5e6f7890", "flight_number": "UA123", "departure": "LAX", "arrival": "JFK", "airline": "United Airlines", "node_id": "!a1b2c3d4", "node_name": "SkyNode-Alpha", "user_name": "MeshPilot", "notes": "Running 915MHz LoRa with a quarter-wave antenna.", "scheduled_departure": "2026-03-15T08:30:00.000Z", "scheduled_arrival": "2026-03-15T16:45:00.000Z", "is_active": 1, "altitude_ft": 35000, "frequency": "915 MHz", "reception_count": 7, "created_at": "2026-03-15T08:00:00.000Z", "updated_at": "2026-03-15T08:00:00.000Z" }

GET /api/flights

Search, filter, and paginate through shared flights. Supports full-text search across all fields, airport filtering, active status, and sort ordering.

Query Parameters

ParamTypeDefaultDescription
q string Full-text search across flight number, airports, airline, node name, user name, notes
departure string Filter by departure airport code
arrival string Filter by arrival airport code
flight_number string Filter by exact flight number
active boolean Filter by active status (true or false)
sort string newest Sort order: newest, oldest, departure, receptions
page integer 1 Page number (1-based)
limit integer 20 Results per page (max 100)

Example Request

curl "https://aether.socialmesh.app/api/flights?departure=LAX&active=true&sort=receptions&limit=10"

Response 200 OK

{ "flights": [ { "id": "ae_1a2b3c4d5e6f7890", "flight_number": "UA123", "departure": "LAX", "arrival": "JFK", // ... all flight fields } ], "pagination": { "page": 1, "limit": 10, "total": 42, "totalPages": 5 } }

GET /api/flights/stats

Aggregate statistics across all shared flights.

Example Request

curl https://aether.socialmesh.app/api/flights/stats

Response 200 OK

{ "total_flights": 11, "active_flights": 3, "unique_departures": 10, "unique_arrivals": 10, "unique_flight_numbers": 10, "total_receptions": 63, "max_altitude": 41000 }

GET /api/flights/airports

Lists unique departure and arrival airport codes with flight counts. Useful for populating filter dropdowns in client apps.

Example Request

curl https://aether.socialmesh.app/api/flights/airports

Response 200 OK

{ "departures": [ { "code": "LAX", "count": 5 }, { "code": "JFK", "count": 3 } ], "arrivals": [ { "code": "SFO", "count": 4 }, { "code": "LHR", "count": 2 } ] }

GET /health

Health check endpoint. Returns service status and timestamp.

Response 200 OK

{ "status": "ok", "service": "aether-api", "timestamp": "2026-03-15T08:00:00.000Z" }

Error Responses

Standard Error Format

{ "error": "Description of what went wrong" }
CodeMeaning
400Invalid request body or missing required fields
401Invalid or missing API key (when key auth is enabled)
404Flight not found
429Rate limit exceeded
500Internal server error

Rate Limiting

Requests are rate-limited per IP address within a 1-minute sliding window. POST requests are limited to 20 per minute. GET requests are limited to 120 per minute. When the limit is exceeded, the API returns 429 Too Many Requests.

Authentication

When the AETHER_API_KEY environment variable is configured on the server, all POST requests must include a matching X-API-Key header. GET requests are always public. This allows a safe rollout: deploy the server first, then ship the app update with the key header, then enable enforcement.

CORS

Cross-origin requests are allowed from socialmesh.app, aether.socialmesh.app, map.socialmesh.app, and localhost origins. Supported methods: GET, POST, OPTIONS.

About Aether

Aether is the flight-tracking feature in the Socialmesh app. Mesh radio operators share their upcoming and active flights so that ground station operators can attempt to receive LoRa signals from aircraft at altitude. Flights at 30,000–40,000 ft have line-of-sight to ground stations hundreds of kilometers away, making air-to-ground mesh contacts possible.

Browse shared flights at aether.socialmesh.app.