The interface is fully translated, and so is every written page — the guide, the learning articles, the data essays and the blog. What stays in Persian is what arrives from the data source itself: city, airport, airline and aircraft names, and the notes stored alongside them. Those will appear in Persian until the API carries an English field for them.

آسمان‌جو's public API

Everything this site shows comes from these endpoints; the pages themselves are nothing but readers of them. All are read-only, all return JSON except where stated otherwise, and none needs a key. Their root is https://asemanjoo.ir .

What you take is not public domain

The answer from these endpoints is the same data the download files have and the same conditions hold on it: citing the source, the ODbL “share-alike” condition, and the ban on entering origin/destination into another database. The license page says exactly what is allowed and what is not.

Rate limit

  • No key120 requests per minuteIt is counted by internet address network, not by browser.
  • With this site's user session300 requests per minuteFor the pages the site itself reads behind your account.
  • With an API keyA separate quota for each keyA key is obtained through the contact page and its quota is set there; the request header is X-API-Key.

Every response carries the three X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset ; when the quota runs out the response is 429 and Retry-After It tells you how many seconds to wait. The window is one minute and is counted afresh from the start of each minute.

Version and stability

  • Every address under /api/ also answers under the /api/v1/ prefix; it is the same implementation, so the two never drift apart.
  • Removing an address, renaming a parameter, or changing its default value are all locked down in one test file; changing them has to be deliberate and reviewable.
  • The answer from heavy endpoints is kept for a while and carries an ETag header; if you send If-None-Match, you get a 304 and your previous copy is still valid.
  • A cross-origin request from the browser is accepted only from asemanjoo.ir itself; for any other use, read it from the server side.

Before you take a number seriously

  • “Unknown” means we do not know, and in the JSON answer it comes back as null — not as zero. A speed of zero and an altitude of zero, where the transmitter said nothing, are “unknown” too, not “zero”.
  • The origin and destination of every flight has a provenance rank: 0 means none, 10 means the adsbdb callsign table, 20 means a claim whose source was not recorded, 30 means a flight schedule and 40 means our own observation on the ground. Rank 10 is the weakest: one callsign flies several routes in a single day and that table holds one route per callsign.
  • The point-by-point track of flights is kept for 30 days and the flight row itself for a year; the daily roll-ups are never deleted. Which means «there was no flight» and «we no longer keep it» are two different things.
  • Our coverage is the coverage of volunteer receivers, not the coverage of the sky. Where there is no receiver there is no flight — and that shows in the figures for airports with few receivers.
  • Punctuality and scheduled times are available only for a minority of flights, so this is a sample, not a census.

The sky right now

  • /api/flights

    Every flight seen inside the requested box at this moment. Rows are arrays rather than objects so they stay small; the field order is the one the site's own map reads.

    south, north, west, east, since, limit

  • /api/stats/live

    The number of flights being tracked right now — one number, for when that is all you want.

  • /api/stats/world

    A picture of the world at this moment: the busiest origins, destinations, airlines and types among the flights in the air.

  • /api/nearest

    The flights nearest to a point, with distance in kilometres.

    lat, lon, radius_km, limit, ground

  • /api/overhead

    What is overhead a point — the very question “what is this aircraft above me”.

    lat, lon, radius_km, limit

  • /api/density

    Traffic density in the viewport, for drawing the density layer.

    south, north, west, east, nx, ny

  • /api/top

    The flights with the most visitors on this site right now.

  • /api/flights/emergency

    Flights squawking 7500, 7600 or 7700. The list is usually empty, and that is an answer too.

  • /api/feed/events.rss

    The same emergency list in RSS format, for a news reader.

