Balad ↔ Bank NXT

Balad ↔ Bank NXT — Remittance Integration

Technical specification for the file-based payout integration: encrypted transaction files in, plain status files back, all over SFTP.

Owner Balad Counterparty Bank NXT ● Draft for review Updated 2026-06-23
Transport
SFTPSSH key auth
Format
CSVUTF-8, header row
Inbound (Balad→NXT)
PGP-encryptedtransaction file
Outbound (NXT→Balad)
Plainstatus file
Time zone
UTCall dates & times

End-to-end flow

1
Create & encrypt CSV
Balad
2
Upload via SFTP
Balad
3
Decrypt, validate, pay out
Bank NXT
4
Write status CSV (plain)
Bank NXT
5
Sync status updates
Balad

1Overview

Balad and Bank NXT exchange remittance data through flat CSV files over SFTP. The integration is bidirectional.

DirectionFileFormatEncryptionDescription
Balad → Bank NXT (inbound)Transaction fileCSV (UTF-8)PGP-encryptedPayout instructions, one batch per file
Bank NXT → Balad (outbound)Status Update fileCSV (UTF-8)Plain (none)Lifecycle status of each transaction
All dates and timestamps in both files are UTC.

2Transport & Security

2.1 SFTP

/inbound/    # files received from the counterparty
/outbound/   # files placed for the counterparty to collect
/archive/    # processed files (optional, per retention policy)

2.2 PGP — inbound transaction file only

3File Naming Convention

3.1 Transaction file — Balad → Bank NXT (encrypted)

{BaladReferenceNo}_{YYYYMMDD}_{HHMMSS}.csv        (cleartext)
{BaladReferenceNo}_{YYYYMMDD}_{HHMMSS}.csv.pgp    (on SFTP)
TokenMeaningExample
BaladReferenceNoBalad batch / transaction referenceBLDREF00001
YYYYMMDDFile generation date (UTC)20260604
HHMMSSFile generation time (UTC, 24h)095231

Example: BLDREF00001_20260604_095231.csv

3.2 Status Update file — Bank NXT → Balad (plain)

{BaladReferenceNo}_Status_Update.csv

Example: BLDREF00001_Status_Update.csv

4Transaction File (Balad → Bank NXT)

4.1 File-level rules

FormatCSV (comma , delimited)
EncodingUTF-8 (required — Arabic name fields)
Header rowYes — first line is the column header, exact names below
Text qualifierDouble-quote " for any field containing a comma, quote, or newline
Decimal separatorPeriod . (e.g. 2430.65)
Date formatdd-MMM-yyyy (UTC) — e.g. 14-FEB-1985
Datetime formatdd-MMM-yyyy hh:mm:ss tt (UTC) — e.g. 18-JUN-2026 11:11:39 AM
Empty valuesEmpty string between delimiters (no NULL literal)

4.2 Column specification

Columns appear in the exact order below.

req always required cond conditional (by transaction type) opt optional
#ColumnData type / FormatReq.DescriptionLookup
1BaladReferenceString (≤200)reqUnique Balad transaction reference. Primary key for status matching.
2TransactionCreatedAtDatetime dd-MMM-yyyy hh:mm:ss tt (UTC)reqWhen the transaction was created at Balad.
3SenderFullNameString (Latin)reqSender full name (English/Latin script).
4SenderFullNameArString (Arabic)reqSender full name (Arabic script).
5SenderNationalityString, ISO 3166-1 alpha-2 (2)reqSender nationality as ISO 3166-1 alpha-2 country code (e.g. EG).
6SenderDOBDate dd-MMM-yyyyreqSender date of birth.
7ReceiverNameString (Latin)reqBeneficiary full name (English/Latin script).
8ReceiverNameArString (Arabic)reqBeneficiary full name (Arabic script).
9ReceiverContactNumberString (digits, intl.)reqBeneficiary contact number, intl. format without + (e.g. 201001234567).
10TransactionTypeIntegerreqPayout method.Transaction Types
11BusinessModelStringreqBusiness model (e.g. C2C).Business Model
12PayoutAmountDecimal (2 dp)reqAmount to be paid to the beneficiary.
13PayoutCurrencyString, ISO 4217 (3)reqPayout currency (e.g. USD).
14DestinationBankString codecondBeneficiary bank code. Required for bank-account payouts.Banks
15AccountNumberStringcondBeneficiary account number or IBAN. Required for bank-account/card payouts.
16WalletMobileNumberString (digits)condBeneficiary wallet mobile number. Required for wallet payouts.
17PurposeOfTransferString codereqRegulatory purpose of transfer.Purpose
Conditional fields by TransactionType: 1 Cash → bank/account/wallet may be empty · 2 BankAccount → DestinationBank + AccountNumber required · 3 Wallet → WalletMobileNumber required · 4 Card → AccountNumber required.

