Step 4: Creating a Payout

This process allows for the ability for the CUSTOMER ENABLED wallet to complete payouts to other bank accounts using their Virtual Account.

It is possible to create both a payout to themselves (first party) or a payout to another bank account (third party).

When creating a Fiat Payout the following information is necessary; bank account number, bank code, SCAN (also know as a sort code) for GBP payments, and IBAN and BIC for EUR payments.

Note that if an invalid Bank Account or Bank Code are provided the payment will be rejected with an error message returned.


🚧

BETA endpoint

Please note that this endpoint is currently in beta, and it may undergo changes as we continue to improve and refine the functionality.

📘

Metadata supported endpoint

Allowing you to include custom additional information with your request. The provided metadata will also be returned in the status endpoint for reference.

📘

Idempotency supported endpoint

This means you can retry a request without worrying about it being processed multiple times.

To use this feature, add the X-Idempotency-Key header with a unique value (a UUID). This ensures the request is only processed once, even if it's sent multiple times.


Request

EnvironmentEndpoint
ProductionPOST https://api.bvnk.com/payment/v1/payouts
SandboxPOST https://api.sandbox.bvnk.com/payment/v1/payouts

Note that in the payload request below it is possible to toggle between GBP and EUR for the benefit of the explaining within this documentation.

curl --location 'https://api.sandbox.bvnk.com/payment/v1/payouts' \
--header 'X-Idempotency-Key: cbb1007a-6cf6-409e-94ed-7bc08ed7f6e0' \
--header 'Content-Type: application/json' \
--header 'Authorization: Hawk id="Kd1ScqaaHohgNHsO2LLJPIHucECwYXY4YwFqQnS2mRb8AsMYxyDFsBaForMInYZq", ts="1725966831", nonce="lspGKa", mac="F7SFrkm/FtA6DIBkPjHEZGqk5f99QqAdJbj7j8vUx+M="' \
--data '{
  "walletId": "a:24071743003474:xE95Oq7:1",
  "amount": {
    "value": 1000,
    "currency": "GBP"
  },
  "paymentReference": "Payment for invoice #12345",
  "instruction": {
    "type": "FIAT",
    "beneficiary": {
      "beneficiaryType": "SELF_OWNED",
      "transferDestination": "LOCAL",
      "currency": "GBP",
      "paymentReference": "Payment for invoice #12345",
      "companyDetails": {
        "name": "Doe Corp"
      },
      "address": {
        "addressLine1": "123 Main St",
        "addressLine2": "Apt 4B",
        "region": "London",
        "city": "London",
        "country": "GB",
        "postCode": "12345"
      },
      "bankDetails": {
        "accountNumber": "123456789",
        "code": "987654",
        "address": {
          "addressLine1": "123 Main St",
          "addressLine2": "Suite 500",
          "region": "London",
          "city": "London",
          "country": "GB",
          "postCode": "12345"
        },
        "accountType": "SAVINGS",
        "bankTypeIdentifier": "SWIFT",
        "intermediaryBanks": [
          {
            "name": "Intermediary Bank 1",
            "accountNumber": "0987654321",
            "code": "XYZ987"
          }
        ]
      },
      "alias": "John's Business"
    },
    "metadata": {
      "field1": "field1 value",
      "field2": "field2 value"
    },
    "requestDetails": {
      "originator": {
        "ipAddress": "77.71.188.87"
      }
    }
  }
}'
curl --location 'https://api.sandbox.bvnk.com/payment/v1/payouts' \
--header 'X-Idempotency-Key: f4e48bf9-93bc-44b0-acd1-ca1add4e539b' \
--header 'Content-Type: application/json' \
--header 'Authorization: Hawk id="Kd1ScqaaHohgNHsO2LLJPIHucECwYXY4YwFqQnS2mRb8AsMYxyDFsBaForMInYZq", ts="1725966988", nonce="vAPr6G", mac="z22Im3gU51F8MKjRD/PcT9TKoWsGfiDvds4GsX6tgGk="' \
--data '{
  "walletId": "a:24071743003474:xE95Oq7:1",
  "amount": {
    "value": 1000,
    "currency": "EUR"
  },
  "paymentReference": "Payment for invoice #12345",
  "instruction": {
    "type": "FIAT",
    "beneficiary": {
      "beneficiaryType": "SELF_OWNED",
      "transferDestination": "LOCAL",
      "currency": "EUR",
      "paymentReference": "Invoice #12345",
      "companyDetails": {
        "name": "Doe Corp"
      },
      "address": {
        "addressLine1": "123 Main St",
        "addressLine2": "Apt 4B",
        "region": "Paris",
        "city": "Paris",
        "country": "FR",
        "postCode": "12345"
      },
      "bankDetails": {
        "accountNumber": "FR7630006000011234567890189",
        "code": "AGRIFRPP",
        "address": {
          "addressLine1": "123 Main St",
          "addressLine2": "Apt 4B",
          "region": "Paris",
          "city": "Paris",
          "country": "FR",
          "postCode": "12345"
        },
        "accountType": "SAVINGS",
        "bankTypeIdentifier": "SWIFT",
        "intermediaryBanks": [
          {
            "name": "Intermediary Bank 1",
            "accountNumber": "0987654321",
            "code": "XYZ987"
          }
        ]
      },
      "alias": "John's Business"
    },
    "metadata": {
      "field1": "field1 value",
      "field2": "field2 value"
    },
    "requestDetails": {
      "originator": {
        "ipAddress": "77.71.188.87"
      }
    }
  }
}'

