Bank payment rules

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
  • 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 paymentDate that is not a CN working day.

CN_ACH

China domestic ACH transfer.

Important

  • Currency must be CNY only.
  • Payment date cannot be in the past. Maximum 65 days forward.
  • bankChargeBearer and instructionForSenderBank must not be provided.
  • receiver.intermediaryBank and receiver.address.line1/line2/state/postalCode must not be provided; only city and country are accepted.
  • receiver.name and receiver.bank may be English or Chinese. Backtick is not allowed.
  • Provide receiver.accountName only if it differs from receiver.name. If provided, the bank uses the account name instead of the beneficiary name.
  • categoryPurpose is a batch-level field. receiver.address.city is required.
fieldpattern / charsetmax lengthmandatory/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 WHLD4O
payments[N].customerReferenceSWIFT (uppercase only)15M
payments[N].paymentDetailsEnglish or Chinese70O
payments[N].paymentAdviceEmails[N]Valid email address
Example: ["finance@company.com"]
50 per email (max 1 email)O
payments[N].transferLocalityINTRA_CITY or INTER_CITYM
payments[N].receiver.nameEnglish or Chinese; backtick not allowed60M
payments[N].receiver.bankEnglish or Chinese; backtick not allowed60M
payments[N].receiver.bankAccountNumberNumeric32M
payments[N].receiver.localRoutingIdentifierNumeric12O
payments[N].receiver.accountNameEnglish or Chinese44O
payments[N].receiver.address.cityEnglish or Chinese35M
payments[N].receiver.address.countryFixed value CN2O

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.localRoutingIdentifier must be exactly 12 digits (CNAPS).
  • receiver.bank is optional.
  • bankChargeBearer, instructionForSenderBank, transferLocality, purposeCode, receiver.intermediaryBank, and receiver.address must not be provided.
  • receiver.name, receiver.bank, and paymentDetails must not contain a backtick.
  • Provide receiver.accountName only if it differs from receiver.name. If provided, the bank uses the account name instead of the beneficiary name.
fieldpattern / charsetmax lengthmandatory/optional
payments[N].customerReferenceSWIFT (uppercase only)15M
payments[N].paymentDetailsEnglish or Chinese; backtick not allowed140O
payments[N].paymentAdviceEmails[N]Valid email address
Example: ["finance@company.com"]
50 per email (max 1 email)O
payments[N].receiver.nameEnglish or Chinese; backtick not allowed60M
payments[N].receiver.bankEnglish or Chinese; backtick not allowed60O
payments[N].receiver.bankAccountNumberNumeric32M
payments[N].receiver.localRoutingIdentifierNumeric (exactly 12 digits)12M
payments[N].receiver.accountNameEnglish or Chinese60O

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.bank must be a BIC.
  • instructionForSenderBank and receiver.localRoutingIdentifier must not be provided.
  • SAFE BOP reporting is required. See SAFE BOP. Acme validates list size, string length, and amount shape only.
  • Provide receiver.accountName only if it differs from receiver.name. If provided, the bank uses the account name instead of the beneficiary name.
  • receiver.address.city and receiver.address.country are mandatory. The full address must fit in 3 lines of 35 SWIFT characters.
fieldpattern / charsetmax lengthmandatory/optional
payments[N].customerReferenceSWIFT (uppercase only)15M
payments[N].paymentDetailsEnglish or Chinese; backtick not allowed140O
payments[N].paymentAdviceEmails[N]Valid email address
Example: ["finance@company.com"]
50 per email (max 1 email)O
payments[N].bankChargeBearerSENDER / RECEIVER / SHAREDO
payments[N].regulatoryInstructionInfoArray of strings (include Citi prefixes, e.g. /CNS1/)35 per entry (max 3)M
payments[N].regulatoryAmountsArray of { amount, currency }. amount is a positive integer in minor unitsmax 2 entriesM
payments[N].regulatoryInformationArray of strings. List index is the Inf slot. Exactly 6 entries; unused slots ""35 per entryM
payments[N].receiver.nameEnglish or Chinese; backtick not allowed35M
payments[N].receiver.bankBIC (8 or 11 characters, ISO 9362)11M
payments[N].receiver.intermediaryBankBIC (8 or 11 characters)11O
payments[N].receiver.bankAccountNumberSWIFT34M
payments[N].receiver.accountNameEnglish or Chinese35O
payments[N].receiver.address.line1SWIFT35O
payments[N].receiver.address.line2SWIFT35O
payments[N].receiver.address.citySWIFT35M
payments[N].receiver.address.stateSWIFT35O
payments[N].receiver.address.postalCodeSWIFT35O
payments[N].receiver.address.countryISO 3166-1 alpha-22M

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.bank is a bank name, not a BIC.
  • receiver.name and receiver.bank must be SWIFT characters. Backtick is not allowed on those fields.
  • instructionForSenderBank, receiver.localRoutingIdentifier, and receiver.intermediaryBank must not be provided.
  • SAFE BOP reporting is required. See SAFE BOP. Acme validates list size, string length, and amount shape only.
  • Provide receiver.accountName only if it differs from receiver.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.
