{"openapi":"3.1.0","info":{"title":"XRPLHub — XRPLScore and Prebuilt XRPL Transactions","version":"1.1.0","description":"Pay-per-call XRP Ledger services for AI agents, settled in RLUSD. A 300–850 wallet creditworthiness score from 8 signals, full risk reports, and ready-to-sign prebuilt XRPL transactions for 35 actions. No account, no API key, no signup. A free (unauthenticated) score is also at GET /api/score/{wallet}.","contact":{"name":"XRPLHub","url":"https://www.xrplhub.io","email":"support@xrplhub.io"}},"servers":[{"url":"https://www.xrplhub.io"}],"x-service-info":{"name":"XRPLHub — XRPLScore","categories":["defi","risk","credit-scoring","xrpl","data"],"network":"xrpl-mainnet","asset":{"symbol":"RLUSD","code":"524C555344000000000000000000000000000000","issuer":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De"},"facilitator":"https://xrpl-facilitator-mainnet.t54.ai","noSignup":true,"documentation":[{"label":"x402 discovery","url":"https://www.xrplhub.io/.well-known/x402"},{"label":"MCP server","url":"https://www.xrplhub.io/api/mcp"},{"label":"llms.txt","url":"https://www.xrplhub.io/llms.txt"},{"label":"Pricing","url":"https://www.xrplhub.io/pricing"}]},"paths":{"/openapi.json":{"get":{"operationId":"discoveryDoc","summary":"OpenAPI discovery document (free)","security":[],"responses":{"200":{"description":"This OpenAPI document."}}}},"/api/score/{wallet}":{"get":{"operationId":"freeScore","summary":"XRPLScore — wallet creditworthiness score (free, unauthenticated)","description":"Get a 300–850 creditworthiness score for one XRPL wallet with the 8-signal breakdown. Free, no key, no signup. Same number the paid endpoints and the public site return.","security":[],"parameters":[{"name":"wallet","in":"path","required":true,"description":"XRPL classic address (r...).","schema":{"type":"string","pattern":"^r[1-9A-HJ-NP-Za-km-z]{24,34}$"},"example":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De"}],"responses":{"200":{"description":"Wallet score with the 8 signals, grade and percentile.","content":{"application/json":{"schema":{"type":"object","properties":{"wallet":{"type":"string"},"score":{"type":"integer","minimum":300,"maximum":850,"description":"XRPLScore, 300–850 absolute scale."},"grade":{"type":"string","enum":["Building","Fair","Good","Excellent","Exceptional"]},"percentile":{"type":"number"},"signals":{"type":"object","description":"The 8 component scores, 0–100 each.","properties":{"accountAge":{"type":"number"},"txActivity":{"type":"number"},"financialHealth":{"type":"number"},"tokenEngagement":{"type":"number"},"dexActivity":{"type":"number"},"ammActivity":{"type":"number"},"securityConfig":{"type":"number"},"nftActivity":{"type":"number"}}},"methodology":{"type":"string"},"computedAt":{"type":"string","format":"date-time"}},"required":["wallet","score","grade","signals"]},"example":{"wallet":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De","score":721,"grade":"Good","percentile":74,"signals":{"accountAge":88,"txActivity":71,"financialHealth":64,"tokenEngagement":61,"dexActivity":40,"ammActivity":12,"securityConfig":30,"nftActivity":0},"methodology":"XRPLHub XRPLScore v1.1 — 8-signal native on-chain behavioral scoring, absolute scale","computedAt":"2026-09-04T00:00:00.000Z"}}}},"404":{"description":"Address is not an activated XRPL mainnet account."}}}},"/api/x402/score":{"get":{"operationId":"x402Score","summary":"XRPLScore — wallet creditworthiness score (x402 exact scheme)","description":"Get a 300–850 creditworthiness score for one XRPL wallet with an 8-signal breakdown. Official x402 exact scheme via the t54 facilitator; pay by presigned RLUSD payment. Send ?wallet=<r-address>. No signup.","tags":["Scoring"],"parameters":[{"name":"wallet","in":"query","required":true,"description":"XRPL classic address (r...) to score or report on.","schema":{"type":"string","pattern":"^r[1-9A-HJ-NP-Za-km-z]{24,34}$","example":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De"},"example":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De"}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.020000"},"protocols":[{"x402":{}}],"description":"Single wallet score, RLUSD via x402 facilitator."},"responses":{"200":{"description":"Wallet score with the 8 signals, grade and percentile.","content":{"application/json":{"schema":{"type":"object","properties":{"wallet":{"type":"string"},"score":{"type":"integer","minimum":300,"maximum":850,"description":"XRPLScore, 300–850 absolute scale."},"grade":{"type":"string","enum":["Building","Fair","Good","Excellent","Exceptional"]},"percentile":{"type":"number"},"signals":{"type":"object","description":"The 8 component scores, 0–100 each.","properties":{"accountAge":{"type":"number"},"txActivity":{"type":"number"},"financialHealth":{"type":"number"},"tokenEngagement":{"type":"number"},"dexActivity":{"type":"number"},"ammActivity":{"type":"number"},"securityConfig":{"type":"number"},"nftActivity":{"type":"number"}}},"methodology":{"type":"string"},"computedAt":{"type":"string","format":"date-time"}},"required":["wallet","score","grade","signals"]},"example":{"wallet":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De","score":721,"grade":"Good","percentile":74,"signals":{"accountAge":88,"txActivity":71,"financialHealth":64,"tokenEngagement":61,"dexActivity":40,"ammActivity":12,"securityConfig":30,"nftActivity":0},"methodology":"XRPLHub XRPLScore v1.1 — 8-signal native on-chain behavioral scoring, absolute scale","computedAt":"2026-09-04T00:00:00.000Z"}}}},"402":{"description":"Payment Required — x402 challenge. Body is the PAYMENT-REQUIRED payload; pay in RLUSD and retry with the PAYMENT-SIGNATURE header."}}}},"/api/x402/report":{"get":{"operationId":"x402Report","summary":"Full wallet risk report (x402 exact scheme)","description":"Everything the score endpoint returns plus machine-readable risk flags, ranked recommendations, and an on-chain snapshot (balance, spendable XRP, trust lines, tx count, DEX/AMM/NFT activity). Send ?wallet=<r-address>. No signup.","tags":["Scoring"],"parameters":[{"name":"wallet","in":"query","required":true,"description":"XRPL classic address (r...) to score or report on.","schema":{"type":"string","pattern":"^r[1-9A-HJ-NP-Za-km-z]{24,34}$","example":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De"},"example":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De"}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.080000"},"protocols":[{"x402":{}}],"description":"Full risk report for one wallet, RLUSD via x402 facilitator."},"responses":{"200":{"description":"Full risk report.","content":{"application/json":{"schema":{"type":"object","properties":{"wallet":{"type":"string"},"score":{"type":"integer","minimum":300,"maximum":850,"description":"XRPLScore, 300–850 absolute scale."},"grade":{"type":"string","enum":["Building","Fair","Good","Excellent","Exceptional"]},"percentile":{"type":"number"},"signals":{"type":"object","description":"The 8 component scores, 0–100 each.","properties":{"accountAge":{"type":"number"},"txActivity":{"type":"number"},"financialHealth":{"type":"number"},"tokenEngagement":{"type":"number"},"dexActivity":{"type":"number"},"ammActivity":{"type":"number"},"securityConfig":{"type":"number"},"nftActivity":{"type":"number"}}},"methodology":{"type":"string"},"computedAt":{"type":"string","format":"date-time"},"riskFlags":{"type":"array","items":{"type":"string"}},"recommendations":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string"},"points":{"type":"string"},"priority":{"type":"string","enum":["high","medium","low"]}}}},"snapshot":{"type":"object","properties":{"balanceXRP":{"type":"number"},"spendableXRP":{"type":"number"},"trustLines":{"type":"integer"},"txCount":{"type":"integer"},"hasMultiSig":{"type":"boolean"},"hasOffers":{"type":"boolean"},"hasAMM":{"type":"boolean"}}}}},"example":{"wallet":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De","score":721,"grade":"Good","percentile":74,"signals":{"accountAge":88,"txActivity":71,"financialHealth":64,"tokenEngagement":61,"dexActivity":40,"ammActivity":12,"securityConfig":30,"nftActivity":0},"methodology":"XRPLHub XRPLScore v1.1 — 8-signal native on-chain behavioral scoring, absolute scale","computedAt":"2026-09-04T00:00:00.000Z","riskFlags":[],"recommendations":[{"action":"Add 2–3 trust lines to established issuers","points":"+18","priority":"medium"}],"snapshot":{"balanceXRP":2500.4,"spendableXRP":2480.1,"trustLines":6,"txCount":4200,"hasMultiSig":false,"hasOffers":true,"hasAMM":false}}}}},"402":{"description":"Payment Required — x402 challenge. Body is the PAYMENT-REQUIRED payload; pay in RLUSD and retry with the PAYMENT-SIGNATURE header."}}}},"/api/x402/tx":{"get":{"operationId":"x402Tx","summary":"Prebuilt XRPL transaction — 35 actions (x402 exact scheme)","description":"Get a ready-to-sign transaction JSON for any of 35 XRPL actions (CheckCreate, Escrow, TrustSet, NFT mint/sell/burn, AMM create/deposit, DEX order, MPT issue/send, multisig, DID, credentials, permissioned domains, and more). The wallet owner signs the returned txjson — this never signs for anyone. No signup.","tags":["Transactions"],"parameters":[{"name":"productId","in":"query","required":true,"description":"Which XRPL action to build. Full catalogue + per-action params at /api/mcp (list_xrpl_services).","schema":{"type":"string","enum":["multisig","regkey","depositauth","desttag","issuerdecl","issuercfg","tokenfee","trustline","trustsend","rippling","mptissue","mptsend","globalfreeze","freezeline","dexorder","dextrade","smartswap","ammlaunch","ammentry","paychannel","tickets","nftmint","nftburn","nftoffer","checkcreate","checkcash","checkcancel","desttagreq","escrow","identity","did","compliance","credentialissue","permdomain"],"example":"checkcreate"},"example":"checkcreate"},{"name":"account","in":"query","required":true,"description":"XRPL classic address that will sign the transaction.","schema":{"type":"string","pattern":"^r[1-9A-HJ-NP-Za-km-z]{24,34}$"},"example":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De"},{"name":"<action params>","in":"query","required":false,"description":"Per-action params as query args, e.g. destination, amount, issuer, currency, uri, finishAfter. See list_xrpl_services for the fields each productId needs.","schema":{"type":"string"}}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.150000"},"protocols":[{"x402":{}}],"description":"One prebuilt XRPL transaction, RLUSD via x402 facilitator."},"responses":{"200":{"description":"The unsigned transaction, ready for `account` to sign.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"productId":{"type":"string"},"label":{"type":"string"},"tier":{"type":"string","enum":["safe","caution","blocked"]},"txjson":{"type":"object"},"signWith":{"type":"string"},"instructions":{"type":"string"}}},"x402":{"type":"object","properties":{"success":{"type":"boolean"},"network":{"type":"string"}}}}},"example":{"data":{"productId":"checkcreate","label":"Create Check","tier":"safe","txjson":{"TransactionType":"CheckCreate","Account":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De","Destination":"rDest00000000000000000000000000000","SendMax":"10000000"},"signWith":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De","instructions":"Sign this txjson with your own XRPL wallet and submit it."},"x402":{"success":true,"network":"xrpl"}}}}},"402":{"description":"Payment Required — x402 challenge. Body is the PAYMENT-REQUIRED payload; pay in RLUSD and retry with the PAYMENT-SIGNATURE header."},"422":{"description":"Payment received but required action params were missing — retry with them."}}}},"/api/credentials/account":{"get":{"operationId":"credentialsAccount","summary":"Every XLS-70 credential an account holds (free, live)","description":"Get every credential naming this address as Subject — issuer, type, whether it's been accepted, whether it's expired, and its expiry date. Live against a validated mainnet ledger on every call, deliberately not cached: this is the endpoint to check before trusting a counterparty's claimed credential. Free, no signup. Default is an owner-directory walk, bounded at ~20s; for an exchange-scale account it may return coverage:\"partial\" / complete:false. Pass &issuer= (and &type= unless it's XRPLHub's issuer) for a direct ledger lookup that is always fast and always complete.","security":[],"tags":["Credentials"],"parameters":[{"name":"address","in":"query","required":true,"description":"XRPL classic address to look up (r...).","schema":{"type":"string","pattern":"^r[1-9A-HJ-NP-Za-km-z]{24,34}$"},"example":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"},{"name":"issuer","in":"query","required":false,"description":"Restrict to one issuer via direct ledger_entry lookups (no owner-directory walk). For XRPLHub's own issuer all four score tiers are probed automatically; for any other issuer also pass &type=.","schema":{"type":"string","pattern":"^r[1-9A-HJ-NP-Za-km-z]{24,34}$"},"example":"rmWjCGeLtuLGerEuvHDkrsr46ej2Ni13f"},{"name":"type","in":"query","required":false,"description":"Credential type (plain name or hex) — required with &issuer= unless the issuer is XRPLHub's.","schema":{"type":"string"},"example":"io.xrplhub.score.v1.min750"}],"responses":{"200":{"description":"Every credential held by this address.","content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string"},"source":{"type":"string","enum":["live"]},"lookup":{"type":"string","enum":["owner-walk","targeted"]},"coverage":{"type":"string","enum":["complete","partial"]},"complete":{"type":"boolean"},"warning":{"type":"string","nullable":true},"count":{"type":"integer"},"credentials":{"type":"array","items":{"type":"object","properties":{"issuer":{"type":"string"},"credentialType":{"type":"string"},"credentialTypeHex":{"type":"string"},"accepted":{"type":"boolean"},"expired":{"type":"boolean"},"expirationISO":{"type":"string","format":"date-time","nullable":true},"uri":{"type":"string","nullable":true}}}}}},"example":{"address":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","source":"live","lookup":"targeted","coverage":"complete","complete":true,"count":1,"credentials":[{"issuer":"rmWjCGeLtuLGerEuvHDkrsr46ej2Ni13f","credentialType":"io.xrplhub.score.v1.min750","credentialTypeHex":"696F2E7872706C6875622E73636F72652E76312E6D696E373530","accepted":false,"expired":false,"expirationISO":"2026-12-03T10:59:55.000Z","uri":"https://www.xrplhub.io/verify/wallet/rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"}]}}}},"400":{"description":"Missing or invalid address."}}}},"/api/credentials/issuer":{"get":{"operationId":"credentialsIssuer","summary":"Everything an issuer has issued (free, census-backed)","description":"Every credential type an issuer has issued, distinct subject count, and acceptance rate. Served from a network-wide census rebuilt on a schedule, not live — the response's `coverage` field is \"complete\" or \"partial\" so a mid-walk answer is never presented as a finished count. Free, no signup.","security":[],"tags":["Credentials"],"parameters":[{"name":"address","in":"query","required":true,"description":"XRPL classic address of the issuer (r...).","schema":{"type":"string","pattern":"^r[1-9A-HJ-NP-Za-km-z]{24,34}$"},"example":"rmWjCGeLtuLGerEuvHDkrsr46ej2Ni13f"}],"responses":{"200":{"description":"Issuer stats from the census.","content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string"},"source":{"type":"string","enum":["indexed"]},"coverage":{"type":"string","enum":["complete","partial"]},"lastCompletedPassAt":{"type":"string","format":"date-time","nullable":true},"totalIssued":{"type":"integer"},"subjectCount":{"type":"integer"},"acceptanceRate":{"type":"number","nullable":true},"types":{"type":"array","items":{"type":"object","properties":{"credentialType":{"type":"string"},"credentialTypeHex":{"type":"string"},"count":{"type":"integer"}}}}}},"example":{"address":"rmWjCGeLtuLGerEuvHDkrsr46ej2Ni13f","source":"indexed","coverage":"complete","lastCompletedPassAt":"2026-09-05T12:00:00.000Z","totalIssued":1,"subjectCount":1,"acceptanceRate":0,"types":[{"credentialType":"io.xrplhub.score.v1.min750","credentialTypeHex":"696F2E7872706C6875622E73636F72652E76312E6D696E373530","count":1}]}}}},"400":{"description":"Missing or invalid address."}}}},"/api/domains/eligible":{"get":{"operationId":"domainsEligible","summary":"Does this account satisfy this PermissionedDomain? (free, live)","description":"Checks whether an account holds an accepted, unexpired credential matching any entry in a PermissionedDomain's AcceptedCredentials (XLS-80d: OR semantics — one matching credential is enough). Live against a validated mainnet ledger on every call. Free, no signup.","security":[],"tags":["Credentials"],"parameters":[{"name":"address","in":"query","required":true,"description":"XRPL classic address to check (r...).","schema":{"type":"string","pattern":"^r[1-9A-HJ-NP-Za-km-z]{24,34}$"},"example":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"},{"name":"domain","in":"query","required":true,"description":"The PermissionedDomain's own ledger index (DomainID) — 64 hex characters.","schema":{"type":"string","pattern":"^[0-9A-Fa-f]{64}$"}}],"responses":{"200":{"description":"Eligibility result.","content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string"},"domain":{"type":"string"},"domainFound":{"type":"boolean"},"domainOwner":{"type":"string","nullable":true},"eligible":{"type":"boolean"},"reason":{"type":"string"},"satisfiedBy":{"type":"object","nullable":true},"acceptedCredentials":{"type":"array","items":{"type":"object"}},"heldCredentials":{"type":"array","items":{"type":"object"}}}},"example":{"address":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","domain":"0000000000000000000000000000000000000000000000000000000000000000","domainFound":false,"domainOwner":null,"eligible":false,"reason":"No PermissionedDomain exists at that DomainID on the validated ledger.","satisfiedBy":null,"acceptedCredentials":[],"heldCredentials":[]}}}},"400":{"description":"Missing or invalid address/domain."}}}},"/api/mpt/{issuanceId}":{"get":{"operationId":"mptRisk","summary":"MPT issuance risk view — issuer powers + issuer trust (free, live)","description":"The risk view of one Multi-Purpose Token (XLS-33) issuance, not a listing. Returns what the issuer can do to a holder (clawback, freeze, require-auth, whether it's transferable at all) alongside the issuer's own XRPLScore, account age, verified domain and credentials held. Live reads from the validated ledger, cross-checked against Bithomp's index. An issuance not found returns \"unknown\", never \"does not exist\". Free, no signup.","security":[],"tags":["Tokens"],"parameters":[{"name":"issuanceId","in":"path","required":true,"description":"The MPTokenIssuanceID — 48 hexadecimal characters (XLS-33, 192-bit: creating-tx Sequence + issuer AccountID).","schema":{"type":"string","pattern":"^[0-9A-Fa-f]{48}$"},"example":"0641C7D1F9C6BB3B75EA31B353A54E2EFAC423498EF25045"}],"responses":{"200":{"description":"The issuance risk view.","content":{"application/json":{"schema":{"type":"object","properties":{"issuanceId":{"type":"string"},"found":{"type":"boolean"},"source":{"type":"object","properties":{"ledger":{"type":"string"},"bithompIndex":{"type":"string"},"interpretation":{"type":"string","description":"'exists', 'may have been destroyed', or 'unknown'."}}},"issuer":{"type":"string","nullable":true},"issuance":{"type":"object","nullable":true,"properties":{"assetScale":{"type":"integer"},"maximumAmount":{"type":"string","nullable":true},"outstandingAmount":{"type":"string"},"transferFeeBps":{"type":"number"},"metadata":{}}},"issuerPowers":{"type":"object","nullable":true,"properties":{"clawback":{"type":"boolean"},"canFreeze":{"type":"boolean"},"currentlyFrozen":{"type":"boolean"},"requiresAuth":{"type":"boolean"},"transferable":{"type":"boolean"}}},"issuerRisk":{"type":"object","nullable":true,"properties":{"xrplScore":{"type":"integer","nullable":true},"grade":{"type":"string","nullable":true},"accountAgeDays":{"type":"integer","nullable":true},"blackholed":{"type":"boolean"},"domain":{"type":"string","nullable":true},"domainVerified":{"type":"boolean","description":"Issuer address is listed in the domain's xrp-ledger.toml."},"credentialsHeld":{"type":"integer"},"credentials":{"type":"array","items":{"type":"object"}}}}}},"example":{"issuanceId":"0641C7D1F9C6BB3B75EA31B353A54E2EFAC423498EF25045","found":true,"source":{"ledger":"MPTokenIssuance present on the validated ledger (live read)","bithompIndex":"listed in Bithomp's index","interpretation":"exists"},"issuer":"rPm6K1fr4MNcv5W8pD4RCawVHjsK1ziCKp","issuance":{"assetScale":0,"maximumAmount":"1","outstandingAmount":"0","transferFeeBps":0,"metadata":{"t":"SCPO","ac":"rwa"}},"issuerPowers":{"clawback":true,"canFreeze":false,"currentlyFrozen":false,"requiresAuth":false,"transferable":false},"issuerRisk":{"xrplScore":475,"grade":"Building","accountAgeDays":80,"blackholed":false,"domain":"ipfs://Qm…","domainVerified":false,"credentialsHeld":2,"credentials":[]}}}}},"400":{"description":"issuanceId is not 48 hex characters."}}}},"/api/mpt/search":{"get":{"operationId":"mptSearch","summary":"Search the MPT registry index (free)","description":"Find Multi-Purpose Token (XLS-33) issuances by issuer address, MPTokenIssuanceID (or a hex prefix), or token name / ticker. Served from the registry index — the union of Bithomp's per-issuer data and our own ledger_data walk. The response carries `coverage` (\"complete-per-known-issuer\" | \"partial\") with `guarantees` / `doesNotGuarantee` strings: \"complete-per-known-issuer\" means every issuance of every issuer we know about is indexed and ledger-verified, NOT that no unknown issuer exists. Free, no signup.","security":[],"tags":["Tokens"],"parameters":[{"name":"q","in":"query","required":true,"description":"Issuer address (r...), MPTokenIssuanceID or hex prefix, or a token name / ticker.","schema":{"type":"string","minLength":2},"example":"rM7ffj9GZV41K8fWUhtpfZSZvYoZB2yA4t"}],"responses":{"200":{"description":"Matching issuances from the index.","content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"matchedBy":{"type":"string","enum":["issuer","issuanceId","name"]},"source":{"type":"string","enum":["indexed"]},"coverage":{"type":"string","enum":["complete-per-known-issuer","partial"]},"knownIssuers":{"type":"integer"},"indexedIssuances":{"type":"integer"},"cappedIssuers":{"type":"integer","description":"known issuers with >100 issuances Bithomp free can't fully page"},"freshnessFloorAt":{"type":"string","format":"date-time","nullable":true},"lastCompletedStateWalkPassAt":{"type":"string","format":"date-time","nullable":true},"guarantees":{"type":"string"},"doesNotGuarantee":{"type":"string"},"count":{"type":"integer"},"truncated":{"type":"boolean"},"results":{"type":"array","items":{"type":"object","properties":{"issuanceId":{"type":"string"},"issuer":{"type":"string"},"name":{"type":"string","nullable":true},"assetScale":{"type":"integer"},"maximumAmount":{"type":"string","nullable":true},"outstandingAmount":{"type":"string"},"transferFeeBps":{"type":"number"},"holderCount":{"type":"integer","nullable":true},"issuerPowers":{"type":"object"},"sources":{"type":"array","items":{"type":"string","enum":["walk","bithomp"]}},"lastSeenAt":{"type":"string","format":"date-time"}}}},"related":{"type":"array","items":{"type":"object"}}}},"example":{"query":"rM7ffj9GZV41K8fWUhtpfZSZvYoZB2yA4t","matchedBy":"issuer","source":"indexed","coverage":"complete-per-known-issuer","knownIssuers":34,"indexedIssuances":251,"cappedIssuers":0,"freshnessFloorAt":"2026-09-05T18:00:00.000Z","lastCompletedStateWalkPassAt":null,"guarantees":"Every MPTokenIssuance of all 34 issuers we know about is in this index…","doesNotGuarantee":"That no MPT issuer exists outside this set…","count":10,"truncated":false,"results":[{"issuanceId":"0601A5ECE082DA1CE432D2435B0D719CD87FF7EB9B77FDE7","issuer":"rM7ffj9GZV41K8fWUhtpfZSZvYoZB2yA4t","name":"SIV134","assetScale":0,"maximumAmount":"10000000","outstandingAmount":"0","transferFeeBps":0,"holderCount":0,"issuerPowers":{"clawback":false,"canFreeze":false,"currentlyFrozen":false,"requiresAuth":false,"canEscrow":false,"canTrade":true,"transferable":true},"sources":["bithomp"],"lastSeenAt":"2026-09-05T11:00:00.000Z"}],"related":[]}}}},"400":{"description":"q missing or shorter than 2 characters."}}}},"/api/mpt/issuer":{"get":{"operationId":"mptIssuer","summary":"Every MPT an issuer has out, plus their XRPLScore (free)","description":"Everything one issuer has issued as Multi-Purpose Tokens (XLS-33), from the registry index, with each issuance's issuer-power flags, alongside the issuer's own XRPLScore (cached, kept fresh by the daily refresh; computed live if not yet cached). Carries `coverage` (\"complete-per-known-issuer\" | \"partial\") with `guarantees` / `doesNotGuarantee`. Free, no signup.","security":[],"tags":["Tokens"],"parameters":[{"name":"address","in":"query","required":true,"description":"XRPL issuer address (r...).","schema":{"type":"string","pattern":"^r[1-9A-HJ-NP-Za-km-z]{24,34}$"},"example":"rM7ffj9GZV41K8fWUhtpfZSZvYoZB2yA4t"}],"responses":{"200":{"description":"The issuer's MPTs and score.","content":{"application/json":{"schema":{"type":"object","properties":{"issuer":{"type":"string"},"source":{"type":"string","enum":["indexed"]},"coverage":{"type":"string","enum":["complete-per-known-issuer","partial"]},"knownIssuers":{"type":"integer"},"indexedIssuances":{"type":"integer"},"cappedIssuers":{"type":"integer"},"freshnessFloorAt":{"type":"string","format":"date-time","nullable":true},"lastCompletedStateWalkPassAt":{"type":"string","format":"date-time","nullable":true},"guarantees":{"type":"string"},"doesNotGuarantee":{"type":"string"},"issuer_known_to_index":{"type":"boolean"},"aggregateStale":{"type":"boolean"},"xrplScore":{"type":"integer","nullable":true},"grade":{"type":"string","nullable":true},"scoreSource":{"type":"string","enum":["cached","live","unavailable"]},"scoredAt":{"type":"string","format":"date-time","nullable":true},"mptCount":{"type":"integer"},"mpts":{"type":"array","items":{"type":"object"}},"related":{"type":"array","items":{"type":"object"}}}},"example":{"issuer":"rM7ffj9GZV41K8fWUhtpfZSZvYoZB2yA4t","source":"indexed","coverage":"complete-per-known-issuer","knownIssuers":34,"indexedIssuances":251,"cappedIssuers":0,"freshnessFloorAt":"2026-09-05T18:00:00.000Z","lastCompletedStateWalkPassAt":null,"guarantees":"…","doesNotGuarantee":"…","issuer_known_to_index":true,"aggregateStale":false,"xrplScore":597,"grade":"Fair","scoreSource":"cached","scoredAt":"2026-09-05T07:00:00.000Z","mptCount":10,"mpts":[],"related":[]}}}},"400":{"description":"Missing or invalid address."}}}},"/api/mpt/anchor":{"get":{"operationId":"mptAnchor","summary":"Latest on-ledger anchor of the MPT registry (free)","description":"The BIS Working Paper 1374 pattern: after each cron pass the registry index is canonicalised, a Merkle root is computed over the issuance records, and that root is committed in a Memo on an AccountSet transaction from the issuer wallet (rmWjCGeLtuLGerEuvHDkrsr46ej2Ni13f). Returns the latest root, its tx hash, ledger index, issuance/issuer counts, coverage label, and the exact canonicalisation + Merkle scheme so a third party can reproduce the root from /api/mpt/search + /api/mpt/issuer and confirm the registry has not been altered. Free, no signup.","security":[],"tags":["Tokens"],"responses":{"200":{"description":"The latest anchor plus the verification recipe.","content":{"application/json":{"schema":{"type":"object","properties":{"anchoringEnabled":{"type":"boolean"},"latest":{"type":"object","nullable":true,"properties":{"canonVersion":{"type":"string"},"merkleRoot":{"type":"string","description":"64-hex lowercase SHA-256 Merkle root"},"issuanceCount":{"type":"integer"},"issuerCount":{"type":"integer"},"coverage":{"type":"string","enum":["complete-per-known-issuer","partial"]},"freshnessFloorAt":{"type":"string","format":"date-time","nullable":true},"status":{"type":"string","enum":["pending","anchored","failed"]},"txHash":{"type":"string","nullable":true},"ledgerIndex":{"type":"integer","nullable":true},"account":{"type":"string","nullable":true},"feeDrops":{"type":"string","nullable":true},"memo":{"type":"string","description":"exact UTF-8 payload; on-ledger MemoData is this hex-encoded"},"anchoredAt":{"type":"string","format":"date-time","nullable":true},"explorer":{"type":"string","nullable":true}}},"pendingNext":{"type":"object","nullable":true,"description":"the next snapshot awaiting an anchor, if its root differs from `latest`"},"history":{"type":"object","properties":{"totalSnapshots":{"type":"integer"},"anchoredOnLedger":{"type":"integer"}}},"verify":{"type":"object","description":"Everything needed to reproduce merkleRoot: the registry source endpoints, the frozen canonicalisation spec, and where the root sits on-ledger."}}},"example":{"anchoringEnabled":false,"latest":null,"pendingNext":{"canonVersion":"mpt-anchor-v1","merkleRoot":"10cbd62f0b95f16c46ddc9534cae3d549cf91b763254fb75cfbfac7f162c0fab","issuanceCount":251,"issuerCount":34,"coverage":"complete-per-known-issuer","status":"pending","txHash":null,"memo":"{\"root\":\"10cbd6…\",\"issuances\":251,\"issuers\":34,\"coverage\":\"complete-per-known-issuer\",\"freshnessFloor\":\"2026-09-05T…\",\"ts\":\"2026-09-05T…\"}"},"history":{"totalSnapshots":1,"anchoredOnLedger":0},"verify":{"summary":"Recompute the Merkle root from the published rows and check it equals latest.merkleRoot…"}}}}}}}},"/api/x402/usdc/mpt/{issuanceId}":{"get":{"operationId":"mptRiskFull","summary":"MPT issuance risk — full issuer detail (x402, $0.01 USDC on Base)","description":"Everything /api/mpt/{issuanceId} returns plus the parts that cost real live work: issuer account age, blackhole check, xrp-ledger.toml domain verification, the full credential list, the Bithomp cross-check, and a `related` cross-sell block. x402 exact scheme, USDC on Base via the CDP facilitator. No signup.","tags":["Tokens"],"parameters":[{"name":"issuanceId","in":"path","required":true,"description":"The MPTokenIssuanceID — 48 hexadecimal characters.","schema":{"type":"string","pattern":"^[0-9A-Fa-f]{48}$"},"example":"0641C7D1F9C6BB3B75EA31B353A54E2EFAC423498EF25045"}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.010000"},"protocols":[{"x402":{}}],"description":"Full MPT issuer risk view, USDC on Base via the CDP x402 facilitator."},"responses":{"200":{"description":"Full risk view — see /api/mpt/{issuanceId} 200 schema plus issuerRisk.{accountAgeDays,blackholed,domain,domainVerified,credentials} and a related[] block."},"402":{"description":"Payment Required — x402 challenge. Pay in USDC on Base and retry with the X-PAYMENT header."}}}},"/api/x402/usdc/score":{"post":{"operationId":"x402UsdcScore","summary":"XRPLScore — per-call, agent-priced (x402, $0.01 USDC on Base)","description":"The same 300–850 score and 8-signal breakdown as /api/x402/score, priced for agents at $0.01 per call and settled in USDC on Base via the CDP x402 facilitator (not the RLUSD/t54 rail). POST a JSON body {\"wallet\":\"r...\"}. No signup.","tags":["Scoring"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["wallet"],"properties":{"wallet":{"type":"string","pattern":"^r[1-9A-HJ-NP-Za-km-z]{24,34}$"}}},"example":{"wallet":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De"}}}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.010000"},"protocols":[{"x402":{}}],"description":"Per-call wallet score, USDC on Base via the CDP x402 facilitator."},"responses":{"200":{"description":"Wallet score with the 8 signals, grade and percentile.","content":{"application/json":{"schema":{"type":"object","properties":{"wallet":{"type":"string"},"score":{"type":"integer","minimum":300,"maximum":850,"description":"XRPLScore, 300–850 absolute scale."},"grade":{"type":"string","enum":["Building","Fair","Good","Excellent","Exceptional"]},"percentile":{"type":"number"},"signals":{"type":"object","description":"The 8 component scores, 0–100 each.","properties":{"accountAge":{"type":"number"},"txActivity":{"type":"number"},"financialHealth":{"type":"number"},"tokenEngagement":{"type":"number"},"dexActivity":{"type":"number"},"ammActivity":{"type":"number"},"securityConfig":{"type":"number"},"nftActivity":{"type":"number"}}},"methodology":{"type":"string"},"computedAt":{"type":"string","format":"date-time"}},"required":["wallet","score","grade","signals"]},"example":{"wallet":"rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De","score":721,"grade":"Good","percentile":74,"signals":{"accountAge":88,"txActivity":71,"financialHealth":64,"tokenEngagement":61,"dexActivity":40,"ammActivity":12,"securityConfig":30,"nftActivity":0},"methodology":"XRPLHub XRPLScore v1.1 — 8-signal native on-chain behavioral scoring, absolute scale","computedAt":"2026-09-04T00:00:00.000Z"}}}},"402":{"description":"Payment Required — x402 challenge. Pay in USDC on Base and retry with the X-PAYMENT header."}}}}}}