The details required in the payout request are as follows:

AttributeTypeRequiredDescription
walletIdStringYesThe unique identifier for the wallet from which the payout will be made.
amountObjectYesObject containing value and currency for the payout.
amount.valueNumberYesThe amount to be paid out in the specified currency.
amount.currencyStringYesThe currency in which the payout will be made.
paymentReferenceStringYesA reference string for the payment, often used for invoicing or tracking purposes.
instructionObjectYesContains information about the payout instruction.
instruction.typeStringYesThe type of instruction. Currently supports FIAT only.
instruction.beneficiaryObjectYesContains beneficiary information.
instruction.beneficiary.
beneficiaryType
StringYesSpecifies the type of beneficiary Possible values: SELF_OWNED or THIRD_PARTY
instruction.beneficiary.
transferDestination
StringYesIndicates the transfer destination. Possible values: LOCAL or INTERNATIONAL.
instruction.beneficiary.
currency
StringYesThe currency for the beneficiary, matching the currency in amount.currency.
instruction.beneficiary.
paymentReference
StringNoAdditional payment reference for the beneficiary.
instruction.beneficiary.
companyDetails
ObjectYesContains details of the beneficiary company or organisation.
instruction.beneficiary.
companyDetails.name
StringYesName of the beneficiary company or organisation.
instruction.beneficiary.addressObjectNoAddress of the beneficiary.
instruction.beneficiary.address.
addressLine1
StringYesThe primary address line of the beneficiary. Required if address is specified.
instruction.beneficiary.address.
addressLine2
StringNoThe secondary address line of the beneficiary, if applicable.
instruction.beneficiary.address.
region
StringYesThe region or state of the beneficiary's address.
instruction.beneficiary.address.
city
StringYesThe city of the beneficiary's address.
instruction.beneficiary.address.
country
StringYesThe country code (ISO 3166-1 alpha-2) of the beneficiary’s address. Example: "ES".
instruction.beneficiary.address.
postCode
StringYesThe postal or ZIP code for the beneficiary's address.
instruction.beneficiary.
bankDetails
ObjectYesContains bank details for the payout.
instruction.beneficiary.bankDetails.
accountNumber
StringYesThe bank account number of the beneficiary.
instruction.beneficiary.bankDetails.
code
StringYesThe bank code, such as SWIFT or IBAN.
instruction.beneficiary.bankDetails.
address
ObjectNoOptional bank address object similar to the main address object for the beneficiary.
instruction.beneficiary.bankDetails.
accountType
StringNoThe type of bank account, e.g., "SAVINGS".
instruction.beneficiary.bankDetails.
bankTypeIdentifier
StringYesThe type of identifier for the bank, such as "SWIFT".
instruction.beneficiary.bankDetails.
intermediaryBanks
ArrayNoAn array of intermediary banks involved in the transfer, each containing name, accountNumber, and code.
instruction.beneficiary.aliasStringNoAn alias or nickname for the beneficiary, useful for identifying them in future payouts.
instruction.metadataObjectNoCustom metadata as key-value pairs that can be included in the payout request.
instruction.requestDetailsObjectYesRequest details for the payout.
instruction.requestDetails.originatorObjectYesOriginator details for the payout.
instruction.requestDetails.originator.
ipAddress
StringYesOriginator's IP address for the request.

Response

Successful response:

