Invoket
The checks your agent runs before it acts: verify a bank account, a phone number, a law in force, the weather or a vehicle — computed from official sources, with provenance in every response. You only pay for answers.
The wallet the 402 directs payment to. Its whole payment record — every payer, every chain — is on the merchant page.
Asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
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.
Live 402 challenge
Captured by the enrichment pass, not read just now. Prices can change — always read the 402 the endpoint answers with.
{
"error": "PAYMENT-SIGNATURE header is required. Free trial on request: send the header `X-402-Trial: 1` on this call and on the signed retry to have a free-trial option added to accepts[].",
"accepts": [
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"version": "2"
},
"payTo": "0x4465825B0ac713aA2Fa07Ea29023020804A128ee",
"amount": "10000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 60
}
],
"resource": {
"url": "https://api.invoket.com/weather/forecast",
"tags": [
"compliance",
"verification",
"fraud-prevention",
"regulatory-data",
"weather"
],
"iconUrl": "https://invoket.com/apple-touch-icon.png",
"mimeType": "application/json",
"description": "Before your agent schedules a delivery, plans outdoor work or hedges short-term weather exposure: a point forecast of 2 m temperature, precipitation and 10 m wind — plus opt-in convective, humidity, cloud and snow variables — for any GPS point or city. Deterministic NOAA GFS at 0.25 deg to 16 days (384 h), NOAA GEFS ensemble mean at 0.5 deg to 35 days (840 h) — beyond 16 days the value is an ensemble mean with smoothed extremes: trend, not threshold triggers. The lead selector is optional (omitted, the forecast defaults to the current analysis time) and the response names the model that served it and the exact forecast step.",
"serviceName": "Invoket"
},
"extensions": {
"bazaar": {
"info": {
"input": {
"type": "http",
"method": "GET",
"schema": {
"type": "object",
"required": [],
"properties": {
"city": {
"type": "string",
"description": "Optional on its own - City or place name, resolved against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population (most populous wins). Alias: location. Narrow with country=<ISO 3166 alpha-2>. Alternative: pass lat + lon directly instead. The resolved place is echoed back as data.location."
},
"horizon_h": {
"type": "string",
"description": "Optional. Forecast lead time in hours from the analysis cycle, 0-840 (35 days). Up to 384 h served from the deterministic GFS 0.25 deg run; beyond 384 h from the GEFS ensemble mean at 0.5 deg (an average of 31 members, not a single deterministic scenario: smoothed extremes, so trend rather than threshold triggers). If the target falls beyond the window currently available (its exact end shifts with ingestion cycles), the request is served at the latest available step and the response sets lead.clamped=true with the valid_time actually served. Alternatives (at most one of the three; all omitted defaults to the current analysis time, horizon_h=0): valid_time (RFC 3339 instant — never clamped, out-of-window returns 400) or date (YYYY-MM-DD calendar day, served at 12:00 UTC that day; weekday names like 'Wednesday' are rejected with a 400 that spells out the expected format)."
},
"variables": {
"type": "string",
"description": "Optional. Comma-separated selector of the variable families to return; defines the exact set served (omit it for the default temperature,precipitation,wind). Base families: temperature, precipitation, wind. Opt-in families from the deterministic GFS (<= 384 h only): convective (surface CAPE/CIN plus a qualitative convective_risk — an instability proxy for thunderstorm/hail risk, NOT a calibrated hail probability), humidity (2 m relative humidity), clouds (total cloud cover), snow (snow depth on the ground and whether precipitation is falling as snow). An opt-in family requested beyond 384 h, or missing at the grid cell, is served as a null block with coverage.complete=false naming it — never extrapolated."
}
}
},
"headers": {
"accept": "application/json"
},
"queryParams": {
"city": "Zurich",
"horizon_h": "24",
"variables": "temperature,precipitation,wind,convective,humidity,clouds,snow"
}
},
"output": {
"type": "json",
"schema": {
"type": "object",
"required": [
"data",
"provenance"
],
"properties": {
"data": {
"type": "object",
"required": [
"coverage",
"grid",
"lat",
"lead",
"lon"
],
"properties": {
"lat": {
"type": "number"
},
"lon": {
"type": "number"
},
"date": {
"type": "string"
},
"grid": {
"type": "object",
"required": [
"distance_km",
"lat",
"lon"
],
"properties": {
"lat": {
"type": "number"
},
"lon": {
"type": "number"
},
"distance_km": {
"type": "number"
}
}
},
"lead": {
"type": "object",
"required": [
"cycle",
"horizon_h",
"valid_time"
],
"properties": {
"cycle": {
"type": "string"
},
"clamped": {
"type": "boolean"
},
"horizon_h": {
"type": "integer"
},
"step_time": {
"type": "string"
},
"valid_time": {
"type": "string"
},
"step_offset_secs": {
"type": "integer"
}
},
"description": "Resolved lead: analysis cycle, requested instant, lead hours, and the exact forecast step served; clamped=true when horizon_h was reduced to the latest available step. horizon_h here is recounted from the cycle that served the data (see data.horizon_h). step_offset_secs (signed seconds, step_time minus valid_time, present only when non-zero) is how far the served step sits from the instant asked for: a step covers the interval that follows it, so an unaligned instant is served by the preceding step — up to 4 h on the 6-hourly GEFS tail. Never interpolated between steps; coverage.reason spells the gap out and coverage.complete stays true."
},
"snow": {
"type": "object",
"required": [
"depth_m",
"is_snow"
],
"properties": {
"depth_m": {
"type": [
"number",
"null"
],
"description": "Snow depth on the ground in metres (state, SNOD); distinct from is_snow. null when unavailable at the grid cell"
},
"is_snow": {
"type": [
"boolean",
"null"
],
"description": "Whether precipitation at the served step is falling as snow (GFS categorical CSNOW); distinct from depth_m. null when unavailable at the grid cell"
}
}
},
"wind": {
"type": "object",
"required": [
"direction_deg",
"speed_ms"
],
"properties": {
"speed_ms": {
"type": [
"number",
"null"
]
},
"direction_deg": {
"type": [
"number",
"null"
]
}
}
},
"clouds": {
"type": "object",
"required": [
"total_cover_pct"
],
"properties": {
"total_cover_pct": {
"type": [
"number",
"null"
],
"description": "Total (whole-column) cloud cover in percent; null when unavailable at the grid cell"
}
}
},
"coverage": {
"type": "object",
"required": [
"complete"
],
"properties": {
"reason": {
"type": "string",
"description": "Which requested family could not be served for this point and step, present when 'complete' is false — the block is then served with null values rather than extrapolated"
},
"complete": {
"type": "boolean"
}
}
},
"humidity": {
"type": "object",
"required": [
"relative_pct"
],
"properties": {
"relative_pct": {
"type": [
"number",
"null"
],
"description": "2 m relative humidity in percent; null when unavailable at the grid cell"
}
}
},
"location": {
"type": "object",
"required": [
"admin1",
"country",
"lat",
"lon",
"name",
"source"
],
"properties": {
"lat": {
"type": "number"
},
"lon": {
"type": "number"
},
"name": {
"type": "string"
},
"admin1": {
"type": "string"
},
"source": {
"type": "string"
},
"country": {
"type": "string"
}
},
"description": "Echo of the resolved place when city=/location= was used: name, ISO country, admin1 code and the exact GeoNames coordinates the lookup was served at"
},
"horizon_h": {
"type": "integer",
"description": "Echo of the requested lead time in hours, always counted from the deterministic GFS cycle. Beyond 384 h the answer comes from the GEFS 00Z cycle, structurally one cycle behind, so lead.horizon_h counts more hours from that cycle for the same instant: compare lead.valid_time, not the two horizon counts."
},
"convective": {
"type": "object",
"required": [
"cape_jkg",
"cin_jkg",
"inhibited",
"risk"
],
"properties": {
"risk": {
"type": [
"string",
"null"
],
"description": "Qualitative instability proxy derived from surface CAPE — an instability/thunderstorm-hail-risk proxy, NOT a calibrated hail probability (hail also needs shear, freezing level…). Scale (NWS/SPC conventions, J/kg): none [<100), low [100,1000), moderate [1000,2500), high [2500,4000), extreme [>=4000). null when CAPE is unavailable"
},
"cin_jkg": {
"type": [
"number",
"null"
],
"description": "Convective Inhibition in J/kg (raw, negative or zero); a strong cap suppresses convection despite high CAPE. Secondary: null CIN alone does not degrade coverage"
},
"cape_jkg": {
"type": [
"number",
"null"
],
"description": "Surface-based Convective Available Potential Energy in J/kg (raw GFS value); null when unavailable at the grid cell or beyond the deterministic window"
},
"inhibited": {
"type": [
"boolean",
"null"
],
"description": "True when CIN <= -100 J/kg (a strong cap likely to suppress convection despite instability); reported separately, it never changes the risk category. null when CIN is unavailable"
}
}
},
"valid_time": {
"type": "string"
},
"temperature": {
"type": "object",
"required": [
"celsius"
],
"properties": {
"celsius": {
"type": [
"number",
"null"
]
}
}
},
"precipitation": {
"type": "object",
"required": [
"total_mm"
],
"properties": {
"total_mm": {
"type": [
"number",
"null"
],
"description": "Forecast precipitation for the served step (mm). Beyond 384 h (dataset=gefs) every value served — this one, temperature and wind alike — is a ~30-member ensemble mean: averaging spreads rain across members, so heavy-rain steps and dry steps are largely absent (tail measured 0.4-1.8 mm/day vs 0.0-13.1 on the deterministic segment). Never build a threshold trigger on that range; dataset=gfs is the segment that resolves extremes."
}
}
}
}
},
"provenance": {
"type": "object",
"required": [
"dataset",
"fetched_at",
"freshness",
"source"
],
"properties": {
"source": {
"type": "string",
"description": "Human-readable label of the model that served the response: 'GFS' (deterministic, 0.25 deg, <= 384 h) or 'NOAA GEFS ensemble mean (35-day, 0.5 deg)' beyond — the label spells out that the long-range answer is an ensemble mean, not a deterministic scenario. Written for humans, its exact wording is not part of the contract: branch on provenance.dataset."
},
"dataset": {
"type": "string",
"description": "Stable machine identifier of the model that served the response, one of: gfs (deterministic NOAA GFS 0.25 deg, <= 384 h), gefs (NOAA GEFS ensemble mean 0.5 deg, beyond 384 h). Branch on this field rather than parsing provenance.source, which carries the human-readable label (the GEFS label spells out that it is an ensemble mean) whose wording is not part of the contract."
},
"freshness": {
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string"
}
}
},
"fetched_at": {
"type": "string"
}
}
}
}
},
"example": {
"data": {
"lat": 47.36667,
"lon": 8.55,
"grid": {
"lat": 47.25,
"lon": 8.5,
"distance_km": 12.8
},
"lead": {
"cycle": "2026-07-05T00:00:00+00:00",
"horizon_h": 24,
"step_time": "2026-07-06T00:00:00+00:00",
"valid_time": "2026-07-06T00:00:00+00:00"
},
"snow": {
"depth_m": 0,
"is_snow": false
},
"wind": {
"speed_ms": 2.7,
"direction_deg": 215
},
"clouds": {
"total_cover_pct": 35
},
"coverage": {
"complete": true
},
"humidity": {
"relative_pct": 58
},
"location": {
"lat": 47.36667,
"lon": 8.55,
"name": "Zürich",
"admin1": "ZH",
"source": "GeoNames",
"country": "CH"
},
"horizon_h": 24,
"convective": {
"risk": "low",
"cin_jkg": -18,
"cape_jkg": 640,
"inhibited": false
},
"temperature": {
"celsius": 22.8
},
"precipitation": {
"total_mm": 0
}
},
"provenance": {
"source": "GFS",
"dataset": "gfs",
"freshness": {
"kind": "live"
},
"fetched_at": "2026-07-05T04:35:00Z"
}
}
}
},
"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",
"HEAD",
"DELETE"
],
"type": "string"
},
"schema": {
"type": "object"
},
"headers": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"queryParams": {
"type": "object",
"required": [],
"properties": {
"city": {
"type": "string",
"description": "Optional on its own - City or place name, resolved against the embedded GeoNames cities500 gazetteer: exact name match (case- and accent-insensitive, no fuzzy matching), ties broken by population (most populous wins). Alias: location. Narrow with country=<ISO 3166 alpha-2>. Alternative: pass lat + lon directly instead. The resolved place is echoed back as data.location."
},
"horizon_h": {
"type": "string",
"description": "Optional. Forecast lead time in hours from the analysis cycle, 0-840 (35 days). Up to 384 h served from the deterministic GFS 0.25 deg run; beyond 384 h from the GEFS ensemble mean at 0.5 deg (an average of 31 members, not a single deterministic scenario: smoothed extremes, so trend rather than threshold triggers). If the target falls beyond the window currently available (its exact end shifts with ingestion cycles), the request is served at the latest available step and the response sets lead.clamped=true with the valid_time actually served. Alternatives (at most one of the three; all omitted defaults to the current analysis time, horizon_h=0): valid_time (RFC 3339 instant — never clamped, out-of-window returns 400) or date (YYYY-MM-DD calendar day, served at 12:00 UTC that day; weekday names like 'Wednesday' are rejected with a 400 that spells out the expected format)."
},
"variables": {
"type": "string",
"description": "Optional. Comma-separated selector of the variable families to return; defines the exact set served (omit it for the default temperature,precipitation,wind). Base families: temperature, precipitation, wind. Opt-in families from the deterministic GFS (<= 384 h only): convective (surface CAPE/CIN plus a qualitative convective_risk — an instability proxy for thunderstorm/hail risk, NOT a calibrated hail probability), humidity (2 m relative humidity), clouds (total cloud cover), snow (snow depth on the ground and whether precipitation is falling as snow). An opt-in family requested beyond 384 h, or missing at the grid cell, is served as a null block with coverage.complete=false naming it — never extrapolated."
}
}
}
},
"additionalProperties": false
},
"output": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string"
},
"example": {
"type": "object"
}
}
}
}
}
}
},
"x402Version": 2
}Accepts
The payment requirements as published to the catalog. Read the live 402 before paying — a price here is a claim, not a quote.
Pay 0.01 USDC on Base to 0x4465…128ee. The signed payment is good for 1 minute.
- Paid to
- 0x4465…128ee
- USD Coin contract
- 0x8335…02913
- Payment window
- 1 minute
- As published
- 10000 smallest units
The catalog’s raw entry
[
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"version": "2"
},
"payTo": "0x4465825B0ac713aA2Fa07Ea29023020804A128ee",
"amount": "10000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 60
}
]Extensions
{
"bazaar": {
"info": {
"input": {
"type": "http",
"method": "GET",
"headers": {
"accept": "application/json"
},
"queryParams": {
"city": "Zurich",
"horizon_h": "24",
"variables": "temperature,precipitation,wind,convective,humidity,clouds,snow"
}
},
"output": {
"type": "json"
}
},
"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",
"HEAD",
"DELETE"
],
"type": "string"
},
"schema": {
"type": "object"
},
"headers": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"queryParams": {
"type": "object",
"required": [],
"properties": {
"city": {
"type": "string"
},
"horizon_h": {
"type": "string"
},
"variables": {
"type": "string"
}
}
}
},
"additionalProperties": false
},
"output": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string"
},
"example": {
"type": "object"
}
}
}
}
}
}
}Provenance
- Seen in the source catalog
- 2026-09-14 18:44Z
- Last indexed by Roundhouse
- 2026-09-24 12:50Z
- Last enriched (probe, favicon, geo)
- 2026-09-13 01:45Z
- x402 version
- 2
- Max timeout
- 60s
- Liveness probe
- HTTP 402
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.
Show the promptHide the prompt
Using Roundhouse, look up the x402 service Invoket 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=Invoket' 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.invoket.com/weather/forecast, 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.