api.geoprimitives.dev

https://api.geoprimitives.dev/v1/timezone

Shares a payout wallet with 20 other endpoints — its adoption is attributed from that shared wallet's traffic, not earned exclusively.

Give it a longitude and latitude and it answers with the IANA timezone identifier (America/New_York), the UTC offset in force there right now, whether daylight saving is currently in effect and by how much, the local wall-clock time, and the zone's standard offset. Pass an optional ISO 8601 `at` instant to ask about any moment between 1900 and 2100 instead of now, which is what you want when scheduling something months out across a DST boundary. Parameters go in the query string: this is a GET, there is no body. Two halves, with different vintages, and the difference matters. The offset and the DST rules come from the runtime's own timezone database and are current: a rule change reaches this endpoint when Cloudflare updates ICU, with no redeploy here. The *boundaries* come from tz_world (efele.net), CC0 1.0 and derived from VMAP0, a public-domain US government product. That map was frozen at tzdb 2016d in May 2016, and this catalog sells public-domain and permissively-licensed data only, which is why it is used rather than the current OpenStreetMap-derived alternative. What the vintage costs, measured against IANA's own coordinates for all 312 zones in zone1970.tab rather than estimated: 293 agree. Of the 19 that do not, 7 are Antarctic research stations, which this map does not cover at all and which fall back to the open-water rule; 7 more return a different identifier for the identical offset and DST all year (Australia/Brisbane for Australia/Lindeman, America/Regina for America/Swift_Current, and five like them), so the time is right and only the name is old. That leaves four regions where the answer is up to one hour wrong because the zone was split after 2016: Chilean Magallanes and Aysen (answered as America/Santiago rather than America/Punta_Arenas or America/Coyhaique), the Mexican border municipalities around Ciudad Juarez, Saratov Oblast in Russia, and the weeks each spring when Asia/Hebron and Asia/Jerusalem change on different dates. If you query inside one of those, do not trust this endpoint. Boundary precision is a separate question from vintage. The map is indexed as compacted H3 cells at resolution 6, whose half-width is about 1.6 km, chosen to match VMAP0's own stated positional accuracy of roughly 2 km rather than to flatter the index. So a point within a couple of kilometres of a zone border may be attributed to the neighbour, and no amount of the source's precision would fix that because the source does not have it. Away from a border the answer is exact. Every answer says where it came from under `source`. `boundary` means the point is inside a mapped timezone polygon and is the answer you are paying for. `coastal` means it is over water or on land this map does not cover, and the identifier is the nearest zone within about 60 km -- correct for a harbour or a coastal city whose coordinate falls just offshore, and not a boundary result. `nautical` means open water more than about 60 km from mapped land, answered with the tz database's own rule for international waters, meridians 15 degrees apart; it is not the time kept aboard any vessel and it ignores territorial waters. Longitude and latitude are checked against EPSG:4326 bounds before anything else touches them, because H3 silently normalises an out-of-range latitude into a real but wrong cell rather than refusing it. Reproject with POST /v1/transform first if you are not already in WGS 84. The DST flag is decided on offsets rather than on the tz database's own isdst bit, so Europe/Dublin reads as daylight saving in summer like everywhere else, and it is measured over a window either side of the instant so that a zone which changes its standard offset mid-year -- Asia/Almaty in 2024 -- is not mistaken for one on daylight saving.

56
reliability

Reliability & health

Uptime and response time from our own unpaid probes, plus the reliability score built from them.

Uptime

100.0% avg
0% 50% 100% Fri 7 PMFri 8 PMFri 9 PMFri 10 PM

Response time

p50 296ms · p95 468ms
0ms 250ms 500ms Fri 7 PMFri 8 PMFri 9 PMFri 10 PM
Data table
Reliability history per time bucket over the last 7 days (hourly).
Bucket Uptime Probes Response time
8/21/2026, 7:00:00 PM 100% 1 8ms
8/21/2026, 8:00:00 PM 100% 1 488ms
8/21/2026, 9:00:00 PM 100% 1 237ms
8/21/2026, 10:00:00 PM 100% 1 356ms
56
Composite reliability — the weighted average of the dimensions below, on a 0–100 scale.
Availability
100

How often it was reachable when we probed it (weight 35%).

Latency
100

How quickly it answers when it is up — fast scores high (weight 20%).

Security
100

Whether it serves over working TLS / https (weight 15%).

Transparency
61

Whether the operator disclosed what it does — description, schema, identity (weight 15%).

Activity
1

Observed on-chain payments to this endpoint's wallet — transactions, volume, and distinct paying wallets over the last month (weight 15%; not yet measured when we have not seen its wallet settle).