{
    "transactionReference": "123e4567-e89b-12d3-a456-426614174000",
    "paymentReference": "Payment for invoice #12345",
    "amount": {
        "value": 1000,
        "currency": "GBP"
    },
    "fee": {
        "value": 0.00,
        "currency": "GBP"
    },
    "walletId": "a:24071743003474:xE95Oq7:1",
    "status": "PROCESSING",
    "createdAt": "2024-09-26T14:30:00Z",
    "details": {
        "type": "FIAT",
        "beneficiary": {
            "entityType": "COMPANY",
            "companyDetails": {
                "name": "Doe Corp"
            },
            "address": {
                "addressLine1": "123 Main St",
                "addressLine2": "Apt 4B",
                "region": "London",
                "city": "London",
                "country": "GB",
                "postCode": "12345",
                "fullAddress": "123 Main St Suite 500"
            },
            "bankAccount": {
                "format": "IBAN",
                "bankName": "ABC Bank",
                "accountNumber": "GB29NWBK60161331926819",
                "bankCode": "NWBKGB2L",
                "bankAddress": {
                    "addressLine1": "123 Main St",
                    "addressLine2": "Suite 500",
                    "region": "London",
                    "city": "London",
                    "country": "GB",
                    "postCode": "12345",
                    "fullAddress": "123 Main St Suite 500"
                }
            },
            "correspondentBic": "ABCDEF12"
        }
    },
    "metadata": {
        "field1": "field1 value",
        "field2": "field2 value"
    }
}

In response, you will also receive a POST location header containing the transactionReference .

Response codes

Response codeStatusDescription
200CREATEDThe payout request has been created successfully
400BAD REQUESTThe payout has validation errors.

AttributeTypeDescription
transactionReferenceStringUnique reference identifier for the transaction.
paymentReferenceStringReference or description for the payment.
amountObjectObject containing the amount and currency of the transaction.
amount.valueNumberThe value of the transaction.
amount.currencyStringThe currency of the transaction.
feeObjectObject containing the fee amount and currency.
fee.valueNumberThe value of the fee.
fee.currencyStringThe currency for the fee.
walletIdStringUnique identifier for the wallet.
statusStringStatus of the transaction.
createdAtStringTimestamp for when the transaction was created.
detailsObjectContains details of the payout, including the entity and bank info.
details.
type
StringType of transaction.
details.beneficiary.
entityType
StringType of the entity involved.
details.beneficiary.companyDetails.
name
StringName of the company associated with the transaction.
details.beneficiary.
address
ObjectAddress information for the company or beneficiary.
details.beneficiary.address.
addressLine1
StringFirst line of the address.
details.beneficiary.address.
addressLine2
StringSecond line of the address (optional).
details.beneficiary.address.
region
StringRegion or state of the address.
details.beneficiary.address.
city
StringCity of the address.
details.beneficiary.address.
countryCode
StringCountry code of the address.
details.beneficiary.address.
postCode
StringPostal code of the address.
details.beneficiary.address.
fullAddress
StringFull concatenated address string.
details.beneficiary.
bankAccount
ObjectObject containing the bank account information.
details.beneficiary.bankAccount.
format
StringBank account format.
details.beneficiary.bankAccount.
bankName
StringName of the bank associated with the account.
details.beneficiary.bankAccount.
accountNumber
StringBank account number.
details.beneficiary.bankAccount.
bankCode
StringBank's SWIFT/BIC code.
details.beneficiary.bankAccount.
bankAddress
ObjectAddress of the bank.
details.beneficiary.bankAccount.bankAddress.
addressLine1
StringFirst line of the bank's address.
details.beneficiary.bankAccount.bankAddress.
addressLine2
StringSecond line of the bank's address.
details.beneficiary.bankAccount.bankAddress.
region
StringRegion or state of the bank's address.
details.beneficiary.bankAccount.bankAddress.
city
StringCity of the bank's address.
details.beneficiary.bankAccount.bankAddress.
countryCode
StringCountry code of the bank's address.
details.beneficiary.bankAccount.bankAddress.
postCode
StringPostal code of the bank's address.
details.beneficiary.bankAccount.bankAddress.
fullAddress
StringFull concatenated address string of the bank.
details.beneficiary.
correspondentBic
StringCorrespondent bank BIC code (if applicable).
metadataObjectMetadata related to the transaction.
metadata.field1StringAdditional metadata field 1.
metadata.field2StringAdditional metadata field 2.