{"openapi":"3.1.0","info":{"title":"APRS Live API","description":"\nAPI publique **APRS Live** — données APRS en temps réel pour la Suisse et l'Europe.\n\nLes positions proviennent du réseau **APRS-IS** (radioamateur). Toutes les routes de\n**lecture** sont publiques et utilisables librement (CORS ouvert). Les routes d'**écriture**\n(envoi de message, alertes, favoris) nécessitent une authentification.\n\n### Démarrage rapide\n```bash\n# Stations dans une zone (bbox = ouest,sud,est,nord), vues il y a moins de 60 min\ncurl \"https://aprs.hb9v.ch/api/stations?bbox=6,46,8,47.5&since=60\"\n\n# Détail d'une station (position, météo si dispo)\ncurl \"https://aprs.hb9v.ch/api/station/HB9HPG-9\"\n\n# Trace des dernières 24 h\ncurl \"https://aprs.hb9v.ch/api/station/HB9HPG-9/track?hours=24\"\n```\n\n### Format\n`/api/stations` renvoie du **GeoJSON** (FeatureCollection). Les horodatages sont en\n**secondes Unix (UTC)**. Vitesses en km/h, altitudes en mètres, températures en °C.\n\n### Bon usage\nMerci de mettre en cache et de ne pas marteler l'API. Pour du temps réel, préférez le\nWebSocket `wss://aprs.hb9v.ch/api/ws`. Données sous licence ODbL via OpenStreetMap/APRS-IS.\n","contact":{"name":"APRS Live","url":"https://aprs.hb9v.ch/"},"license":{"name":"Données : OpenStreetMap (ODbL) & APRS-IS"},"version":"1.0.0"},"paths":{"/api/info":{"get":{"tags":["Général"],"summary":"Informations sur l'API","operationId":"api_root_api_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stations":{"get":{"tags":["Stations"],"summary":"Stations dans une zone (GeoJSON)","operationId":"stations_api_stations_get","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"w,s,e,n","title":"Bbox"},"description":"w,s,e,n"},{"name":"since","in":"query","required":false,"schema":{"type":"integer","description":"vues il y a moins de N minutes","default":60,"title":"Since"},"description":"vues il y a moins de N minutes"},{"name":"types","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Types"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":8000,"default":3000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/station/{callsign}":{"get":{"tags":["Stations"],"summary":"Détail d'une station","operationId":"station_api_station__callsign__get","parameters":[{"name":"callsign","in":"path","required":true,"schema":{"type":"string","title":"Callsign"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/station/{callsign}/track":{"get":{"tags":["Stations"],"summary":"Trace (historique de positions)","operationId":"track_api_station__callsign__track_get","parameters":[{"name":"callsign","in":"path","required":true,"schema":{"type":"string","title":"Callsign"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"default":24,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/station/{callsign}/weather":{"get":{"tags":["Données"],"summary":"Série météo","operationId":"weather_api_station__callsign__weather_get","parameters":[{"name":"callsign","in":"path","required":true,"schema":{"type":"string","title":"Callsign"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"default":48,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/station/{callsign}/telemetry":{"get":{"tags":["Données"],"summary":"Série de télémétrie","operationId":"telemetry_api_station__callsign__telemetry_get","parameters":[{"name":"callsign","in":"path","required":true,"schema":{"type":"string","title":"Callsign"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"default":24,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/search":{"get":{"tags":["Général"],"summary":"Recherche d'indicatif","operationId":"search_api_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats":{"get":{"tags":["Général"],"summary":"Statistiques globales","operationId":"stats_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/replay":{"get":{"tags":["Rejeu"],"summary":"Positions d'une zone sur une fenêtre de temps","operationId":"replay_api_replay_get","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"w,s,e,n","title":"Bbox"},"description":"w,s,e,n"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":72,"default":6,"title":"Hours"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":80000,"default":25000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages":{"get":{"tags":["Messages"],"summary":"Messages (récents ou par indicatif)","operationId":"get_messages_api_messages_get","parameters":[{"name":"call","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Call"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Messages"],"summary":"Envoyer un message APRS (jeton requis)","operationId":"send_message_api_messages_post","parameters":[{"name":"x-aprs-token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Aprs-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessage"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts":{"get":{"tags":["Alertes"],"summary":"Lister les règles d'un client","operationId":"list_alerts_api_alerts_get","parameters":[{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"aprs_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aprs Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Alertes"],"summary":"Créer une règle d'alerte","operationId":"create_alert_api_alerts_post","parameters":[{"name":"aprs_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aprs Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/{alert_id}":{"delete":{"tags":["Alertes"],"summary":"Supprimer une règle","operationId":"delete_alert_api_alerts__alert_id__delete","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}},{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"aprs_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aprs Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/events":{"get":{"tags":["Alertes"],"summary":"Historique des alertes déclenchées","operationId":"alert_events_api_alerts_events_get","parameters":[{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"aprs_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aprs Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/push/vapid":{"get":{"tags":["Alertes"],"summary":"Clé publique VAPID (Web Push)","operationId":"push_vapid_api_push_vapid_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/push/subscribe":{"post":{"tags":["Alertes"],"summary":"Enregistrer un abonnement Web Push","operationId":"push_subscribe_api_push_subscribe_post","parameters":[{"name":"aprs_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aprs Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushSub"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/push/unsubscribe":{"post":{"tags":["Alertes"],"summary":"Supprimer un abonnement Web Push","operationId":"push_unsubscribe_api_push_unsubscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushUnsub"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/register":{"post":{"tags":["Compte"],"summary":"Créer un compte","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credentials"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["Compte"],"summary":"Se connecter","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credentials"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"tags":["Compte"],"summary":"Se déconnecter","operationId":"logout_api_auth_logout_post","parameters":[{"name":"aprs_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aprs Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["Compte"],"summary":"Utilisateur courant","operationId":"me_api_auth_me_get","parameters":[{"name":"aprs_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aprs Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/favorites":{"get":{"tags":["Compte"],"summary":"Lister mes favoris","operationId":"list_favorites_api_favorites_get","parameters":[{"name":"aprs_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aprs Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Compte"],"summary":"Ajouter un favori","operationId":"add_favorite_api_favorites_post","parameters":[{"name":"aprs_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aprs Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/favorites/{callsign}":{"delete":{"tags":["Compte"],"summary":"Retirer un favori","operationId":"del_favorite_api_favorites__callsign__delete","parameters":[{"name":"callsign","in":"path","required":true,"schema":{"type":"string","title":"Callsign"}},{"name":"aprs_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aprs Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health":{"get":{"tags":["Général"],"summary":"État du service","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AlertIn":{"properties":{"client_id":{"type":"string","title":"Client Id"},"type":{"type":"string","title":"Type"},"callsign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Callsign"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"radius_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Radius Km"},"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction","default":"both"},"speed_kmh":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speed Kmh"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"cooldown_s":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cooldown S","default":300}},"type":"object","required":["client_id","type"],"title":"AlertIn"},"Credentials":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","password"],"title":"Credentials"},"FavIn":{"properties":{"callsign":{"type":"string","title":"Callsign"}},"type":"object","required":["callsign"],"title":"FavIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"PushSub":{"properties":{"client_id":{"type":"string","title":"Client Id"},"subscription":{"additionalProperties":true,"type":"object","title":"Subscription"}},"type":"object","required":["client_id","subscription"],"title":"PushSub"},"PushUnsub":{"properties":{"endpoint":{"type":"string","title":"Endpoint"}},"type":"object","required":["endpoint"],"title":"PushUnsub"},"SendMessage":{"properties":{"to":{"type":"string","title":"To"},"text":{"type":"string","title":"Text"}},"type":"object","required":["to","text"],"title":"SendMessage"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"tags":[{"name":"Stations","description":"Positions courantes, détail, traces."},{"name":"Données","description":"Météo, télémétrie."},{"name":"Messages","description":"Messages APRS (lecture publique, envoi protégé)."},{"name":"Alertes","description":"Règles d'alerte par client (entendu, zone, vitesse)."},{"name":"Rejeu","description":"Historique des positions pour l'animation temporelle."},{"name":"Compte","description":"Comptes utilisateurs et favoris."},{"name":"Général","description":"Recherche, statistiques, état."}]}