---
name: flyitalyadsb-api-ingestion
description: "How to get FlyItalyADSB API data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load live FlyItalyADSB aircraft into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/flyitalyadsb-api
Provider: https://flyitalyadsb.com/en/data/api/docs/
Checked against the provider's documentation: 2026-11-01

## Access
- Request a free key by email and set FLYITALYADSB_API_KEY.
- Send the key in X-Api-Key and use an application-specific User-Agent.

## Request
```bash
curl -H "X-Api-Key: $FLYITALYADSB_API_KEY" -H 'User-Agent: signal-lab-ingest/1.0' 'https://api.flyitalyadsb.com/v2/lat/41.80/lon/12.25/dist/50'
```

## Format
JSON object with now, count and ac; ac contains readsb aircraft records such as hex, flight, registration, type, latitude, longitude, altitude, speed, track, squawk, seen_pos and position source.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""Live aircraft within 50 km of Rome Fiumicino -> pandas -> Parquet."""
import os
import requests
import pandas as pd

URL = "https://api.flyitalyadsb.com/v2/lat/41.80/lon/12.25/dist/50"
r = requests.get(URL, headers={
    "X-Api-Key": os.environ["FLYITALYADSB_API_KEY"],
    "User-Agent": "signal-lab-ingest/1.0",
}, timeout=30)
r.raise_for_status()
payload = r.json()
df = pd.json_normalize(payload.get("ac", []))
df["snapshot_at"] = pd.to_datetime(payload["now"], unit="s", utc=True)
df.to_parquet("flyitalyadsb_rome_live.parquet", index=False)
print(len(df), "aircraft at", df["snapshot_at"].iloc[0].isoformat() if len(df) else "empty snapshot")
```
Not run: it needs a free API key.

## Limits
- Free plan: 30 requests per minute per key and 300,000 per month.
- Free plan: 500 km maximum radius and 100 requests per minute per IP.
- Free overflight queries cover at most a 10 km radius and six-hour window, and no more than 10 searches per minute per key.

## Quirks
- Aircraft fields may be absent when they are not transmitted, and alt_baro can be the string ground.
- flight is padded to eight characters; trim it before matching callsigns.
- Use seen_pos to assess position age and type to distinguish ADS-B, MLAT and other position sources.
- Historical coverage before 17 August 2026 has reduced tracks and gaps.

## Terms and attribution
- Credit FlyItalyADSB and link to flyitalyadsb.com; adapted data remains CC BY-SA 4.0.
- Do not use the service for safety of life, air traffic control, navigation, unlawful activity or following or harassing people.
- Real-time API or feed redistribution for other products requires a written agreement.
- Terms page: https://flyitalyadsb.com/en/terms/

## Sources
- https://flyitalyadsb.com/en/data/api/docs/endpoints/: "Every FlyItalyADSB REST API v2 endpoint: aircraft by hex, callsign or registration, within a radius, by squawk or type, military, PIA, LADD, history, profile, overflights; differences from ADSBx v2."
- https://flyitalyadsb.com/en/data/api/docs/limits-and-errors/: "The Free plan also has a cap of 100 requests per minute per IP."
- https://flyitalyadsb.com/en/data/api/docs/history/: "There is no history from 28/06/2024 to 16/08/2026."
- https://flyitalyadsb.com/en/terms/: "The data is published under the Creative Commons Attribution-ShareAlike 4.0 licence (CC BY-SA 4.0)"

## Help improve this skill
Missing a source, or see something to improve? Call the MCP tool suggest_source or feedback (or POST /api/suggest or /api/feedback). Reviewed ideas: https://signal-lab-jet.vercel.app/agent-suggestions

Information for educational purposes only. Free tiers, limits and licenses belong to the providers and may change; check the provider's own terms before using the data.
