iBanFirst Beneficiaries API

A beneficiary can be either your own account in another bank or a third party recipient account. Beneficiaries can be created or deleted through the API. **Note :** ***beneficiaries*** are also labelled as ***externalBankAccounts*** in the iBanFirst API.

Business capability
Payment Initiation Management BC-1340.10

Operations 4

POST /externalBankAccounts Create beneficiary
GET /externalBankAccounts Get beneficiaries list
GET /externalBankAccounts/{id} Get beneficiary details
DELETE /externalBankAccounts/{id} Delete beneficiary

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/ibanfirst-beneficiaries-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

ibanfirst-beneficiaries-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  version: 1.6.0
  title: iBanFirst Beneficiaries API
  description: "iBanFirst API for cross-border payments, FX trades, account management, beneficiaries, and webhooks.\n\n**Try it out in Postman:** [View Postman Collection](https://www.postman.com/productibf/ibanfirst-rest-api-workspace/collection/d24hl8d/ibanfirst-rest-api?action=share&creator=44872188)\n\n---\n\n## Authentication — X-WSSE\n\nEvery request must include an `X-WSSE` header. Plain HTTP calls will fail. The token is **stateless and expires after ~5 minutes**, so it must be computed fresh for each request.\n\n### Header format\n\n```\nX-WSSE: UsernameToken Username=\"<username>\", PasswordDigest=\"<digest>\", Nonce=\"<nonce_b64>\", Created=\"<timestamp>\"\n```\n\n### Fields\n\n| Field | Description |\n|---|---|\n| `Username` | The username assigned during onboarding. |\n| `Nonce` | A Base64-encoded random hex string (≥ 32 hex characters). |\n| `Created` | Current UTC timestamp in ISO 8601: `YYYY-MM-DDTHH:MM:SSZ`. |\n| `PasswordDigest` | `Base64( SHA-1( nonce_bytes ∥ created_bytes ∥ secret_bytes ) )` — SHA-1 **binary** digest, then Base64. |\n\n### Algorithm (step-by-step)\n\n1. Generate a random nonce: at least 32 lowercase hexadecimal characters (e.g. `d36e3162829ed4c89851497a717f0001`).\n2. Get the current UTC timestamp as an ISO-8601 string (e.g. `2026-05-12T10:30:00Z`).\n3. Encode the nonce string as UTF-8 bytes, the timestamp as UTF-8 bytes, and the API secret as UTF-8 bytes.\n4. Compute `SHA-1( nonce_bytes + created_bytes + secret_bytes )`. The hash **must** be the raw binary digest (not hex).\n5. `PasswordDigest` = `Base64( sha1_binary_digest )`\n6. `Nonce` = `Base64( nonce_utf8_bytes )`\n\n### Code samples\n\n**Python**\n```python\nimport base64, hashlib, os, binascii\nfrom datetime import datetime, timezone\n\ndef generate_xwsse(username: str, secret: str) -> str:\n    nonce = binascii.b2a_hex(os.urandom(16))          # 32 hex bytes\n    created = datetime.now(timezone.utc).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n    digest = base64.b64encode(\n        hashlib.sha1(nonce + created.encode() + secret.encode()).digest()\n    ).decode()\n    nonce_b64 = base64.b64encode(nonce).decode()\n    return f'UsernameToken Username=\"{username}\", PasswordDigest=\"{digest}\", Nonce=\"{nonce_b64}\", Created=\"{created}\"'\n```\n\n**JavaScript (Node.js)**\n```javascript\nconst crypto = require('crypto');\nfunction generateXWSSE(username, secret) {\n    const nonce = crypto.randomBytes(16);\n    const created = new Date().toISOString();\n    const digest = crypto.createHash('sha1')\n        .update(nonce)\n        .update(Buffer.from(created))\n        .update(Buffer.from(secret))\n        .digest('base64');\n    return `UsernameToken Username=\"${username}\", PasswordDigest=\"${digest}\", Nonce=\"${nonce.toString('base64')}\", Created=\"${created}\"`;\n}\n```\n\n**PHP**\n```php\nfunction generateXWSSE(string $username, string $secret): string {\n    $nonce = bin2hex(random_bytes(16));          // 32 hex chars\n    $created = gmdate('Y-m-d\\TH:i:s\\Z');\n    $digest = base64_encode(sha1($nonce . $created . $secret, true));\n    return sprintf('UsernameToken Username=\"%s\", PasswordDigest=\"%s\", Nonce=\"%s\", Created=\"%s\"',\n        $username, $digest, base64_encode($nonce), $created);\n}\n```\n\n### Environments\n\n| Environment | Base URL |\n|---|---|\n| Demo (testing) | `https://api-demo.ibanfirst.com/api` |\n| Live (production) | `https://api.ibanfirst.com/api` |\n\n### Forbidden characters in input fields\n\nThe following characters are rejected in route parameters, query parameters, and JSON bodies: `&` `<` `>` `%` `?` `\\` `/` `|`"
