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 the rules Citi has confirmed (see Mandatory sub-fields), plus list size, string length and amount shape.
- 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 the rules Citi has confirmed (see Mandatory sub-fields), plus list size, string length and amount shape.
- 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
CN_TT_INTL and CN_TT_DOM payments carry China's SAFE balance of payments (BOP) declaration. Citi reports it to the State Administration of Foreign Exchange. You send it in three payment fields:
| field | What it holds | How to recognise it |
|---|---|---|
regulatoryInformation | The declaration, in 6 positional slots | Always 6 strings; the first starts with O/C/… |
regulatoryInstructionInfo | The remarks and the invoice number | Every string starts with /CNS1/, /CNS2/ or /CNIN/ |
regulatoryAmounts | The amount for each BOP code | Objects with amount (minor units) and currency, not strings |
Acme rejects the payment on create when a required value is missing or badly formatted (see Mandatory sub-fields). Citi checks the rest after the payment arrives, including whether the BOP code and the country are right. If they are not, Citi holds the payment until you amend it in CitiDirect.
The names in brackets below (TXREM, CONTRNO …) are the labels on Citi's CitiDirect BOP form, in case Citi refers to them.
Typical payment
Most payments look like this: one BOP code, not bonded goods. Replace the {…} values and keep all 6 strings, sending "" for an unused slot so the later slots stay in position.
{
"regulatoryInstructionInfo": ["/CNS1/{remark}", "/CNIN/{invoice number}"],
"regulatoryAmounts": [{ "amount": {same minor units as amount}, "currency": "{payment currency}" }],
"regulatoryInformation": [
"O/C/{BOP code}/{payment purpose}/{applicant name}",
"/N/{phone}",
"",
"",
"{unit code}/{country}",
"{contract number}"
]
}| Placeholder | What to put |
|---|---|
{remark} | The nature of the payment in Chinese, for example 技术服务费 (technical service fee). Citi's limit is 25 Chinese characters (TXREM) |
{invoice number} | Your invoice number, or N/A if there is none (INVOINO) |
{BOP code} | The 6-digit code for the nature of the payment. See BOP transaction codes |
{payment purpose} | A, D, R or O. See Code values |
{applicant name} | The name of the person making the declaration: English ≤20 or Simplified Chinese ≤10 characters (CRTUSER) |
{phone} | The applicant's phone, digits only, ≤20, for example 02128961234. A country code is not required (INPTELC) |
{unit code} | Your company's organisation code (对公组织机构代码). Citi does not issue it; your China entity has it |
{country} | The counterparty's country of registration, as a 3-letter code (USA, SGP, HKG …), not your own. Use CHN only if the counterparty itself is registered in China |
{contract number} | Your contract number, or N/A if there is none (CONTRNO) |
The slots are:
| Index | Holds |
|---|---|
[0] | Form type, customer type, BOP code 1, payment purpose, applicant name |
[1] | BOP code 2 (empty if unused), bonded goods, phone |
[2] | Payment character, only for form type D; otherwise "" |
[3] | SAFE register number and fund source; "" unless you need them |
[4] | Unit code and country |
[5] | Contract number |
Code values
Form type (slot [0], 1st part): use O overseas for both CN_TT_INTL and CN_TT_DOM. D domestic is not for these payment types unless Citi tells you otherwise.
Customer type (slot [0], 2nd part): C for business.
Payment purpose (slot [0], 4th part, PayType):
| code | Meaning | Use when |
|---|---|---|
A | Advance payment (预付货款) | You pay before the goods or services are delivered |
D | Payment against delivery (货到付款) | You pay on or after delivery |
R | Refund (退款) | You are returning money you received |
O | Others (其他) | None of the above |
Bonded goods (slot [1], 2nd part, ISREF): Y if the payment is for bonded goods (保税货物), otherwise N.
Fund source (slot [3], 2nd part, optional):
| code | Meaning | Use when |
|---|---|---|
F | FX (现汇) | You pay from foreign currency already in your account |
P | Purchase (购汇) | You buy the foreign currency with CNY for this payment |
O | Others (其他) | Any other source |
BOP transaction codes
The BOP transaction code is a 6-digit code from SAFE's 涉外收支交易分类与代码(2014版) that says what the payment is for. Refer to the BOP transaction code list provided by Citibank for every code. The first digit is the group:
| First digit | Group | SAFE register number (REGNO) |
|---|---|---|
1 | Goods trade (货物贸易) | not needed |
2 | Services trade (服务贸易) | not needed |
3 | Primary income (初次收入) | not required by Acme |
4 | Secondary income (二次收入) | not required by Acme |
5 | Capital account (资本账户) | required |
6 | Direct investment (直接投资) | required |
7 | Securities and derivatives (证券投资及金融衍生工具) | required |
8 | Other investment (其他投资) | required |
9 | Domestic FX and special transactions (境内外汇收支交易及其他特殊交易) | required |
Pick the code that describes the true nature of the payment, and describe the same thing in the /CNS1/ remark. Acme checks only that the code is 6 digits. A valid code that does not match the payment is caught by Citi, which holds the payment until it is amended.
Common mistake
Sending 929010 同名账户资金转入/转出 (a transfer between accounts in the same name) for a payment that is actually a service fee. The 9 group is for domestic FX transactions, not payments to an overseas counterparty. A service fee takes a 2 services code, such as 228039 其他技术服务 (other technical services).
When you need extra fields
A code starting with 5–9: put the SAFE register number (REGNO, ≤20 characters) in slot [3] as {register number}/{fund source}, for example "REG-2024-001/F". The fund source is optional (see Code values).
A second BOP code:
- Slot
[1]becomes{code 2}/{Y or N}/{phone}(useYif bonded goods, otherwiseN) - Add
{ "amount": …, "currency": … }asregulatoryAmounts[1] - Add
/CNS2/{remark}, in Chinese, toregulatoryInstructionInfo
Bonded goods only (no second code): slot [1] is /Y/{phone} instead of /N/{phone}.
Example: CN_TT_INTL
USD 10,000.00 for a technical service fee, paid in advance, to a counterparty registered in the US. Replace 12345678 with your company's organisation code.
{
"amount": 1000000,
"currency": "USD",
"customerReference": "CNTT002",
"bankChargeBearer": "SHARED",
"regulatoryInstructionInfo": ["/CNS1/技术服务费", "/CNIN/INV-2024-001"],
"regulatoryAmounts": [{ "amount": 1000000, "currency": "USD" }],
"regulatoryInformation": [
"O/C/228039/A/Zhang Wei",
"/N/13800138000",
"",
"",
"12345678/USA",
"CTR-2024-001"
],
"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"
}
}
}| String | Meaning |
|---|---|
/CNS1/技术服务费 | Remark: technical service fee |
/CNIN/INV-2024-001 | Invoice number |
O/C/228039/A/Zhang Wei | Overseas, business, code 228039 other technical services, advance payment, applicant Zhang Wei |
/N/13800138000 | No code 2, not bonded goods, phone |
12345678/USA | Unit code, and the counterparty's country |
CTR-2024-001 | Contract number |
Example: CN_TT_DOM
The same three fields. Use CNY for amount and regulatoryAmounts.
{
"amount": 1000000,
"currency": "CNY",
"customerReference": "CNTTDOM0001",
"bankChargeBearer": "SHARED",
"paymentDetails": "Invoice 2024-001",
"regulatoryInstructionInfo": ["/CNS1/技术服务费", "/CNIN/INV-2024-001"],
"regulatoryAmounts": [{ "amount": 1000000, "currency": "CNY" }],
"regulatoryInformation": [
"O/C/228039/A/Zhang Wei",
"/N/13800138000",
"",
"",
"12345678/HKG",
"CTR-2024-001"
],
"receiver": {
"name": "Kowloon Trading Co Ltd",
"bank": "Bank of China (Hong Kong) Ltd",
"bankAccountNumber": "9876543210",
"accountName": "账户户名",
"address": {
"line1": "1 Garden Road",
"city": "Hong Kong",
"country": "HK"
}
}
}Mandatory sub-fields
Acme rejects a CN_TT_INTL or CN_TT_DOM payment on create when any of these is missing or invalid:
| Field | Part | Rule |
|---|---|---|
regulatoryInformation[0] | 1st: form type | required |
regulatoryInformation[0] | 3rd: BOP code 1 | required; 6 digits |
regulatoryInformation[0] | 4th: payment purpose (PayType) | required |
regulatoryInformation[0] | 5th: applicant name (CRTUSER) | required |
regulatoryInformation[1] | 1st: BOP code 2 | 6 digits if given |
regulatoryInformation[1] | 2nd: bonded goods (ISREF) | required |
regulatoryInformation[1] | 3rd: applicant phone (INPTELC) | required |
regulatoryInformation[3] | 1st: SAFE register number (REGNO) | required when BOP code 1 starts with 5–9 |
regulatoryInformation[4] | 1st: unit code | required |
regulatoryInformation[4] | 2nd: country | required; Acme does not check the value |
regulatoryInformation[5] | contract number (CONTRNO) | required; N/A if there is none |
regulatoryInstructionInfo | /CNS1/{remark} (TXREM) | required when form type is O; must be in Chinese |
regulatoryInstructionInfo | /CNIN/{invoice} (INVOINO) | required; /CNIN/N/A if there is none |
regulatoryInstructionInfo | /CNS2/{remark} (TX2REM) | optional; must be in Chinese if given |
Acme also checks the shape of the three fields:
| field | Limits |
|---|---|
regulatoryInformation | Exactly 6 strings, each ≤35 characters |
regulatoryInstructionInfo | 1 to 3 strings, each ≤35 characters including the code word |
regulatoryAmounts | 1 or 2 entries. amount is in minor units, 1 to 999999999999999999 |
Slot [2]: payment character (form type D only)
X bonded area · E export processing zone · D diamond exchange · M downstream processing · O other. Leave the slot "" for form type O.