{"openapi":"3.1.0","info":{"title":"ScrapeMole Pulse: FX rates (ECB), currency conversion, time zones, weather forecasts and Hacker News for AI agents","version":"1.0.0","description":"Pay-per-call \"state of the world\" lookups that language models cannot know on their own: official ECB exchange rates (latest, historical, conversion), the current time and DST-aware time-zone conversion for scheduling, global weather forecasts (MET Norway, by coordinates or place name) and the live Hacker News front page. Public, non-personal data with sources and licences in every response. USDC via x402, no accounts.\n\nPayments: x402 v2, scheme \"exact\", USDC on Base (eip155:8453). The payment is verified before the work and settled only when the response is 200. Terms: https://pulse.scrapemole.workers.dev/terms","contact":{"email":"edgaras@mail.grokbot.com","url":"https://scrapemole.pages.dev"},"x-guidance":"Call any /v1 endpoint without payment to receive a 402 with the exact price, then retry with an x402 client (e.g. @x402/fetch). 4xx/5xx responses are never charged."},"servers":[{"url":"https://pulse.scrapemole.workers.dev"}],"components":{"securitySchemes":{"x402":{"type":"http","scheme":"x402","description":"HTTP 402 payment with USDC via the x402 protocol."}}},"paths":{"/v1/fx/latest":{"get":{"operationId":"fxLatest","summary":"Latest official ECB foreign exchange reference rates for ~30 currencies against any base currency (EUR, USD, GBP, JPY…), with the rate date.","description":"Use when you need a current, citable exchange rate: returns the latest European Central Bank reference rates (published once per working day around 16:00 CET) for about 30 major currencies, re-based to any supported currency, optionally filtered to the symbols you need. Includes the rate date so you know how fresh it is. Not for trading; for pricing, reporting, invoicing and conversions.","tags":["fx","exchange-rates","currency","finance","ecb"],"parameters":[{"name":"base","in":"query","required":false,"description":"Base currency (ISO 4217).","schema":{"type":"string","default":"EUR","examples":["USD"]}},{"name":"symbols","in":"query","required":false,"description":"Comma-separated target currencies; all ~30 if omitted.","schema":{"type":"string","examples":["EUR,GBP,JPY"]}}],"security":[{"x402":[]}],"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.001","currency":"USD","network":"eip155:8453","networks":["eip155:8453"],"asset":"USDC"},"responses":{"200":{"description":"Result (the payment settles only for this status).","content":{"application/json":{"example":{"base":"USD","date":"2026-10-09","rates":{"EUR":0.89238,"GBP":0.75641,"JPY":152.31},"source":"European Central Bank euro foreign exchange reference rates (via Frankfurter, https://frankfurter.dev)","sourceUrl":"https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html","note":"ECB reference rates are published around 16:00 CET on TARGET working days; they are for information, not for transactions."}}}},"400":{"description":"Invalid input. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"402":{"description":"Payment required (x402). The PAYMENT-REQUIRED header (mirrored in the body) carries price, network and payTo."},"404":{"description":"Not found / no data. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"502":{"description":"Upstream error. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"504":{"description":"Upstream timeout. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}}}}},"/v1/fx/convert":{"get":{"operationId":"fxConvert","summary":"Convert an amount between two currencies at the latest or a historical ECB reference rate (any working day since 1999).","description":"Use to convert money amounts for quotes, invoices, expense reports or price comparisons: converts an amount from one currency to another at the ECB reference rate of the latest working day or of a given past date (rates since 1999-01-04; weekends/holidays fall back to the previous working day). Returns the converted amount, the rate used and the rate date.","tags":["fx","currency-conversion","exchange-rates","finance"],"parameters":[{"name":"from","in":"query","required":true,"description":"Source currency (ISO 4217).","schema":{"type":"string","examples":["USD"]}},{"name":"to","in":"query","required":true,"description":"Target currency (ISO 4217).","schema":{"type":"string","examples":["EUR"]}},{"name":"amount","in":"query","required":false,"description":"Amount to convert (default 1).","schema":{"type":"string","examples":["250"]}},{"name":"date","in":"query","required":false,"description":"Historical date YYYY-MM-DD (default latest).","schema":{"type":"string"}}],"security":[{"x402":[]}],"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.001","currency":"USD","network":"eip155:8453","networks":["eip155:8453"],"asset":"USDC"},"responses":{"200":{"description":"Result (the payment settles only for this status).","content":{"application/json":{"example":{"from":"USD","to":"EUR","amount":250,"result":223.1,"rate":0.89238,"date":"2026-10-09","source":"European Central Bank euro foreign exchange reference rates (via Frankfurter, https://frankfurter.dev)","sourceUrl":"https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html","note":"ECB reference rates are published around 16:00 CET on TARGET working days; they are for information, not for transactions."}}}},"400":{"description":"Invalid input. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"402":{"description":"Payment required (x402). The PAYMENT-REQUIRED header (mirrored in the body) carries price, network and payTo."},"404":{"description":"Not found / no data. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"502":{"description":"Upstream error. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"504":{"description":"Upstream timeout. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}}}}},"/v1/fx/history":{"get":{"operationId":"fxHistory","summary":"Daily ECB reference rate time series between two dates (up to 1 year) for chosen currencies, plus min/max/first/last per currency.","description":"Use for trend questions (\"how did USD/EUR move this quarter?\") and for back-dated conversions: returns daily ECB reference rates for each working day between start and end (max 366 days) for the requested currencies, re-based to any base, with per-currency first, last, min, max and percent change.","tags":["fx","exchange-rates","time-series","finance"],"parameters":[{"name":"start","in":"query","required":true,"description":"Start date YYYY-MM-DD.","schema":{"type":"string","examples":["2026-09-01"]}},{"name":"end","in":"query","required":false,"description":"End date YYYY-MM-DD (default today).","schema":{"type":"string"}},{"name":"base","in":"query","required":false,"description":"Base currency.","schema":{"type":"string","default":"EUR","examples":["USD"]}},{"name":"symbols","in":"query","required":true,"description":"Comma-separated currencies (max 10).","schema":{"type":"string","examples":["EUR,GBP"]}}],"security":[{"x402":[]}],"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.002","currency":"USD","network":"eip155:8453","networks":["eip155:8453"],"asset":"USDC"},"responses":{"200":{"description":"Result (the payment settles only for this status).","content":{"application/json":{"example":{"base":"USD","start":"2026-09-01","end":"2026-10-09","days":28,"stats":{"EUR":{"first":0.9012,"last":0.8924,"min":0.8899,"max":0.9055,"changePct":-0.98}},"series":[{"date":"2026-09-01","rates":{"EUR":0.9012,"GBP":0.7655}}],"source":"European Central Bank euro foreign exchange reference rates (via Frankfurter, https://frankfurter.dev)","sourceUrl":"https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html","note":"ECB reference rates are published around 16:00 CET on TARGET working days; they are for information, not for transactions."}}}},"400":{"description":"Invalid input. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"402":{"description":"Payment required (x402). The PAYMENT-REQUIRED header (mirrored in the body) carries price, network and payTo."},"404":{"description":"Not found / no data. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"502":{"description":"Upstream error. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"504":{"description":"Upstream timeout. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}}}}},"/v1/time/now":{"get":{"operationId":"timeNow","summary":"Current local date, time, weekday, UTC offset and DST flag in up to 20 IANA time zones at once.","description":"Use when an agent needs the real current time somewhere (models do not know \"now\"): returns the authoritative current UTC instant and, for each requested IANA time zone, the local date/time, weekday, UTC offset, abbreviation and whether daylight saving time is in effect. Computed from the IANA tz database, no upstream dependency.","tags":["time","timezone","clock","dst","utilities"],"parameters":[{"name":"tz","in":"query","required":false,"description":"Comma-separated IANA zones (max 20).","schema":{"type":"string","default":"UTC","examples":["Europe/Vilnius,America/New_York,Asia/Tokyo"]}}],"security":[{"x402":[]}],"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.001","currency":"USD","network":"eip155:8453","networks":["eip155:8453"],"asset":"USDC"},"responses":{"200":{"description":"Result (the payment settles only for this status).","content":{"application/json":{"example":{"utc":"2026-10-12T07:30:00.000Z","unix":1791790200,"zones":[{"timeZone":"Europe/Vilnius","local":"2026-10-12T10:30:00+03:00","date":"2026-10-12","time":"10:30:00","weekday":"Monday","utcOffset":"+03:00","abbreviation":"GMT+3","dst":true}],"source":"IANA time zone database"}}}},"400":{"description":"Invalid input. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"402":{"description":"Payment required (x402). The PAYMENT-REQUIRED header (mirrored in the body) carries price, network and payTo."},"404":{"description":"Not found / no data. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"502":{"description":"Upstream error. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"504":{"description":"Upstream timeout. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}}}}},"/v1/time/convert":{"get":{"operationId":"timeConvert","summary":"Convert a local date-time from one IANA time zone to others (DST-aware), e.g. \"2026-11-03 15:00 in New York\" to Vilnius and Tokyo.","description":"Use for scheduling across time zones: takes a wall-clock time in a source zone (or an ISO instant with offset) and returns the same instant in each target zone with date, weekday, UTC offset and DST flag, plus the UTC instant. Handles daylight-saving transitions correctly (times in a spring-forward gap move to the first valid instant and are flagged).","tags":["time","timezone","scheduling","meetings","dst"],"parameters":[{"name":"time","in":"query","required":true,"description":"Local time \"YYYY-MM-DD HH:MM[:SS]\" in \"from\", or an ISO instant with Z/offset.","schema":{"type":"string","examples":["2026-11-03 15:00"]}},{"name":"from","in":"query","required":false,"description":"IANA zone of \"time\" (ignored if time has an offset).","schema":{"type":"string","default":"UTC","examples":["America/New_York"]}},{"name":"to","in":"query","required":true,"description":"Comma-separated target IANA zones (max 20).","schema":{"type":"string","examples":["Europe/Vilnius,Asia/Tokyo"]}}],"security":[{"x402":[]}],"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.001","currency":"USD","network":"eip155:8453","networks":["eip155:8453"],"asset":"USDC"},"responses":{"200":{"description":"Result (the payment settles only for this status).","content":{"application/json":{"example":{"input":{"time":"2026-11-03 15:00","from":"America/New_York"},"utc":"2026-11-03T20:00:00.000Z","source":{"timeZone":"America/New_York","local":"2026-11-03T15:00:00-05:00","utcOffset":"-05:00","dst":false},"targets":[{"timeZone":"Europe/Vilnius","local":"2026-11-03T22:00:00+02:00","weekday":"Tuesday","utcOffset":"+02:00","dst":false}]}}}},"400":{"description":"Invalid input. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"402":{"description":"Payment required (x402). The PAYMENT-REQUIRED header (mirrored in the body) carries price, network and payTo."},"404":{"description":"Not found / no data. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"502":{"description":"Upstream error. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"504":{"description":"Upstream timeout. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}}}}},"/v1/weather":{"get":{"operationId":"weather","summary":"Current conditions and hourly forecast (up to 48 h) plus daily min/max/precipitation (up to 9 days) for any coordinates or place name worldwide.","description":"Use for trip planning, logistics, event or outdoor decisions: returns the forecast for a location from the Norwegian Meteorological Institute (global coverage): current temperature, wind, humidity, cloud cover, pressure and symbol, an hourly series for the next N hours, and daily summaries (min/max temperature, total precipitation, dominant symbol). Give lat/lon, or a place name resolved via Wikidata. Times are UTC. Licensed CC BY 4.0: credit MET Norway.","tags":["weather","forecast","climate","travel","geo"],"parameters":[{"name":"place","in":"query","required":false,"description":"Place name (city, landmark), resolved via Wikidata. Give place or lat+lon.","schema":{"type":"string","examples":["Vilnius"]}},{"name":"lat","in":"query","required":false,"description":"Latitude -90..90.","schema":{"type":"string"}},{"name":"lon","in":"query","required":false,"description":"Longitude -180..180.","schema":{"type":"string"}},{"name":"hours","in":"query","required":false,"description":"Hourly points to return (1-48).","schema":{"type":"string","default":"24"}}],"security":[{"x402":[]}],"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.002","currency":"USD","network":"eip155:8453","networks":["eip155:8453"],"asset":"USDC"},"responses":{"200":{"description":"Result (the payment settles only for this status).","content":{"application/json":{"example":{"location":{"name":"Vilnius","lat":54.6872,"lon":25.2797,"wikidataId":"Q216"},"updatedAt":"2026-10-12T06:29:36Z","units":{"temperature":"celsius","wind":"m/s","precipitation":"mm"},"now":{"time":"2026-10-12T07:00:00Z","temperatureC":7.4,"windMs":3.1,"humidityPct":88,"cloudPct":95,"symbol":"cloudy"},"hourly":[{"time":"2026-10-12T08:00:00Z","temperatureC":8,"precipitationMm":0,"symbol":"cloudy"}],"daily":[{"date":"2026-10-12","minC":5.1,"maxC":11.2,"precipitationMm":0.4,"symbol":"partlycloudy_day"}],"attribution":{"source":"MET Norway Locationforecast 2.0 (https://api.met.no)","license":"CC BY 4.0 (data: The Norwegian Meteorological Institute)","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","credit":"Weather data from MET Norway"}}}}},"400":{"description":"Invalid input. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"402":{"description":"Payment required (x402). The PAYMENT-REQUIRED header (mirrored in the body) carries price, network and payTo."},"404":{"description":"Not found / no data. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"502":{"description":"Upstream error. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"504":{"description":"Upstream timeout. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}}}}},"/v1/news/hn":{"get":{"operationId":"hn","summary":"Current Hacker News front page, newest, best, Ask HN, Show HN or job stories: title, link, domain, points, comment count, age and discussion URL.","description":"Use to see what the tech/startup community is reading right now or to monitor launches: returns up to 30 stories from one Hacker News list (top = front page, new, best, ask, show, job) via the official HN API, each with title, external URL and domain, score, comment count, posted time and the news.ycombinator.com discussion link. Usernames are omitted (non-personal data). For full-text HN search and complete comment threads use ScrapeMole Social: https://social.scrapemole.workers.dev/v1/hn/search and /v1/hn/thread.","tags":["news","hacker-news","tech-news","startups","trends"],"parameters":[{"name":"list","in":"query","required":false,"description":"top, new, best, ask, show or job.","schema":{"type":"string","default":"top","examples":["top"]}},{"name":"limit","in":"query","required":false,"description":"Stories to return (1-30).","schema":{"type":"string","default":"10","examples":["10"]}}],"security":[{"x402":[]}],"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.002","currency":"USD","network":"eip155:8453","networks":["eip155:8453"],"asset":"USDC"},"responses":{"200":{"description":"Result (the payment settles only for this status).","content":{"application/json":{"example":{"list":"top","count":1,"stories":[{"rank":1,"id":41234567,"title":"Show HN: A pay-per-call API for agents","url":"https://example.org/post","domain":"example.org","points":312,"comments":141,"postedAt":"2026-10-12T05:01:00Z","discussionUrl":"https://news.ycombinator.com/item?id=41234567"}],"source":"Hacker News API (https://github.com/HackerNews/API)"}}}},"400":{"description":"Invalid input. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"402":{"description":"Payment required (x402). The PAYMENT-REQUIRED header (mirrored in the body) carries price, network and payTo."},"404":{"description":"Not found / no data. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"502":{"description":"Upstream error. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}},"504":{"description":"Upstream timeout. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"charged":{"type":"boolean","const":false}}}}}}}}}}}}}