servers:
- url: https://api-demo.ibanfirst.com/api
security:
- X-WSSE: []
tags:
- name: Beneficiaries
  description: 'A beneficiary can be either your own account in another bank or a third party recipient account. Beneficiaries can be created or deleted through the API.


    **Note :** ***beneficiaries*** are also labelled as ***externalBankAccounts*** in the iBanFirst API.'
paths:
  /externalBankAccounts:
    post:
      summary: Create beneficiary
      tags:
      - Beneficiaries
      description: "By submitting a new beneficiary, you must supply the relevant details in order to execute a payment.\n\n **Note :** each of your physical IBAN accounts hold with iBanFirst will be automatically created when subscribing with us.\n\nThe **Create beneficiary** service allows to reference external accounts which can be either your own accounts in another bank or a third party account.\n\nAdding a beneficiary has some rules :\n\n* If you have the BIC/SWIFT of the bank, just submit it, and we will recover informations of the bank on our own.\n* If you do not have the BIC/SWIFT of the bank, you have to refer at least its clearing code type, its clearing code and its name.\n* In both cases, if values are not mentionned above, they are not required.\n\nThis service include verifications on the format of the account created.\nThe API has been made in order to accept local specification of cross-boarder payments.\n\nThe API accepts the following formats of external bank accounts :\n\n  - Austrian Bankleitzahl\n  - Australian Bank State Branch\n  - German Bankleitzahl\n  - Canadian Payments Association Payment Routing Number\n  - Spanish Domestic Interbanking Code\n  - Fedwire Routing Number\n  - HEBIC (Hellenic Bank Identification Code)\n  - Bank Code of Hong Kong\n  - Irish National Clearing Code (NSC)\n  - Indian Financial System Code (IFSC)\n  - Italian Domestic Identification Code\n  - New Zealand National Clearing Code\n  - Polish National Clearing Code (KNR)\n  - Portuguese National Clearing Code\n  - Russian Central Bank Identification Code\n  - UK Domestic Sort Code\n  - Swiss Clearing Code\n  - South African National Clearing Code\n"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
              - accountNumber
              - currency
              - holderBank
              - holder
              properties:
                accountNumber:
                  type: string
                  maxLength: 50
                  description: 'The recipient account number or IBAN.

                    '
                currency:
                  $ref: '#/components/schemas/Currency'
                holderBank:
                  $ref: '#/components/schemas/HolderBank'
                holder:
                  $ref: '#/components/schemas/Holder'
                contactEmail:
                  $ref: '#/components/schemas/Email'
                tag:
                  type: string
                  maxLength: 50
                  description: 'Custom Data.

                    '
                correspondentBic:
                  type: string
                  maxLength: 50
                  description: 'The intermediary bank identifier code.

                    '
                verificationOfPayee:
                  type: boolean
                  description: "`true` to verify the beneficiary's IBAN, name and type. If the verification fails, the beneficiary will not be created.\n\n **Note** : the verification of payee process can take up to 8 seconds."
        description: the account to post
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExternalBankAccountVOP'
        default:
          description: ERROR
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorVOP'
    get:
      summary: Get beneficiaries list
      tags:
      - Beneficiaries
      description: "Retrieve the list of all beneficiaries referenced with your accounts.\n \n **Note :** you may use the **Retrieve beneficiaries** service to get the unique id of your accounts."
      parameters:
      - name: sort
        in: query
        description: 'A code representing the order of rendering external bank accounts with their creation date.

          '
        required: false
        schema:
          type: string
          enum:
          - ASC
          - DESC
      - name: page
        in: query
        description: 'Index of the page.

          '
        required: false
        schema:
          type: string
          default: '1'
      - name: per_page
        in: query
        description: 'Number of items returned.

          '
        required: false
        schema:
          type: string
          default: '50'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  accounts:
                    type: array
                    description: 'An array containing a list of beneficairies.

                      '
                    items:
                      $ref: '#/components/schemas/ExternalBankAccount'
        '204':
          description: No externalBankAccounts found
        default:
          description: ERROR
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /externalBankAccounts/{id}:
    get:
      summary: Get beneficiary details
      tags:
      - Beneficiaries
      description: "This request allows you to see the details related to a specific beneficiary. \n"
      parameters:
      - name: id
        in: path
        description: "The unique id of the beneficiary. \n"
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  account:
                    $ref: '#/components/schemas/ExternalBankAccount'
        default:
          description: ERROR
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    delete:
      summary: Delete beneficiary
      tags:
      - Beneficiaries
      parameters:
      - name: id
        in: path
        description: 'The unique id of the beneficiary to be deleted.

          '
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProcessResult'
        '204':
          description: No externalBankAccounts found
        default:
          description: ERROR
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    ErrorVOP:
      type: object
      description: 'Representation of an error.

        '
      properties:
        errorCode:
          type: number
          format: int
          description: 'The code referring the error.

            '
        errorType:
          type: string
          description: 'A short description identifying a general category for the error that occurred.

            '
        errorMessage:
          type: string
          description: 'Error description. '
        link:
          type: string
          description: 'An hyperlink to access the page that describes more accurately the error.

            '
        payeeVerification:
          type: object
          description: ''
          properties:
            status:
              type: string
              enum:
              - PARTIAL
              - FAILED
              description: ''
            message:
              type: string
              description: Verification of payee result details.
            corrections:
              type: object
              description: Proposed modification regarding the beneficiary information.
              properties:
                account_holder_name:
                  type: string
                  description: Expected beneficiary name.
                account_holder_type:
                  type: string
                  enum:
                  - Individual
                  - Corporate
                  description: Expected beneficiary type.
    ProcessResult:
      type: object
      description: 'As some of our process just need to send you back the confirmation that this process is successful, the API will send you a ProcessResult.

        '
      properties:
        result:
          type: boolean
          description: 'The result of the operation. `true` if the operation is successful, else `false`

            '
    ExternalBankAccountVOP:
      type: object
      properties:
        id:
          $ref: '#/components/schemas/ID'
        currency:
          $ref: '#/components/schemas/Currency'
        tag:
          type: string
          maxLength: 50
          description: 'Custom reference of the account.

            '
        accountNumber:
          type: string
          maxLength: 40
          description: 'The code specifying the account (can be either an Iban or an account number).

            '
        correspondentBank:
          $ref: '#/components/schemas/CorrespondantBank'
        holderBank:
          $ref: '#/components/schemas/HolderBank'
        holder:
          $ref: '#/components/schemas/Holder'
        contactEmail:
          $ref: '#/components/schemas/Email'
        payeeVerification:
          type: object
          description: "Verification of payee result. \n\n **Note** : check default error response if the verification failed for more details.\n"
          properties:
            status:
              type: string
              description: '`SUCCESS` if the beneficiary IBAN and name are verified.'
            message:
              type: string
              description: '`Match` if the beneficiary IBAN and name are a perfect match.'
    Currency:
      type: string
      pattern: ^[A-Z]{3}$
      format: ^[A-Z]{3}$
      example: USD
      description: 'A String representing the Three-digit ISO 4217 Currency Code of a currency. This String only contains capitalized letters.

        '
    Address:
      type: object
      description: 'Representation of an address

        '
      required:
      - country
      properties:
        street:
          type:
          - string
          - 'null'
          maxLength: 255
          description: 'The street and street number for the address described.

            '
        postCode:
          type:
          - string
          - 'null'
          maxLength: 15
          description: 'The ZIP/Post code for the address described.

            '
        city:
          type:
          - string
          - 'null'
          maxLength: 35
          description: 'The city for the address described.

            '
        province:
          type:
          - string
          - 'null'
          maxLength: 2
          description: 'The province code for the address described. This field could be required if the country use a province system, like United States or Canada. To see a full list of province code, please refer to http://www.mapability.com/ei8ic/contest/states.php.

            '
        country:
          type: string
          maxLength: 8
          description: 'The two-letters abbreviation for the country, following the ISO-3166 for the address described.

            '
    HolderBank:
      type: object
      description: 'Representation of a beneficiary bank.

        '
      properties:
        bic:
          type: string
          maxLength: 11
          description: 'Eight or eleven-digit ISO 9362 Business Identifier Code specifying the Recipient Bank.

            This field is optional only when the account number does not have an Iban format.'
        clearingCodeType:
          type: string
          maxLength: 2
          description: 'The two-digit code specifying the local clearing network.

            If you does not have a bic, this field is required.'
        clearingCode:
          type: string
          maxLength: 15
          description: 'The code identifying the branch number on the local clearing network.

            If you does not have a bic, this field is required.'
        name:
          type: string
          maxLength: 120
          description: 'The beneficiary bank name.

            '
        address:
          $ref: '#/components/schemas/Address'
    ID:
      type: string
      pattern: ^[A-Za-z0-9]+$
      format: ^[A-Za-z0-9]+$
      example: Na5Dv6E
      description: 'A String representing the id of an object. This string contains alpha-numeric characters, including the capital ones.

        '
    Error:
      type: object
      description: 'Representation of an error.

        '
      properties:
        errorCode:
          type: number
          format: int
          description: 'The code referring the error.

            '
        errorType:
          type: string
          description: 'A short description identifying a general category for the error that occurred.

            '
        errorMessage:
          type: string
          description: Error description.
        link:
          type: string
          description: 'An hyperlink to access the page that describes more accurately the error.

            '
    ExternalBankAccount:
      type: object
      properties:
        id:
          $ref: '#/components/schemas/ID'
        currency:
          description: 'The three-digit code specifying the currency of the account.

            '
          type: string
        tag:
          type: string
          maxLength: 50
          description: 'Custom reference of the account.

            '
        accountNumber:
          type: string
          maxLength: 40
          description: 'The code specifying the account (can be either an Iban or an account number).

            '
        correspondentBank:
          $ref: '#/components/schemas/CorrespondantBank'
        holderBank:
          $ref: '#/components/schemas/HolderBank'
        holder:
          $ref: '#/components/schemas/Holder'
        contactEmail:
          $ref: '#/components/schemas/Email'
    Holder:
      type: object
      description: 'What we call a Holder can be either an Individual or an Organisation that own the account.

        May also be referred to as: Beneficiary/Supplier/Vendor/Payee/Recipient.


        In the beneficiary address, only the Country is mandatory, but you can specify all fields to be more precise.

        '
      required:
      - name
      - type
      properties:
        name:
          type: string
          maxLength: 100
          description: 'The name of the account owner.

            '
        type:
          type: string
          maxLength: 10
          description: 'The code identifying the type of account owner.

            '
          enum:
          - Individual
          - Corporate
        address:
          $ref: '#/components/schemas/Address'
    Email:
      type: string
      description: Beneficiary email address
      pattern: ^[A-Za-z0-9._-]+@[A-Za-z0-9._-]+\.[A-Za-z]{2,}$
    CorrespondantBank:
      type:
      - object
      - 'null'
      description: 'Representation of a correspondant bank.

        '
      properties:
        bic:
          type: string
          maxLength: 11
          description: 'Eight or eleven-digit ISO 9362 Business Identifier Code specifying the Recipient Bank.

            '
        name:
          type: string
          maxLength: 120
          description: 'The beneficiary bank name.

            '
        address:
          $ref: '#/components/schemas/Address'
  securitySchemes:
    X-WSSE:
      type: apiKey
      in: header
      name: X-WSSE
      description: 'X-WSSE token-based authentication. The header value must be computed fresh for every request (tokens expire in ~5 minutes).


        Header value format:

        ```

        UsernameToken Username="<username>", PasswordDigest="<digest>", Nonce="<nonce_b64>", Created="<timestamp>"

        ```


        Algorithm:

        1. Generate a random nonce: ≥ 32 lowercase hex characters.

        2. Get current UTC timestamp in ISO 8601: `YYYY-MM-DDTHH:MM:SSZ`.

        3. Compute `PasswordDigest = Base64( SHA-1( nonce_bytes + created_bytes + secret_bytes ) )` — SHA-1 over the raw UTF-8 bytes concatenated in that order, result must be the binary digest before Base64 encoding.

        4. Compute `Nonce = Base64( nonce_utf8_bytes )`.


        See the `info.description` field at the top of this spec for full code samples in Python, JavaScript, PHP, Java, and Go.'