4.3 Header row (exact)

BaladReference,TransactionCreatedAt,SenderFullName,SenderFullNameAr,SenderNationality,SenderDOB,ReceiverName,ReceiverNameAr,ReceiverContactNumber,TransactionType,BusinessModel,PayoutAmount,PayoutCurrency,DestinationBank,AccountNumber,WalletMobileNumber,PurposeOfTransfer

5Lookup / Reference Data

Agreed enumerations for the coded columns. Kept in sync between both parties; changes are versioned and communicated before use.

5.1 Purpose of Transfer (PurposeOfTransfer)

Codes are 3-digit zero-padded strings.

CodeDescription
002TRANSFER OF SAVINGS
003TRANSFER TO OWN FOREIGN BANK AC
004INVESTMENT
005EDUCATIONAL EXPENSES
006FOR SCHOOL/BOARDING FEES
007HELP FOR NEEDY
008GIFT
011PAYMENT OF LOANS
012PAYMENT OF INSURANCE PREMIUM
013FOR MEDICAL TREATMENT
014COVER FOR CORRESPONDENT ACCOUNTS
015HOTEL RESERVATION
016TOURISM
017HOUSE RENT
018INVESTMENT IN REAL ESTATE
019INHERITANCE
020OTHERS
021Salaries

5.2 Transaction Types (TransactionType)

CodeDescription
1Cash
2BankAccount
3Wallet
4Card

5.3 Banks (DestinationBank)

37 bank codes — click to expand
CodeDescription
BDCBANQUE DU CAIRE
CBECENTRAL BANK OF EGYPT CAIRO
MISRBANQUE MISR
NBENATIONAL BANK OF EGYPT
BOABANK OF ALEXANDRIA S A E
EALBEGYPTIAN ARAB LAND BANK
IDBEINDUSTRIAL DEVELOPMENT BANK OF EGYPT
PDACAGRICULTURAL BANK OF EGYPT
CIBCOMMERCIAL INTERNATIONAL BANK
ENBDEMIRATES NATIONAL BANK OF DUBAI SAE
SCBSUEZ CANAL BANK
ABKAL AHLI BANK OF KUWAIT - EGYPT S.A.E.
AUBKUWAIT FINANCE HOUSE BANK (EGYPT) S.A.E.
ABRKALBARAKA BANK EGYPT
NBKNATIONAL BANK OF KUWAIT - EGYPT
HSBCHSBC BANK EGYPT S.A.E
UNBADCB Bank
EGBEGYPTIAN GULF BANK
ADIBABU DHABI ISLAMIC BANK - EGYPT
UNBKETHE UNITED BANK
MIDBMISR IRAN DEVELOPMENT BANK
BBEATTIJARIWAFA BANK EGYPT S.A.E
SAIBSOCIETE ARABE INTERNATIONALE DE
CAECREDIT AGRICOLE EGYPT
QNBQATAR NATIONAL BANK ALAHLI S.A.E
HDBHOUSING AND DEVELOPMENT BANK
ABCArab Banking Corporation
NBADFIRST ABU DHABI BANK
CITICITIBANK CAIRO
ARABARAB BANK PLC
MASHMASHREQ BANK
ARIBARAB INTERNATIONAL BANK
AAIBARAB AFRICAN INTERNATIONAL BANK
AIBBANK NXT
FAIBFAISAL ISLAMIC BANK OF EGYPT
EDBEEXPORT DEVELOPMENT BANK OF EGYPT
POSTEGPPOST

5.4 Business Model (BusinessModel)

CodeDescription
C2CCustomer-to-Customer
B2CBusiness-to-Customer

6Status Update File (Bank NXT → Balad)

Plain (unencrypted) CSV. Multiple rows per BaladReference are expected — one per lifecycle event.

6.1 File-level rules

FormatCSV (comma , delimited)
EncodingUTF-8
EncryptionNone (plain)
Header rowYes — first line is the column header
Text qualifierDouble-quote " when needed
Datetime formatdd-MMM-yyyy hh:mm:ss tt (UTC) — e.g. 18-JUN-2026 11:11:39 AM
One fileCovers one batch

6.2 Column specification

#ColumnData type / FormatReq.Description
1BaladReferenceStringreqMust match a BaladReference from the transaction file.
2StatusString (enum)reqCurrent lifecycle status (owned by Bank NXT — see §7).
3StatusTimestampDatetime dd-MMM-yyyy hh:mm:ss tt (UTC)reqWhen the status was set.
4AdditionalInfoStringoptFree-text detail / reason for the status.

Header row (exact):

BaladReference,Status,StatusTimestamp,AdditionalInfo

6.3 Status values

The set of Status values (and rejection reasons) is owned and shared by Bank NXT. They are emitted at each step of Bank NXT's processing workflow — see §7. Bank NXT Processing Workflow.

