{
  "schema_version": "1.14.0",
  "name": "XR-Pulse",
  "provider": "XRPL-Utilities™",
  "description": "Normalized event feed for XRPL agents. Aggregates two sources into one time-ordered JSON stream: public-source news (regulatory press, central-bank releases, crypto-press coverage of Ripple/XRP/RLUSD/XRPL) and on-chain whale activity (every successful XRPL Payment above the storage threshold). News events carry mechanical cross-verification (Jaccard 0.5 over 48h) and a four-hour XRPL price-window correlation; whale events carry sender + receiver addresses with institutional-watchlist labels resolved via XRPScan. Deterministic heuristic data only; not an editorial product.",
  "contact": "hello@xrpl-utilities.com",
  "getting_started": "GET /schema once to learn the event shape (note: events[].active_utility differs by source - news events use {active, signals[]}; whale events use {signal: 'whale_transfer', usd_value, sender_label, receiver_label, ...}). POST /events/recent for the time-ordered feed (free for browser callers via Turnstile-issued preview-token JWT from xrpl-utilities.com; $0.10 USD via x402 for non-browser clients). The default response surfaces only whale-grade events (>= $500k USD); pass min_whale_usd: 0 in the request body to get the full $50k+ activity stream alongside news. Each news event has a numerical appearance_count rather than a legitimacy score; consumers decide their own cross-verification threshold.",
  "location": "Cloud-Native / Global",
  "data_residency": "agnostic",
  "pii": "none",
  "capabilities": {
    "feed_type": "public_source_event_log",
    "sources": {
      "regulatory_primary": [
        {"key": "sec_press", "feed_url": "https://www.sec.gov/news/pressreleases.rss", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"},
        {"key": "fca_uk", "feed_url": "https://www.fca.org.uk/news/rss.xml", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"},
        {"key": "esma_eu", "feed_url": "https://www.esma.europa.eu/rss.xml", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"}
      ],
      "central_bank": [
        {"key": "federal_reserve", "feed_url": "https://www.federalreserve.gov/feeds/press_all.xml", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"},
        {"key": "ecb_press", "feed_url": "https://www.ecb.europa.eu/rss/press.html", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"},
        {"key": "bank_of_england", "feed_url": "https://www.bankofengland.co.uk/rss/news", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"},
        {"key": "bank_of_japan", "feed_url": "https://www.boj.or.jp/en/rss/whatsnew.xml", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"},
        {"key": "bank_of_canada", "feed_url": "https://www.bankofcanada.ca/feed/", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"},
        {"key": "rba_australia", "feed_url": "https://www.rba.gov.au/rss/rss-cb-media-releases.xml", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"},
        {"key": "bis_speeches", "feed_url": "https://www.bis.org/doclist/cbspeeches.rss", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"}
      ],
      "standards_body": [
        {"key": "fsb", "feed_url": "https://www.fsb.org/feed/", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"}
      ],
      "crypto_press": [
        {"key": "coindesk", "feed_url": "https://www.coindesk.com/arc/outboundfeeds/rss/", "filter": "ripple|xrp|rlusd|xrpl in title or summary", "status": "live"},
        {"key": "cointelegraph_xrp", "feed_url": "https://cointelegraph.com/rss/tag/xrp", "filter": "ripple|xrp|rlusd|xrpl in title or summary (source-side tag-filtered)", "status": "live"},
        {"key": "crypto_news_xrp", "feed_url": "https://crypto.news/tag/xrp/feed/", "filter": "ripple|xrp|rlusd|xrpl in title or summary (source-side tag-filtered)", "status": "live"},
        {"key": "coinspeaker_xrp", "feed_url": "https://www.coinspeaker.com/?s=XRP&feed=rss2", "filter": "ripple|xrp|rlusd|xrpl in title or summary (source-side tag-filtered)", "status": "live"}
      ]
    },
    "sources_status_note": "Every source listed here is currently polling and ingesting. The full list of additional candidates that were probed and found unavailable (BaFin, FINMA, FATF, IOSCO, HKMA, MAS, IMF, RippleX Medium, Ripple Insights/Press, OCC, CFTC, etc.) is exposed at /stats.dropped_sources_v1_1 with the specific failure mode for each. Operator policy: no roadmap stubs - if a feed has no working public RSS, it is documented in dropped_sources rather than advertised here.",
    "sources_v1": ["bis_speeches", "sec_press", "cointelegraph_xrp", "crypto_news_xrp", "coinspeaker_xrp", "coindesk", "federal_reserve", "ecb_press", "bank_of_england", "bank_of_japan", "bank_of_canada", "rba_australia", "fca_uk", "esma_eu", "fsb"],
    "sources_v1_note": "DEPRECATED flat alias of capabilities.sources keys. Retained for one schema cycle for clients reading the v1 list shape; removed in 1.9.0.",
    "ingestion_cadence_seconds": 900,
    "correlation_window_hours_default": 4,
    "cross_verification": "Mechanical title-similarity clustering. Events whose normalized title tokens share Jaccard >= 0.5 within a 48h window collapse into a single record with cross_verified=true. No editorial judgment.",
    "sec_press_keyword_filter": "SEC press releases are filtered post-fetch to entries whose title or summary contains 'ripple' or 'xrp' (case-insensitive). Other feeds are source-side topic-relevant and not filtered.",
    "whale_xrpl_source": "Continuous on-chain feed alongside the RSS-sourced events. The whale_watcher loop polls validated XRPL ledgers every WHALE_POLL_SECONDS (default 10s, runs against QuickNode) and emits one event per successful Payment whose USD value clears WHALE_THRESHOLD_USD (default $50,000). XRP and RLUSD only this round; XRP is converted to USD via the Telemetry /healthz oracle, RLUSD is pegged at $1. Events use source='whale_xrpl', primary_url points to xrpscan.com/tx/<hash>, and active_utility carries: currency, usd_value, sender_label + receiver_label (institutional watchlist match), ledger_index, tx_hash, sender_sentinel + receiver_sentinel (XR-Sentinel cross-reference: activity_level, signals, identity {display_name/role/verified/domain/twitter/advisory}, delta {score_change, level_change, hours_since_prior_scan}), and telemetry_context (XR-Telemetry macro snapshot at emit time: current_price_usd, active_float_xrp, exchange_outflow_24h_xrp). Sentinel + Telemetry enrichments are best-effort; consumers should treat null/missing as 'no data this round' rather than an error.",
    "whale_xrpl_feed_floor": "POST /events/recent suppresses whale events below WHALE_FEED_MIN_USD (default $500,000) by default so RSS-sourced and institutional-grade whale events stay visible alongside the broader on-chain activity stream. Override with the min_whale_usd field on the request body: lower it (down to 0) to see all stored on-chain activity above WHALE_THRESHOLD_USD ($50k); raise it to hide whales entirely. Storage threshold ($50k) and feed floor ($500k) are independent, so smaller activity is always queryable even when hidden from the default feed.",
    "permissioned_domain_lifecycle_source": "Continuous on-chain feed for XLS-70/80 (Credentials + PermissionedDomain) AND XLS-81 (Permissioned DEX) activity. The permissioned_domain_watcher loop polls XR-Trust /events on PD_POLL_SECONDS cadence (default 120s) and emits each new tx as a Pulse event with source='permissioned_domain_lifecycle'. Two distinct values on active_utility.signal: 'permissioned_domain_lifecycle' for XLS-70/80 (PermissionedDomainSet/Delete, CredentialCreate/Accept/Delete) and 'permissioned_dex_event' for XLS-81 (OfferCreate/Cancel, AMMCreate/Deposit/Withdraw/Vote/Bid, Payment - only when the tx body or affected meta carries a DomainID, meaning it operates within a permissioned venue). Trust does the heavy lifting (long-lived XRPL WebSocket subscribe directly to QuickNode, persistence on /data volume, DEX gating on DomainID, dedupe by tx_hash); Pulse just consumes and surfaces. active_utility carries trade economics where applicable (taker_gets, taker_pays, asset, asset2, amount, destination, offer_sequence) and trust_url drill-down for the affected domain. Catches owner additions of new credential issuers, fresh domain creation, credential acceptance by new subjects, AND every permissioned offer placed/cancelled, every permissioned AMM created or modified, every permissioned cross-currency Payment - the actual trading inside permissioned venues that previously required watching the ledger directly.",
    "outputs": [
      "event_id_stable_sha256",
      "source_appearances_array",
      "appearance_count_numerical",
      "primary_url",
      "title_and_brief_verbatim_from_feed",
      "published_at_unix",
      "ingested_at_unix",
      "correlation_block_optional_with_heuristic_only_watermark"
    ],
    "not_provided": [
      "legitimacy_scoring",
      "source_credibility_ranking",
      "sentiment_analysis",
      "geopolitical_adoption_modeling",
      "llm_generated_summaries"
    ]
  },
  "payment": {
    "spec": "x402",
    "x402_version": 2,
    "scheme": "exact",
    "network": "xrpl:0",
    "facilitator_url": "https://xrpl-facilitator-mainnet.t54.ai",
    "amount_usd": "0.10",
    "recipient_resolution": "per_invoice_via_facilitator",
    "recipient_resolution_note": "Pulse does NOT advertise a static recipient address. Each 402 PaymentRequired body returned from /events/recent carries a per-invoice recipient resolved through the t54 facilitator. Sentinel and Telemetry surface a static `recipient` field for backwards-compat with simpler clients; Pulse intentionally omits it so callers always read the per-invoice value from the PaymentRequirements body. Pulling from agents.json instead would surface a stale or wrong address.",
    "currencies_accepted": ["XRP", "RLUSD"],
    "rlusd": {
      "amount": "0.10",
      "issuer": "rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De",
      "currency_hex": "524C555344000000000000000000000000000000"
    },
    "auth_header": "PAYMENT-SIGNATURE",
    "settlement_header": "PAYMENT-RESPONSE",
    "verify_before_settle": true,
    "refund_policy": "Verify-before-settle. If feed retrieval fails, settlement is skipped and the presigned tx is never broadcast. Successful retrievals are paid; no refunds otherwise."
  },
  "endpoints": {
    "base_url": "https://pulse.xrpl-utilities.io",
    "schema": "/schema",
    "events_recent": "/events/recent",
    "manifest": "/agents.json",
    "health": "/healthz",
    "stats": "/stats",
    "docs": "/docs",
    "openapi": "/openapi.json"
  },
  "rate_limits": {
    "requests_per_minute": 30
  },
  "legal": {
    "notice": "Deterministic heuristic data only. Not an endorsement of news legitimacy. Source presence is reported as a property of an event, not a verdict on the source. Correlation against XR-Telemetry is a measurement, not a causal claim. DYOR. Not investment, legal, or regulatory advice.",
    "user_responsibility": "XRPL-Utilities provides a normalized public-source event feed and on-chain measurement data. We do not provide financial advice, risk ratings, source credibility assessments, or investment forensics. Users are responsible for ensuring their use of these tools complies with local digital asset and AI regulations, including the California Digital Financial Assets Law and the Colorado AI Act where applicable. This service is offered void where prohibited; use is not authorized in California or Colorado."
  }
}
