Experiment record
Open-Meteo HTTP 429 only on Apps Script time-driven triggers
The same Google Apps Script collector returned HTTP 200 when run manually and HTTP 429 under a time-driven trigger. The evidence points to execution/network context, while the provider's exact rate-limit key remains unresolved; a Cloudflare Worker relay restored the investigated scheduled workflow.
Short conclusion
The retained records support treating this as an execution/network-context-dependent Open-Meteo 429 problem rather than a trigger-only application request bug. The same collection function succeeded manually with HTTP 200 and returned HTTP 429 when invoked by a time-driven trigger. The record reports that a Cloudflare Worker relay restored the investigated scheduled collection.
The exact Open-Meteo rate-limit key is not established.
Objective
Determine why the same Google Apps Script collection function succeeds when run manually but receives HTTP 429 from Open-Meteo under a time-driven trigger, and identify a practical mitigation without inventing an undocumented provider rate-limit mechanism.
Observed facts
- Manual execution of the collection function returned HTTP 200 from Open-Meteo.
- Time-driven-trigger execution of the same function returned HTTP 429 with a daily API request limit message.
- Diagnostic logging distinguished MANUAL and TRIGGER execution using the trigger event object.
- A temporary external IP check showed different outward paths: manual execution exposed IPv6 while scheduled execution exposed a different IPv4. Exact addresses are withheld.
- Code inspection found no trigger-only extra Open-Meteo request. On HTTP 429, the retry loop stopped instead of repeatedly calling the provider.
- The record reports that scheduled collection recovered after routing the provider request through a Cloudflare Worker relay.
- Timestamp-based deduplication and a bounded 72-hour history window were retained.
How to read the evidence labels
This site uses evidence labels so that direct observations, interpretations, and unresolved explanations are not presented as if they had the same level of support.
| Label | Meaning on this site |
|---|---|
| VERIFIED | Supported by additional confirmation such as a manufacturer response, specification, or independent verification |
| OBSERVED | Directly seen or measured during the experiment or in retained logs |
| INFERRED | The interpretation that best fits the observations, but is not directly confirmed |
| HYPOTHESIS | A plausible explanation that still requires testing or confirmation |
| DISPROVEN | An explanation that investigation did not support under the tested conditions |
Evidence summary for this experiment
INFERRED
The combined observations strongly indicate that the failure depended on execution or network context rather than a materially different ordinary application request path.
HYPOTHESIS
The differing outward paths are consistent with the possibility that Open-Meteo applied rate limiting to a network identity or route encountered by scheduled execution. The provider’s exact rate-limit key was not independently established, so this remains a hypothesis rather than a verified fact.
DISPROVEN
For the inspected application code, a trigger-only extra Open-Meteo request was not the cause of the observed 429 behavior.
Result
The investigated workflow was operationally mitigated by routing Open-Meteo requests through a Cloudflare Worker relay. This establishes a practical workaround for the recorded case, but not the provider’s internal reason for issuing HTTP 429.
About this record and privacy
This article was organized from the experiment record created on 2026-08-14. Exact egress IP addresses, coordinates, spreadsheet identifiers, account identifiers, credentials, and household telemetry are not published.
The exact original execution timestamps and a complete post-mitigation scheduled-run log were not retained. This page therefore does not fill in details beyond what the retained record supports.
Structured data
A machine-readable structured record for this Experiment is publicly available as JSON.