Skip to main content

Overview

This guide walks you through sending your first international payment using PayOnProof. You’ll compare anchor routes, execute a transfer, and receive verifiable proof of payment—all in under 5 minutes.
This quickstart uses the PayOnProof web interface. For API integration, see the API Reference.

Prerequisites

Before you begin, you’ll need:
  • A Stellar-compatible wallet (Freighter, Albedo, or similar)
  • Test funds on Stellar testnet (or real funds for mainnet)
  • Basic understanding of international payment corridors
For production payments, ensure your wallet is funded and you’ve completed KYC requirements with your chosen anchor.

Step 1: Connect your wallet

Navigate to the PayOnProof web app and connect your Stellar wallet.
1

Open PayOnProof

Visit app.payonproof.com (or your deployment URL).
2

Click 'Connect Wallet'

Select your wallet provider from the connection modal.
3

Approve connection

Confirm the connection request in your wallet extension.
Your wallet address will appear in the top-right corner once connected.

Step 2: Enter payment details

On the send money page, enter your payment details:
// The form captures:
- Origin country (e.g., "United States")
- Destination country (e.g., "Mexico")
- Amount (e.g., 1000 USD)
PayOnProof automatically queries all active anchors in the selected corridor to find available routes.

Example payment

Let’s send $1,000 from the United States to Mexico:
  1. Origin: United States (US)
  2. Destination: Mexico (MX)
  3. Amount: 1000
Click “Compare Routes” to proceed.

Step 3: Compare anchor routes

PayOnProof queries multiple Stellar anchors and presents side-by-side route comparisons.

What you’ll see

Each route displays:
  • Anchors: Origin anchor (on-ramp) → Destination anchor (off-ramp)
  • Total fee: Percentage and absolute amount
  • Fee breakdown: On-ramp fee + bridge fee (0.2%) + off-ramp fee
  • Exchange rate: Live FX rate between currencies
  • Recipient receives: Final amount after all fees
  • Estimated time: Settlement duration (typically 8-20 minutes)
  • Escrow: Whether funds are protected through the journey
  • Operational status: Real-time anchor availability

Route comparison example

{
  "routes": [
    {
      "id": "route-moneygram-moneygram-1709481234",
      "originAnchor": {
        "name": "MoneyGram (US)",
        "currency": "USD"
      },
      "destinationAnchor": {
        "name": "MoneyGram (MX)",
        "currency": "MXN"
      },
      "feePercentage": 2.1,
      "feeAmount": 21.00,
      "exchangeRate": 17.2450,
      "receivedAmount": 16876.81,
      "estimatedTime": "8 min",
      "available": true,
      "recommended": true
    }
  ]
}

Sorting options

You can sort routes by:
  • Best (recommended): Balanced score based on fees, speed, and reliability
  • Cheapest: Lowest total fee percentage
  • Fastest: Shortest estimated settlement time
Routes marked with a lightning bolt icon are recommended based on PayOnProof’s scoring algorithm.

Step 4: Execute the transfer

Once you’ve selected a route, PayOnProof guides you through the multi-phase execution:

Phase 1: Prepare authentication

PayOnProof prepares SEP-10 authentication challenges for both the origin and destination anchors.
// API call from services/api/api/execute-transfer.ts:960-1074
POST /api/execute-transfer
{
  "phase": "prepare",
  "route": selectedRoute,
  "amount": 1000,
  "senderAccount": "GXXXXXXXXXXXXX..."
}
Response:
{
  "status": "needs_signature",
  "prepared": {
    "transactionId": "POP-1709481234-X7Y9Z2",
    "anchors": [
      {
        "role": "origin",
        "anchorName": "MoneyGram (US)",
        "challengeXdr": "AAAA...",
        "webAuthEndpoint": "https://..."
      },
      {
        "role": "destination",
        "anchorName": "MoneyGram (MX)",
        "challengeXdr": "AAAA...",
        "webAuthEndpoint": "https://..."
      }
    ]
  }
}

Phase 2: Sign challenges

Your wallet signs the SEP-10 authentication challenges for both anchors.
You’ll need to approve two signature requests in your wallet—one for the origin anchor and one for the destination anchor.

Phase 3: Authorize and start interactive flows

PayOnProof exchanges the signed challenges for JWT tokens and initiates SEP-24 interactive flows.
POST /api/execute-transfer
{
  "phase": "authorize",
  "prepared": { /* from phase 1 */ },
  "signatures": {
    "origin": "signed_challenge_xdr",
    "destination": "signed_challenge_xdr"
  }
}
Response:
{
  "status": "processing",
  "transaction": {
    "id": "POP-1709481234-X7Y9Z2",
    "statusRef": "encrypted_status_handle",
    "anchorFlows": {
      "originDeposit": {
        "url": "https://anchor.example/interactive/deposit?token=..."
      },
      "destinationWithdraw": {
        "url": "https://anchor.example/interactive/withdraw?token=..."
      }
    }
  }
}

