2s · AsyncAPI Specification
2S Io Watchers Webhooks
Version
View Spec
View on GitHub
AgentsAgentic Commercex402MCPA2APublic RecordsGovernment DataFinanceCryptoSecurityLegalWeatherGeocodingEDIAI GatewayAgent InfrastructureWebhookAgent-NativeAsyncAPIEvents
Channels
watchers
schedules
pubsub
AsyncAPI Specification
generated: '2026-09-19'
method: derived
source: openapi/2s-io-openapi.json (live https://2s.io/openapi.json, 2026-09-19) and https://2s.io/llms.txt
spec_type: webhook-catalog
asyncapi_published: false
docs:
- https://2s.io/watchers
- https://2s.io/llms.txt#watchers--get-a-callback-dont-poll
- https://2s.io/.well-known/2s-attestation.json
summary: '2s publishes no AsyncAPI document (no /asyncapi.yaml or .json, nothing in the GitHub org), so none is
saved and none is fabricated. It does publish a real outbound-callback surface in its OpenAPI and llms.txt: 26
watcher kinds (arm once, get an EIP-191-signed HTTP POST when the world changes), a time-driven schedule primitive,
and a consent-gated pub/sub with fan-out to subscriber URLs. This file captures that catalog verbatim from the
contract so the event surface is scored; it is a webhook catalog, not an AsyncAPI.'
delivery:
transport: HTTPS POST to a caller-supplied callbackUrl (any http(s) URL)
signing: EIP-191 personal_sign by the provider's published key — "verify offline"; header X-2s-Signature (named
in pubsub_subscribe)
retries: exponential backoff; a pub/sub subscriber that repeatedly fails delivery is auto-disabled
pull_backstop: watchers_status returns recent deliveries (HTTP result, attempt count) and any UNDELIVERED events
with full bodies; schedule_status likewise
payload: caller-supplied payload JSON echoed verbatim in every callback (+ scheduleId, fireNumber, firedAt on
schedules)
confirmation: 'pub/sub only — a one-time challenge POST carrying X-2s-Confirmation-Token and {type: "2s_subscription_confirmation",
token}; the endpoint must reply 2xx with that token before it receives messages'
schema_published: false
note: The callback BODY schema is not declared anywhere in the contract — only that it carries the echoed payload
and is signed. An AsyncAPI would be the natural place for it and does not exist.
pricing:
watcher: $0.125 flat per arm; default 30-day / 25-fire window, max 90 days / 1,000 fires; cancel refunds nothing
schedule: $0.125 per create; default+max 90 days; maxFires default 25, max 1000
pubsub: $0.005 per subscribe/publish/create-topic call
management: watchers_cancel $0.0025; watchers_status read-priced
channels:
watchers:
count: 25
manage:
- watchers_status (GET, pull backstop)
- watchers_cancel (POST, idempotent)
events:
- id: watchers.business-earnings
operationId: watchers_business-earnings
path: /api/watchers/business-earnings
price_usd: 0.125
summary: 'WATCHER: get a signed callback around a US company''s earnings.'
trigger: 'WATCHER: get a signed callback around a US company''s earnings'
arm_fields:
- ticker
- trigger
- daysBefore
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- ticker
- callbackUrl
- id: watchers.company-news
operationId: watchers_company-news
path: /api/watchers/company-news
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a new news article is...'
trigger: 'WATCHER: get a signed callback when a new news article is published about a US company'
arm_fields:
- ticker
- keyword
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- ticker
- callbackUrl
- id: watchers.crypto-address-activity
operationId: watchers_crypto-address-activity
path: /api/watchers/crypto-address-activity
price_usd: 0.125
summary: 'WATCHER: get a signed callback the moment a crypto address...'
trigger: 'WATCHER: get a signed callback the moment a crypto address transacts'
arm_fields:
- chain
- address
- callbackUrl
- direction
- assetTypes
- minValueUsd
- payload
- expiresInSeconds
- maxFires
- label
required:
- chain
- address
- callbackUrl
- id: watchers.dns
operationId: watchers_dns
path: /api/watchers/dns
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a host''s DNS records...'
trigger: 'WATCHER: get a signed callback when a host''s DNS records change'
arm_fields:
- host
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- host
- callbackUrl
- id: watchers.earthquake
operationId: watchers_earthquake
path: /api/watchers/earthquake
price_usd: 0.125
summary: 'WATCHER: get a signed callback when USGS reports a new...'
trigger: 'WATCHER: get a signed callback when USGS reports a new earthquake near a location above a magnitude'
arm_fields:
- lat
- lon
- radiusKm
- minMagnitude
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- lat
- lon
- callbackUrl
- id: watchers.fear-greed
operationId: watchers_fear-greed
path: /api/watchers/fear-greed
price_usd: 0.125
summary: 'WATCHER: get a signed callback when the Crypto Fear & Greed...'
trigger: 'WATCHER: get a signed callback when the Crypto Fear & Greed index crosses a level (e.g'
arm_fields:
- conditionType
- threshold
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- conditionType
- threshold
- callbackUrl
- id: watchers.federal-register
operationId: watchers_federal-register
path: /api/watchers/federal-register
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a new US Federal...'
trigger: 'WATCHER: get a signed callback when a new US Federal Register document is published'
arm_fields:
- type
- agency
- keyword
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- callbackUrl
- id: watchers.flight-status
operationId: watchers_flight-status
path: /api/watchers/flight-status
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a flight''s status...'
trigger: 'WATCHER: get a signed callback when a flight''s status changes (e.g'
arm_fields:
- ident
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- ident
- callbackUrl
- id: watchers.fred-series
operationId: watchers_fred-series
path: /api/watchers/fred-series
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a FRED economic series''...'
trigger: 'WATCHER: get a signed callback when a FRED economic series'' latest value crosses a level'
arm_fields:
- seriesId
- conditionType
- threshold
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- seriesId
- conditionType
- threshold
- callbackUrl
- id: watchers.funding-rate
operationId: watchers_funding-rate
path: /api/watchers/funding-rate
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a Hyperliquid...'
trigger: 'WATCHER: get a signed callback when a Hyperliquid perpetual''s hourly funding rate crosses a level
(e.g'
arm_fields:
- coin
- conditionType
- threshold
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- coin
- conditionType
- threshold
- callbackUrl
- id: watchers.fx-rate
operationId: watchers_fx-rate
path: /api/watchers/fx-rate
price_usd: 0.125
summary: 'WATCHER: get a signed callback when an FX pair crosses a...'
trigger: 'WATCHER: get a signed callback when an FX pair crosses a rate you set'
arm_fields:
- base
- quote
- conditionType
- threshold
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- base
- quote
- conditionType
- threshold
- callbackUrl
- id: watchers.gas-price
operationId: watchers_gas-price
path: /api/watchers/gas-price
price_usd: 0.125
summary: 'WATCHER: get a signed callback when EVM gas crosses a level...'
trigger: 'WATCHER: get a signed callback when EVM gas crosses a level you set — e.g'
arm_fields:
- chain
- conditionType
- threshold
- tier
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- chain
- conditionType
- threshold
- callbackUrl
- id: watchers.http-headers
operationId: watchers_http-headers
path: /api/watchers/http-headers
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a website''s HTTP...'
trigger: 'WATCHER: get a signed callback when a website''s HTTP security-headers grade changes (e.g'
arm_fields:
- url
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- url
- callbackUrl
- id: watchers.ioc-reputation
operationId: watchers_ioc-reputation
path: /api/watchers/ioc-reputation
price_usd: 0.125
summary: 'WATCHER: get a signed callback when an indicator of...'
trigger: 'WATCHER: get a signed callback when an indicator of compromise (IP or domain) changes malicious
status across threat feeds'
arm_fields:
- ioc
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- ioc
- callbackUrl
- id: watchers.ipo
operationId: watchers_ipo
path: /api/watchers/ipo
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a new US IPO appears on...'
trigger: 'WATCHER: get a signed callback when a new US IPO appears on the calendar'
arm_fields:
- keyword
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- callbackUrl
- id: watchers.package-release
operationId: watchers_package-release
path: /api/watchers/package-release
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a package publishes a...'
trigger: 'WATCHER: get a signed callback when a package publishes a new version — track your dependencies'
arm_fields:
- registry
- name
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- registry
- name
- callbackUrl
- id: watchers.paper
operationId: watchers_paper
path: /api/watchers/paper
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a new academic paper...'
trigger: 'WATCHER: get a signed callback when a new academic paper matching your query is published (arXiv
/ PubMed / Semantic Scholar)'
arm_fields:
- query
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- query
- callbackUrl
- id: watchers.patent
operationId: watchers_patent
path: /api/watchers/patent
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a new USPTO patent...'
trigger: 'WATCHER: get a signed callback when a new USPTO patent matching your query appears'
arm_fields:
- query
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- query
- callbackUrl
- id: watchers.prediction-market
operationId: watchers_prediction-market
path: /api/watchers/prediction-market
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a Polymarket outcome''s...'
trigger: 'WATCHER: get a signed callback when a Polymarket outcome''s implied probability crosses a level'
arm_fields:
- conditionId
- outcomeIndex
- conditionType
- threshold
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- conditionId
- conditionType
- threshold
- callbackUrl
- id: watchers.product-recall
operationId: watchers_product-recall
path: /api/watchers/product-recall
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a new US product recall...'
trigger: 'WATCHER: get a signed callback when a new US product recall is published (CPSC)'
arm_fields:
- keyword
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- callbackUrl
- id: watchers.sec-filing
operationId: watchers_sec-filing
path: /api/watchers/sec-filing
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a US company files with...'
trigger: 'WATCHER: get a signed callback when a US company files with the SEC (EDGAR)'
arm_fields:
- ticker
- form
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- ticker
- callbackUrl
- id: watchers.stock-price
operationId: watchers_stock-price
path: /api/watchers/stock-price
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a US stock crosses a...'
trigger: 'WATCHER: get a signed callback when a US stock crosses a price you set'
arm_fields:
- ticker
- conditionType
- threshold
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- ticker
- conditionType
- threshold
- callbackUrl
- id: watchers.token-price
operationId: watchers_token-price
path: /api/watchers/token-price
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a crypto asset crosses...'
trigger: 'WATCHER: get a signed callback when a crypto asset crosses a price you set'
arm_fields:
- tokenId
- conditionType
- threshold
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- tokenId
- conditionType
- threshold
- callbackUrl
- id: watchers.weather-alert
operationId: watchers_weather-alert
path: /api/watchers/weather-alert
price_usd: 0.125
summary: 'WATCHER: get a signed callback when the US National Weather...'
trigger: 'WATCHER: get a signed callback when the US National Weather Service issues a new alert for an area'
arm_fields:
- area
- severity
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- area
- callbackUrl
- id: watchers.whois
operationId: watchers_whois
path: /api/watchers/whois
price_usd: 0.125
summary: 'WATCHER: get a signed callback when a domain''s WHOIS...'
trigger: 'WATCHER: get a signed callback when a domain''s WHOIS registration changes — registrar, expiry,
or status'
arm_fields:
- domain
- callbackUrl
- payload
- expiresInSeconds
- maxFires
- label
required:
- domain
- callbackUrl
schedules:
operations:
- schedule_create
- schedule_status
- schedule_cancel
trigger: at (ISO-8601 one-shot) or everySeconds (≥ 60, recurring)
callback_fields:
- payload (echoed)
- scheduleId
- fireNumber
- firedAt
pubsub:
operations:
- pubsub_create-topic
- pubsub_publish
- pubsub_subscribe
- pubsub_unsubscribe
fanout: owner publishes → every CONFIRMED subscriber callbackUrl receives the message, signed
limits: 100 subscribers per topic, one per URL
inbound_events: null
note: 'Wire type: Webhooks. No AsyncAPI pointer is emitted because no AsyncAPI exists.'
Work with this as data
Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for asyncapi
4 MCP tools reach this
find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/2s-io-watchers-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.