Check before you pay
The most common fraud when paying in crypto is a swapped payment address: the page looks genuine, but the address belongs to someone else. Ask first whether this address really belongs to this domain. That goes for people and especially for AI agents that pay on their own.
How to read the result
| Result | Meaning |
|---|---|
| Proven | Whoever controls the domain also controls this address. ID MANDAT has checked it. |
| Declared only | The operator lists the address in its file. There is no proof. Better confirm it through a second channel. |
| A different address is proven | For the domain a different address is proven. Do not pay before you have confirmed the address through a second channel. |
| Not confirmed | The domain is registered but does not list this address. |
| Domain not registered | There is no valid entry. That is no proof of fraud, but nothing you can rely on either. |
| Invalid address | The form or checksum is wrong: usually a typo, sometimes tampering. |
What is checked
- XRP Ledger: the domain names the account in its
idmandat.json, and the account names the domain in itsDomainfield. Both together are the proof, as described on ID MANDAT and the XRP Ledger. - Ethereum and BNB Chain: the operator signs a sentence with the wallet that binds the address to the domain. The address is the same on all Ethereum-compatible networks (Base, Polygon, Arbitrum and more), so the check holds for all of them.
- Solana: addresses can be declared so far, but not yet proven. “Declared only” is the most you get there today.
- Typos: for Ethereum/BNB addresses with mixed upper and lower case, the built-in checksum (EIP-55) is verified; for XRP, the address checksum. A corrupted address is caught before it belongs to anyone.
For agents and programs
It is the same lookup as for a domain, with two extra parameters. The answer contains the field payment_check and is digitally signed as usual.
GET https://idmandat.com/api/v1/verify?domain=example.com&address=r…&chain=xrp
"payment_check": {
"domain": "example.com",
"chain": "xrp",
"address": "r…",
"result": "proven",
"proof": "xrpl-account-domain",
"text": "Proven: …"
}
Possible values of result: proven, declared, different_from_proven, not_declared, domain_not_registered, invalid_address, unsupported_chain. chain may be omitted; it is then detected from the address format. For MCP there is the tool check_payment_address (domain, address, chain). More in the API reference.
A rule worth following for agents: pay only if result equals proven. For anything else, stop and ask a human.
For operators: how to get your address in
Add the address to your idmandat.json, on the agent that uses it:
"references": { "onchain": ["r…", "0x…"] }
It is proven like this: for XRP as described on the XRPL page, for Ethereum/BNB with the wallet signature as in How an agent checks the seal. The seal then also shows the WALLET segment.
What the check does not say
- It says who an address belongs to, not whether the company is trustworthy or a payment is safe. Someone who controls the domain passes the check even as a fraudster.
- It does not replace asking back for larger amounts.
- The check uses the state stored at ID MANDAT, refreshed at registration and in the nightly re-check. A proof that lapsed a few hours ago may still be shown until the next re-check.
- Nothing is paid, nothing is stored and no key is touched. We only count how often a day it is queried.
Read the XRPL page for the details of the account proof, or open the check page for domains.
No key for your agent yet? Create your own security key.