One flight

  • /api/flight/{flight_id}

    Everything about one flight: identifier, airframe, route, recorded track and photos.

    with_trail

  • /api/flight/{flight_id}/live

    Only the live part of that same flight, for when the page is open and just needs refreshing.

  • /api/flight/{flight_id}/eta

    Estimated time of arrival. It is our estimate from speed and distance, not the airline's announcement.

  • /api/flight/{flight_id}/geojson

    That same flight's track as GeoJSON, to drop onto any other map.

  • /api/flight/{flight_id}/playback

    Replay of the flight track from our own store, point by point.

    max_points

  • /api/flight/{flight_id}/history

    Past flights with the same flight number — “when this flight usually lands”.

    limit

  • /api/replay

    Replay of one box of the map over a past time window.

    south, north, west, east, start, minutes, max_flights, stream

  • /api/replay/export

    Export of the same replay to a GeoJSON or CSV file — for inspection and research, not video.

    south, north, west, east, start, minutes, max_flights, format

  • /api/replay/airport/{iata}

    Replay of the flights that landed at or departed from this airport within a time window — selected by flight, not by geographic box, so that a flight leaving the box is not left out of the replay.

    start, minutes, max_flights

Airport

  • /api/airports

    A list of airports with their Persian name, coordinates and movement count.

    fields, format

  • /api/airports.csv

    The same list in CSV format, for a spreadsheet.

  • /api/airports/bbox

    Airports inside a box, for the map.

    south, north, west, east, limit

  • /api/airports/compare

    Two airports side by side, with the same numbers the comparison page shows.

    a, b, days

  • /api/airports/disruptions

    Global and regional airport rankings based on a live index of disruption, delays and cancellations.

    hours, limit, region

  • /api/airport/{iata}

    One airport: name, coordinates, runways, weather and recent stats.

  • /api/airport/{iata}/full

    The four answers above — airport, board, stats and forecast — in one request.

    kind, days, board_before, board_after, stats_days, radius_km

  • /api/airport/{iata}/board

    That same airport's arrivals and departures board.

    kind, before, after

  • /api/airport/{iata}/stats

    Time series of the airport's traffic, day by day.

    days

  • /api/airport/{iata}/delay

    An airport's delay status, right now and over the recent window — with an explicit “unknown” state when the sample is small.

    days, hours

  • /api/airport/{iata}/routes

    That airport's most frequent destinations in the recent window.

    days, limit

  • /api/airport/{iata}/ground

    The aircraft seen on that airport's ground at this moment.

    radius_km, limit

  • /api/airport/{iata}/departures.xml

    An RSS feed of that airport's departures — the same departure board, to subscribe to in a reader without an account.

  • /api/airport/{iata}/departures.json

    The same feed in JSON Feed 1.1 format, for the developer consumer.

  • /api/airport/{iata}/trails

    Recent arrival and departure tracks for that same airport, condensed and ready to draw on a map (E-274).

    days

Route, airline, type, country and airframe

  • /api/routes

    Every route with traffic, page by page with a key cursor.

    cursor, limit

  • /api/route/{orig}/{dest}

    One route: flight count, landings and the airframes that fly it.

  • /api/route/{orig}/{dest}/geojson

    The same track in GeoJSON format.

  • /api/city/{slug}

    One city: its airports, their combined traffic and the busiest destinations.

    days

  • /api/city-pair/{orig}/{dest}

    Every airport pair between two cities, gathered into one response.

    days

  • /api/route/{orig}/{dest}/trails

    Recent tracks of flights on this same route, condensed and ready to draw on a map (E-46).

    days

  • /api/route/{orig}/{dest}/path

    The usual path of this route, computed from the median of recent tracks — not the path of one particular flight (L-90).

    days

  • /api/route/{orig}/{dest}/seasonality

    This route's seasonal pattern broken down by Persian calendar month, from the permanent stats_daily_route record (L-92).

  • /api/busiest

    The busiest airports and routes of the past thirty days, in one response.

  • /api/busiest/airports.csv

    The same airport ranking in CSV format.

  • /api/busiest/routes.csv

    The same route ranking in CSV format.

  • /api/stats/extremes

    The longest and shortest routes we have seen.

    limit, min_flights

  • /api/airlines

    A list of airlines with their Persian name and flight count.

  • /api/airline/{iata}

    One airline: fleet, destinations and flight count.

    days

  • /api/airline/{iata}/history

    That airline's stats over a window you set yourself.

    start, end

  • /api/types

    A list of aircraft types with flight count.

  • /api/type/{code}

    One aircraft type: the airframes seen and the most-used routes.

    days

  • /api/countries

    A list of countries with airport count and traffic.

  • /api/country/{code}

    A country's flights and airports.

    days

  • /api/aircraft/{reg}

    One airframe by registration: details and recent flights.

    days

  • /api/aircraft/{reg}/history

    Flights by that same airframe, over a window you set yourself.

    start, end, limit

