Pay with Payoneer (charge account)

Overview

This flow debits an accountholder's Payoneer balance from your client platform after the user authenticates and consents. You call Payoneer with the account context and access token, retrieve balances, let the user select which balance to charge, call debit with the amount and references, obtain approval for the charge and fees, then commit the transaction. Payoneer may require multi-factor authentication; the response can include a challenge URL and session id for the user to complete.

Detailed request and response fields are in the API reference.

Charge User Balance (flow)

The diagram below summarizes the five-step interaction between the User, Client Platform, and Payoneer (Balances ? Debit ? Commit).

Flowchart: Charge User Balance — User, Client Platform, and Payoneer across five steps from retrieve balance through commit and MFA
Charge User Balance: retrieve balance, user selects balance, request debit, approve charge and fees, commit with MFA challenge when required.

Step 1 — Retrieve balance

From your backend, with account id and a valid access token, request the user's balances (see the API reference). Present the returned balances in your UI so the user can continue.

Step 2 — Select balance to charge

The user selects which Payoneer balance should be debited for the charge (for example in a "Pay with Payoneer" flow). Your platform stores the chosen balance_id for the next API calls.

Desktop web app: Pay with Payoneer modal to choose currency balance
Example desktop UI: user selects a currency balance (USD, EUR, …) before confirming the charge.

Step 3 — Request charge (Debit)

Call POST /v4/accounts/{account_id}/balances/{balance_id}/debit with the amount and your reference fields. Confirm optional fields in the API reference. Example (sandbox):

curl --request POST \
  --url https://api.sandbox.payoneer.com/v4/accounts/{account_id}/balances/{balance_id}/debit \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer 123' \
  --header 'Content-Type: application/json' \
  --data '{
  "client_reference_id": "charge12345",
  "amount": 2.02,
  "currency": "USD",
  "description": "some description of transaction",
  "to": {
    "type": "partner",
    "id": "123123123"
  }
}'

The debit step corresponds to the Debit arrow in the flowchart.

API response (debit)

Example response after a successful debit request (includes commit_id for consent and commit):

{
  "result": {
    "type": "debit",
    "commit_id": "f17c62a0-4edb-4ac6-8698-ef405f3d91a8",
    "client_reference_id": "test12342124312341234_12",
    "last_status": "2025-12-10T18:59:20.1265543Z",
    "created_at": "2025-12-10T18:59:20.1265545Z",
    "request_details": {
      "client_reference_id": "test12342124312341234_12",
      "amount": 16.03,
      "description": "test USD charge",
      "currency": "USD",
      "to": {
        "id": 123123123,
        "type": "partner"
      },
      "name": "APPROVED DIVINE"
    },
    "fees": [
      {
        "type": "charge_fee",
        "amount": 1,
        "currency": "USD"
      },
      {
        "type": "partner_fee",
        "amount": 3,
        "currency": "USD"
      }
    ],
    "amounts": {
      "charged": {
        "amount": 16.03,
        "currency": "USD"
      },
      "target": {
        "amount": 16.03,
        "currency": "USD"
      }
    },
    "expires_at": "2025-12-10T19:04:20.1025441Z"
  }
}

Step 4 — Approve charge + fees

The user must review and approve the charge, FX rate, and any fees shown from the response before you commit (including authorization to debit their Payoneer balance).

Desktop web app: Confirm payment details with Payoneer including FX and authorization
Example desktop UI: confirm order amount, FX rate, payment amount in balance currency, and authorization before Commit.

Step 5 — Confirm transaction (Commit)

After approval, call PUT to commit the transaction. Payoneer may require MFA; the response can include a challenge URL and session id for the user to complete before retrying commit.

curl -X PUT \
https://api.sandbox.payoneer.com/v4/accounts/{account_id}/payments/{commit_id} \
-H "Authorization: Bearer MXVNd2NTcTBlTi94NkZC…" \
-H 'content-type: application/json'

Challenge required (403 Forbidden)

If the user must pass a challenge (e.g. MFA), the commit request may return 403 Forbidden with error set to challenge_required. Use the challenge.url, session_id, and challenge_reference from the payload. Example body:

{
    "error": "challenge_required",
    "error_description": "Challenge authentication required. Please see 'challenge' in response for more details.",
    "error_details": {
        "code": 1803
    },
    "challenge": {
        "type": "mfa",
        "expires_at": "2026-01-14T15:14:59.544Z",
        "challenge_reference": "1e786e90701f4d90b6fbd69a64cea43f",
        "session_id": "e57e9b2e-c3fb-487f-aa79-d9cd43a34cfa",
        "url": "https://auth.payoneer.com/#?t=e57e9b2e-c3fb-487f-aa79-d9cd43a34cfa&challenge_reference=1e786e90701f4d90b6fbd69a64cea43f&v=a"
    }
}

Straight success response (commit)

When the commit succeeds without a pending challenge, the response can look like the following (example). You can then show a confirmation screen in your app.

{
    "result": {
        "payment_id": "4366181900177340",
        "status": 2,
        "status_description": "completed",
        "last_status": "2022-01-19T15:13:57.4407969Z",
        "created_at": "2022-01-19T15:13:54.9623312Z",
        "client_reference_id": "test3243454346",
        "request_details": {
            "url": "/accounts/3769570/balances/4366181897867848/payments/debit",
            "body": {
                "client_reference_id": "test3243454346",
                "amount": 16.02,
                "description": "test USD charge",
                "currency": "USD",
                "to": {
                    "id": 123456,
                    "type": "partner"
                }
            }
        },
        "to": {
            "type": "partner",
            "id": "123456"
        },
        "fees": [
            {
                "type": "charge_fee",
                "amount": 1,
                "currency": "USD"
            }
        ],
        "amounts": {
            "charged": {
                "amount": 16.02,
                "currency": "USD"
            },
            "target": {
                "amount": 16.02,
                "currency": "USD"
            }
        }
    }
}

Success screen (UI)

Desktop web app: successful Pay with Payoneer payment confirmation
Example desktop UI: payment completed confirmation with amount and currency.