geoprimitives

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.

SearchLiveeip155:8453Exactvia cdp
TimezoneIanaDstUtc-offsetH3
Calls · 30d
4↓ 15%
This endpoint's own trailing-30-day call count, as published by the upstream catalog and snapshotted daily. 30 snapshots so far.
$4.43
Verified settled volume
891 settlements proven x402 by their on-chain EIP-3009 marker.
$0.0050
Listed price
As published in the catalog. Always read the live 402 before paying.
4
Calls · 30d
Upstream's own call count for this endpoint, not ours.
4
Unique payers · 30d
Last called 2026-09-20 21:30Z
—
Upstream on-chain volume
Reported by the source catalog.
Paid to
0x76A51b5Dd3729950B3b60c17f19252d221968FCe

The wallet the 402 directs payment to. Its whole payment record — every payer, every chain — is on the merchant page.

Asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913

Provider

The payTo wallet does not resolve to a registered ERC-8004 agent. That is not a verdict on the service — most of the catalog is unregistered.

Accepts

The payment requirements as published to the catalog. Read the live 402 before paying — a price here is a claim, not a quote.

0.005USDC≈ $0.005 USD
on Base · exact scheme

Pay 0.005 USDC on Base to 0x76A5…68FCe. The signed payment is good for 5 minutes.

USD Coin contract
0x8335…02913
Payment window
5 minutes
As published
5000 smallest units
The catalog’s raw entry
[
  {
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "extra": {
      "name": "USD Coin",
      "version": "2"
    },
    "payTo": "0x76A51b5Dd3729950B3b60c17f19252d221968FCe",
    "amount": "5000",
    "scheme": "exact",
    "network": "eip155:8453",
    "maxTimeoutSeconds": 300
  }
]

Extensions

{
  "bazaar": {
    "info": {
      "input": {
        "type": "http",
        "method": "GET",
        "queryParams": {
          "at": "2026-07-04T16:00:00Z",
          "lat": 40.7128,
          "lon": -74.006
        }
      },
      "output": {
        "type": "json",
        "example": {
          "at": "2026-07-04T16:00:00.000Z",
          "cell": "862a1072fffffff",
          "isDST": true,
          "notes": [],
          "query": {
            "lat": 40.7128,
            "lon": -74.006
          },
          "source": "boundary",
          "timezone": "America/New_York",
          "localTime": "2026-07-04T12:00:00-04:00",
          "utcOffset": "-04:00",
          "boundaries": {
            "dataset": "tz_world_mp",
            "license": "CC0-1.0",
            "tzdbVintage": "2016d",
            "h3Resolution": 6,
            "accuracyMetres": 1600
          },
          "abbreviation": "EDT",
          "dstOffsetMinutes": 60,
          "utcOffsetMinutes": -240,
          "standardUtcOffset": "-05:00",
          "standardUtcOffsetMinutes": -300
        }
      }
    },
    "schema": {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "input"
      ],
      "properties": {
        "input": {
          "type": "object",
          "required": [
            "type",
            "method"
          ],
          "properties": {
            "type": {
              "type": "string",
              "const": "http"
            },
            "method": {
              "enum": [
                "GET"
              ],
              "type": "string"
            },
            "queryParams": {
              "type": "object",
              "required": [
                "lat",
                "lon"
              ],
              "properties": {
                "at": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Optional ISO 8601 instant to answer for, e.g. 2026-07-04T16:00:00Z. Defaults to now. Must fall between 1900 and 2100."
                },
                "lat": {
                  "type": "number",
                  "maximum": 90,
                  "minimum": -90,
                  "description": "Latitude in decimal degrees, EPSG:4326. Refused outside -90..90 rather than normalised."
                },
                "lon": {
                  "type": "number",
                  "maximum": 180,
                  "minimum": -180,
                  "description": "Longitude in decimal degrees, EPSG:4326. Refused outside -180..180."
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false
        },
        "output": {
          "type": "object",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string"
            },
            "example": {
              "type": "object"
            }
          }
        }
      }
    }
  }
}

Provenance

Seen in the source catalog
2026-09-20 21:30Z
Last indexed by Roundhouse
2026-09-25 10:50Z
Last enriched (probe, favicon, geo)
2026-09-23 21:15Z
x402 version
2
Max timeout
300s
Liveness probe
HTTP 402
Report

Hand this page to an agent

Copy the prompt and paste it into Claude, an MCP client or your own agent — it will vet this service and call it over the free read API. No key, no account.

GET api.roundhouseai.io/v0/endpoints

This endpoint's own trailing-30-day call count, as published by the upstream catalog and snapshotted daily. 30 snapshots so far. Verified volume counts only settlements with an on-chain EIP-3009 marker.

Open skill.md
Show the prompt
Using Roundhouse, look up the x402 service geoprimitives and tell me whether it is
worth paying: what a call costs, whether the endpoint answered when last probed, and what
its payment record actually shows.

curl -s 'https://api.roundhouseai.io/v0/endpoints?q=geoprimitives'
curl -s 'https://api.roundhouseai.io/v0/merchants/<the payTo wallet returned above>'

Then call it: read the price from the live 402 at https://api.geoprimitives.dev/v1/timezone, never from
a cached figure, and pay with an x402 client.

The /v0 API needs an API key (`authorization: Bearer rh_live_…`) on everything except
/v0/unified* and /v0/endpoints. Mint a personal key for $0.01 at GET https://api.roundhouseai.io/v0/test/x402,
or use an organization key from https://roundhouseai.io/dashboard/team.

If you do not have Roundhouse tools or skills installed, read
https://roundhouseai.io/skill.md first — it is the whole procedure.