Stats and downloads

  • /api/stats/daily

    Daily counts of flights, routes, airports and types. With format=csv it gives the same in CSV.

    days, format

  • /api/stats/world/series

    Time series of the global flight count, one sample every five minutes — up to seven days back. An interval in which the collector took no sample stays empty; no value is interpolated in its place.

    hours

  • /api/download/datasets

    A machine-readable list of the downloadable datasets: the column names, address and licence text of each.

  • /api/download/{dataset}.csv

    One of the daily or yearly roll-ups in CSV format, with a header that carries the build time and the licence inside the file itself. `days` limits only the daily roll-ups; the yearly ones give the whole recorded range.

    days

Search

  • /api/search

    One search across airports, airlines, flights, routes and registrations.

    q

  • /api/search/suggest

    Short suggestions while typing.

    q, limit

  • /api/search/advanced

    Search with combined filters: airline, type, altitude, speed and airport.

    airline, aircraft_type, orig, dest, min_alt, max_alt, min_spd, max_spd, ground, limit

  • /api/search/history

    Search a flight number, callsign or registration over a date range — up to a year back.

    q, from, to, limit

Weather, airspace and sources

  • /api/wx/hazard

    Aviation weather advisories (SIGMET/AIRMET) in the viewport.

    south, north, west, east, limit

  • /api/tfr

    Active US temporary flight restrictions (TFR) in the viewport, with type (sporting/hazard/security/space/VIP/drone gathering/special) and validity window.

    south, north, west, east, limit

  • /api/oceanic-tracks

    The organised oceanic tracks valid at this moment (NAT-OTS, PACOTS and AUS-OTS) together with each system's source and one status sentence.

  • /api/wx/turbulence

    Turbulence layer: pilot reports (PIREP, “reported”) and the model's wind shear between two adjacent levels (“estimated”) inside the view box — two separate sub-layers.

    south, north, west, east, limit

  • /api/airspace/fir

    Flight information region (FIR) boundaries inside the box.

    south, north, west, east, zoom, limit

  • /api/airspace/at

    Which flight information region this point lies in.

    lat, lon

  • /api/map/ground

    The navaids and runways inside the box, for the map's ground layer.

    south, north, west, east, runways, limit

  • /api/sources

    Live status of the data sources: which of them answer and how large each one's share is.

    hours

