API de hntavirus.com

API HTTP pública y de solo lectura para datos de vigilancia de hantavirus. Casos, noticias, alertas de la OMS, informes diarios generados por IA y conjuntos de datos sin procesar. Gratuito para investigación y periodismo — por favor, acredita el sitio y las fuentes originales.

URL base
https://hntavirus.com
Autenticación
none (public)
Formato
JSON · GeoJSON · CSV · XML
CORS
open on /api/dataset/*, /api/cases

Endpoints públicos

MétodoEndpoint 
GET/api/statsEjemplo
GET/api/casesEjemplo
GET/api/cases/by-country/{iso}
GET/api/country/{iso}Ejemplo
GET/api/newsEjemplo
GET/api/who-don
GET/api/sourcesEjemplo
GET/api/timeseriesEjemplo
GET/api/briefingEjemplo
GET/api/dataset/cases.geojson
GET/api/dataset/cases.csv
GET/api/dataset/news.json
GET/feed.xml
GET/sitemap.xml
GET/sitemap-news.xml
GET/api/stats
+

High-level dashboard counts.

cURL
curl https://hntavirus.com/api/stats
Respuesta
{
  "total": 107,
  "confirmed": 24,
  "suspected": 21,
  "deaths": 9,
  "locations": 30,
  "lastOnset": 1778025600000
}
GET/api/cases
+

All case features as GeoJSON, paginated server-side and merged.

cURL
curl https://hntavirus.com/api/cases
Respuesta
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "id": 1,
      "geometry": {
        "type": "Point",
        "coordinates": [8.6054, 47.4847]
      },
      "properties": {
        "OBJECTID": 1,
        "STATUS": "CONFIRMED",
        "ONSET": 1778025600000,
        "DEATH": null,
        "LASTLOCATION": "ZURICH",
        "SOURCE": "https://www.bag.admin.ch/...",
        "Exposure_Group": "MV Hondius, Disembarked April 24th",
        "DETAILS": "Departed ship, Swiss national, confirmed case"
      }
    }
  ]
}
GET/api/country/{iso}
+

Stats, recent cases, recent news, WHO DON entries, aggregate timeline.

cURL
curl https://hntavirus.com/api/country/{iso}
Respuesta
{
  "stats": {
    "iso": "CH",
    "total": 2,
    "confirmed": 1,
    "suspected": 1,
    "deaths": 0,
    "newsCount": 0,
    "donCount": 0
  },
  "recentCases": [
    {
      "objectId": 1,
      "status": "CONFIRMED",
      "location": "ZURICH",
      "onset": 1778025600000,
      "death": null,
      "age": null,
      "sex": 1,
      "lon": 8.605,
      "lat": 47.484
    }
  ],
  "recentNews": [],
  "recentWho": [],
  "aggregate": [
    { "day": "2026-05-12", "cases": 2, "confirmed": 1, "suspected": 1, "deaths": 0, "newsCount": 0 }
  ]
}
GET/api/news
+

Latest news ordered by pub_date DESC.

cURL
curl 'https://hntavirus.com/api/news?lang=es&limit=5'
Respuesta
{
  "source": "d1",
  "items": [
    {
      "id": "978acd2b",
      "title": "French and Spanish hantavirus evacuees test positive...",
      "url": "https://www.sbs.com.au/news/article/...",
      "source": "sbs.com.au",
      "domain": "sbs.com.au",
      "country": "AU",
      "lang": "en",
      "image": "https://...",
      "pubDate": "2026-05-11T23:45:00.000Z",
      "origin": "gdelt"
    }
  ]
}
GET/api/sources
+

Live status of each upstream data source.

cURL
curl https://hntavirus.com/api/sources
Respuesta
{
  "sources": [
    { "source": "who_don", "ok": true, "lastRunAt": "2026-05-12T00:16:15.000Z", "count": 8, "ms": 1222 },
    { "source": "gdelt",   "ok": true, "lastRunAt": "2026-05-12T00:16:15.000Z", "count": 35, "ms": 22142 },
    { "source": "promed",  "ok": true, "lastRunAt": "2026-05-12T00:16:15.000Z", "count": 0, "ms": 17147 },
    { "source": "arcgis",  "ok": true, "lastRunAt": "2026-05-12T00:16:15.000Z", "count": 107, "ms": 16878 }
  ]
}
GET/api/timeseries
+

Daily series for charts.

cURL
curl https://hntavirus.com/api/timeseries
Respuesta
{
  "kind": "cases",
  "iso": null,
  "days": 7,
  "series": [
    { "day": "2026-05-06", "value": 3 },
    { "day": "2026-05-07", "value": 1 }
  ]
}
GET/api/briefing
+

AI-written daily briefing in the requested locale.

cURL
curl 'https://hntavirus.com/api/briefing?locale=es'
Respuesta
{
  "ok": true,
  "source": "cached",
  "briefing": {
    "locale": "es",
    "day": "2026-05-12",
    "body": "Hasta hoy se han notificado...",
    "generatedAt": "2026-05-12T01:15:00Z"
  }
}

Ejemplos rápidos

cURL

# Stats
curl https://hntavirus.com/api/stats

# News (Spanish)
curl 'https://hntavirus.com/api/news?lang=es&limit=5'

# Country dashboard
curl https://hntavirus.com/api/country/CH

# Briefing (German)
curl 'https://hntavirus.com/api/briefing?locale=de'

# Dataset download
curl -o cases.geojson \
  https://hntavirus.com/api/dataset/cases.geojson

JavaScript

const r = await fetch(
  "https://hntavirus.com/api/country/CH"
);
const data = await r.json();
console.log(data.stats.confirmed);

Python

import requests
cases = requests.get(
  "https://hntavirus.com/api/dataset/cases.geojson"
).json()
print(len(cases["features"]))

Errores

Todas las respuestas de error siguen una estructura JSON consistente: { "error": "descripción humana" }

EstadoSignificado
200Éxito
201Creado
400Cuerpo de solicitud incorrecto
404No encontrado
429Demasiadas solicitudes (protección predeterminada de Cloudflare)
500Error del servidor
502Error de fuente externa

Versiones, límites de velocidad y atribución

  • Versión actual: v1 (implícita). Los cambios importantes se moverán a /api/v2/* con un período de deprecación. Las adiciones al esquema no rompen compatibilidad.
  • Los límites de velocidad son flexibles, aplicados por Cloudflare. Espera 429 solo bajo abuso.
  • Cabeceras de caché: la mayoría de endpoints emiten Cache-Control: public, s-maxage=300, stale-while-revalidate=600. Omite con ?fresh=1 donde esté soportado.
  • Si usas los datos públicamente, enlaza a hntavirus.com y acredita las fuentes originales (ArcGIS / WHO DON / GDELT / ProMED / r/ContagionCuriosity).

Contacto e incidencias

Incidencias, correcciones de datos → abre un issue en GitHub o contacta a través de la página de prensa. Mantenido por hntavirus.com.