NightScribe — Fuentes de datos
Todas las fuentes externas usadas por NightScribe, un módulo por fuente en core/sources/. Verificadas en funcionamiento el 21-08-2026. Todo acceso a red pasa por la caché HTTP de SQLite (core/db.py) con el TTL indicado.
Fuentes de planificación (alimentan «Esta noche»)
NEOfixer — neofixer.py — fuente primaria de NEOs
GET https://neofixerapi.arizona.edu/targets/?site=<código MPC>&num=N— pública, JSON-RPC. Lista de objetivos específica del sitio con score, prioridad, coste (minutos), vmag, movimiento, incertidumbre, flag NEOCP, flags impacto/radar/NHATS/Yarkovsky.GET .../ephem/?site=<código>&object=<packed>— pública. Efeméride por sitio (alt, az, mag, movimiento) precalculada por NEOfixer (find_orb de Bill Gray, con perturbaciones). Es la posición precisa del goto fresco y del track & stack de un objeto NEOCP/PCCP sin confirmar que Horizons no conoce, por delante de la propagación local de dos cuerpos. Ventana opcionaltime-start/time-stop(la noche del visit).GET .../orbit/?object=<packed>— pública. Elementos orbitales preliminares de objetos sin confirmar (NEOCP), calculados con Find_Orb desde la astrometría del MPC: elementos keplerianos completos (a, e, q, Q, i, asc_node, arg_per, M, Tp, epoch) con sigma por elemento, MOIDs por planeta,p_NEO, nº de residuos y arco observado.parse_neofixer_orbit()los normaliza a la forma SBDB (ADR-023); alimentan el dibujo de órbita, la tabla de parámetros (con sigmas) y la efeméride local decore/ephemeris.py.GET .../report/?key=<api key>&site=<código>&object=<id>&status=<s>— requiere la clave API del usuario (Configuración). Reportawill_observe/observed/... para coordinación comunitaria. Opcional.TTL: 12 h (
targets); 1.5 h (orbityephem— la órbita preliminar y la tabla derivada de ella cambian rápido). Ojo:objectdebe ser designación empaquetada (packed).
Rochester Astronomy (David Bishop) — rochester.py — supernovas recientes
https://www.rochesterastronomy.org/snimages/sndate.html— tabla HTML pública, parseada con lxml (mismo layout que el históricosaas/supernova.py).TTL: 6 h. Es la web de una sola persona: sé buen ciudadano (¡cachea!).
COBS — cobs.py — cometas activos
https://cobs.si/api/comet_list.api— JSON público: magnitud actual observada, fecha/magnitud de perihelio, flag de actividad, tipo (C/P/N), nombre MPC.TTL: 6 h.
PCCP del MPC — pccp.py — posibles cometas
https://www.minorplanetcenter.net/iau/NEO/pccp_tabular.html— tabla HTML pública: designación temporal, score de cometa (0–100), RA/Dec, V, arco, notas. No existe endpoint JSON; se parsea con lxml.TTL: 6 h.
ESA NEOCC — esa_neo.py — próximas aproximaciones (alertas)
https://neo.ssa.esa.int/PSDB-portlet/download?file=esa_upcoming_close_app— texto público de ancho fijo: objeto, fecha, distancia (km/AU/LD), diámetro, H, magnitud máxima, velocidad relativa.TTL: 6 h. (El endpoint de lista de prioridad ESA responde 200 con cuerpo vacío a fecha 2026-08; se mantiene con degradación elegante.)
ExoClock (ESA Ariel) — exoclock.py — tránsitos de exoplanetas
https://www.exoclock.space/database/planets_json— JSON público, ~776 planetas: efeméride de tránsito (ephem_mid_time,ephem_period), profundidad (mmag), duración, prioridad,min_telescope_inches, deriva O-C, magnitud estelar y coordenadas.TTL: 24 h. Los instantes de tránsito se calculan en local (t0 + n·P) — ver
core/transits.py.
Catálogo HADS (P. Wils / VVS) — hads_sheet.py — δ Scuti de alta amplitud
https://docs.google.com/spreadsheets/d/1oGA2HaEHE8L6eX19ZoHqQQTu0LYV56HX3Srg7oCtOHo/export?format=xlsx— libro público de Google Sheets (una pestaña por año, actualizado a diario por el coordinador del programa): nombre (con aliases), RA/Dec, magnitudes Max/Min, periodo (h), prioridades por color de fuente (nombre rojo/naranja = cambios de periodo encontrados/posibles — ¡prioridad!; coordenadas azules = aún no observada; nombre morado = multiperiódica) y las celdas mensuales de cobertura por observador.TTL: 12 h, caché de dos niveles (XLSX crudo + JSON parseado). Parseo con
zipfile+xml.etreede la stdlib (sin openpyxl en runtime). El snapshot empaquetadoassets/HADS-stars.csv(168 estrellas, aliases ricos) es el respaldo offline; el merge vive encore/hads.py(ADR-034).
AAVSO VSX — vsx.py — estrellas variables (Track V, ADR-035)
GET https://vsx.aavso.org/index.php?view=api.object&ident=<nombre>&format=json— API pública del Variable Star Index. Ojo: el dominiowww.aavso.orgestá tras Cloudflare y bloquea clientes simples; el subdominiovsx.aavso.orgresponde 200 limpio (verificado 2026-09-11). Extracción: nombre + AUID, RA/Dec, tipo variable, periodo (d), época (JD→MJD en el parser), máx/min con banda, clasificación espectral, constelación.TTL: 7 d. Degradación:
lookup()devuelveNonesi no existe o falla → ficha por SIMBAD (coordenadas) → alta manual; Tonight es local y nunca rompe.
ALeRCE ZTF API v1 — surveys.py — contexto de curvas (V-f) + vigilias (SC4a)
GET https://api.alerce.online/ztf/v1/conesearch?_ra=..&_dec=..&_radius=..yGET .../lightcurve?oid=<oid>— dos llamadas cacheadas por objeto (oid → curva). Puntos grises de referenciasource="survey:ztf"bajo los propios, nunca mezclados (bandas ZTF g/r/i mapeadas a filtros). Verificado 2026-09-11.TTL: 30 d para el contexto de curvas (la fotometría de survey no cambia). Las vigilias (ADR-037) usan las mismas llamadas con claves
vigils:*y TTL 12 h: la guardia necesita el último punto, no el contexto. Fallo →[]/None; el botón de surveys avisa y nada más se rompe.
AAVSO canal editorial — aavso.py — alertas del foro + campañas (SC4b)
GET https://forums.aavso.org/c/observing/alerts/50.json— el foro es Discourse y sirve JSON nativo por categoría (spike validado 2026-09-16: títulos tipo «SU Tau is dimming», «T CRB Johnson V scores below 8.5»). Se listan los temas con actividad en los últimos 60 d (el pinned «About» se descarta).GET https://apps.aavso.org/v2/campaigns/— lista HTML de campañas de observación; se parsean las filas<tr>(id+enlace | título | solicitante | inicio | fin | tipos) con la stdlib y se filtran las activas (inicio ≤ hoy ≤ fin).El nombre de la estrella se extrae del título con patrones tolerantes (
Nova Sgr 2026 No. 3,NSV 11664, designación + genitivo tipoSU Tau/T CRB) y se valida vía VSX antes de mostrar nada: lo que no resuelve no se muestra. TTL: 12 h. Fallo →[].Fotometría de la comunidad (vigilias brillantes, SC4a rev. 2):
GET https://apps.aavso.org/v2/api/observations/photometry/?target=<estrella>&start_date=..&end_date=..— endpoint oficial (docs.aavso.org), exige el token de API del usuario (Authorization: Token …, 401 sin él; se configura en Ajustes junto al código de observador). Es el backend de las vigilias con basal < 11,5 mag: ZTF satura ahí (verificado 2026-09-16: T CrB/R CrB no tienen objeto ALeRCE). Campos usados:jd_dbl,magnitude,band(respuesta DRF-paginada o lista; parseo tolerante). TTL: 12 h. Sin token →None, silencio amable.
Fuentes de datos de objeto (alimentan «Explora» y «Post»)
JPL SBDB — sbdb.py — identidad y datos físicos de cuerpos menores
GET https://ssd-api.jpl.nasa.gov/sbdb.api?sstr=<nombre>&phys-par=1— JSON público: nombre completo,kind(asteroide/cometa), clase orbital, elementos (a, e, i, q, Q, per...), MOID y parámetros físicos (H, diámetro, rotación, albedo, clase espectral; M1/K1 en cometas). TTL: 7 d.
JPL Horizons — horizons.py — efemérides precisas
GET https://ssd.jpl.nasa.gov/api/horizons.api?...— pública.CENTERacepta códigos de observatorio MPC directamente (p. ej.'Z41'). QUANTITIES usados:1(RA/Dec),4(az/el aparente),19(rango heliocéntrico),20(rango al observador). TTL: 12 h.
JPL CAD — cad.py — aproximaciones cercanas
GET https://ssd-api.jpl.nasa.gov/cad.api?des=<des>&date-min=..&date-max=..— JSON público: fecha de aproximación, distancia (AU), velocidad relativa. TTL: 7 d.
SIMBAD (CDS) — simbad.py — transitorios y galaxias anfitrionas
POST https://simbad.cds.unistra.fr/simbad/sim-script— interfaz de scripts pública. Consultas:query id <nombre>(tipo, coordenadas, flujo V),query around <nombre> radius=<r>(candidatas a galaxia anfitriona con redshift vía%RV). TTL: 7 d. Respaldo: ante un fallo de red el mismo script se reintenta una vez contra el espejo de Harvard (https://simbad.harvard.edu/simbad/sim-script) — losquery aroundpesados superan con frecuencia el timeout de 40 s en Estrasburgo mientras el espejo responde 3× más rápido (medido 2026-09); los scriptsaroundusan 60 s, losid40 s.
TNS (Transient Name Server) — tns.py — posiciones de transientes frescos
GET https://www.wis-tns.org/object/<nombre>— página pública del objeto (HTML), parseada con lxml: el bloquefield-radeclleva las coordenadas J2000 en grados decimales, más tipo/magnitud/fecha de descubrimiento. Sin credenciales; una descarga cacheada por objeto, TTL 6 h — sé buen ciudadano. Primer resolvedor de la función blink (ADR-018): los transientes frescos aparecen en TNS días antes de que SIMBAD los ingeste. (La API bot oficial queda disponible cuando se conectentns_bot_name/tns_bot_key.)
Astrometry.net (nova) — astrometry.py — resolución ciega de astrometría
POST /api/login+POST /api/upload+ sondeo/api/submissions/<id>y/api/jobs/<id>+GET /wcs_file/<jobid>— requiere la clave de API gratuita del usuario (astrometry_keyen Ajustes). La usa la función blink cuando el FITS del usuario no tiene WCS (ADR-018). Las tarjetas WCS resueltas se cachean por hash del fichero (TTL 30 d): la misma imagen nunca se resuelve dos veces.
NASA Exoplanet Archive — exoplanet_archive.py — detalle de exoplanetas
Consulta TAP sync (
https://exoplanetarchive.ipac.caltech.edu/TAP/sync,format=json) sobrepscomppars: período, radio, masa, temperatura de equilibrio, distancia del sistema, estrella anfitriona. TTL: 7 d.
VizieR (CDS) — vizier.py — fotometría de catálogo para secuencias (ADR-042)
GET https://vizier.cds.unistra.fr/viz-bin/asu-tsv?-source=<cat>&-c=<ra>+<dec>& -c.r=<arcmin>...— cone search TSV sobre los catálogos: Gaia EDR3 (I/350/gaiaedr3: G/BP/RP + errores), APASS DR9 (II/336/apass9: B,V y g′r′i′ directos) y AAVSO VSX (B/vsx/vsx: tipo, periodo, máx/mín) para el cruce de variables del campo. Alimenta las secuencias fotométricas y las cartas de comparación (la pregunta «¿con qué comparo?» del seguimiento).Parseo tolerante (patrón de SecFot): se pide una lista explícita de columnas; si falta alguna de las sondeadas, la consulta se repite con
-out.ally gana la respuesta más rica, de modo que un renombre de columna no rompe nada.TTL: 30 d (la fotometría de referencia es cuasi-estática). Fallo →
None; el usuario ve el aviso honesto y nada más se rompe.
Sol y entorno
NOAA SWPC — noaa.py
services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json(SSN, F10.7).../products/noaa-planetary-k-index.json(Kp).../json/solar_regions.json(regiones activas — alimenta nuestro mapa de manchas).../json/goes/primary/xrays-7-day.json(flujo de rayos X → clases de fulguración)Todo JSON público. TTL: 1 h.
SILSO (SIDC, Real Observatorio de Bélgica) — silso.py
Series de número de manchas para contexto del ciclo. Datos públicos con crédito. TTL: 24 h.
NASA SDO — sdo.py
https://sdo.gsfc.nasa.gov/assets/img/latest/latest_1024_<canal>.jpg(0193, 0304, HMII, ...). Imágenes de dominio público con crédito («Courtesy of NASA/SDO and the AIA, EVE, and HMI science teams»). TTL: 1 h.
Imágenes
Cutouts — cutouts.py — campos de referencia para supernovas
DESI Legacy Survey:
https://www.legacysurvey.org/viewer/jpeg-cutout?ra=..&dec=..(color, bonitos). hips2fits del CDS:https://alasky.cds.unistra.fr/ hips-image-services/hips2fits?...(DSS color, Pan-STARRS). Ambos servicios públicos.Referencia para blink (ADR-018): hips2fits
hips=CDS/P/PanSTARRS/DR1/g, formato FITS, pedido con el centro celeste, escala de píxel y rotación exactos de la imagen del usuario (parámetrorotation_angle) de modo que ambas imágenes queden alineadas por construcción. FallbackCDS/P/DSS2/redsi dec < −30° (fuera de la cobertura 3π de PS1). Atribución en los exports: «PanSTARRS DR1 g (CDS hips2fits)» / «DSS2-red (CDS hips2fits)».TTL: 30 d (los campos de referencia no cambian).
Imágenes de descubrimiento (TNS) — opcional, solo dentro de la app
Las páginas de objeto de TNS muestran imágenes de descubrimiento del survey; el acceso automatizado requiere las credenciales bot TNS del usuario (Configuración). Se muestran dentro de la app como referencia; solo se reutilizan en posts si la licencia del survey lo permite (ZTF/ATLAS con crédito). Si no, enlazamos a la página TNS del objeto. Ver ADR-016.
Calidad del sitio (brillo de cielo)
Atlas de contaminación lumínica — lightpollution.py — brillo cenital del sitio (ADR-083)
GET https://www.lightpollutionmap.info/QueryRaster/?ql=wa_2015&qt=point&qd=<lon>,<lat>&key=<clave>— el New World Atlas of Artificial Night Sky Brightness (Falchi et al. 2016) y su sucesor Sky brightness (NASA Black Marble 2.0), por punto. Requiere una clave que se pide a lightpollutionmap.info (opcional: sin ella el observador escribe el valor).Devuelve el brillo cenital ARTIFICIAL en mcd/m2; el sitio documenta la conversión exacta a mag/arcsec2 (total = artificial + 0.171168465 mcd/m2 para el cielo natural de 22.0;
MPSAS = log10(total / 108000000) / -0.4). Guardamos mag/arcsec2.TTL: 30 días (el atlas es estático). El valor es el brillo CENITAL modelado, «mejor caso»: VIIRS es casi ciego al azul, así que un cielo con LEDs blancos puede ser más brillante de lo que predice. Crédito: «Jurij Stare, lightpollutionmap.info» y «NASA's Black Marble nighttime lights product».
Integraciones locales con el observatorio (no son fuentes externas)
El paso Captura habla con el software de observatorio del propio observador en localhost, con una ruta de lectura cacheada (TTL de la fuente 60 s) para que el dashboard no machaque al programa, y comandos directos (slew, paro, filtro, captura) que nunca se cachean. Un backend a la vez, elegido en Ajustes (ADR-081):
CCDciel —
ccdciel.py— JSON-RPC 2.0 enhttp://host:3277/jsonrpc(ADR-030). Lecturas:CCDciel_Version,status,Wheel_GetfiltersName,Devices_connected,Telescope_slewing/Telescope_tracking. Comandos:Telescope_slewasync,Astrometry_Goto_Async/_Running/_Result,Telescope_abortmotion,Wheel_setfilter,Capture_set*/Capture_get*,Capture_start.NINA / PINS —
nina.py— REST Advanced API v2 enhttp://host:1888/v2/api(ADR-081). Cada respuesta es una envoltura{Response, Error, StatusCode, Success, Type};Success: falsese convierte en error, nunca en un no-op silencioso. Lecturas:/version/nina,/equipment/info,/equipment/filterwheel/info. Comandos:/equipment/mount/slew(center=true&waitForResult=truees el goto astrométrico),/equipment/mount/slew/stop(el paro de seguridad),/equipment/filterwheel/change-filter,/equipment/camera/capture. Sin token.
requests vive solo en core/sources/ (AGENTS.md); los dos clientes lanzan ObservatoryError, así que la GUI no ramifica por backend.
Enlaces externos (nunca incrustados — copyright)
Mapas solares de Raben, SolarMonitor, SIDC/uset, universemonitor, ETD (var.astro.cz), web de NEOfixer, web de TNS. La app los abre en el navegador.
Efemérides locales
Sol, Luna y planetas: algoritmos de baja precisión de Paul Schlyter (core/ephem_minor.py) — math puro, precisión de arcminutos, offline. Cuerpos menores: propagación kepleriana desde elementos SBDB. Ver ADR-009.
Superficie de la Luna (solo el icono de fase, no efemérides): una fotografía empaquetada, nightscribe/assets/moon_disk.png — Gregory H. Revera, "FullMoon2010", Wikimedia Commons, CC BY-SA 3.0 (crédito completo en assets/ATTRIBUTION.txt). Generada una vez en desarrollo; la app no necesita red para ella.