Depth: punctuality, data health and Iran

  • /api/punctuality

    Airports whose departure sample reaches the publication floor, with the real data window. No percentage is returned — numerator and denominator separately, so that no share reaches the reader without its sample.

  • /api/punctuality/{iata}

    An airport's punctuality: today's board against the average, the local-hour curve, the airline ranking, and the count of what the sample floor set aside.

  • /api/airport/{iata}/conditions

    The airport forecast (TAF) and the active en-route warnings (SIGMET) within its radius. Separate from the airport page, because a warning lives for hours, not thirty days.

    radius_km

  • /api/aircraft/{reg}/activity

    One aircraft's thirty-day record: how many flights each day and from which airports. A zero day means a day we looked and saw nothing.

  • /api/aircraft/{reg}/distance

    The total distance Asemanjoo has observed from one airframe — not that aircraft's lifetime distance. The observation window and the number of un-aggregated days come in this same response, because the number cannot be read without them.

  • /api/aircraft/{reg}/utilization

    The utilisation of one airframe: mean flight hours per day and mean ground turnaround between two flights, over the given window. An aircraft with recorded flights on fewer than five different days gets no number.

    days

  • /api/airline/{iata}/fleet-utilization

    The same utilisation, for an airline's whole fleet: one row per registration, plus the fleet average over those that reached the sample floor.

    days, limit

  • /api/airline/{iata}/fleet

    The aircraft we have seen for this airline — not the official fleet — with whether each is in the air right now or on the ground, and if on the ground, when and where it was last seen. A registration parked for the whole window is not in this list.

    days, limit

  • /api/airline/{iata}/operated-by

    For flights sold under this airline's code, their real operator when it differs from the airline itself — a sign of a wet lease. Continue reading it with `/api/operator/{icao}`.

    days

  • /api/operator/{icao}

    The real operator of a fleet instead of the ticket seller — the same shape as `/api/airline/{iata}`, but based on who actually operated the aircraft, not on which code the ticket was sold under.

    days

  • /api/airline/{iata}/fleet-wikidata

    A second, independent source for the same question: the airframes Wikidata (not our own receivers) knows for this airline. This is not the official fleet either — Wikidata records only notable aircraft one by one, not a complete fleet, so the count is a floor, not a ceiling.

    limit

  • /api/type/{code}/sectors

    What distances this aircraft type covers: the median, the spread, and fixed distance bands so that two types can be compared.

  • /api/type/{code}/live

    A right-now census of this type: how many airframes of this type are seen in the sky at this moment — from the server's own live table, not from the browser map's count, which is bounded by the connection cap.

  • /api/emergency/history

    Archive of the emergency squawks (7500/7600/7700) with the start of the record. The end of an event means the aircraft stopped sending that code — it says nothing about its fate.

  • /api/digest/today

    Today's summary since midnight in Tehran: the flight count, the busiest route, the longest and shortest observed flight, and today's emergency codes. Any section can be empty — meaning we caught nothing today, not that the query failed.

  • /api/data-health

    What the site knows about itself: the share of flights with a track, an altitude and a registration, the collector's availability, and each source's share. “Not measured” and “healthy” are two different answers.

    days

  • /api/iran/today

    Iran's sky from Tehran midnight to this moment. What we saw, not what flew — coverage is not uniform.

  • /api/iran/airports

    Iran's airports with runway, elevation and navaids. The reference columns are kept separate from the observed column.

  • /api/iran/network

    Domestic city pairs in order of flights seen, the two directions counted as one. The sample floor and what it removed are both returned.

  • /api/iran/fleet

    Iranian-registered aircraft we have seen. “Not seen” means we did not hear it; no grounding is inferred from it.

