Acme Citibank China Payments
This describes validations / allowed data formats for Acme payments going through Citibank China. These will be validated by Acme and further validated by the bank. These rules may be stricter than what the bank requires.
Common Definitions
-
SWIFT Character Set:
- The 26 uppercase Latin letters
A-Z - The 26 lowercase Latin letters
a-z - The 10 digits
0-9 - Forward slash
/ - Hyphen
- - Question mark
? - Colon
: - Left and right parentheses
() - Full stop
. - Comma
, - Single quote
' - Plus sign
+ - Space
- The 26 uppercase Latin letters
-
Citi restrictions:
- For SWIFT character set: do not start a field with any of the following characters:
/,-,: - Acme does not apply a China bank-holiday calendar. The bank may still reject a
paymentDatethat is not a CN working day.
- For SWIFT character set: do not start a field with any of the following characters:
CN_ACH
China domestic ACH transfer.
Important
- Currency must be CNY only.
- Payment date cannot be in the past. Maximum 65 days forward.
bankChargeBearerandinstructionForSenderBankmust not be provided.receiver.intermediaryBankandreceiver.address.line1/line2/state/postalCodemust not be provided; onlycityandcountryare accepted.receiver.nameandreceiver.bankmay be English or Chinese. Backtick is not allowed.- Provide
receiver.accountNameonly if it differs fromreceiver.name. If provided, the bank uses the account name instead of the beneficiary name. categoryPurposeis a batch-level field.receiver.address.cityis required.
| field | pattern / charset | max length | mandatory/optional |
|---|---|---|---|
| categoryPurpose (at batch level) | One of BONU CASH CCRD CORT DCRD DIVI EPAY GOVT HEDG ICCP IDCP INTC INTE LOAN OTHR PENS SALA SECU SSBE SUPP TAXS TRAD TREA VATX WHLD | 4 | O |
| payments[N].customerReference | SWIFT (uppercase only) | 15 | M |
| payments[N].paymentDetails | English or Chinese | 70 | O |
| payments[N].paymentAdviceEmails[N] | Valid email address Example: ["finance@company.com"] | 50 per email (max 1 email) | O |
| payments[N].transferLocality | INTRA_CITY or INTER_CITY | M | |
| payments[N].receiver.name | English or Chinese; backtick not allowed | 60 | M |
| payments[N].receiver.bank | English or Chinese; backtick not allowed | 60 | M |
| payments[N].receiver.bankAccountNumber | Numeric | 32 | M |
| payments[N].receiver.localRoutingIdentifier | Numeric | 12 | O |
| payments[N].receiver.accountName | English or Chinese | 44 | O |
| payments[N].receiver.address.city | English or Chinese | 35 | M |
| payments[N].receiver.address.country | Fixed value CN | 2 | O |
CN_RTGS
China domestic RTGS transfer for high-value payments.
Important
- Currency must be CNY only.
- Payment date cannot be in the past. Maximum 90 days forward.
receiver.localRoutingIdentifiermust be exactly 12 digits (CNAPS).receiver.bankis optional.bankChargeBearer,instructionForSenderBank,transferLocality,purposeCode,receiver.intermediaryBank, andreceiver.addressmust not be provided.receiver.name,receiver.bank, andpaymentDetailsmust not contain a backtick.- Provide
receiver.accountNameonly if it differs fromreceiver.name. If provided, the bank uses the account name instead of the beneficiary name.
| field | pattern / charset | max length | mandatory/optional |
|---|---|---|---|
| payments[N].customerReference | SWIFT (uppercase only) | 15 | M |
| payments[N].paymentDetails | English or Chinese; backtick not allowed | 140 | O |
| payments[N].paymentAdviceEmails[N] | Valid email address Example: ["finance@company.com"] | 50 per email (max 1 email) | O |
| payments[N].receiver.name | English or Chinese; backtick not allowed | 60 | M |
| payments[N].receiver.bank | English or Chinese; backtick not allowed | 60 | O |
| payments[N].receiver.bankAccountNumber | Numeric | 32 | M |
| payments[N].receiver.localRoutingIdentifier | Numeric (exactly 12 digits) | 12 | M |
| payments[N].receiver.accountName | English or Chinese | 60 | O |
CN_TT_INTL
Telegraphic transfer for international payments. Currency must not be CNY; use CN_TT_DOM for RMB.
Important
- Currency must not be CNY.
- Payment date cannot be in the past. Maximum 90 days forward.
receiver.bankmust be a BIC.instructionForSenderBankandreceiver.localRoutingIdentifiermust not be provided.- SAFE BOP reporting is required. See SAFE BOP. Acme validates list size, string length, and amount shape only.
- Provide
receiver.accountNameonly if it differs fromreceiver.name. If provided, the bank uses the account name instead of the beneficiary name. receiver.address.cityandreceiver.address.countryare mandatory. The full address must fit in 3 lines of 35 SWIFT characters.
| field | pattern / charset | max length | mandatory/optional |
|---|---|---|---|
| payments[N].customerReference | SWIFT (uppercase only) | 15 | M |
| payments[N].paymentDetails | English or Chinese; backtick not allowed | 140 | O |
| payments[N].paymentAdviceEmails[N] | Valid email address Example: ["finance@company.com"] | 50 per email (max 1 email) | O |
| payments[N].bankChargeBearer | SENDER / RECEIVER / SHARED | O | |
| payments[N].regulatoryInstructionInfo | Array of strings (include Citi prefixes, e.g. /CNS1/) | 35 per entry (max 3) | M |
| payments[N].regulatoryAmounts | Array of { amount, currency }. amount is a positive integer in minor units | max 2 entries | M |
| payments[N].regulatoryInformation | Array of strings. List index is the Inf slot. Exactly 6 entries; unused slots "" | 35 per entry | M |
| payments[N].receiver.name | English or Chinese; backtick not allowed | 35 | M |
| payments[N].receiver.bank | BIC (8 or 11 characters, ISO 9362) | 11 | M |
| payments[N].receiver.intermediaryBank | BIC (8 or 11 characters) | 11 | O |
| payments[N].receiver.bankAccountNumber | SWIFT | 34 | M |
| payments[N].receiver.accountName | English or Chinese | 35 | O |
| payments[N].receiver.address.line1 | SWIFT | 35 | O |
| payments[N].receiver.address.line2 | SWIFT | 35 | O |
| payments[N].receiver.address.city | SWIFT | 35 | M |
| payments[N].receiver.address.state | SWIFT | 35 | O |
| payments[N].receiver.address.postalCode | SWIFT | 35 | O |
| payments[N].receiver.address.country | ISO 3166-1 alpha-2 | 2 | M |
CN_TT_DOM
RMB cross-border payment. Despite the type name, this is not a domestic FCY rail. Currency must be CNY only; use CN_TT_INTL for other currencies.
Important
- Currency must be CNY only.
- Payment date cannot be in the past. There is no Acme forward-date cap.
receiver.bankis a bank name, not a BIC.receiver.nameandreceiver.bankmust be SWIFT characters. Backtick is not allowed on those fields.instructionForSenderBank,receiver.localRoutingIdentifier, andreceiver.intermediaryBankmust not be provided.- SAFE BOP reporting is required. See SAFE BOP. Acme validates list size, string length, and amount shape only.
- Provide
receiver.accountNameonly if it differs fromreceiver.name. If provided, the bank uses the account name instead of the beneficiary name. - If an address is provided, the full address must fit in 3 lines of 35 SWIFT characters.
| field | pattern / charset | max length | mandatory/optional |
|---|---|---|---|
| payments[N].customerReference | SWIFT (uppercase only) | 16 | M |
| payments[N].paymentDetails | English or Chinese | 140 | O |
| payments[N].paymentAdviceEmails[N] | Valid email address Example: ["finance@company.com"] | 50 per email (max 1 email) | O |
| payments[N].bankChargeBearer | SENDER / RECEIVER / SHARED | O | |
| payments[N].purposeCode | One of GOD STR CTF RMT OTF 02112 02113 02114 02115 02116 02117 02123 02124 02125 02127 | O | |
| payments[N].regulatoryInstructionInfo | Array of strings (include Citi prefixes, e.g. /CNS1/) | 35 per entry (max 3) | M |
| payments[N].regulatoryAmounts | Array of { amount, currency }. amount is a positive integer in minor units | max 2 entries | M |
| payments[N].regulatoryInformation | Array of strings. List index is the Inf slot. Exactly 6 entries; unused slots "" | 35 per entry | M |
| payments[N].receiver.name | SWIFT; backtick not allowed | 35 | M |
| payments[N].receiver.bank | SWIFT (bank name, not BIC); backtick not allowed | 35 | M |
| payments[N].receiver.bankAccountNumber | SWIFT | 34 | M |
| payments[N].receiver.accountName | English or Chinese | 60 | O |
| payments[N].receiver.address.line1 | SWIFT | 35 | O |
| payments[N].receiver.address.line2 | SWIFT | 35 | O |
| payments[N].receiver.address.city | SWIFT | 35 | O |
| payments[N].receiver.address.state | SWIFT | 35 | O |
| payments[N].receiver.address.postalCode | SWIFT | 35 | O |
| payments[N].receiver.address.country | ISO 3166-1 alpha-2 | 2 | O |
SAFE BOP
For CN_TT_INTL and CN_TT_DOM you must send three payment fields. They are not interchangeable:
| field | Role | How you can tell them apart |
|---|---|---|
regulatoryInstructionInfo | Prefixed remarks and invoice | Every string starts with /CNS1/, /CNS2/, or /CNIN/ |
regulatoryInformation | SAFE form slots | First string starts with O/C/… (no /CNS prefix). Always 6 slots; unused slots are "" |
regulatoryAmounts | Code 1 / Code 2 money | Objects with amount and currency, not strings |
Use application form type O (overseas) for both types. Customer type is C (business).
Acme only checks list size, string length (≤35), and amount shape. Citi checks the actual SAFE content.
| field | Limits |
|---|---|
regulatoryInstructionInfo | Non-empty; ≤3 strings |
regulatoryAmounts | Non-empty; ≤2. amount is minor units (1–999999999) |
regulatoryInformation | Exactly 6 strings. List index = slot ([0] is slot 1). Unused slots are "" |
Use this table with Citi’s Values — CHINA SAFE BOP Declaration Sub-form. Join the parts of a slot with /.
regulatoryInformation
| Citi sub-form field | Send as |
|---|---|
| Application Form Type | Slot [0], 1st part — use O (overseas) |
| Customer Type | Slot [0], 2nd part — use C (business) |
| BOP Transaction Code 1 | Slot [0], 3rd part — 6 digits |
| Payment Purpose | Slot [0], 4th part — A D R O |
| Name of Applicant | Slot [0], 5th part |
| BOP Transaction Code 2 | Slot [1], 1st part — optional; leave empty if unused |
| Payment classified for bonded goods | Slot [1], 2nd part — Y or N |
| Applicant Phone Number | Slot [1], 3rd part |
| Payment Character | Slot [2] — only if form type is D |
| SAFE Approval/Register/Service Number | Slot [3], 1st part — optional |
| Fund Source Type | Slot [3], 2nd part — optional F P O |
| Unit Code For Business | Slot [4], 1st part — required because customer type is C |
| Resident Country/Region | Slot [4], 2nd part — 3 characters from the China SAFE country list |
| Contract Number | Slot [5] — required when bonded goods is Y |
regulatoryAmounts
| Citi sub-form field | Send as |
|---|---|
| BOP Transaction Code 1 Amount | [0].amount (minor units) — goes with Inf slot [0] |
| BOP Transaction Code 1 Currency | [0].currency |
| BOP Transaction Code 2 Amount | [1].amount — only if Code 2 is used (Inf slot [1]) |
| BOP Transaction Code 2 Currency | [1].currency — only if Code 2 is used |
regulatoryInstructionInfo (each string starts with the code word)
| Citi sub-form field | Send as |
|---|---|
| BOP Transaction Code 1 Remark | /CNS1/{remark} — required for form type O (overseas) |
| BOP Transaction Code 2 Remark | /CNS2/{remark} — required for form type O (overseas) when Code 2 is used |
| Invoice Number | /CNIN/{invoice} — required when bonded goods is Y |
Typical payment
Bonded goods N, no second BOP code. Send all 6 strings. Unused slots (Payment Character, SAFE number, contract) are "" so later slots stay in position. Replace the {…} values.
{
"regulatoryInstructionInfo": ["/CNS1/{code 1 remark}"],
"regulatoryAmounts": [
{ "amount": {same minor units as amount}, "currency": "{payment currency}" }
],
"regulatoryInformation": [
"O/C/{6-digit BOP code}/{purpose}/{applicant name}",
"/N/{phone}",
"",
"",
"{unit code}/{SAFE country}",
""
]
}| Index | Slot | In this template |
|---|---|---|
[0] | 1 | Form, customer, BOP code 1, purpose, applicant name |
[1] | 2 | Code 2 (empty), bonded N, phone |
[2] | 3 | "" — Payment Character, only if form type is D |
[3] | 4 | "" — optional SAFE number / fund source |
[4] | 5 | Unit code + SAFE country |
[5] | 6 | "" — contract number, only if bonded is Y |
Do not skip middle or trailing unused slots. Send "" so the index still matches the Citi slot.
| Placeholder | What to put |
|---|---|
{code 1 remark} | Short remark for BOP code 1 (required for overseas). The whole string including /CNS1/ must be ≤35 |
{6-digit BOP code} | BOP Transaction Code 1 |
{purpose} | A advance payment, D payment against delivery, R refund, O others |
{applicant name} | English ≤20 or Simplified Chinese ≤10 |
{phone} | Applicant phone, ≤20 |
{unit code} | Business unit code Citi issued (required because customer type is C) |
{SAFE country} | 3 characters from the China SAFE country list (for example CHN) |
When you need extra fields
Second BOP code
- Slot
[1]becomes{code2}/N/{phone}(orYif bonded) - Add
{ "amount": …, "currency": … }asregulatoryAmounts[1](this amount is sent with Inf slot[1], not as a separate amount-only block) - Add
/CNS2/{code 2 remark}toregulatoryInstructionInfo
Bonded goods Y
- Slot
[1]usesYinstead ofN - Add
/CNIN/{invoice number}toregulatoryInstructionInfo - Put the contract number in slot
[5]instead of""
Optional slot [3]
{SAFE approval or register number}/{fund source}- Fund source:
FFX,Ppurchase,Oothers - If you skip it, keep
""so later slots do not move
Domestic form type D
- Do not use
Dfor these payment types unless Citi told you to - If you do, slot
[2]must be Payment Character:Xbonded area,Eexport processing zone,Ddiamond exchange,Mdownstream processing,Oother
Example: CN_TT_INTL
USD 10,000.00, BOP code 600101, advance payment, not bonded. Replace 12345678 with your Citi unit code.
{
"amount": 1000000,
"currency": "USD",
"customerReference": "CNTT002",
"bankChargeBearer": "SHARED",
"regulatoryInstructionInfo": ["/CNS1/Trade settlement"],
"regulatoryAmounts": [{ "amount": 1000000, "currency": "USD" }],
"regulatoryInformation": ["O/C/600101/A/Zhang Wei", "/N/13800138000", "", "", "12345678/CHN", ""],
"receiver": {
"name": "Shanghai Export Co",
"bank": "CITIUS33XXX",
"bankAccountNumber": "9876543210",
"accountName": "Shanghai Export Account Title",
"address": {
"line1": "100 Wall Street",
"city": "New York",
"state": "NY",
"postalCode": "10005",
"country": "US"
}
}
}That SAFE block means:
| String | Meaning |
|---|---|
/CNS1/Trade settlement | Code 1 remark |
O/C/600101/A/Zhang Wei | Overseas, business, code 600101, advance, applicant Zhang Wei |
/N/13800138000 | No Code 2, not bonded, phone |
12345678/CHN | Unit code + resident country China |
Example: CN_TT_DOM
Same three SAFE fields. Use CNY for amount and regulatoryAmounts.
{
"amount": 1000000,
"currency": "CNY",
"customerReference": "CNTTDOM0001",
"bankChargeBearer": "SHARED",
"paymentDetails": "Invoice 2024-001",
"regulatoryInstructionInfo": ["/CNS1/Trade settlement"],
"regulatoryAmounts": [{ "amount": 1000000, "currency": "CNY" }],
"regulatoryInformation": ["O/C/600101/A/Zhang Wei", "/N/13800138000", "", "", "12345678/CHN", ""],
"receiver": {
"name": "Shanghai Import Export Co",
"bank": "Bank of Shanghai Co Ltd",
"bankAccountNumber": "9876543210",
"accountName": "账户户名",
"address": {
"line1": "100 Huangpu Road",
"city": "Shanghai",
"country": "CN"
}
}
}