7Bank NXT Processing Workflow (BPMN)

How Bank NXT processes each batch and the statuses it writes to the status file at every step. Source: Bank NXT – EDE – Balad project – BPMN – workflow – V0.13. Payment instructions are processed in parallel per record.

flowchart TD
    Start([Robot listens for new file]) --> A{New master file added?}
    A -- No --> Start
    A -- Yes --> B[Create batch processing log file]
    B --> C[["All records status = Received"]]
    C --> P[/Process payment instructions in parallel/]

    P --> BM{Business Model = C2C?}
    BM -- No --> RJ1[["Rejected — Business model is not C2C"]]
    BM -- Yes --> BAL[Check funding account balance]
    BAL --> SB{Sufficient balance?}
    SB -- No --> RJ2[["Rejected — Insufficient balance"]]
    SB -- Yes --> LOCK[Lock funding amount + commission + fees]

    LOCK --> COMP[["Check Compliance SAS — status = Under Compliance Review"]]
    COMP --> WAIT1[Waiting for compliance response]
    WAIT1 --> HIT{Hit?}
    HIT -- Yes --> UNL1[Unlock funding amount] --> RJ3[["Rejected — Compliance rejected"]]
    HIT -- No --> APP[["status = Compliance approved"]]

    APP --> RT{Routing type?}

    RT -- On-Us internal transfer --> VAL["Validate bank customer - CIF and sub-account in T24"]
    VAL --> V{Valid?}
    V -- No --> RJ4[["Rejected — Invalid CIF / receiving account"]]
    V -- Yes --> CORE[["status = Sent to core"]]
    CORE --> POST1["Post accounting entries and transfer to receiver"]
    POST1 --> PD{Posted?}
    PD -- Yes --> TR1[["status = Transferred"]]
    PD -- No --> UNL2[Unlock funding amount] --> RJ5[["Rejected — Internal transfer not posted"]]

    RT -- Third-party bank --> ACH1[["status = Sent to ACH"]]
    ACH1 --> POST2["Post accounting entries and send ACH to bank"]
    POST2 --> AW[["status = Awaits ACH response"]]
    AW --> WAIT2[Waiting for ACH response]
    WAIT2 --> TRD{Transferred?}
    TRD -- Yes --> TR2[["status = Transferred"]]
    TRD -- No --> REV[Reverse accounting entries] --> RJ6[["Rejected — ACH failed"]]
    

7.1 T24 customer validation (sub-process)

flowchart TD
    S([Start]) --> VC[Validate CIF]
    VC --> Q1{Valid CIF number?}
    Q1 -- No --> R1[["Rejected — Invalid CIF"]]
    Q1 -- Yes --> VS["Validate sub-account and match transaction currency"]
    VS --> Q2{Valid sub-account?}
    Q2 -- No --> R2[["Rejected — Invalid receiving account"]]
    Q2 -- Yes --> OK([Valid → continue])
    

7.2 Statuses & rejection reasons

StatusWhen
ReceivedAll records on initial batch log creation.
Under Compliance ReviewSent to compliance screening (SAS).
Compliance approvedCleared compliance (no hit).
Sent to coreOn-Us internal transfer routed to core.
Sent to ACHThird-party bank transfer routed to ACH.
Awaits ACH responseWaiting on ACH confirmation.
TransferredPayout completed (terminal success).
RejectedTerminal failure; reason in AdditionalInfo.

Rejection reasons: Business model is not C2C · Insufficient balance · Compliance rejected · Invalid CIF · Invalid receiving account · Internal transfer not posted · ACH failed.

8Processing & Validation Rules

  1. Filename — reject files not matching the naming convention (§3).
  2. PGP — reject inbound files that fail decryption or signature verification.
  3. Header — column names and order must match exactly (§4.3 / §6.2).
  4. Encoding — files must be valid UTF-8; reject on decode errors (protects Arabic fields).
  5. Mandatory fields — reject rows missing any required field.
  6. Lookup validation — coded columns must exist in the reference tables (§5).
  7. Conditional fields — enforce the per-TransactionType requirements.
  8. AmountPayoutAmount > 0, max 2 decimals; valid ISO 4217 currency.
  9. Datetime — all datetimes in UTC, dd-MMM-yyyy hh:mm:ss tt (e.g. 18-JUN-2026 11:11:39 AM).
  10. Reference uniquenessBaladReference unique within a batch.
  11. Status matching — every status BaladReference must correspond to a previously sent transaction.

9Open Items / To Confirm

#Item
1Bank NXT connectivity setup (SFTP host, port, SSH keys, IP allowlisting).
2Bank NXT account creation / credentials provisioning.
3Shared PGP keys exchanged and a test file validated (decrypt + signature).
4SFTP polling cadence / SLA for status returns.
5Bank NXT to share the full list of statuses and their meanings.