🚀 VaultsPay API v1 is live. See what's new →
Direct TransfersInitiate Transfer

Initiate Transfer

After validating the IBAN and creating the payment contact, the SaaS app must call the API below with the specified attributes to initiate the transfer.

POST{baseUrl}/tc/api/v1/direct-transfer

Payload

Either senderAccountId or currencyCode must be provided — at least one of them is required.

AttributeTypeRequiredDescription
senderAccountIdStringConditionalThe unique ID of the sender’s account. Required if currencyCode is not provided.
currencyCodeStringConditionalISO 4217 currency code (e.g., AED). Required if senderAccountId is not provided.
paymentContactIdStringYesThe ID of the payment contact created via the Create Payment Contact API.
purposeStringYesPurpose of the transfer. Must be one of the predefined Purpose Enum values (see below).
descriptionStringYesTransfer description. Only letters, numbers and spaces allowed. Max 100 characters.
amountIntegerYesTransfer amount in cents (e.g., 100000 = 1000.00).

Purpose Values

PERSONAL OWN_ACCOUNT_TRANSFER RENT UTILITY_BILL_PAYMENTS ALLOWANCE AIR_TRANSPORT COMMISSION COMPENSATION CREDIT_CARD_PAYMENT EDUCATIONAL_SUPPORT FAMILY_SUPPORT FINANCIAL_SERVICES GOODS_BOUGHT PROCESSING_REPAIR GOVERNMENT_GOODS LEASING_ABROAD LEASING_IN_UAE TRAVEL TELECOMMUNICATION_SERVICES

Request Example
{
  "senderAccountId": "1234",
  "currencyCode": "AED",
  "paymentContactId": "9876",
  "purpose": "RENT",
  "description": "Monthly rent August",
  "amount": 100000
}

Response

FieldTypeDescription
idIntegerUnique transaction record ID in VaultsPay.
transactionIdStringUUID for tracking the transaction across systems.
gatewayRefIdStringReference ID returned by the payment gateway.
currencyCodeStringCurrency code used for the transfer.
amountIntegerTransfer amount in cents.
totalChargesIntegerTotal charges applied to the transaction in cents.
narrationStringSystem-generated transaction narration.
statusStringTransaction status: PENDING, SUCCESS, or FAILED.
transactionMetaEntity.transferPurposeStringPurpose of the transfer.
transactionMetaEntity.transferDescriptionStringDescription provided in the request.
createdAtStringTransaction creation timestamp (UTC).
updatedAtStringTransaction last updated timestamp (UTC).
errorsArrayArray of errors if any occurred during processing.

If status = SUCCESS the transaction is successful. If status = PENDING the system will dispatch a webhook to confirm the final status.

200 — SUCCESS
{
  "data": {
    "id": 8780,
    "transactionId": "c360f05e-bd3b-4578-be7e-c2c839d8dae5",
    "gatewayRefId": "c360f05e-bd3b-4578-be7e-c2c839d8dae5",
    "currencyCode": "AED",
    "amount": 350,
    "totalCharges": 100,
    "narration": "DIGITAL APP FUND TRANSFER -  TO: Adam Ahme* MODE:   REF NO -  ",
    "status": "PENDING",
    "transactionMetaEntity": {
      "transferPurpose": "PERSONAL",
      "transferDescription": "TEst description"
    },
    "createdAt": "2025-07-23T09:17:58.508+00:00",
    "updatedAt": "2025-07-23T09:17:58.508+00:00",
    "errors": []
  }
}
422 — Missing senderAccountId or currencyCode
{
  "code": 1000,
  "message": "Invalid payload. Please check your request.",
  "type": "INVALID_PAYLOAD",
  "errors": [
    {
      "key": "senderAccountIdOrCurrencyCode",
      "reason": "At least one value 'senderAccountId' or 'currencyCode' is required"
    }
  ]
}