Raw fleet measurements: wind, positioning health, and intent

  • /api/wx/wind

    Wind and temperature measured by the aircraft themselves, cell by cell at one degree — not a forecast. Three separate wind numbers come back: the vector direction (the mean of 350 and 010 degrees is 000, not 180), the scalar speed, and the vector magnitude, which says how steady the wind was. A cell where nobody measured any wind is “unknown”, not “calm”.

    south, north, west, east, band, hours, min_wind, limit

  • /api/gnss/integrity

    Where aircraft have reported losing their satellite position, on a half-degree grid. Every count comes with its own denominator; a cell with zero readings has no rate and is not clear sky, it is our blindness. coverage says how many hours of history this table has at all.

    south, north, west, east, hours, min_readings, limit

  • /api/gnss/integrity/series

    The same numbers, hour by hour instead of cell by cell. An hour with no flight in the box has no row at all — it is a gap, not a zero trough; filling it would draw a collector outage as a sudden improvement in the sky.

    south, north, west, east, hours

  • /api/flight/{flight_id}/intent

    Altitude and the code the pilot selected over the course of one flight, one row per change. A flight that does not exist gets a 404 and an existing flight with no events gets an empty list — so that “we heard nothing” does not become “there is no such flight”.

    limit

  • /api/airport/{iata}/stand

    The nearest mapped stand to a point on the ground. It is an estimate, not an assignment: no source says which stand the aircraft is on. Outside the radius the answer is null, not the nearest stand anywhere. Geometry from OpenStreetMap and under ODbL.

    lat, lon, max_m

  • /api/airport/{iata}/stand/by-ref

    The location of the parking stand from the gate or stand number written in the flight schedule. It is a name match, not a distance guess; no exact match means stand equals null, not the nearest stand. Geometry from OpenStreetMap and under ODbL.

    ref

  • /api/military

    Flights that the receiver network's airframe database has classified as military. This is the upstream source's classification, not Asemanjoo's judgement, and it is not merged with the callsign guess and the aircraft-type prefix in the map filter. It is global and has no geographic filter. An empty column is “unknown”, not zero — an unknown route is normal in this list. [[E-284]]: each row additionally carries block_country and block_military — an independent signal from the 24-bit ICAO address range, separate from the main column and unmerged; block_basis explains it.

    days, limit

  • /api/coverage/grid

    A map of our own observation coverage: each 5×5 degree cell with its number of recorded rows, its number of unique aircraft and a label of “no coverage/sparse/dense”. A cell with no record in this window is “no coverage”, not “no traffic” — an absent receiver and an absent flight cannot be told apart, and this query does not count the two as one. sparsest names the ten sparsest cells.

    hours

API version

  • /api/versions

    The versions this service answers on, which one is current, and each one's deprecation or sunset date (null until it is set). A client that is not updated in step with the service should call under the current version's prefix: under /api/v1/ fields are added, but not removed, and their type does not change. The path without a prefix is the same implementation but carries no such commitment, and is marked stable: false in this same response.

What is deliberately undocumented

These addresses answer too, but they are not a public interface: they are either operational probes, or their answer is tied to your session, or their shape belongs to our own map and changes with it. Do not build anything on them.

  • /api/healthAn operational check; it is for monitoring the service, not for data.
  • /api/health/liveLiveness probe for the container.
  • /api/health/readyReadiness probe for the load balancer.
  • /api/health/deepA deep check of the dependencies; it is expensive and written for the operator.
  • /api/status-historyAn operational check; it is the availability history of the service itself (H-35), not data about flights — behind /status, like /api/health.
  • /api/ops/metricsPrometheus metrics, for monitoring.
  • /api/noticeThe site's own site-wide message; its content is our decision, not data.
  • /api/color-themeTheme and colour settings for the map's user interface; it is for the site's front end, not data.
  • /api/paletteThe interface's default livery, chosen by the operator; like /api/color-theme it is the site's own appearance decision, not data about flights.
  • /api/content/{slug}The text block of a static page (K-29); it is only for embedding in the very page that reads this slug, not independent data.
  • /api/glossaryThe panel's additions and corrections to the static glossary (K-30); it is only for the server-side merge in `/glossary`.
  • /api/faqQuestions added from the panel (K-31); it exists only for the server-side merge into `/faq`.
  • /api/marksIts response depends on the signed-in user's session and means nothing to anyone else.
  • /api/streamThe SSE stream for our own map; the shape of its rows changes with the map and we have promised nothing about its stability.
  • /api/sitemapBuilt for search engines.
  • /api/sitemap/{name}The same, section by section.
  • /api/public/coverage/gridA mirror of the same `/api/coverage/grid` under the versioned, publicly documented subset (G-143) — it is described in “/api-docs”, not here, so that one dataset is not documented twice.
  • /api/public/sourcesA mirror of the same `/api/sources` under the same public subset — described in “/api-docs”.
  • /api/public/openapi.jsonThe OpenAPI document of the public subset itself; it is structure, not data.
  • /api/public/docsA Swagger UI for that same document; it is a page, not data.

A file, instead of a query

If you want a ready-made roll-up and not a live query, The downloads page It gives the same data in CSV form and says what we have deliberately left out. The list of upstream sources is also in The data sources page .