fieldpattern / charsetmax lengthmandatory/optional
payments[N].customerReferenceSWIFT (uppercase only)16M
payments[N].paymentDetailsEnglish or Chinese140O
payments[N].paymentAdviceEmails[N]Valid email address
Example: ["finance@company.com"]
50 per email (max 1 email)O
payments[N].bankChargeBearerSENDER / RECEIVER / SHAREDO
payments[N].purposeCodeOne of GOD STR CTF RMT OTF 02112 02113 02114 02115 02116 02117 02123 02124 02125 02127O
payments[N].regulatoryInstructionInfoArray of strings (include Citi prefixes, e.g. /CNS1/)35 per entry (max 3)M
payments[N].regulatoryAmountsArray of { amount, currency }. amount is a positive integer in minor unitsmax 2 entriesM
payments[N].regulatoryInformationArray of strings. List index is the Inf slot. Exactly 6 entries; unused slots ""35 per entryM
payments[N].receiver.nameSWIFT; backtick not allowed35M
payments[N].receiver.bankSWIFT (bank name, not BIC); backtick not allowed35M
payments[N].receiver.bankAccountNumberSWIFT34M
payments[N].receiver.accountNameEnglish or Chinese60O
payments[N].receiver.address.line1SWIFT35O
payments[N].receiver.address.line2SWIFT35O
payments[N].receiver.address.citySWIFT35O
payments[N].receiver.address.stateSWIFT35O
payments[N].receiver.address.postalCodeSWIFT35O
payments[N].receiver.address.countryISO 3166-1 alpha-22O

SAFE BOP

For CN_TT_INTL and CN_TT_DOM you must send three payment fields. They are not interchangeable:

fieldRoleHow you can tell them apart
regulatoryInstructionInfoPrefixed remarks and invoiceEvery string starts with /CNS1/, /CNS2/, or /CNIN/
regulatoryInformationSAFE form slotsFirst string starts with O/C/… (no /CNS prefix). Always 6 slots; unused slots are ""
regulatoryAmountsCode 1 / Code 2 moneyObjects 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.

fieldLimits
regulatoryInstructionInfoNon-empty; ≤3 strings
regulatoryAmountsNon-empty; ≤2. amount is minor units (1999999999)
regulatoryInformationExactly 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 fieldSend as
Application Form TypeSlot [0], 1st part — use O (overseas)
Customer TypeSlot [0], 2nd part — use C (business)
BOP Transaction Code 1Slot [0], 3rd part — 6 digits
Payment PurposeSlot [0], 4th part — A D R O
Name of ApplicantSlot [0], 5th part
BOP Transaction Code 2Slot [1], 1st part — optional; leave empty if unused
Payment classified for bonded goodsSlot [1], 2nd part — Y or N
Applicant Phone NumberSlot [1], 3rd part
Payment CharacterSlot [2] — only if form type is D
SAFE Approval/Register/Service NumberSlot [3], 1st part — optional
Fund Source TypeSlot [3], 2nd part — optional F P O
Unit Code For BusinessSlot [4], 1st part — required because customer type is C
Resident Country/RegionSlot [4], 2nd part — 3 characters from the China SAFE country list
Contract NumberSlot [5] — required when bonded goods is Y

regulatoryAmounts

Citi sub-form fieldSend 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 fieldSend 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}",
    ""
  ]
}
IndexSlotIn this template
[0]1Form, customer, BOP code 1, purpose, applicant name
[1]2Code 2 (empty), bonded N, phone
[2]3"" — Payment Character, only if form type is D
[3]4"" — optional SAFE number / fund source
[4]5Unit 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.

PlaceholderWhat 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} (or Y if bonded)
  • Add { "amount": …, "currency": … } as regulatoryAmounts[1] (this amount is sent with Inf slot [1], not as a separate amount-only block)
  • Add /CNS2/{code 2 remark} to regulatoryInstructionInfo

Bonded goods Y

  • Slot [1] uses Y instead of N
  • Add /CNIN/{invoice number} to regulatoryInstructionInfo
  • Put the contract number in slot [5] instead of ""

Optional slot [3]

  • {SAFE approval or register number}/{fund source}
  • Fund source: F FX, P purchase, O others
  • If you skip it, keep "" so later slots do not move

Domestic form type D

  • Do not use D for these payment types unless Citi told you to
  • If you do, slot [2] must be Payment Character: X bonded area, E export processing zone, D diamond exchange, M downstream processing, O other

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:

StringMeaning
/CNS1/Trade settlementCode 1 remark
O/C/600101/A/Zhang WeiOverseas, business, code 600101, advance, applicant Zhang Wei
/N/13800138000No Code 2, not bonded, phone
12345678/CHNUnit 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"
    }
  }
}

On this page