{"data":{"specVersion":"1.0.0","environment":"production","runtime":{"cache":{"driver":"memory","configuredDriver":"memory","matchesConfiguration":true,"sharedAcrossInstances":false,"scope":"per-instance","note":null},"storage":{"driver":"vercel-blob","configuredDriver":"vercel-blob","matchesConfiguration":true,"available":true,"durable":true,"reason":"BLOB_ACTIVATED"},"rateLimit":{"defaultLimit":60,"defaultWindowSeconds":60,"perConsumerAllowanceOverridesDefault":true,"scope":"per-instance","sharedAcrossInstances":false,"bucket":"PER_ROUTE_NAME","subjectSecret":"configured"}},"routes":[{"path":"/api/v1/health","name":"v1.health","rateLimitBucket":"v1.health","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"platform","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/sources","name":"v1.sources","rateLimitBucket":"v1.sources","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"sources","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/weather/current","name":"v1.weather.current","rateLimitBucket":"v1.weather.current","methods":["GET","HEAD"],"access":"ECOSYSTEM_INTERNAL","requiredScope":"weather:read","authentication":{"required":true,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"weather","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/weather/forecast","name":"v1.weather.forecast","rateLimitBucket":"v1.weather.forecast","methods":["GET","HEAD"],"access":"ECOSYSTEM_INTERNAL","requiredScope":"weather:read","authentication":{"required":true,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"weather","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/economics/events","name":"v1.economics.events","rateLimitBucket":"v1.economics.events","methods":["GET","HEAD"],"access":"ECOSYSTEM_INTERNAL","requiredScope":"economics:read","authentication":{"required":true,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"economics","requiresDurableStorage":true,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/economics/calendar","name":"v1.economics.calendar","rateLimitBucket":"v1.economics.calendar","methods":["GET","HEAD"],"access":"ECOSYSTEM_INTERNAL","requiredScope":"economics:read","authentication":{"required":true,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"economics","requiresDurableStorage":true,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/economics/indicators","name":"v1.economics.indicators","rateLimitBucket":"v1.economics.indicators","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"economics","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/economics/indicators/:slug","name":"v1.economics.indicators","rateLimitBucket":"v1.economics.indicators","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"economics","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/economics/series","name":"v1.economics.series","rateLimitBucket":"v1.economics.series","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"economics","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/economics/series/:slug","name":"v1.economics.series","rateLimitBucket":"v1.economics.series","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"economics","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/economics/series/:slug/observations","name":"v1.economics.observations","rateLimitBucket":"v1.economics.observations","methods":["GET","HEAD"],"access":"ECOSYSTEM_INTERNAL","requiredScope":"economics:read","authentication":{"required":true,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"economics","requiresDurableStorage":true,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/news/events","name":"v1.news.events","rateLimitBucket":"v1.news.events","methods":["GET","HEAD"],"access":"ECOSYSTEM_INTERNAL","requiredScope":"news:read","authentication":{"required":true,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"news","requiresDurableStorage":true,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/public/v1/economics/calendar","name":"public.economics.calendar","rateLimitBucket":"public.economics.calendar","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"economics","requiresDurableStorage":true,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/public/v1/economics/releases","name":"public.economics.releases","rateLimitBucket":"public.economics.releases","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"economics","requiresDurableStorage":true,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/public/v1/economics/observations","name":"public.economics.observations","rateLimitBucket":"public.economics.observations","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"economics","requiresDurableStorage":true,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/public/v1/weather/current","name":"public.weather.current","rateLimitBucket":"public.weather.current","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"weather","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/public/v1/status","name":"public.status","rateLimitBucket":"public.status","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"platform","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/public/v1/news/events","name":"public.news.events","rateLimitBucket":"public.news.events","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"news","requiresDurableStorage":true,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/capabilities","name":"v1.capabilities","rateLimitBucket":"v1.capabilities","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"platform","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}},{"path":"/api/v1/openapi.json","name":"v1.openapi","rateLimitBucket":"v1.openapi","methods":["GET","HEAD"],"access":"PUBLIC","requiredScope":null,"authentication":{"required":false,"header":"Authorization","scheme":"Bearer","alternatives":[{"header":"X-Helperg-Api-Key","scheme":null}]},"domain":"platform","requiresDurableStorage":false,"availability":{"state":"AVAILABLE","reason":null,"errorCode":null,"httpStatus":null}}],"domains":[{"domain":"platform","capability":"AVAILABLE","reasons":["NOT_AN_EXTERNAL_DATA_DOMAIN"],"isExternalDataDomain":false,"routeCount":4,"availablePaths":["/api/v1/health","/api/public/v1/status","/api/v1/capabilities","/api/v1/openapi.json"],"unavailablePaths":[],"sourceIds":[]},{"domain":"sources","capability":"AVAILABLE","reasons":["NOT_AN_EXTERNAL_DATA_DOMAIN"],"isExternalDataDomain":false,"routeCount":1,"availablePaths":["/api/v1/sources"],"unavailablePaths":[],"sourceIds":[]},{"domain":"weather","capability":"AVAILABLE","reasons":["ALL_ROUTES_SERVEABLE"],"isExternalDataDomain":true,"routeCount":3,"availablePaths":["/api/v1/weather/current","/api/v1/weather/forecast","/api/public/v1/weather/current"],"unavailablePaths":[],"sourceIds":["met-no"]},{"domain":"economics","capability":"AVAILABLE","reasons":["ALL_ROUTES_SERVEABLE"],"isExternalDataDomain":true,"routeCount":10,"availablePaths":["/api/v1/economics/events","/api/v1/economics/calendar","/api/v1/economics/indicators","/api/v1/economics/indicators/:slug","/api/v1/economics/series","/api/v1/economics/series/:slug","/api/v1/economics/series/:slug/observations","/api/public/v1/economics/calendar","/api/public/v1/economics/releases","/api/public/v1/economics/observations"],"unavailablePaths":[],"sourceIds":["bls-release-schedule","eurostat","ecb","eurostat-release-calendar","ecb-meetings-calendar","ecb-statistics-calendar"]},{"domain":"news","capability":"AVAILABLE","reasons":["ALL_ROUTES_SERVEABLE"],"isExternalDataDomain":true,"routeCount":2,"availablePaths":["/api/v1/news/events","/api/public/v1/news/events"],"unavailablePaths":[],"sourceIds":["bls-news-releases","eurostat-news-releases","ecb-press-releases"]}],"sources":[{"sourceId":"met-no","sourceName":"MET Norway Weather API","organization":"Norwegian Meteorological Institute","sourceUrl":"https://www.met.no/","domains":["weather"],"enabled":true,"attributionRequired":true,"attributionText":"Weather data from MET Norway (Norwegian Meteorological Institute), licensed under CC BY 4.0.","licenseName":"CC BY 4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","termsUrl":"https://api.met.no/doc/TermsOfService","commercialUseStatus":"ALLOWED","redistributionStatus":"ALLOWED","modificationDisclosure":"PER_RESPONSE"},{"sourceId":"bls-release-schedule","sourceName":"BLS Economic News Release Schedule","organization":"U.S. Bureau of Labor Statistics","sourceUrl":"https://www.bls.gov/","domains":["economics","government-statistics"],"enabled":true,"attributionRequired":true,"attributionText":"Source: U.S. Bureau of Labor Statistics.","licenseName":"U.S. Government Work (public domain)","licenseUrl":null,"termsUrl":"https://www.bls.gov/bls/linksite.htm","commercialUseStatus":"ALLOWED","redistributionStatus":"ALLOWED","modificationDisclosure":"PER_RESPONSE"},{"sourceId":"eurostat","sourceName":"Eurostat dissemination API","organization":"Eurostat (Statistical Office of the European Union)","sourceUrl":"https://ec.europa.eu/eurostat","domains":["economics","government-statistics"],"enabled":true,"attributionRequired":true,"attributionText":"Source: Eurostat.","licenseName":"CC BY 4.0 (Commission Decision 2011/833/EU)","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","termsUrl":"https://ec.europa.eu/eurostat/help/copyright-notice","commercialUseStatus":"ALLOWED","redistributionStatus":"ALLOWED","modificationDisclosure":"PER_RESPONSE"},{"sourceId":"ecb","sourceName":"ECB Data Portal API","organization":"European Central Bank","sourceUrl":"https://www.ecb.europa.eu/","domains":["economics","markets"],"enabled":true,"attributionRequired":true,"attributionText":"Source: ECB statistics.","licenseName":"ECB/ESCB free access and free reuse policy","licenseUrl":null,"termsUrl":"https://www.ecb.europa.eu/stats/ecb_statistics/governance_and_quality_framework/html/usage_policy.en.html","commercialUseStatus":"ALLOWED","redistributionStatus":"ALLOWED","modificationDisclosure":"PER_RESPONSE"},{"sourceId":"eurostat-release-calendar","sourceName":"Eurostat release calendar (euro indicators)","organization":"Eurostat (Statistical Office of the European Union)","sourceUrl":"https://ec.europa.eu/eurostat/web/main/news/release-calendar","domains":["economics","government-statistics"],"enabled":true,"attributionRequired":true,"attributionText":"Source: Eurostat.","licenseName":"CC BY 4.0 (Commission Decision 2011/833/EU)","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","termsUrl":"https://ec.europa.eu/eurostat/help/copyright-notice","commercialUseStatus":"ALLOWED","redistributionStatus":"ALLOWED","modificationDisclosure":"PER_RESPONSE"},{"sourceId":"ecb-meetings-calendar","sourceName":"ECB Governing Council and General Council meetings calendar","organization":"European Central Bank","sourceUrl":"https://www.ecb.europa.eu/press/calendars/mgcgc/html/index.en.html","domains":["economics","markets"],"enabled":true,"attributionRequired":true,"attributionText":"Source: European Central Bank.","licenseName":"ECB website disclaimer and copyright (reproduction permitted with source citation)","licenseUrl":null,"termsUrl":"https://www.ecb.europa.eu/services/disclaimer/html/index.en.html","commercialUseStatus":"ALLOWED","redistributionStatus":"ALLOWED","modificationDisclosure":"PER_RESPONSE"},{"sourceId":"ecb-statistics-calendar","sourceName":"ECB statistical release calendar","organization":"European Central Bank","sourceUrl":"https://www.ecb.europa.eu/press/calendars/statscal/html/index.en.html","domains":["economics","markets"],"enabled":true,"attributionRequired":true,"attributionText":"Source: European Central Bank.","licenseName":"ECB website disclaimer and copyright (reproduction permitted with source citation)","licenseUrl":null,"termsUrl":"https://www.ecb.europa.eu/services/disclaimer/html/index.en.html","commercialUseStatus":"ALLOWED","redistributionStatus":"ALLOWED","modificationDisclosure":"PER_RESPONSE"},{"sourceId":"bls-news-releases","sourceName":"BLS Economic News Releases","organization":"U.S. Bureau of Labor Statistics","sourceUrl":"https://www.bls.gov/bls/newsrels.htm","domains":["news"],"enabled":true,"attributionRequired":true,"attributionText":"Source: U.S. Bureau of Labor Statistics.","licenseName":"U.S. Government Work (public domain)","licenseUrl":null,"termsUrl":"https://www.bls.gov/bls/linksite.htm","commercialUseStatus":"ALLOWED","redistributionStatus":"ALLOWED","modificationDisclosure":"PER_RESPONSE"},{"sourceId":"eurostat-news-releases","sourceName":"Eurostat news releases (Euro indicators)","organization":"Eurostat (Statistical Office of the European Union)","sourceUrl":"https://ec.europa.eu/eurostat/news/euro-indicators","domains":["news"],"enabled":true,"attributionRequired":true,"attributionText":"Source: Eurostat.","licenseName":"CC BY 4.0 (Commission Decision 2011/833/EU)","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","termsUrl":"https://ec.europa.eu/eurostat/help/copyright-notice","commercialUseStatus":"ALLOWED","redistributionStatus":"ALLOWED","modificationDisclosure":"PER_RESPONSE"},{"sourceId":"ecb-press-releases","sourceName":"ECB press and statistical releases","organization":"European Central Bank","sourceUrl":"https://www.ecb.europa.eu/press/pr/html/index.en.html","domains":["news"],"enabled":true,"attributionRequired":true,"attributionText":"Source: European Central Bank.","licenseName":"ECB website disclaimer and copyright (reproduction permitted with source citation)","licenseUrl":null,"termsUrl":"https://www.ecb.europa.eu/services/disclaimer/html/index.en.html","commercialUseStatus":"ALLOWED","redistributionStatus":"ALLOWED","modificationDisclosure":"PER_RESPONSE"}],"cache":{"driver":"memory","scope":"per-instance","sharedAcrossInstances":false,"policies":[{"name":"weatherCurrent","defaultTtlSeconds":600,"minTtlSeconds":300,"maxTtlSeconds":3600,"staleServeSeconds":21600,"applied":true,"appliedByRoutes":["v1.weather.current"],"note":null},{"name":"weatherForecast","defaultTtlSeconds":3600,"minTtlSeconds":900,"maxTtlSeconds":21600,"staleServeSeconds":86400,"applied":true,"appliedByRoutes":["v1.weather.forecast"],"note":null},{"name":"economicsCalendar","defaultTtlSeconds":21600,"minTtlSeconds":3600,"maxTtlSeconds":86400,"staleServeSeconds":604800,"applied":false,"appliedByRoutes":[],"note":"Defined but selected by no runtime code path in this build. No response is cached under it."},{"name":"economicsReleaseWindow","defaultTtlSeconds":60,"minTtlSeconds":30,"maxTtlSeconds":300,"staleServeSeconds":900,"applied":false,"appliedByRoutes":[],"note":"Defined but selected by no runtime code path in this build. No response is cached under it."},{"name":"news","defaultTtlSeconds":300,"minTtlSeconds":60,"maxTtlSeconds":1800,"staleServeSeconds":21600,"applied":false,"appliedByRoutes":[],"note":"Defined but selected by no runtime code path in this build. No response is cached under it."},{"name":"sourceRegistry","defaultTtlSeconds":86400,"minTtlSeconds":3600,"maxTtlSeconds":604800,"staleServeSeconds":604800,"applied":false,"appliedByRoutes":[],"note":"Defined but selected by no runtime code path in this build. No response is cached under it."}],"sharedEntries":[{"routes":["v1.weather.current","v1.weather.forecast"],"keyNamespace":"weather:met-no:payload","keyedBy":["latitude","longitude","altitudeMetres"],"note":"Both routes cache ONE provider payload per location. The cache key does not include the policy, so whichever route stores the entry sets its TTL and the other route reads it. Treat weatherForecast.maxTtlSeconds as the real upper bound on the freshness of either."}]},"errors":[{"code":"BAD_REQUEST","httpStatus":400,"retryable":false,"message":"The request could not be understood."},{"code":"VALIDATION_FAILED","httpStatus":400,"retryable":false,"message":"One or more request parameters are invalid."},{"code":"NOT_FOUND","httpStatus":404,"retryable":false,"message":"The requested resource does not exist."},{"code":"METHOD_NOT_ALLOWED","httpStatus":405,"retryable":false,"message":"This endpoint does not support that HTTP method."},{"code":"UNAUTHORIZED","httpStatus":401,"retryable":false,"message":"Authentication is required for this endpoint."},{"code":"FORBIDDEN","httpStatus":403,"retryable":false,"message":"This credential is not permitted to access this resource."},{"code":"RATE_LIMITED","httpStatus":429,"retryable":true,"message":"Request rate exceeded. Retry after the indicated interval."},{"code":"WEATHER_LOCATION_INVALID","httpStatus":400,"retryable":false,"message":"The supplied coordinates are not a valid location."},{"code":"ECONOMICS_RANGE_INVALID","httpStatus":400,"retryable":false,"message":"The supplied date range is not valid."},{"code":"SOURCE_NOT_FOUND","httpStatus":404,"retryable":false,"message":"No source is registered under that identifier."},{"code":"SOURCE_DISABLED","httpStatus":404,"retryable":false,"message":"That source exists but is not currently enabled."},{"code":"CONFIGURATION_ERROR","httpStatus":503,"retryable":false,"message":"This deployment is not correctly configured."},{"code":"STORAGE_UNAVAILABLE","httpStatus":503,"retryable":true,"message":"The storage backend is temporarily unavailable. Retry after a short delay."},{"code":"UPSTREAM_TIMEOUT","httpStatus":504,"retryable":true,"message":"The upstream data provider did not respond in time."},{"code":"SERVICE_UNAVAILABLE","httpStatus":503,"retryable":false,"message":"No durable storage is configured for this deployment."},{"code":"UPSTREAM_UNAVAILABLE","httpStatus":502,"retryable":true,"message":"The upstream data provider is currently unavailable."},{"code":"UPSTREAM_INVALID_PAYLOAD","httpStatus":502,"retryable":false,"message":"The upstream data provider returned an unusable payload."},{"code":"UPSTREAM_PAYLOAD_TOO_LARGE","httpStatus":502,"retryable":false,"message":"The upstream data provider returned an oversized payload."},{"code":"INTERNAL","httpStatus":500,"retryable":false,"message":"An internal error occurred."}]},"meta":{"requestId":"4d23c73b-4b62-426f-a26d-3f0ceb9b4877","generatedAt":"2026-09-21T17:33:54.727Z","cached":false,"cacheAgeSeconds":0,"stale":false,"degraded":false,"sourceCount":0,"sources":[],"attribution":[],"attributionRecords":[]}}