{"schema_version":"1.98.5","provider":"XRPL-Utilities™","service":"XR-Pulse","description":"Normalized event feed for XRPL agents. Aggregates regulatory press, central-bank releases, and crypto-press coverage of Ripple/XRP/RLUSD/XRPL into a single time-ordered JSON stream, alongside an on-chain whale-transfer source. Deterministic heuristic data only; no editorial scoring or source ranking.","event_shape":{"event_id":"Stable sha256-derived id of the source URL.","source_appearances":"Array of source names where the event was found. e.g. ['bis_speeches', 'cointelegraph_ripple'].","appearance_count":"Length of source_appearances. Numerical. Present only on news events; omitted on on-chain-only rows (whale_xrpl, permissioned_domain_lifecycle) where each event has a unique tx-hash-derived event_id and appearance_count is structurally always 1.","cross_verified":"Boolean. True when appearance_count >= 2 across distinct sources. Cluster membership is computed by Jaccard title-similarity (threshold 0.35) within a 48h window. Title normalization strips trailing publisher suffix (' - Outlet'), drops a fixed news-noise stopword set, and applies entity aliases (xrp/ripple -> xrp_ripple, jpm/jpmorgan -> jpmorgan, mc -> mastercard). Mechanical, not editorial. Omitted on on-chain-only rows for the same reason as appearance_count.","cluster_members":"Optional array. Present when cross_verified=true. Lists the secondary {title, source, url, published_at} entries that joined the cluster, so consumers can verify the merge was sane.","primary_url":"The most-recent source URL in the cluster.","title":"Title verbatim from the most-recent source feed in the cluster.","brief":"Short summary verbatim from the source feed's description tag, trimmed to 400 chars. Not LLM-generated.","published_at":"Unix timestamp from the feed's published or updated tag.","ingested_at":"Unix timestamp when XR-Pulse first stored the event.","correlation":"Optional block; carries t0 fields immediately at ingestion and finalizes 4h after the event with t1 + delta_pct on four metrics: XRP price (current_price_usd), Active Float (active_float_xrp), exchange outflow (exchange_outflow_24h_xrp), and XRPL-wide 24h settlement volume (settlement_volume_24h_usd, added in schema 1.18.0). The 'heuristic_only' watermark is fixed; this is a measurement, not a causal claim. The settlement-volume signal is intentionally network-wide, not story-attributed: a delta confirms 'something moved on chain', never 'this story moved it'."},"sources_v1_1":[{"name":"sec_press","type":"regulatory_press","url_env":"SEC_EDGAR_SEARCH_URL","keyword_filter":["ripple","xrp","rlusd","digital asset"]},{"name":"federal_reserve","type":"central_bank","url_env":"FEDERAL_RESERVE_RSS_URL","keyword_filter":["ripple","xrp","rlusd","digital asset"]},{"name":"bis_speeches","type":"central_bank","url_env":"BIS_PRESS_RSS_URL","keyword_filter":["ripple","xrp","rlusd","digital asset"]},{"name":"ecb_press","type":"central_bank","url_env":"ECB_PRESS_RSS_URL","keyword_filter":["ripple","xrp","rlusd","digital asset"]},{"name":"bank_of_england","type":"central_bank","url_env":"BANK_OF_ENGLAND_RSS_URL","keyword_filter":["ripple","xrp","rlusd","digital asset"]},{"name":"rba_australia","type":"central_bank","url_env":"RBA_AUSTRALIA_RSS_URL","keyword_filter":["ripple","xrp","rlusd","digital asset"]}],"dropped_sources_v1_1":"Sources listed in the v1.1 spec that did not expose working public RSS at the spec'd paths are surfaced in /stats.dropped_sources_v1_1 with the specific reason. Operator can override via env vars if a working URL is later discovered.","cross_verification":{"method":"title_jaccard_similarity","threshold":0.35,"time_window_hours":48,"title_normalization":["strip_trailing_publisher_suffix","lowercase_alphanumeric_tokenize","drop_news_noise_stopwords","apply_entity_aliases"],"entity_aliases_examples":{"xrp_ripple":["xrp","ripple","ripples","xrpl"],"jpmorgan":["jpm","jpmorgan","morgan","chase"],"mastercard":["mc","mastercard"],"tokenized":["tokenised","tokenized"]},"note":"Two distinct events become cross_verified when their normalized title tokens share Jaccard >= 0.35 within 48h. Mechanical heuristic, not editorial judgment. Threshold lowered from 0.5 in 1.17.0 alongside richer normalization (publisher-suffix strip + entity aliases) so different outlets covering the same beat collapse into one card."},"active_utility":{"description":"Mechanical-only Partnership-to-Payload signal. An event row gains an active_utility block when one or more deterministic signals fire within the post-event window. None of the signals are causation claims; each lists its underlying evidence so consumers can verify it themselves.","signals":[{"name":"cross_verified","fires_when":"appearance_count >= 2 across distinct sources via title-similarity clustering"},{"name":"price_moved","fires_when":"current_price_usd_delta_pct (over the T+4h window) exceeds the configured threshold (default 1.5%)"},{"name":"volume_moved","fires_when":"exchange_outflow_24h_xrp_delta_pct (over the T+4h window) exceeds the configured threshold (default 5%). Requires a TELEMETRY_SISTER_KEY so Pulse can read the paid Telemetry /scan; falls back to None when unset."},{"name":"rlusd_mint_observed","fires_when":"one or more outgoing IOU Payments from the RLUSD issuer wallet land within the T+4h window. Only Payment txs whose Amount.currency=RLUSD and issuer matches are counted."},{"name":"watchlist_activity_observed","fires_when":"one or more above-threshold outgoing XRP Payments from a labeled exchange/issuer/treasury/MM/bridge/custody wallet land within the T+4h window. Watchlist source addresses are resolved dynamically from external label sources against an operator-curated role filter; destination addresses are resolved against both label-list and per-account paths so labels missing from the well-known subset still surface. Each tx attaches source_label, source_role, destination, amount_xrp, amount_usd_at_tx, tx_hash, and (when the receiver is on the watchlist) destination_label + destination_role so consumers can see exchange-to-exchange flow, bridge outflows, OTC consolidators, and custody movements without manual cross-referencing. Retention: rows beyond the configured retention window are purged daily. Consumers wanting institutional-grade-only firing should filter on total_amount_usd or roles in the signal payload rather than relying on the binary fire/no-fire."},{"name":"high_activity_target","fires_when":"an XRPL classic address embedded in the event's title or brief returns activity_level=High when scanned via XR-Sentinel free-web. Address detection is regex-based; cross-reference is best-effort."},{"name":"institutional_event","fires_when":"title + brief match any of a curated set of institutional-event keyword patterns. Categories returned in the signal payload: regulated_exchange_listing (MOEX / DBAG / LSE / NYSE / Nasdaq / SGX / ASX / TSE listings), etf_event (ETF approval, launch, listing, debut, closure, S-1 / 19b-4 filings), derivatives_event (CME / CBOE / ICE futures and options launches, index futures, Nasdaq Crypto Index / Bloomberg Galaxy Crypto Index references; the May 2026 CME + Nasdaq multi-crypto index futures contract tracking BTC/ETH/SOL/XRP/ADA/LINK/XLM is the canonical example), regulatory_action (SEC approval / order / settlement / charges, court rulings, OFAC sanctions, no-action letters), central_bank_statement (Fed / ECB / BOE / BIS / BOJ / RBA speeches and papers on digital assets, CBDC framework), international_standard_body (FSB / IOSCO / FATF / IMF / BCBS publications), and ripple_corporate_event (Ripple acquisitions, IPO, RLUSD launch and integrations). Deterministic substring match (case-insensitive), one match per category is enough. No editorial judgment, no scoring: the categories array tells consumers which patterns fired so a renderer can choose its own visual treatment."},{"name":"whale_transfer","fires_when":"a successful XRPL Payment whose USD value clears the configured whale-grade threshold is observed by the whale_watcher loop. Carries currency (XRP or RLUSD), usd_value at the ledger close, sender_address + sender_label, receiver_address + receiver_label (label is the institutional-watchlist match when present, null otherwise), ledger_index, tx_hash, a tier classification, and per-emit cross-product enrichment: sender_sentinel + receiver_sentinel (XR-Sentinel /scan results - activity_level, signals, identity, delta), and telemetry_context (XR-Telemetry macro snapshot at emit time - current_price_usd, active_float_xrp, exchange_outflow_24h_xrp). Continuous on-chain source; not gated by RSS ingestion cadence. Cross-product fields are best-effort; null when the upstream service is unreachable."},{"name":"tier","fires_when":"Always present on whale_transfer events. One of four values classified by USD value band and watchlist membership: NORMAL_ACTIVITY (small, both sides unwatchlisted - network noise, excluded from the high-impact stream by the default min_whale_usd surface threshold), WHALE_MOVE (mid-tier, both sides unwatchlisted - private high-value intent or OTC accumulation), INSTITUTIONAL_FLOW (large or at least one side on the institutional watchlist - named smart money, exchanges/issuers/treasuries/MMs/custody/bridges), EXCHANGE_LOGISTICS (both sides labeled to the SAME canonical exchange family - 'logistic whales' that hold massive weight but represent maintenance, not sentiment). Identity supersedes value: a Ripple Treasury -> unlabeled mid-tier move is INSTITUTIONAL_FLOW, not WHALE_MOVE."},{"name":"permissioned_domain_lifecycle","fires_when":"an XLS-70/80 lifecycle tx (PermissionedDomainSet, PermissionedDomainDelete, CredentialCreate, CredentialAccept, or CredentialDelete) validates on the XRPL ledger. Sourced from XR-Trust's /events stream, which runs a long-lived WebSocket subscribe directly to the network. Polled on a recurring cadence. active_utility carries: tx_type, tx_hash, account, domain_id, ledger_index, credential_type_hex, subject, trust_event_id, trust_url. trust_url drill-down lets consumers jump straight into the institutional-issuer breakdown for the affected domain. Catches owner additions of new credential issuers, fresh domain creation, credential acceptance by new subjects, etc."},{"name":"permissioned_dex_event","fires_when":"an XLS-81 (Permissioned DEX) tx that operates within a permissioned venue validates on the XRPL ledger - OfferCreate, OfferCancel, AMMCreate, AMMDeposit, AMMWithdraw, AMMVote, AMMBid, or Payment that carries a DomainID in its tx body or affected meta nodes. Same source path as permissioned_domain_lifecycle (Trust /events poll); distinct signal value so consumers can filter on the DEX granularity specifically. active_utility carries: tx_type, tx_hash, account, domain_id, ledger_index, taker_gets, taker_pays, asset, asset2, amount, destination, offer_sequence (subset present per tx_type), trust_event_id, trust_url, plus an `execution` block on OfferCreate events parsed from meta.AffectedNodes: {executed_taker_gets_value, executed_taker_gets_currency, executed_taker_gets_issuer, executed_taker_pays_value, executed_taker_pays_currency, executed_taker_pays_issuer, consumed_offers_count}. Execution figures reflect actual offer-fill against the order book at validation time, not the offer ceiling. null when the meta fetch misses. Captures actual trading inside permissioned venues like xrp-liquid.com - permissioned offers selling XRP for Circle USDC / Ripple RLUSD / Quantoz EURQ, AMMs created with permissioned-only liquidity, cross-currency payments restricted to domain members."},{"name":"token_escrow_event","fires_when":"an XLS-85 (Token Escrow, mainnet 2026-02-12) tx that locks, finishes, or cancels a non-XRP IOU validates on the XRPL ledger. tx_type is one of EscrowCreate, EscrowFinish, EscrowCancel. Source: same per-ledger scan as whale_transfer (whale_watcher.process_ledger), so latency stays in lock-step with whale events. XRP-denominated escrows are out of scope here; they remain covered by the Payment branch. active_utility carries: tx_type, tx_hash, account (escrow owner), destination, ledger_index, issuer (of the IOU), currency (ASCII), currency_on_ledger (40-char hex when applicable), amount (full XRPL Amount object), amount_display, condition (Crypto-Conditions hex; null on time-locked-only), finish_after, cancel_after, plus subtype = token_escrow (default) | dvp_candidate. Subtype dvp_candidate fires when an EscrowCreate with a Condition matches an earlier EscrowCreate within 1h that has the SAME Condition AND reciprocal Account↔Destination — heuristic candidate for an atomic delivery-vs-payment swap, NOT a confirmed pair (operator marketing: heuristic candidate, do not pitch DvP detection as a marquee feature until live activity exercises this matcher)."},{"name":"issuer_deepfreeze","fires_when":"an XRPL TrustSet transaction that sets tfSetDeepFreeze (0x00400000) validates on the XRPL ledger. Issuer = tx.Account; the deep-frozen holder is tx.LimitAmount.issuer (XRPL trustline convention: from the issuer's perspective, the counterparty's address sits in LimitAmount.issuer). Same per-ledger scan source as whale_transfer. active_utility carries: tx_type=TrustSet, tx_hash, ledger_index, issuer, target_holder, currency (ASCII), currency_on_ledger, flags. Sanctions-grade compliance signal: deep-freeze prevents the holder from sending OR receiving the IOU entirely (the regular freeze flag only blocks sending). One of the strongest issuer-side discretionary actions on XRPL."},{"name":"rwa_issuer_mint","fires_when":"an outgoing IOU Payment from an RWA issuer wallet in rwa_issuers.RWA_ISSUERS validates on XRPL. The issuer set is operator-curated and includes Ondo OUSG (2 wallets), Schuman EUROP, Braza USDB + BBRL, SG-FORGE EURCV, Guggenheim DCP (currency rolls forward by maturity), Justoken JMWH, OpenEden TBL, Ripple RLUSD, AUDD, Palau Stablecoin Pilot (sovereign USD stablecoin), VERT Capital (Brazilian agribusiness securitized credit / FIDC), plus Archax (abrdn MMF) as rails-only for first-mint capture. active_utility carries: direction='mint', issuer_label, issuer_logical_label (aggregation key for issuers with multiple wallets), issuer_address, issuer_domain, asset_class (treasuries|fiat_stable_usd|fiat_stable_eur|fiat_stable_brl|fiat_stable_aud|commercial_paper|money_market|commodity_energy|private_credit|gateway_iou), currency (ASCII display), currency_on_ledger (40-char hex when applicable, useful for DCP tranche tracking), amount, counterparty (recipient of the mint), ledger_index, tx_hash, and a per-issuer caveat field. Source: rwa_issuer_watcher polls live ledger reads on a recurring cadence. No NAV reconciliation, no USD valuation: the mint is reported in the asset's native unit-of-account."},{"name":"rwa_issuer_burn","fires_when":"an IOU Payment whose Destination is an RWA issuer wallet and whose Amount.issuer matches that same wallet validates on XRPL. This is the standard redemption pattern: a holder sends the issued IOU back to the issuer, decreasing the issuer's outstanding obligations at the next ledger close. active_utility carries: direction='burn', issuer_label, issuer_logical_label, issuer_address, asset_class, currency, currency_on_ledger, amount, counterparty (sender returning the IOU), ledger_index, tx_hash. We do not attempt to distinguish redemption burns from holder-error returns; both reduce circulating supply identically."},{"name":"rwa_obligations_spike","fires_when":"an RWA issuer's outstanding obligations jump by more than the configured threshold between watcher passes. Catches supply changes the Payment classifier structurally misses: Ripple brings RLUSD into circulation via OfferCreate on the XRPL DEX rather than direct Payments, so rwa_issuer_mint never fires for RLUSD even when tens of millions are minted. The obligations watcher polls live ledger reads on a recurring cadence, stores the last-seen obligations per issuer, and diffs each pass. source='rwa_obligations_delta'. active_utility carries: direction='mint', signal='rwa_obligations_spike', issuer_label, issuer_logical_label, issuer_address, asset_class, currency, amount (absolute delta in native units), prior_obligations, current_obligations, prior_observed_at (unix ts of the last reading), inference_method='obligations_delta', and a caveat that this is supply-snapshot inference rather than per-tx classification."},{"name":"rwa_obligations_drop","fires_when":"an RWA issuer's outstanding obligations decrease by more than the configured threshold between watcher passes. Mirror of rwa_obligations_spike for the redemption / supply-reduction side; same source and active_utility shape but direction='burn', signal='rwa_obligations_drop'. Captures whatever mechanism reduced supply (Payment redemption, treasury burn, clawback, etc.) at the obligations level without classifying the underlying transaction."},{"name":"rwa_issuer_daily","fires_when":"the daily aggregate snapshot loop completes one issuer's reading on a fresh UTC day. Once per UTC day per live issuer, the loop computes deltas vs the prior day's stored snapshot from live ledger reads, and emits a single event with source='rwa_issuer_daily'. active_utility carries: snapshot_date (UTC YYYY-MM-DD), issuer_label, issuer_logical_label, issuer_address, asset_class, currency, currency_on_ledger (or 'AGGREGATE' for DCP-style rolling-tranche issuers), obligations_t1 + obligations_t0 + obligations_delta, net_circulating_t1 + net_circulating_t0 + net_circulating_delta (for issuers with treasury_subtraction_wallet set, e.g. OpenEden TBL where the treasury holds ~9.9B of the ~9.9B obligations and net-circulating is ~35M), treasury_subtraction_wallet, treasury_balance_excluded, trustline_count_t1 + trustline_count_t0 + trustline_count_delta, trustline_count_truncated (true when the issuer exceeds the page cap, e.g. RLUSD with many trustlines; the obligations total remains canonical), and a per-issuer caveat field. The Justoken JMWH caveat explicitly notes that marketed USD value is issuer-stated, not on-chain attested."},{"name":"rwa_amm_pool_state","fires_when":"the AMM-of-RWA watcher snapshots one XLS-30 AMM pool whose asset or asset2 includes an RWA issuer's IOU. Runs once per UTC day per discovered pool. Discovery runs each pass against (RWA issuer, counterparty) pairs (counterparties: XRP, RLUSD), so newly created pools land automatically without a manual map update. active_utility carries: snapshot_date, pool_account, rwa_issuer_label, rwa_issuer_wallet, rwa_asset_class, rwa_currency (ASCII display), rwa_currency_on_ledger (40-char hex), rwa_amount, counterparty_label (XRP|RLUSD|other), counterparty_currency, counterparty_amount, counterparty_is_iou, lp_supply, lp_currency, trading_fee. Both balances are in native units; no USD conversion is applied. Mainnet baseline as of 2026-05-10 has 8 RWA-touching pools; only RLUSD/XRP carries meaningful liquidity (~$8M), the others are dust."}]},"rwa_issuer_discovery":{"description":"Auto-discovery pipeline that surfaces candidate RWA issuer wallets on XRPL without requiring the operator to add them by hand. Runs daily. Output appears on GET /stats/rwa-summary as a top-level candidates[] array. The candidates surface is FREE; no x402 payment is required.","filter_rationale":"Combines on-chain authorization-flag presence with non-zero outstanding obligations and an external label match. Operator-curated canonical issuers and previously-dismissed wallets are excluded. The filter keeps false-positive rate low without sacrificing recall on actual RWA issuers.","candidate_fields":["wallet","label","domain","currency_ascii","currency_on_ledger","obligations_amount","trustline_count","trustline_truncated","require_auth","allow_clawback","source","first_seen","last_seen","status (always 'unverified')"],"operator_judgment_fields_NOT_auto_populated":["asset_class","logical_label","caveat"],"promotion_path":"Operator adds a full entry to rwa_issuers.RWA_ISSUERS (wallet + label + logical_label + asset_class + currency_ascii + currency_hex + accept_any_currency + subtract_treasury_wallet + mint_status + unit_caveat + domain) and redeploys Pulse. The candidate auto-drops from /stats/rwa-summary on the next call because the pending-candidates view filters wallets that have entered the canonical map. No state cleanup needed on the candidates table.","dismissal_path":"Operator marks the row status='dismissed' on the storage volume. Dismissed wallets are never re-surfaced by the discovery loop, even when their external label or on-chain flags do not change."},"whale_xrpl_source":{"description":"Continuous on-chain feed alongside the RSS sources. Validated XRPL ledgers are polled on a recurring cadence; successful Payments whose USD value clears the configured whale-grade threshold are stored as events with source='whale_xrpl'.","currencies":["XRP","RLUSD"],"xrp_pricing":"Telemetry /healthz oracle (60s in-process cache).","rlusd_pricing":"Pegged at $1.00.","feed_floor":"POST /events/recent suppresses whale events below the configured default feed floor so the mid-tier attribution band stays visible alongside RSS and the whale stream. Override via the min_whale_usd field on the request body (min_whale_usd=0 to see every stored event down to the storage threshold).","address_labels":"sender_label and receiver_label populate from the institutional watchlist's resolved-address cache when the address is on the watchlist; null otherwise.","partial_payments":"Uses meta.delivered_amount when present so partial-payment transactions are sized by what actually arrived, not the intended Amount.","primary_url_format":"https://xrpscan.com/tx/<tx_hash>"},"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."}