Confidence 8% — how much probe evidence backs this score. A thin history is flagged, not hidden.

See the scoring methodology for exactly how each number is computed.

Payment

Currencies
USDC
Networks
base
Facilitator
unknown
SDK
unknown

Operator

Company
inferred — unknown
Jurisdiction
Registrar
CloudFlare, Inc.
Domain registered
2026-08-20
Hosting network
CLOUDFLARENET
Hosting country

Operator context is derived from public RDAP/TLS records and unverified. Company and country are only available for endpoints that publish them (an OV/EV TLS certificate or a non-redacted domain record); most endpoints are CDN-fronted and disclose neither.

On-chain activity (base)

33
payments (30d)
0.23
USD volume (30d)
1
paying wallets (30d)

Payments per day

last payment 8/21/2026
0 20 40 Aug 21
Data table
Settled payments per day.
Day Payments Volume (USD) Paying wallets
8/21/2026 33 0.23 1

This payout wallet is shared: figures cover all 21 endpoints paid at it, since payments cannot be attributed to one of them. Only payments settled on chains and facilitators we index.

Response schema
{
  "additionalProperties": false,
  "properties": {
    "abbreviation": {
      "description": "Short name as the runtime spells it in English: \"EST\", \"GMT+5:45\". Null if it has none.",
      "type": [
        "string",
        "null"
      ]
    },
    "at": {
      "description": "The instant answered for, ISO 8601 UTC. Echoed.",
      "type": "string"
    },
    "boundaries": {
      "additionalProperties": false,
      "description": "Provenance, on every response, because a buyer cannot inspect it from outside.",
      "properties": {
        "accuracyMetres": {
          "description": "Half-width of one cell at that resolution.",
          "type": "integer"
        },
        "dataset": {
          "type": "string"
        },
        "h3Resolution": {
          "type": "integer"
        },
        "license": {
          "type": "string"
        },
        "tzdbVintage": {
          "description": "The tzdb release the boundary map was cut against.",
          "type": "string"
        }
      },
      "required": [
        "dataset",
        "license",
        "tzdbVintage",
        "h3Resolution",
        "accuracyMetres"
      ],
      "type": "object"
    },
    "cell": {
      "description": "The H3 cell the lookup resolved through, at resolution 6. Null for a nautical answer. Two points in the same cell always get the same zone, so it is also a cache key.",
      "type": [
        "string",
        "null"
      ]
    },
    "dstOffsetMinutes": {
      "description": "How far advanced, in minutes. 0 when isDST is false. 30 in Lord Howe.",
      "type": "integer"
    },
    "isDST": {
      "description": "Are the clocks advanced at `at` relative to this zone's own standard time? Decided on offsets, not on tzdb's isdst bit.",
      "type": "boolean"
    },
    "localTime": {
      "description": "The zone's wall clock at `at`, ISO 8601 with the offset attached.",
      "type": "string"
    },
    "notes": {
      "description": "Anything worth knowing about this particular answer. Empty for an ordinary boundary result; populated for a coastal or nautical one.",
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "query": {
      "additionalProperties": false,
      "description": "The coordinate as parsed, echoed back.",
      "properties": {
        "lat": {
          "type": "number"
        },
        "lon": {
          "type": "number"
        }
      },
      "required": [
        "lat",
        "lon"
      ],
      "type": "object"
    },
    "source": {
      "description": "boundary: inside a mapped timezone polygon. coastal: nearest zone within about 60 km, for a point over water. nautical: open water, answered by the 15-degree meridian rule.",
      "enum": [
        "boundary",
        "coastal",
        "nautical"
      ],
      "type": "string"
    },
    "standardUtcOffset": {
      "description": "Standard-time offset as \"+HH:MM\".",
      "type": "string"
    },
    "standardUtcOffsetMinutes": {
      "description": "Standard-time offset in minutes.",
      "type": "integer"
    },
    "timezone": {
      "description": "IANA timezone identifier, e.g. America/New_York. Always one the runtime's own timezone database resolves.",
      "type": "string"
    },
    "utcOffset": {
      "description": "Offset in force at `at`, as \"+HH:MM\".",
      "type": "string"
    },
    "utcOffsetMinutes": {
      "description": "The same offset in whole minutes east of UTC. Negative west of it.",
      "type": "integer"
    }
  },
  "required": [
    "timezone",
    "utcOffset",
    "utcOffsetMinutes",
    "isDST",
    "dstOffsetMinutes",
    "standardUtcOffset",
    "standardUtcOffsetMinutes",
    "abbreviation",
    "localTime",
    "at",
    "source",
    "cell",
    "query",
    "boundaries",
    "notes"
  ],
  "type": "object"
}