Address verification is in
Developer Preview. Endpoints and schemas are subject to change. To participate, contact
Paxos Support.
This guide covers both verification methods. Both flows use the same authentication step, so one access token covers the full walkthrough.
Use this guide when your application verifies addresses directly or when a third-party wallet collects signatures on behalf of its users.
Before You Begin
- A Sandbox account with API credentials (Client ID and Client Secret)
- The
address_ownership:read_verification and address_ownership:write_verification scopes enabled on your credentials. See API Credentials.
- The blockchain address you want to verify and its
network
- For
SIGNATURE: a way for the address holder to sign the Paxos message
- For
SMALL_DEPOSIT: a way for the address holder or custodian to send a transaction from the address
Who Does What
| Role | Responsibility |
|---|
| Paxos customer or API caller | Authenticates with Paxos, creates the verification record, sends the signing details to the wallet or user, submits the returned signature, and polls status. |
| Wallet or third-party collector | Shows the exact Paxos message to the address holder, collects the signature, and returns it to the API caller. Paxos credentials are not required. |
| Address holder | Signs the exact message with the wallet that controls the address, or sends the small deposit from the address. Private keys and seed phrases are never shared. |
Authenticate
Add the address_ownership:read_verification and address_ownership:write_verification scopes to your Sandbox account under API Management, then authenticate.
curl --location 'https://oauth.sandbox.paxos.com/oauth2/token' \
--form grant_type=client_credentials \
--form client_id={client_id} \
--form client_secret={client_secret} \
--form scope='address_ownership:read_verification address_ownership:write_verification'
Save the access_token from the response. You will use it in every subsequent request.
{
"access_token": "{access_token}",
"expires_in": 3599,
"scope": "address_ownership:read_verification address_ownership:write_verification",
"token_type": "bearer"
}
Signature Flow
Use this flow when the address holder can sign a message with the wallet that controls the address. This is the recommended flow for wallet integrations because it does not require an on-chain transaction.
- Authenticate (above)
- Create a verification to get the message to sign
- Send the verification details to the wallet or user
- Collect the signature and submit it via Submit Signature
1. Create a Verification
Covers Ethereum, Ink, XLayer, and Arbitrum One.curl --location --request POST 'https://api.sandbox.paxos.com/v2/addresses/verifications' \
--header 'Authorization: Bearer {access_token}' \
--header 'Content-Type: application/json' \
--data '{
"network": "ETHEREUM",
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"verification_method": "SIGNATURE",
"ref_id": "my-idempotency-key-001"
}'
The response contains signature_verification.message, the exact string to sign, and signature_verification.nonce, which is embedded in that message.{
"id": "01934abc-def0-7890-abcd-ef0123456789",
"network": "ETHEREUM",
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"verification_method": "SIGNATURE",
"status": "PENDING",
"signature_verification": {
"message": "Paxos Address Ownership Verification\nNonce: a1b2c3d4\nIssued At: 2026-05-19T12:00:00Z",
"nonce": "a1b2c3d4",
"signature": ""
},
"created_at": "2026-05-19T12:00:00Z",
"updated_at": "2026-05-19T12:00:00Z",
"expires_at": "2026-05-21T12:00:00Z"
}
Save the id, signature_verification.message, network, address, and expires_at. curl --location --request POST 'https://api.sandbox.paxos.com/v2/addresses/verifications' \
--header 'Authorization: Bearer {access_token}' \
--header 'Content-Type: application/json' \
--data '{
"network": "SOLANA",
"address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
"verification_method": "SIGNATURE",
"ref_id": "my-idempotency-key-002"
}'
The response structure is identical to EVM. Sign message using ed25519 instead of EIP-191.{
"id": "01934abc-def0-7890-abcd-ef0123456790",
"network": "SOLANA",
"address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
"verification_method": "SIGNATURE",
"status": "PENDING",
"signature_verification": {
"message": "Paxos Address Ownership Verification\nNonce: b3c4d5e6\nIssued At: 2026-05-19T12:00:00Z",
"nonce": "b3c4d5e6",
"signature": ""
},
"created_at": "2026-05-19T12:00:00Z",
"updated_at": "2026-05-19T12:00:00Z",
"expires_at": "2026-05-21T12:00:00Z"
}
Save the id, signature_verification.message, network, address, and expires_at.
2. Collect the Signature
Send the signing details to the wallet or user. Do not send Paxos client credentials, client secrets, or OAuth tokens to a wallet frontend or third-party collector.
{
"verification_id": "01934abc-def0-7890-abcd-ef0123456789",
"network": "ETHEREUM",
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"message": "Paxos Address Ownership Verification\nNonce: a1b2c3d4\nIssued At: 2026-05-19T12:00:00Z",
"expires_at": "2026-05-21T12:00:00Z"
}
The wallet must sign message exactly as returned by Paxos, including casing, spacing, and line breaks.
The signed message verifies control of the address for the requested Paxos use case. It is not an on-chain transaction and does not authorize movement of funds.
3. Submit the Signature
After the wallet or address holder returns the signature, submit it to Paxos with the verification id.
Signing standards:
- EVM networks (Ethereum, Ink, XLayer, Arbitrum One): EIP-191
personal_sign. Most wallets and libraries (ethers.js, viem, web3.py) expose this as signMessage.
- Solana: ed25519. Sign the message bytes with
nacl.sign.detached or equivalent.
Pass the verification id and the collected signature in the request body.
curl --location --request POST \
'https://api.sandbox.paxos.com/v2/addresses/verifications/signature' \
--header 'Authorization: Bearer {access_token}' \
--header 'Content-Type: application/json' \
--data '{
"id": "01934abc-def0-7890-abcd-ef0123456789",
"signature": "0x1b9b6f1a2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a1b"
}'
If the signature is valid, status moves to APPROVED immediately.
{
"id": "01934abc-def0-7890-abcd-ef0123456789",
"network": "ETHEREUM",
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"verification_method": "SIGNATURE",
"status": "APPROVED",
"signature_verification": {
"message": "Paxos Address Ownership Verification\nNonce: a1b2c3d4\nIssued At: 2026-05-19T12:00:00Z",
"nonce": "a1b2c3d4",
"signature": "0x1b9b6f1a2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a1b"
},
"created_at": "2026-05-19T12:00:00Z",
"updated_at": "2026-05-19T12:05:00Z",
"expires_at": "2026-05-21T12:00:00Z"
}
If the signature doesn’t verify, the verification stays PENDING. Call this endpoint again with a corrected signature.
Small Deposit Flow
Use this flow when the address holder cannot sign a message, for example if the address is held by a custodian or a hardware wallet that doesn’t support the Paxos message format.
- Authenticate (above)
- Create a verification to get the deposit address and amount
- Send exactly the specified amount from the address under verification
- Poll until the verification approves
1. Create a Verification
curl --location --request POST 'https://api.sandbox.paxos.com/v2/addresses/verifications' \
--header 'Authorization: Bearer {access_token}' \
--header 'Content-Type: application/json' \
--data '{
"network": "ETHEREUM",
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"verification_method": "SMALL_DEPOSIT",
"ref_id": "my-idempotency-key-003"
}'
The response tells you where to send funds. The details are under small_deposit_verification.
{
"id": "01934abc-def0-7890-abcd-ef0123456791",
"network": "ETHEREUM",
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"verification_method": "SMALL_DEPOSIT",
"status": "PENDING",
"small_deposit_verification": {
"deposit_address": "0xPaxosControlledAddress123456789abcdef01234",
"amount": "0.000001",
"asset": "ETH"
},
"created_at": "2026-05-19T12:00:00Z",
"updated_at": "2026-05-19T12:00:00Z",
"expires_at": "2026-05-21T12:00:00Z"
}
Send exactly small_deposit_verification.amount on-chain from 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 to the deposit_address. Paxos checks both the sender and the amount. No further API call is needed.
If the deposit isn’t detected, you can send again from the same address within the 48-hour window.
2. Poll for Status
Poll Get Address Verification until status is no longer PENDING.
curl --location \
'https://api.sandbox.paxos.com/v2/addresses/verifications/01934abc-def0-7890-abcd-ef0123456791' \
--header 'Authorization: Bearer {access_token}'
{
"id": "01934abc-def0-7890-abcd-ef0123456791",
"network": "ETHEREUM",
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"verification_method": "SMALL_DEPOSIT",
"status": "APPROVED",
"small_deposit_verification": {
"deposit_address": "0xPaxosControlledAddress123456789abcdef01234",
"amount": "0.000001",
"asset": "ETH",
"transaction_hash": "0xabc123def456..."
},
"created_at": "2026-05-19T12:00:00Z",
"updated_at": "2026-05-19T12:18:43Z",
"expires_at": "2026-05-21T12:00:00Z"
}
status | Meaning | Next step |
|---|
PENDING | In progress | Poll again |
APPROVED | Address control confirmed | Done |
EXPIRED | Verification window elapsed | Create a new verification and retry |
What to Expect
| Method | Time to approval | Notes |
|---|
SIGNATURE | Immediate | Approves the moment a valid signature is submitted |
SMALL_DEPOSIT | A few minutes | Depends on on-chain confirmation time for your network |
MANUAL | Contact Support | Handled off-platform for additional verification requirements that have not yet been automated. It is not created or expired through the public API. |
For SMALL_DEPOSIT, poll Get Address Verification every 10-15 seconds after sending your transaction. Paxos detects the deposit as soon as it confirms on-chain.
Idempotency
Use ref_id to make verification creation safe to retry. If a request times out before you get a response, resend it with the same ref_id and Paxos returns the existing verification instead of creating a new one.
ref_id is scoped to your account. The same value can be used across different accounts without conflict.
List Verifications
Use List Address Verifications to retrieve verification records, with optional filters.
curl --location \
'https://api.sandbox.paxos.com/v2/addresses/verifications?order=DESC' \
--header 'Authorization: Bearer {access_token}'
{
"items": [
{
"id": "01934abc-def0-7890-abcd-ef0123456789",
"network": "ETHEREUM",
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"verification_method": "SIGNATURE",
"status": "PENDING",
"ref_id": "my-idempotency-key-001",
"signature_verification": {
"message": "Paxos Address Ownership Verification\nNonce: a1b2c3d4\nIssued At: 2026-05-19T12:00:00Z",
"nonce": "a1b2c3d4",
"signature": ""
},
"created_at": "2026-05-19T12:00:00Z",
"updated_at": "2026-05-19T12:00:00Z",
"expires_at": "2026-05-21T12:00:00Z"
},
{
"id": "01934abc-def0-7890-abcd-ef0123456791",
"network": "ETHEREUM",
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"verification_method": "SMALL_DEPOSIT",
"status": "PENDING",
"ref_id": "my-idempotency-key-003",
"small_deposit_verification": {
"deposit_address": "0xPaxosControlledAddress123456789abcdef01234",
"amount": "0.000001",
"asset": "ETH",
"transaction_hash": ""
},
"created_at": "2026-05-19T11:00:00Z",
"updated_at": "2026-05-19T11:00:00Z",
"expires_at": "2026-05-21T11:00:00Z"
}
],
"next_page_cursor": ""
}
Supported query filters: status, verification_method, network, address, created_at.gte, created_at.lte, created_at.gt, created_at.lt, order, limit, page_cursor.
Questions? Contact Support.