✈
    TravelmodeDevelopers

    Weather Intelligence API · v1

    🔎/
    📖Overview🧪API Reference (Try It)
    Guides
    🚀Getting Started🔐Authentication⏱️Rate Limits📡Endpoints⚠️Errors💳Billing🧊Cache & Freshness🪝Webhooks📝Attribution
    ⬇️Download openapi.yaml🔑Manage API Keys
    Developers / Rate Limits

    Rate Limits

    Last verified: 2026-05-03 (Task #334 — docs accuracy pass).

    The Weather Intelligence API enforces four quota dimensions per calendar month (UTC). The dimensions are independent — exhausting one does not block the others.

    DimensionWhat it counts
    requestsSuccessful, billable API calls. Calls that log billing_units = 0 (e.g. /v1/usage, pre-handler rate-limit rejections) do not count.
    timeline_itemsSum of items_analyzed across all /v1/weather/timeline calls in the period.
    route_callsSuccessful /v1/weather/route calls.
    active_watchesInstantaneous count of weather_watches in status='active'.

    Limits are pinned to PRD section 22.1.

    Plan tiers

    PlanRequests / moTimeline items / moRoute calls / moActive watches
    Free1,00010000
    Starter25,00010,0001,000500
    Pro250,000100,00025,00010,000
    Enterprise250,000100,00025,00010,000

    Enterprise defaults to Pro and is expected to be tuned per-account via developer_api_keys.rate_limit_overrides.

    Note for Free and Starter callers: the route endpoint and watches endpoints are not just throttled — they're flatly excluded. A Free-tier call to /v1/weather/route returns billing_limit_reached (HTTP 402), not rate_limited.

    Headers on every response

    Every response — successful or not — includes the standard rate-limit headers describing the monthly request bucket for the calling key:

    HeaderMeaning
    X-RateLimit-LimitCap for the requests dimension on this plan.
    X-RateLimit-RemainingRequests left in the current monthly window (clamped to ≥ 0).
    X-RateLimit-ResetUnix-seconds timestamp when the monthly bucket rolls over (next UTC month boundary).

    Other dimensions are not exposed via headers but are returned in full by GET /v1/usage.

    Throttling

    When a quota cap is hit, the response is one of:

    CodeHTTPWhen
    rate_limit_exceeded429The plan includes the feature, but the monthly cap was hit. Wait for the bucket to reset (or upgrade).
    billing_limit_reached402The plan flatly excludes the feature (limit is 0). Waiting won't help — the caller has to upgrade.

    Both come back in the standard ErrorEnvelope shape. The error details block names the dimension that was over.

    {
      "error": {
        "code": "rate_limit_exceeded",
        "message": "Monthly request quota exceeded",
        "details": { "dimension": "requests" },
        "request_id": "7c0f3c2c-9e4a-4d29-b4a2-9c2b4e9f5c11"
      },
      "meta": {
        "request_id": "7c0f3c2c-9e4a-4d29-b4a2-9c2b4e9f5c11",
        "generated_at": "2026-04-25T18:34:00.000Z"
      }
    }
    

    The Retry-After header is not currently emitted. Use X-RateLimit-Reset to know when the monthly bucket rolls over.

    Reading your usage

    GET /v1/usage returns the full picture: plan, environment, period boundaries, every limit, and current usage + remaining for every dimension. Calling this endpoint never burns request quota and never gets rate-limited (otherwise developers couldn't see why they're throttled).

    See endpoints.md#get-usage for the full shape and an example.

    Internal Travelmode calls

    Travelmode's own service-to-service calls bypass rate-limit checks but are still recorded via the same api_usage_events pipeline. The headers you see on an internal-key response report what the cap would have been if the key were external — useful for debugging how a feature would behave for a real customer.

    Previous
    ← Authentication
    Next
    Endpoints →