Mass Payout with China SAFE

Overview

Cross-border payouts involving China require order reporting consistent with SAFE (State Administration of Foreign Exchange) rules. Payoneer's Mass Payout with China SAFE solution lets you submit mass payouts together with the SAFE-related order information your program must supply, using either a REST API or an SFTP file channel.

Follow the official guide for every page in the flow: eligibility, field definitions, validation rules, file layouts, and error handling.

SAFE reporting

Your platform typically holds trade or service order data that must accompany eligible payouts. Payoneer maps that data into the reporting workflow described in the guide. Exact required properties, formats, and per-program rules are defined in the official documentation—not duplicated here—so your integration stays aligned with the current specification.

Prerequisites

  • Program enabled for China SAFE mass payout (confirm with Payoneer).
  • Payees registered and eligible for payout (see Payee onboarding).
  • Funding sufficient for requested payouts (same principle as Submit mass payout).
  • Credentials: OAuth2 application token for the API path; SFTP key/username and paths for the SFTP path (issued per your integration package).

Solution 1: REST API

Use your program access token with Submit Mass Payout (POST /v4/programs/{program_id}/masspayouts). Each payment can include orders_report with merchant/store details and either an SFTP JSON path (orders.type: local_ftp) or you can send order line items later via Update SAFE data (below). See the official guide for validation rules.

Submit mass payout with orders_report (SFTP JSON location)

Point orders.path at the JSON file on Payoneer's SFTP (example URLs below). Include payout_date, group_id, and the merchant / store structure as required for your program.

curl --request POST \
  --url https://api.sandbox.payoneer.com/v4/programs/{program_id}/masspayouts \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer MXVNd2NTcTBlTi94NkZC…' \
  --header 'Content-Type: application/json' \
  --data '{
  "Payments": [
    {
      "client_reference_id": "Payment1234",
      "payee_id": "ID123",
      "amount": "20",
      "description": "payment description",
      "payout_date": "10-01-2018",
      "currency": "USD",
      "group_id": "123",
      "orders_report": {
        "merchant": {
          "id": "123456",
          "store": {
            "name": "Payoneer goods LLC",
            "url": "www.payoneer.com",
            "type": "ECOMMERCE"
          }
        },
        "orders": {
          "type": "local_ftp",
          "path": "http://sftp.payoneer.com/xxxxxx.json"
        }
      }
    },
    {
      "client_reference_id": "Payment1235",
      "payee_id": "ID124",
      "amount": "20",
      "description": "payment description",
      "payout_date": "10-01-2018",
      "currency": "USD",
      "group_id": "123",
      "orders_report": {
        "merchant": {
          "id": "123456",
          "store": {
            "name": "Payoneer goods LLC",
            "url": "www.payoneer.com",
            "type": "ECOMMERCE"
          }
        },
        "orders": {
          "type": "local_ftp",
          "path": "http://sftp.payoneer.com/xxxxxxx.json"
        }
      }
    }
  ]
}'

Update SAFE data API (after mass payout)

Alternatively, call POST /v4/programs/{program_id}/payouts/{client_reference_id}/safe-data after submission to supply orders_report with inline orders.items when orders.type is data (same client_reference_id as the payout).

curl --request POST \
  --url https://api.sandbox.payoneer.com/v4/programs/{program_id}/payouts/{client_reference_id}/safe-data \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer MXVNd2NTcTBlTi94NkZC…' \
  --header 'Content-Type: application/json' \
  --data '{
  "orders_report": {
    "merchant": {
      "id": 9472596,
      "store": {
        "name": "floral",
        "url": "https://www.example.com/shop/floral",
        "type": "ECOMMERCE"
      }
    },
    "orders": {
      "type": "data",
      "items": [
        {
          "order_id": 3237717488,
          "order_date": "2024-03-10T01:59:07+00:00",
          "commit_date": "2024-03-10T02:01:01+00:00",
          "item_name": "High Quality Artificial Plant  Office Wedding Home Decoration Gifts",
          "item_id": 1597070916,
          "quantity": 1,
          "sku": 18883461293,
          "category": "Craft Supplies & Tools",
          "logistics_company": "UPS",
          "logistics_number": "1Z12345E02919",
          "price": "32.80",
          "currency": "USD"
        },
        {
          "order_id": 3232876399,
          "order_date": "2024-03-12T00:53:50+00:00",
          "commit_date": "2024-03-12T00:53:55+00:00",
          "item_name": "DIY Florals   Wedding Home Decoration   Gifts  DIY Bouquets Centerpieces",
          "item_id": 475985959,
          "quantity": 2,
          "sku": 2908998297,
          "category": "Craft Supplies & Tools",
          "logistics_company": "FedEx",
          "logistics_number": "6345634564",
          "price": "13.50",
          "currency": "USD"
        }
      ]
    }
  }
}'

Request and response schemas: API reference guide and v4-china-safe.

Solution 2: SFTP (batch file)

Alternatively, upload a batch file (for example CSV or XML) that contains payout rows and the SAFE order columns defined in the official guide. Payoneer provisions an SFTP endpoint, credentials, inbound folder, and file naming or scheduling rules as part of your integration package.

Typical flow:

  1. Build the file according to the layout and encoding in the guide.
  2. Connect with SFTP using the host, username, and private key (or password) Payoneer provides.
  3. Upload to the designated inbound directory; processing is asynchronous.
  4. Monitor processing via status APIs, reports, or webhooks as configured for your program.

Illustrative SFTP session (confirm host, paths, and key path with your integration materials):

sftp -i ~/.ssh/payoneer_sandbox_rsa partner@sftp.sandbox.payoneer.com
sftp> cd /inbound/mass_payout_china_safe
sftp> put ./batch_20250416_01.csv
sftp> bye

Choosing API vs SFTP

TopicAPISFTP
Best forReal-time or on-demand payouts from your backendScheduled or large batch uploads from finance/ops pipelines
IntegrationOAuth2 + HTTPS JSONSSH key + file drop
SAFE dataMust match the official schema; both channels carry the same reporting obligations

Status and monitoring

Payout submission is typically asynchronous. Use the status and notification mechanisms in the API reference (for example payout status endpoints or webhooks where enabled).