This page covers the identity and transaction-level requirements for USD payments to China via CFXPS (China Foreign Exchange Payment System). The name, address, and originator account number requirements apply to every USD payment to China. The transaction-level fields further down apply only to the use cases noted against each field.
To find the SWIFT/BIC code for the destination bank, use the Bank Codes lookup.
Three things about this corridor differ from most others that you should know before you integrate.
For USD payments to China, COMPLETED means the funds have reached the beneficiary's bank. It does not always mean the beneficiary's account has been credited.
In a minority of cases the beneficiary's bank credits the account promptly. In most cases it first conducts a compliance review, because Chinese foreign exchange controls require one for every inbound USD payment regardless of amount. The bank contacts the beneficiary directly to collect supporting documentation, such as an invoice, shipping or customs proof, an employment contract, or proof of relationship. A sender cannot tell in advance which case applies.
This process is outside Ripple's control and no SLA applies. Crediting commonly takes several business days, and can take weeks where the bank escalates to enhanced due diligence. The timeline depends on when the beneficiary provides satisfactory documentation. Set expectations with your beneficiaries accordingly, and do not treat COMPLETED as proof of receipt.
Once a payment is initiated you cannot cancel it, amend it, or request a refund or return. Only the beneficiary's bank can initiate a return, which it does when the payment fails its compliance review.
A returned payment may arrive back as less than the amount sent, because the returning bank may deduct a handling fee. Fees vary by bank and branch, so budget for a shortfall when reconciling returns.
Because a payment cannot be corrected after submission, verify the beneficiary's details before sending. Funds sent to an unintended beneficiary are generally unrecoverable, and incorrect or incomplete details can leave a payment delayed or lost.
The CFXPS rail operates from 09:00 to 16:00 Beijing time (GMT+8), Monday to Friday, excluding Chinese public holidays. Payments submitted outside those hours are processed on the next business day.
Submitting before the 16:00 cutoff does not guarantee same-day completion. The cutoff governs when a payment enters processing, not when it finishes. Payments routed to a manual validation queue can take an additional business day or more, and the beneficiary bank's compliance review is separate from and additional to this.
CFXPS requires the originator's account number on every USD payment to China. Send it in the originatorAccountNumber field on the ORIGINATOR identity. Ripple forwards that value to the payout partner.
originatorAccountNumber is required whenever you validate an originator identity against CN_CFXPS. Creating or updating the identity without it fails with 400 Bad Request (USR_111). The value must be a real account number or customer identifier, not an arbitrary reference such as a randomly generated UUID:
| If the originator is | Send |
|---|---|
| A bank or other financial institution | The originator's bank account number |
| A payment service provider | Your customer identifier for the originator, in a numeric or number-like form |
Prefer digits. The beneficiary's bank applies its own validation to this value, separately from the character and length limits below, and may reject a value that does not resemble an account number.
This matters most if you are a payment service provider sending your own customer identifier. An internal reference in an obviously non-account format, such as a CRM record ID mixing letters and punctuation, can be rejected by the beneficiary's bank even though Ripple accepts it and the payment reaches the corridor. Where you have a choice, send a numeric customer or account identifier.
For USD payments to China, originatorAccountNumber must:
- Be no longer than 34 characters.
- Match
/^[A-Za-z0-9/?:().,'+ -]+$/, the same character set as the name and address fields described below.
The API accepts any string in this field by design, so neither limit is validated when you create the identity. A value that breaks either one fails at payout instead. A standard 36-character UUID exceeds the length limit, which is why an autogenerated identifier cannot be used here.
originatorAccountNumber must also be unique across all ACTIVE identities in your organization. Creating or updating a second active identity with the same value fails with 409 Conflict (USR_122). Uniqueness spans both roles, so a beneficiary identity that already carries a value blocks a later originator from using it. Each originator needs its own value: you cannot reuse a single shared account number across multiple active identities.
Do not send the account number in internalId. That field is your own reference key for the identity, and it has its own separate uniqueness rule.
For general internalId behavior, including how to handle 409 responses, see Payment identities.
Name and address values for USD payments to China via CFXPS must use letters (A-Z, a-z), digits (0-9), spaces, and the punctuation marks / ? : ( ) . , ' + -. Any other character causes the payout to be rejected. Chinese characters and other non-English scripts are not supported, and neither are common punctuation marks outside the set above, such as &, #, ", and _.
Keep the values in each field below as concise as possible. For each party, the combined name and postal address has a total maximum of 139 characters. This total applies separately to the beneficiary and the originator, and the per-field limits below are an allocation of it.
Neither of these limits is validated by the API. Both are applied by CFXPS after the payment is sent, and they behave differently:
- An unsupported character rejects the payment. CFXPS returns it, so you find out.
- An over-length name or address is truncated, not rejected. CFXPS shortens the combined name and address to fit and forwards the payment. Nothing tells you it happened, and the beneficiary's bank may return or misroute a payment that arrives with a shortened name or address.
Truncation is the more damaging of the two, because the money moves with incorrect data. Treat the length limits below as hard requirements even though nothing enforces them on the way in.
All name and address fields must use the character set described above, which is expressed as this regular expression:
/^[A-Za-z0-9/?:().,'+ -]+$/
The API applies its own, separate validation to these fields, and on some of them it is stricter than CFXPS. Personal names and city, for example, reject digits. So a value can satisfy the character set above and still be rejected by the API with a 400, and a value the API accepts can still be rejected by CFXPS. Use the Payload Schema Utility with CN_CFXPS selected to see both constraints applied together for a given field.
The regular expression is made up of the following components:
| Component | Meaning |
|---|---|
^ | Start of string. Matching begins at the very first character. |
[ ... ] | Character class. Defines the set of allowed characters inside the brackets. |
0-9 | Digits 0 through 9. |
a-z | Lowercase letters a through z. |
A-Z | Uppercase letters A through Z. |
/ | Forward slash. |
? | Question mark. |
: | Colon. |
( and ) | Opening and closing parentheses. |
. | Literal period. Inside a bracketed set a period is an ordinary character and needs no escaping. |
, | Comma. |
' | Single quote / apostrophe. |
+ | Plus sign. |
- | Literal hyphen. It sits last in the set deliberately: anywhere else it would be read as a range operator, such as a-z. |
| (space) | Space character (at the end of the bracket set). |
{1,} | Quantifier. The string must contain at least one character, with no upper limit (equivalent to +). |
$ | End of string. The match extends to the end of the input, disallowing invalid characters anywhere in the string. |
| Field | Applies to | Max length |
|---|---|---|
businessName | Beneficiary and originator (business) | 60 |
firstName, lastName | Beneficiary and originator (individual) | 15 each |
address.city | Beneficiary | 16 |
address.country | Beneficiary and originator | 2 |
| Combined address line | Beneficiary (business) | 61 |
| Combined address line | Beneficiary (individual) | 76 |
| Combined address line | Originator (business) | 77 |
| Combined address line | Originator (individual) | 92 |
Before sending a payment, Ripple combines several of the address fields you supply into the address line, separated by , . The limits above apply to the combined result, not to address.streetAddress on its own.
For a beneficiary, the combined line is:
streetAddress + stateOrProvince + postalCode
so the values must satisfy:
len(streetAddress) + len(stateOrProvince) + len(postalCode) + 4 <= 61 (business) or <= 76 (individual)
For an originator, city is also folded in, because CFXPS has no separate city field for the originator:
streetAddress + city + stateOrProvince + postalCode
so the values must satisfy:
len(streetAddress) + len(city) + len(stateOrProvince) + len(postalCode) + 6 <= 77 (business) or <= 92 (individual)
The added constants are the separators: 2 characters for each join.
A second limit applies to address.streetAddress on its own: 70 characters per entry, enforced by the API. Where the combined limit above is larger than 70, that per-entry cap is the one you will hit first, and it returns a 400 rather than failing at payout.
stateOrProvince and postalCode are required on every identity, so budget for them even though they have no individual limit on this corridor.
address.streetAddress is an array, so the API accepts more than one entry. Only the first entry is delivered on this corridor. Anything in a second or later entry is dropped in transit.
This is worse than losing an address line. The state or province and postal code are appended to the last entry, so with two or more entries they are appended to a line that is never delivered, and the beneficiary's bank receives an address with no state and no postal code. The Ripple UI sends a single line for this reason, and API senders should do the same.
Put the whole street address in the first entry and send no others.
The limits above are an allocation of the 139-character total for a party. For a business beneficiary they use it exactly: legal name (60) + combined address line (61) + city (16) + country (2) = 139. For a business originator: legal name (60) + combined address line (77) + country (2) = 139.
For individuals the allocation reserves 15 characters for a middle name, which this API does not expose, so the fields you can send reach 124 rather than 139. The remaining 15 characters are not available to other fields. Using fewer characters in one field never increases the maximum allowed in another.
| Field | Description | Required | Type | Constraints |
|---|---|---|---|---|
purposeCode | Purpose of payment | Required for B2B and B2B2B | ENUM | See valid values below. Not required for other use cases |
purposeCode is required when both the originator and the beneficiary are businesses, meaning the B2B and B2B2B use cases. It is not required for B2C, B2B2C, C2B2B, or C2B2C, and the routes serving those use cases do not consume it.
| Code | Description |
|---|---|
GDDS | Purchase or sale of goods |
SCVE | Purchase or sale of services |