Los créditos se cobran por lo que la API devuelve, no solo por las horas que pediste.
Credits = returned_valid_times * parameters * ceil(coordinates / 500)returned_valid_times son los tiempos válidos que realmente vuelven por ubicación. En consultas de ensemble, cada miembro es su propia time series.
Puedes verificar uso y límites en tu token dashboard.
Sí. Si necesitas hacer un backfill agresivo, podemos configurar ajustes temporales de cuota o throughput para consumir más cuota en una ventana corta.
Escríbenos primero a info@gribstream.com con datasets, variables, rango de tiempo, cantidad de coordenadas y objetivo de finalización. Así podemos dimensionar la carga sin afectar capacidad compartida.
429 Too Many Requests y qué significa Retry-After?Un 429 suele indicar cuota agotada o burst throttling.
Retry-After indica segundos hasta el próximo reset diario UTC.Respeta Retry-After, usa exponential backoff con jitter y evita loops de reintentos.
401/429 repetido?Esto suele pasar cuando un cliente sigue reintentando requests denegados a alta frecuencia.
Para proteger capacidad compartida, GribStream puede aplicar bloqueos temporales a nivel IP. Normalmente duran de 10 minutos a 1 hora, según el patrón de tráfico.
Evítalo dejando de reintentar 401 hasta corregir la autenticación, respetando Retry-After en 429 y usando límites de reintentos.
Las cuotas diarias se reinician a las 00:00 UTC.
El contador exacto aparece en tu token dashboard.
/timeseries y /runs?Ambos endpoints consultan los mismos datos, pero responden preguntas distintas.
/timeseriesasOf./runsforecastedFrom/forecastedUntil, no asOf.fromTime/untilTime o timesList?Usa fromTime/untilTime para ventanas densas y continuas. Usa timesList cuando ya conoces timestamps exactos y necesitas extracción dispersa.
En la práctica, timesList suele reducir over-fetching y créditos porque solo se devuelven los tiempos listados.
asOf y cuándo debería usarlo?asOf es un timestamp de corte para /timeseries: solo son elegibles los runs producidos en ese momento o antes.
Úsalo para backtesting sin leakage, es decir, para reconstruir qué se sabía en ese momento sin incorporar runs futuros.
Si se omite asOf, GribStream usa los runs más recientes disponibles. /runs no usa asOf.
forecasted_at o forecasted_time?Las responses se streamen en un orden optimizado para throughput, por lo que el orden cronológico no está garantizado.
Si necesitas orden determinista, ordena client-side después de descargar: en /timeseries por forecasted_time y luego forecasted_at; en /runs, por los campos de tiempo y run/horizon que use tu workflow.
name, level, info)?Un selector de variable es un objeto JSON como:
{ "name": "TMP", "level": "2 m above ground", "info": "" }name: código de parámetro requerido, por ejemplo TMP o UGRD.level: nivel vertical o físico requerido.info: disambiguador opcional; requerido cuando varios campos comparten name + level.alias: nombre opcional para la columna de salida; no cambia la selección.En cada página de modelo, el browser de variables muestra el selector JSON exacto y permite copiarlo.
Normalmente significa que la grid solicitada no intersecta el dominio del dataset.
step puede dejar cero puntos útiles tras filtrar por dominio.Revisa la página del modelo, prueba primero una coordenada conocida dentro del dominio y luego escala a grid.
En datasets de ensemble, usa el array members para elegir qué miembros devolver.
members se omite, GribStream devuelve solo el primer miembro disponible, normalmente el miembro de control 0./api/v2/catalog/datasets/{dataset} e inspecciona members.En datasets que no son ensemble, members no se usa.
En /timeseries, cada tiempo válido usa el valor de menor lead time disponible bajo tus filtros. Cerca de límites de ciclo, el run seleccionado puede cambiar y eso puede crear saltos.
/runs si necesitas mantener un run fijo para toda la curva.minLeadTime: "0h" y maxLeadTime: "0h".Para backfills grandes, optimiza throughput estable y bajo overhead por punto devuelto.
timesList en vez de rangos amplios.Los cache hits se facturan al 10% de los créditos normales y suelen responder mucho más rápido.
El cache ayuda sobre todo en datos consultados repetidamente: pulls recientes, valores tipo actual/horizonte corto y ventanas que clientes consultan con frecuencia.
Baseline recomendado:
Authorization: Bearer <token>Content-Type: application/jsonAccept: text/csv, application/json o application/ndjsonAccept-Encoding: gzip, muy recomendado para responses grandesAsegúrate de que tu client acepte y descomprima gzip.
Usa expressions/filters en la API cuando puedas reducir payload temprano: conversiones simples, thresholds, eventos y fórmulas directas.
Prefiere post-processing para lógica stateful, joins cross-dataset, enriquecimiento externo o pipelines más complejos.
Default práctico: filtra y deriva en la API primero, luego aplica analytics avanzados downstream.
Sí. GribStream soporta ambos workflows en la misma API.
/timeseries con asOf para reconstruir qué pronóstico estaba disponible en cada timestamp histórico.timesList cuando los timestamps de evaluación son dispersos.Ambas opciones son válidas, pero optimizan tradeoffs distintos.
Muchos equipos usan un enfoque híbrido: API para producto y analytics, archivos crudos para investigación especializada.
Muchos modelos representan el viento con componentes u y v. Puedes calcular velocidad y dirección con:
speed = math.sqrt(u*u + v*v)
direction = (270 - math.atan2(v, u) * 180 / math.pi) % 360u es la componente zonal oeste-este y v la componente meridional sur-norte. La segunda fórmula rota el ángulo a la convención meteorológica.
En GribStream puedes hacerlo con expressions como func.Hypot(uwind, vwind) y func.Atan2(vwind, uwind).
Convierte la temperatura de Kelvin a Celsius y aplica la aproximación Magnus-Tetens:
T_C = T - 273.15
a = 17.27
b = 237.7
gamma = (a * T_C) / (b + T_C) + math.log(RH / 100)
dew_point_C = (b * gamma) / (a - gamma)También puedes calcularlo dentro de la response usando GribStream expressions y devolver dew_point_C o dew_point_K como columnas derivadas.