Phase 4: Complete anchor KYC/transfer

PayOnProof opens interactive windows for you to complete:
  1. Origin anchor deposit: Fund your transfer at the origin anchor
  2. Destination anchor withdraw: Specify recipient details at the destination anchor
Each anchor handles its own KYC requirements. You may need to provide identification, proof of address, or other compliance documentation.

Phase 5: Monitor status

PayOnProof automatically polls transaction status:
POST /api/execute-transfer
{
  "phase": "status",
  "transactionId": "POP-1709481234-X7Y9Z2",
  "statusRef": "encrypted_status_handle"
}
Response:
{
  "status": "ok",
  "stellarTxHash": "a1b2c3d4e5f6...",
  "completed": true,
  "anchors": [
    {
      "role": "origin",
      "status": "completed",
      "stellarTxHash": "a1b2c3d4e5f6..."
    },
    {
      "role": "destination",
      "status": "completed"
    }
  ]
}

Step 5: View proof of payment

Once the transfer completes, PayOnProof generates a verifiable proof of payment.

Proof contents

{
  "transactionId": "POP-1709481234-X7Y9Z2",
  "stellarTxHash": "a1b2c3d4e5f6...",
  "amount": 1000,
  "originCurrency": "USD",
  "destinationCurrency": "MXN",
  "receivedAmount": 16876.81,
  "feeAmount": 21.00,
  "route": {
    "originAnchor": "MoneyGram (US)",
    "destinationAnchor": "MoneyGram (MX)"
  },
  "timestamp": "2026-03-03T15:10:34.000Z",
  "status": "completed",
  "verificationUrl": "https://stellarchain.io/tx/a1b2c3d4e5f6..."
}

Verification

You can verify the payment on-chain:
  1. Click the “View on Stellar Explorer” link
  2. Confirm the transaction hash matches
  3. Verify the timestamp and amounts
  4. Share the proof with recipients or for accounting
The proof is cryptographically verifiable and can be independently validated against the Stellar blockchain.

API integration example

For programmatic access, use the PayOnProof REST API:
// 1. Compare routes
const routesResponse = await fetch('https://api.payonproof.com/api/compare-routes', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    origin: 'US',
    destination: 'MX',
    amount: 1000
  })
});
const { routes } = await routesResponse.json();

// 2. Select best route
const selectedRoute = routes.find(r => r.recommended);

// 3. Prepare transfer
const prepareResponse = await fetch('https://api.payonproof.com/api/execute-transfer', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    phase: 'prepare',
    route: selectedRoute,
    amount: 1000,
    senderAccount: 'GYOUR_STELLAR_ADDRESS'
  })
});
const { prepared } = await prepareResponse.json();

// 4. Sign challenges with your wallet
// (implementation depends on your wallet library)

// 5. Authorize and execute
const authorizeResponse = await fetch('https://api.payonproof.com/api/execute-transfer', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    phase: 'authorize',
    prepared,
    signatures: {
      origin: signedOriginChallenge,
      destination: signedDestinationChallenge
    }
  })
});
const { transaction } = await authorizeResponse.json();

// 6. Poll status until complete
See the API Reference for complete endpoint documentation.

Troubleshooting

”No routes found”

This means no anchors are currently operational for your selected corridor. Solutions:
  • Try a different country pair
  • Check back later (anchors may be temporarily offline)
  • Verify you’re using a supported corridor

”Selected route is not operational”

The route you selected became unavailable between query and execution. Solutions:
  • Return to route comparison and select a different route
  • Refresh the route list to get updated operational status

”SEP-10 challenge failed”

Wallet authentication with the anchor failed. Solutions:
  • Ensure your wallet has sufficient XLM for transaction fees
  • Check that you’re connected to the correct Stellar network (testnet vs mainnet)
  • Verify your wallet supports SEP-10 authentication

”Missing SEP10_CLIENT_DOMAIN_SIGNING_SECRET”

This error occurs in self-hosted deployments when client domain signing is required but not configured. Solutions:
  • Set SEP10_CLIENT_DOMAIN_SIGNING_SECRET in your API environment variables
  • See Local development for configuration details

Next steps

Understand the architecture

Learn how PayOnProof routes payments, aggregates anchors, and generates verifiable proofs.

API reference

Integrate PayOnProof into your application with the REST API.

Development setup

Run PayOnProof locally and contribute to the project.

Route comparison

Explore route scoring, escrow protection, and proof generation in depth.

Build docs developers (and LLMs) love