{"openapi":"3.1.0","info":{"title":"Acimut Portal API","description":"Acceso programático a pasadas, productos, detecciones IA y predicciones de la estación de Berberana (Burgos).\n\nCero auth para read endpoints públicos. Rate limit 60 req/min por IP sin API key, 600 con key.","version":"0.1.0"},"paths":{"/v1/passes":{"get":{"tags":["passes"],"summary":"Lista paginada de pasadas con filtros","operationId":"list_passes_v1_passes_get","parameters":[{"name":"sat","in":"query","required":false,"schema":{"anyOf":[{"enum":["meteor-m2-4","meteor-m2-3","elektro-l3"],"type":"string"},{"type":"null"}],"description":"Filtrar por slug de satélite","title":"Sat"},"description":"Filtrar por slug de satélite"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO 8601, inclusive","title":"From"},"description":"ISO 8601, inclusive"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO 8601, exclusive","title":"To"},"description":"ISO 8601, exclusive"},{"name":"min_elev","in":"query","required":false,"schema":{"type":"number","maximum":90.0,"minimum":0.0,"description":"Elev máx mínima","default":0.0,"title":"Min Elev"},"description":"Elev máx mínima"},{"name":"phenom","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tipos comma-separated: frente,ciclon,tormenta","title":"Phenom"},"description":"Tipos comma-separated: frente,ciclon,tormenta"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PassesPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/passes/latest":{"get":{"tags":["passes"],"summary":"Última pasada procesada (atajo sin paginación)","operationId":"latest_pass_v1_passes_latest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PassDetail"}}}},"404":{"description":"No hay pasadas aún","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/passes/{pass_id}":{"get":{"tags":["passes"],"summary":"Detalle de una pasada con productos + análisis IA","operationId":"pass_detail_v1_passes__pass_id__get","parameters":[{"name":"pass_id","in":"path","required":true,"schema":{"type":"string","title":"Pass Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PassDetail"}}}},"404":{"description":"Pasada no encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/detections":{"get":{"tags":["detections"],"summary":"Detecciones IA filtradas por tipo, fecha o región","operationId":"list_detections_v1_detections_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["frente","ciclon","tormenta"],"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"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"}}}}}}},"/v1/next-passes":{"get":{"tags":["station"],"summary":"Próximas pasadas previstas sobre Berberana (TLE + pyorbital)","operationId":"next_passes_v1_next_passes_get","parameters":[{"name":"sat","in":"query","required":false,"schema":{"enum":["meteor-m2-4","meteor-m2-3","elektro-l3"],"type":"string","description":"Slug del satélite","default":"meteor-m2-4","title":"Sat"},"description":"Slug del satélite"},{"name":"horizon_hours","in":"query","required":false,"schema":{"type":"integer","maximum":72,"minimum":1,"default":24,"title":"Horizon Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NextPassesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/station/status":{"get":{"tags":["station"],"summary":"Salud de la estación, uptime, métricas RFI / SNR","operationId":"station_status_v1_station_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StationStatus"}}}}}}},"/v1/webhooks":{"post":{"tags":["webhooks"],"summary":"Create Webhook","operationId":"create_webhook_v1_webhooks_post","responses":{"501":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/webhooks/{webhook_id}":{"delete":{"tags":["webhooks"],"summary":"Delete Webhook","operationId":"delete_webhook_v1_webhooks__webhook_id__delete","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"501":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Detection":{"properties":{"type":{"type":"string","enum":["frente","ciclon","tormenta"],"title":"Type"},"region":{"type":"string","title":"Region"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"0-1, salida del modelo IA"},"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"},"lng":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lng"}},"type":"object","required":["type","region","confidence","lat","lng"],"title":"Detection","description":"Detección de fenómeno meteorológico en una pasada.","example":{"confidence":0.87,"lat":43.5,"lng":-8.5,"region":"Norte Galicia","type":"frente"}},"Download":{"properties":{"label":{"type":"string","title":"Label"},"format":{"type":"string","title":"Format"},"sizeMb":{"type":"string","title":"Sizemb"},"href":{"type":"string","title":"Href"},"highlight":{"type":"boolean","title":"Highlight","default":false}},"type":"object","required":["label","format","sizeMb","href"],"title":"Download","description":"Producto descargable de la pasada (PNG hi-res, GeoTIFF, IQ raw, JSON)."},"Enhancement":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"image":{"type":"string","title":"Image"},"description":{"type":"string","title":"Description"},"bands":{"type":"string","title":"Bands"}},"type":"object","required":["id","label","image","description","bands"],"title":"Enhancement","description":"Una composición de imagen (estándar, color falso, IR, térmico, NDVI)."},"ErrorResponse":{"properties":{"error":{"type":"string","title":"Error"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["error"],"title":"ErrorResponse","description":"Respuesta de error tipada."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"NextPass":{"properties":{"satellite":{"type":"string","enum":["meteor-m2-4","meteor-m2-3","elektro-l3"],"title":"Satellite"},"satelliteLabel":{"type":"string","title":"Satellitelabel"},"aos":{"type":"string","format":"date-time","title":"Aos"},"los":{"type":"string","format":"date-time","title":"Los"},"maxElTime":{"type":"string","format":"date-time","title":"Maxeltime","description":"TCA — Time of Closest Approach"},"maxElevationDeg":{"type":"number","title":"Maxelevationdeg"},"duration_s":{"type":"integer","title":"Duration S"},"certainty":{"type":"string","enum":["confirmed","estimated"],"title":"Certainty","default":"estimated"}},"type":"object","required":["satellite","satelliteLabel","aos","los","maxElTime","maxElevationDeg","duration_s"],"title":"NextPass","description":"Predicción de pasada futura — calculado con TLE + pyorbital."},"NextPassesResponse":{"properties":{"station":{"type":"string","title":"Station","default":"berberana"},"lat":{"type":"number","title":"Lat","default":42.91712},"lng":{"type":"number","title":"Lng","default":-3.060084},"horizonHours":{"type":"integer","title":"Horizonhours"},"passes":{"items":{"$ref":"#/components/schemas/NextPass"},"type":"array","title":"Passes"}},"type":"object","required":["horizonHours","passes"],"title":"NextPassesResponse","description":"Próximas N pasadas previstas sobre Berberana (Burgos)."},"PassDetail":{"properties":{"id":{"type":"string","title":"Id"},"satellite":{"type":"string","enum":["meteor-m2-4","meteor-m2-3","elektro-l3"],"title":"Satellite"},"satelliteLabel":{"type":"string","title":"Satellitelabel"},"aos":{"type":"string","format":"date-time","title":"Aos"},"los":{"type":"string","format":"date-time","title":"Los"},"duration_s":{"type":"integer","title":"Duration S"},"maxEl":{"type":"number","title":"Maxel","description":"Elevación máxima en grados"},"azDeg":{"type":"integer","title":"Azdeg"},"snr_db":{"type":"number","title":"Snr Db"},"thumbnail":{"type":"string","title":"Thumbnail"},"detections":{"items":{"$ref":"#/components/schemas/Detection"},"type":"array","title":"Detections"},"norad":{"type":"integer","title":"Norad"},"bands":{"type":"string","title":"Bands"},"composition":{"type":"string","title":"Composition"},"framesCcsds":{"type":"integer","title":"Framesccsds"},"packetLoss":{"type":"number","title":"Packetloss"},"enhancements":{"items":{"$ref":"#/components/schemas/Enhancement"},"type":"array","title":"Enhancements"},"downloads":{"items":{"$ref":"#/components/schemas/Download"},"type":"array","title":"Downloads"}},"type":"object","required":["id","satellite","satelliteLabel","aos","los","duration_s","maxEl","azDeg","snr_db","thumbnail","detections","norad","bands","composition","framesCcsds","packetLoss","enhancements","downloads"],"title":"PassDetail","description":"Detalle completo — formato de /v1/passes/{id}."},"PassSummary":{"properties":{"id":{"type":"string","title":"Id"},"satellite":{"type":"string","enum":["meteor-m2-4","meteor-m2-3","elektro-l3"],"title":"Satellite"},"satelliteLabel":{"type":"string","title":"Satellitelabel"},"aos":{"type":"string","format":"date-time","title":"Aos"},"los":{"type":"string","format":"date-time","title":"Los"},"duration_s":{"type":"integer","title":"Duration S"},"maxEl":{"type":"number","title":"Maxel","description":"Elevación máxima en grados"},"azDeg":{"type":"integer","title":"Azdeg"},"snr_db":{"type":"number","title":"Snr Db"},"thumbnail":{"type":"string","title":"Thumbnail"},"detections":{"items":{"$ref":"#/components/schemas/Detection"},"type":"array","title":"Detections"}},"type":"object","required":["id","satellite","satelliteLabel","aos","los","duration_s","maxEl","azDeg","snr_db","thumbnail","detections"],"title":"PassSummary","description":"Resumen de una pasada — formato del listado /v1/passes."},"PassesPage":{"properties":{"page":{"type":"integer","minimum":1.0,"title":"Page"},"per_page":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Per Page"},"total":{"type":"integer","minimum":0.0,"title":"Total"},"passes":{"items":{"$ref":"#/components/schemas/PassSummary"},"type":"array","title":"Passes"}},"type":"object","required":["page","per_page","total","passes"],"title":"PassesPage","description":"Respuesta paginada de /v1/passes."},"StationStatus":{"properties":{"state":{"type":"string","enum":["online","degraded","offline"],"title":"State"},"uptime_s":{"type":"integer","title":"Uptime S"},"lastPassAos":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastpassaos"},"nextPassAos":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Nextpassaos"},"lastPassSnrDb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lastpasssnrdb"},"totalPasses":{"type":"integer","minimum":0.0,"title":"Totalpasses"},"totalDetections":{"type":"integer","minimum":0.0,"title":"Totaldetections"},"diskUsedGb":{"type":"number","minimum":0.0,"title":"Diskusedgb"},"diskTotalGb":{"type":"number","minimum":0.0,"title":"Disktotalgb"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["state","uptime_s","totalPasses","totalDetections","diskUsedGb","diskTotalGb"],"title":"StationStatus","description":"Salud de la estación de Berberana (Burgos)."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}