This is a Developer Preview signal. Field paths under
selatTransactabilityIndex may change during preview. Read for meaning, not as a frozen wire contract.Claim surface (tiers)
Until tier 3 exists, docs and agents must not say delivery %, delivered, or failed to deliver. Today’s numerator is tier 1.
If only one
successRate appears on the 402, treat it as LP→merchant payment-layer telemetry (tier-locked) unless the payload names another hop. Buyer→SELAT/LP clearing reliability is a separate credit exposure and may be unpublished.
Where it appears
Each endpoint’s score rides the inbound402 Payment Required challenge that the SELAT Router returns to your agent, under extensions.selatTransactabilityIndex. The same extension shape can appear on x402- and MPP-routed challenges; evidence quality is rail-specific. Abstracting both rails down to status codes is a weaker proxy than MPP’s Credential→Receipt chain — not “works the same.”
Wire example (illustrative — not a reliability teaching exhibit)
successRate is a fraction string: "1" means 1.0 (100%), not a count of ones. Always read it with paidNum. Thin n stays low-confidence even at 100%.
paidNum as insufficient evidence, not a green light — even if successRate is "1". A window with no data is omitted; empty stats / lastPaid means unmeasured on that surface.
Wire vs ranking: the challenge may carry 24h / 7d / all. SELAT discovery’s ranking parser currently prefers 7d → 1w → 24h and does not read all, and caps index paidNum weight at 50. Do not tell agents that ranking “prefers all / unbounded larger n” — that is not what the spend path consumes today.
What each reading means
Paths are relative toinfo.healthStatus.
Forthcoming (may not be on every challenge yet): named hop + whose
reference, coverage (e.g. pct_with_reference for tier 2), status (unmeasured | insufficient | scored), intervals/posteriors, methodology_version / as_of, and three readings (network / firstParty / divergence) on the challenge itself. Until those ship, use the decision trace + local ledger for first-party and divergence.
How to read it safely
Unmeasured ≠ bad. An endpoint with no score has not been observed settling through SELAT. It remains visible and payable in the federated catalog — it simply has no risk score yet. Never treat a missing signal as a negative one.successRateis transport-level after capture. It does not mean the payload was correct, complete, or useful.- Read
successRatewithpaidNum. Never treat bare 100% on tinynas a reliability signal. - A
5xxafter capture is a counterparty-side payment-layer failure (money out, non-2xx). A4xxusually means the request was rejected and often that the upstream was never paid — see attribution in the decision trace; do not charge that to the endpoint’s network rate. - The score reports what was observed. It does not recommend an action or substitute for your policy.
How discovery uses it (and how it doesn’t)
selat search "…" --top N ranks primarily by intent match, price, and source-count — not by sorting the catalog on Transactability. Unmeasured endpoints stay in the list.
Separately, the CLI may apply a soft reliability factor (and optional pick-time quarantine) from cached Index observations + your local ledger. Primary rank weights stay semantic 0.65 / price 0.25 / source-count 0.10; then combined *= factor when evidence exists.
factor = (successes + 3) / (trials + 3)shrinks toward 1.0. No evidence → factor 1.0 — mathematically the same as “perfect” for demotion purposes. Thin all-success histories barely move the score; only failures pull it down. This is not a calibrated posterior of delivery or body quality.- Own-ledger trials weigh 2× network index trials. Ledger
settled-body-lost(money out, body gone) is not a success: as of selat-discovery#157 it increments chargedFails / can quarantine. That is buyer-protective attribution — on mediated/two-leg paths the loss may be path/SELAT/LP, not proof the merchant returned empty. Do not read this as body-quality or delivery scoring. - The factor is hop-blind (capture+status / settled vs 5xx) — it does not name buyer→SELAT/LP vs LP→merchant.
- Quarantine demotes/skips on strong failure patterns (floor 0.05) — not delisting. See First-Party Transactability.
payment-required header:
Authorship and audit
Prefer scores from the SELAT Router (router.selat.ai or another SELAT-owned origin). The Router strips merchant-supplied selatTransactabilityIndex blocks so agents are not fed self-attested perfection. That is authorship hygiene, not proof the index cannot be wrong or selectively sampled.
Trust boundary (discovery): by default a non-SELAT / non-authoritative index is condemn-only (can demote, cannot exonerate above your own ledger). Two-way trust requires the router envelope header x-selat-index-authoritative (selat-router | sole | true | 1), a SELAT-owned origin, or an explicit env override (SELAT_INDEX_ROUTER_SOLE_AUTHOR). Sole-author is a deployment claim, not a protocol guarantee. Index paidNum used in ranking is capped at 50.
When you curl yourself, treat a block served straight off a merchant endpoint as non-authoritative unless you have an independent verify path.
As structured data
For logging, gating, and audit, usequote.transactabilityTrace (network vs first-party, never blended; attribution buckets). See Decision trace and First-Party Transactability.