API-06 · REST Reference
Référence API
Tous les endpoints HTTP exposés par la plateforme NOVA. Format JSON pour les données structurées, iCal (.ics) pour les calendriers, JSON N.I.N.A. pour l'export Target Scheduler. Authentification bearer pour les endpoints de contrôle.
Conventions
- Base URL :
https://nova-obsrouen.pages.dev - Format : JSON (UTF-8) sauf indication contraire
- Timestamps : ISO 8601 UTC (
2026-06-21T22:34:15.123Z) - Coordonnées : J2000, RA en heures décimales (0-24), Dec en degrés (-90 à +90)
- Magnitudes : Bande V (visuelle) sauf précision
- Authentification : Bearer token
Authorization: Bearer nva_xxx(endpoints/api/control/*) - Erreurs : codes HTTP standards (401 Unauthorized, 400 Bad Request, 429 Rate Limit, 500 Internal)
- CORS : ouvert pour endpoints publics, fermé pour endpoints contrôle
- Rate limit : 60 req/min pour endpoints publics, 120 req/min pour endpoints agent
Endpoints publics
GET /api/now.json
Statut du ciel à l'instant T pour l'observatoire (Rouen par défaut). Pas d'authentification.
GET /api/now.json HTTP/1.1
Host: nova-obsrouen.pages.dev
200 OK
{
"timestamp": "2026-06-21T22:34:15Z",
"observatory": { "lat": 49.44649, "lon": 1.09760, "altitude_m": 65 },
"sun": { "alt_deg": -23.4, "az_deg": 358.2 },
"moon": {
"alt_deg": 41.2, "az_deg": 145.3,
"illumination": 0.42, "age_days": 11.3,
"phase": "waxing gibbous"
},
"astronomical_night": {
"start": "2026-06-21T23:42:00Z",
"end": "2026-06-22T01:18:00Z",
"duration_min": 96
},
"weather": { "cloud_pct": 12, "humidity_pct": 78, "wind_kmh": 8.5 }
} GET /api/tonight.json
Liste des cibles imageables cette nuit avec score composite, triées par score décroissant.
GET /api/tonight.json HTTP/1.1
200 OK
{
"night_start": "2026-06-21T23:42:00Z",
"night_end": "2026-06-22T01:18:00Z",
"targets": [
{
"id": "M13", "name": "Hercules Cluster",
"score": 88,
"altitude_max_deg": 75.2,
"transit_time": "2026-06-22T00:18:00Z",
"window_min": 96,
"moon_separation_deg": 102
},
{
"id": "M27", "name": "Dumbbell Nebula",
"score": 84,
"altitude_max_deg": 71.8,
"transit_time": "2026-06-22T01:42:00Z",
"window_min": 88,
"moon_separation_deg": 87
}
]
} GET /api/nina.json
Export du catalogue complet au format N.I.N.A. Target Scheduler. Importable directement dans le module Sequence de N.I.N.A.
GET /api/nina.json HTTP/1.1
200 OK
Cache-Control: public, max-age=3600
{
"GeneratedAt": "2026-06-21T22:34:15Z",
"Generator": "nova-obsrouen.pages.dev",
"Format": "NINA Target Scheduler · simplified preview",
"Observatory": {
"Name": "Observatoire de Rouen",
"Latitude": 49.44649,
"Longitude": 1.09760,
"AltitudeM": 65
},
"Equipment": {
"Mount": "Takahashi EM-400 Temma 2M",
"Telescope": "Celestron C11",
"Camera": "Atik 460EX",
"Guider": "ZWO ASI120MC"
},
"TargetCount": 349,
"Targets": [
{
"Id": "M1",
"Name": "M1 — Crab Nebula",
"Coordinates": {
"RAHours": 5, "RAMinutes": 34, "RASeconds": 31.97,
"DecDegrees": 22, "DecMinutes": 0, "DecSeconds": 52.1,
"Epoch": "J2000"
},
"Type": "SNR",
"Catalog": "Messier",
"Constellation": "Taurus",
"Magnitude": 8.4,
"SizeArcmin": 6
}
]
} GET /api/target/[id].ics
Calendrier iCal pour une cible donnée. L'événement représente la fenêtre d'observation utile du soir. Importable dans Apple Calendar, Google Calendar, Thunderbird, Proton Calendar.
GET /api/target/M31.ics HTTP/1.1 200 OK Content-Type: text/calendar; charset=utf-8 BEGIN:VCALENDAR VERSION:2.0 PRODID:-//nova-obsrouen//target M31//FR CALSCALE:GREGORIAN BEGIN:VEVENT UID:M31-2026-06-21@nova-obsrouen.pages.dev DTSTAMP:20260621T223415Z DTSTART:20260622T013000Z DTEND:20260622T040000Z SUMMARY:M31 — Andromeda Galaxy · ALT 65° DESCRIPTION:Score 92/100 · Pose recommandée 4h LRGB LOCATION:Observatoire de Rouen END:VEVENT END:VCALENDAR
GET /api/campaigns/[id].ics
Calendrier multi-nuits pour une campagne pré-curatée. Toutes les nuits sur 30+ jours avec un score > 70 sont incluses, avec répartition LRGB / narrowband selon la phase lunaire.
GET /api/campaigns/m31-deep.ics HTTP/1.1 200 OK Content-Type: text/calendar; charset=utf-8 BEGIN:VCALENDAR VERSION:2.0 PRODID:-//nova-obsrouen//campaign m31-deep//FR CALSCALE:GREGORIAN BEGIN:VEVENT UID:m31-deep-001@nova-obsrouen.pages.dev SUMMARY:M31 deep · LRGB nuit 1/12 DTSTART:20260902T220000Z DTEND:20260903T040000Z END:VEVENT ...12 événements... END:VCALENDAR
Endpoints de contrôle (agent)
POST /api/control/heartbeat
Heartbeat de l'agent — appelé toutes les 30 s par le binaire nova-agent embarqué.
Bearer token obligatoire (préfixe nva_). Voir /docs/agent pour le format du payload.
POST /api/control/heartbeat HTTP/1.1
Authorization: Bearer nva_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
{
"agent_version": "0.1.0",
"timestamp": "2026-06-21T22:34:15Z",
"mode": "read-only",
"hardware": { ... },
"weather": { ... }
}
200 OK
{
"ok": true,
"serverTime": "2026-06-21T22:34:15.456Z",
"next_heartbeat_s": 30
} Codes d'erreur :
401 Unauthorized— token manquant ou ne commence pas parnva_400 Bad Request— body non JSON ou structure invalide
GET /api/control/queue
Récupération des commandes en attente. Appelé par l'agent après chaque heartbeat. Retourne un tableau JSON de commandes à exécuter.
GET /api/control/queue HTTP/1.1 Authorization: Bearer nva_xxxxxxxxxxxxxxxxxxxxxxxx 200 OK [] # vide pour l'instant (v0.1 stub, sera D1 en v0.13)
En v0.13, format prévu :
[
{
"id": "cmd-2026-06-21-001",
"issued_at": "2026-06-21T22:33:00Z",
"cmd": "goto",
"params": { "ra_hours": 0.7128, "dec_deg": 41.269 },
"deadline": "2026-06-21T22:40:00Z",
"ack_required": true
}
] POST /api/control/result
Soumission du résultat d'une commande exécutée (ou rejetée). Appelé par l'agent après exécution.
POST /api/control/result HTTP/1.1
Authorization: Bearer nva_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
{
"cmd_id": "cmd-2026-06-21-001",
"status": "ok",
"executed_at": "2026-06-21T22:35:12.123Z",
"duration_ms": 8421,
"result": { ... },
"logs": [ ... ]
}
200 OK
{ "ok": true } Statuts possibles :
"ok"— exécutée avec succès"rejected"— refusée par fail-safe (raison danslogs)"timeout"— durée dépassée"hardware_error"— erreur ASCOM/INDI"aborted"— kill switch activé pendant exécution
Endpoints à venir (roadmap)
| Endpoint | Version | Description |
|---|---|---|
POST /api/control/command | v0.13 | Soumission d'une commande dans la queue |
GET /api/control/sessions | v0.13 | Historique des sessions terminées |
GET /api/control/sessions/[id]/fits | v0.13 | Téléchargement des FITS d'une session (R2) |
POST /api/weather/forecast | v0.4 | Récupère prévision 5 jours pour un site |
GET /api/target/[id].json | v0.4 | Fiche cible en JSON |
POST /api/user/targets | v0.6 | Ajouter une cible custom (coordonnées RA/Dec arbitraires) |
POST /api/user/preferences | v0.7 | Filtres, alertes, sites par défaut |
GET /api/transients/gaia | v0.8 | Proxy Gaia Photometric Science Alerts |
GET /api/photometry/[id] | v0.9 | Courbe de lumière calculée sur une cible |
Codes d'erreur HTTP
| Code | Signification | Action |
|---|---|---|
200 | OK | Réponse normale |
201 | Created | Ressource créée (POST réussi) |
304 | Not Modified | Cache valide (If-None-Match) |
400 | Bad Request | Vérifier format JSON / params requis |
401 | Unauthorized | Token manquant ou invalide |
404 | Not Found | Cible/campagne inconnue |
429 | Too Many Requests | Backoff exponentiel |
500 | Internal Server Error | Réessayer ou signaler |
503 | Service Unavailable | Maintenance ou surcharge |
Exemples curl
# Statut du ciel maintenant
curl https://nova-obsrouen.pages.dev/api/now.json
# Cibles ce soir
curl https://nova-obsrouen.pages.dev/api/tonight.json | jq '.targets[0:5]'
# Export N.I.N.A.
curl https://nova-obsrouen.pages.dev/api/nina.json -o nina-targets.json
# iCal cible M31
curl https://nova-obsrouen.pages.dev/api/target/M31.ics -o m31.ics
# iCal campagne deep M31
curl https://nova-obsrouen.pages.dev/api/campaigns/m31-deep.ics -o m31-campaign.ics
# Heartbeat agent (nécessite token)
curl -X POST https://nova-obsrouen.pages.dev/api/control/heartbeat \
-H "Authorization: Bearer nva_test_token" \
-H "Content-Type: application/json" \
-d '{"agent_version":"0.1.0","mode":"read-only"}'
# Queue de commandes
curl https://nova-obsrouen.pages.dev/api/control/queue \
-H "Authorization: Bearer nva_test_token" Versionnement et stabilité
L'API NOVA suit semver sur la version de la plateforme — la version actuelle est v0.1, ce qui signifie :
- Les endpoints existants restent stables en signature mais peuvent ajouter des champs optionnels.
- Pas de versionnement dans l'URL (
/api/v1/) tant que la v1 n'est pas atteinte. - Les breaking changes sont annoncés 30 jours à l'avance.
- Les endpoints en preview sont marqués dans cette doc (et peuvent disparaître).
En v1.0, le versionnement sera explicite : /api/v1/now.json, /api/v2/now.json, etc.
Les anciennes versions seront maintenues 12 mois.