Skip to main content
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

RoleResponsibility
Paxos customer or API callerAuthenticates 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 collectorShows the exact Paxos message to the address holder, collects the signature, and returns it to the API caller. Paxos credentials are not required.
Address holderSigns 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.

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"
}
statusMeaningNext step
PENDINGIn progressPoll again
APPROVEDAddress control confirmedDone
EXPIREDVerification window elapsedCreate a new verification and retry

What to Expect

MethodTime to approvalNotes
SIGNATUREImmediateApproves the moment a valid signature is submitted
SMALL_DEPOSITA few minutesDepends on on-chain confirmation time for your network
MANUALContact SupportHandled 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.