> ## Documentation Index
> Fetch the complete documentation index at: https://direct-api.reap.global/llms.txt
> Use this file to discover all available pages before exploring further.

# Confirm a bank transfer

> Required API-key scope: `treasury_funding:write`.

Tells Reap a bank transfer is on its way: send the `referenceId` and `amount` from your bank instructions after transferring. The transfer must come from a bank account in your business’s registered name. Confirming does not credit funds; the deposit appears in `GET /treasury/transactions` once the funds land in Reap’s bank account and are reconciled. Confirmations are recorded under the person who created this API key. See [Funding methods](/concepts/treasury/funding).



## OpenAPI

````yaml /openapi/2026-07-13.json post /2026-07-13/treasury/bank-transfer-confirmations
openapi: 3.1.0
info:
  title: Reap Business Account API
  description: >

    # Introduction


    The Reap Business Account API lets you manage cards, spend and Treasury

    funding for your Business Account from your own systems. Every endpoint is

    authenticated with an API key sent in the `x-api-key` header and versioned

    with a date in the URL (`/2026-07-13/...`).


    Guides, concepts and the full setup reference live on the docs site:

    [direct-api.reap.global](https://direct-api.reap.global).



    ## Errors


    All errors share a single JSON envelope:


    ```json

    {
      "statusCode": 400,
      "type": "INVALID_REQUEST_ERROR",
      "code": "SPEND_CAP_TOO_LOW",
      "message": "Spend cap cannot be lower than the amount already spent on this card.",
      "param": "spendCap",
      "requestId": "01H..."
    }

    ```


    - `statusCode`: HTTP status, duplicated in the body.

    - `type`: coarse category, **always present**. Branch on this for
    retry/re-auth decisions.

    - `code`: stable, machine-readable identifier. Present only for
    programmatically-actionable errors.

    - `message`: human-readable explanation, safe to surface to users.

    - `param`: offending field for validation errors (optional).

    - `details`: structured extra context such as validation issues or required
    API-key scopes (optional).

    - `requestId`: correlation id; include it when contacting support
    (optional).


    The specific error codes each endpoint can return are documented on that

    endpoint's responses below.


    ### Error types


    | Type | Description |

    | --- | --- |

    | `INVALID_REQUEST_ERROR` | The request was rejected due to invalid input, a
    missing resource, or a business-rule violation (HTTP 400/404/409/422). |

    | `AUTHENTICATION_ERROR` | Authentication is missing or invalid (HTTP 401).
    |

    | `PERMISSION_ERROR` | The caller is authenticated but not permitted to
    perform the action (HTTP 403). |

    | `RATE_LIMIT_ERROR` | Too many requests; retry after a delay (HTTP 429). |

    | `API_ERROR` | An unexpected error occurred on our side (HTTP 5xx). |

    | `UPSTREAM_ERROR` | An upstream service returned an error (HTTP 502/503). |
  version: '2026-07-13'
  contact: {}
servers:
  - url: https://api.global.direct.reap.global
security: []
tags: []
paths:
  /2026-07-13/treasury/bank-transfer-confirmations:
    post:
      tags:
        - Treasury
      summary: Confirm a bank transfer
      description: >-
        Required API-key scope: `treasury_funding:write`.


        Tells Reap a bank transfer is on its way: send the `referenceId` and
        `amount` from your bank instructions after transferring. The transfer
        must come from a bank account in your business’s registered name.
        Confirming does not credit funds; the deposit appears in `GET
        /treasury/transactions` once the funds land in Reap’s bank account and
        are reconciled. Confirmations are recorded under the person who created
        this API key. See [Funding methods](/concepts/treasury/funding).
      operationId: confirmTreasuryBankTransfer
      parameters:
        - name: Idempotency-Key
          in: header
          description: >-
            Choose one key per transfer. Retrying the same body and key replays
            a successfully stored response for 24 hours; a different body
            returns IDEMPOTENCY_KEY_REUSED.
          required: false
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConfirmTreasuryBankTransfer'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TreasuryBankTransferConfirmation'
              examples:
                confirmation:
                  summary: Pending bank transfer confirmation
                  value:
                    id: ttx_1
                    product: CARD
                    status: PENDING
                    amount:
                      amount: '1000.00'
                      currency: HKD
                    referenceId: IBM-ABCDEF
                    createdAt: '2026-10-01T03:00:00.000Z'
        '400':
          description: '`FUNDING_METHOD_NOT_AVAILABLE`, `DUPLICATE_REFERENCE`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                BAD_REQUEST:
                  summary: BAD_REQUEST
                  value:
                    statusCode: 400
                    type: INVALID_REQUEST_ERROR
                    message: Bad request.
                FUNDING_METHOD_NOT_AVAILABLE:
                  summary: FUNDING_METHOD_NOT_AVAILABLE
                  value:
                    statusCode: 400
                    type: INVALID_REQUEST_ERROR
                    code: FUNDING_METHOD_NOT_AVAILABLE
                    message: This funding method is not available for this product.
                DUPLICATE_REFERENCE:
                  summary: DUPLICATE_REFERENCE
                  value:
                    statusCode: 400
                    type: INVALID_REQUEST_ERROR
                    code: DUPLICATE_REFERENCE
                    message: A transaction with this reference ID is already recorded.
        '401':
          description: '`UNAUTHORIZED`, `AUTH_CREDENTIAL_MISSING`, `API_KEY_INVALID`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                UNAUTHORIZED:
                  summary: UNAUTHORIZED
                  value:
                    statusCode: 401
                    type: AUTHENTICATION_ERROR
                    message: Authentication required.
                AUTH_CREDENTIAL_MISSING:
                  summary: AUTH_CREDENTIAL_MISSING
                  value:
                    statusCode: 401
                    type: AUTHENTICATION_ERROR
                    code: AUTH_CREDENTIAL_MISSING
                    message: Authentication is required.
                API_KEY_INVALID:
                  summary: API_KEY_INVALID
                  value:
                    statusCode: 401
                    type: AUTHENTICATION_ERROR
                    code: API_KEY_INVALID
                    message: API key is invalid.
        '403':
          description: '`TREASURY_NOT_AVAILABLE`, `TREASURY_REQUESTER_NOT_AVAILABLE`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                FORBIDDEN:
                  summary: FORBIDDEN
                  value:
                    statusCode: 403
                    type: PERMISSION_ERROR
                    message: You do not have permission to perform this action.
                API_KEY_IP_NOT_ALLOWED:
                  summary: API_KEY_IP_NOT_ALLOWED
                  value:
                    statusCode: 403
                    type: PERMISSION_ERROR
                    code: API_KEY_IP_NOT_ALLOWED
                    message: Request IP is not allowed for this API key.
                AUTH_INSUFFICIENT_PERMISSIONS:
                  summary: AUTH_INSUFFICIENT_PERMISSIONS
                  value:
                    statusCode: 403
                    type: PERMISSION_ERROR
                    code: AUTH_INSUFFICIENT_PERMISSIONS
                    message: Insufficient permissions.
                    details:
                      requiredScopes:
                        - <required-scope>
                AUTH_METHOD_NOT_ALLOWED:
                  summary: AUTH_METHOD_NOT_ALLOWED
                  value:
                    statusCode: 403
                    type: PERMISSION_ERROR
                    code: AUTH_METHOD_NOT_ALLOWED
                    message: >-
                      This endpoint does not accept the credential type
                      provided.
                TREASURY_NOT_AVAILABLE:
                  summary: TREASURY_NOT_AVAILABLE
                  value:
                    statusCode: 403
                    type: PERMISSION_ERROR
                    code: TREASURY_NOT_AVAILABLE
                    message: Treasury is not available for this business.
                TREASURY_REQUESTER_NOT_AVAILABLE:
                  summary: TREASURY_REQUESTER_NOT_AVAILABLE
                  value:
                    statusCode: 403
                    type: PERMISSION_ERROR
                    code: TREASURY_REQUESTER_NOT_AVAILABLE
                    message: >-
                      The API key creator is no longer an approved team member.
                      Create a new API key under a current team member.
        '409':
          description: '`IDEMPOTENCY_KEY_IN_FLIGHT`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                IDEMPOTENCY_KEY_IN_FLIGHT:
                  summary: IDEMPOTENCY_KEY_IN_FLIGHT
                  value:
                    statusCode: 409
                    type: INVALID_REQUEST_ERROR
                    code: IDEMPOTENCY_KEY_IN_FLIGHT
                    message: >-
                      A request with this Idempotency-Key is still being
                      processed. Retry shortly.
        '422':
          description: '`IDEMPOTENCY_KEY_REUSED`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                IDEMPOTENCY_KEY_REUSED:
                  summary: IDEMPOTENCY_KEY_REUSED
                  value:
                    statusCode: 422
                    type: INVALID_REQUEST_ERROR
                    code: IDEMPOTENCY_KEY_REUSED
                    message: >-
                      This Idempotency-Key was already used with a different
                      request body.
        '429':
          description: '`API_KEY_RATE_LIMITED`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                API_KEY_RATE_LIMITED:
                  summary: API_KEY_RATE_LIMITED
                  value:
                    statusCode: 429
                    type: RATE_LIMIT_ERROR
                    code: API_KEY_RATE_LIMITED
                    message: API key rate limit exceeded.
        '500':
          description: '`INTERNAL_ERROR`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                INTERNAL_ERROR:
                  summary: INTERNAL_ERROR
                  value:
                    statusCode: 500
                    type: API_ERROR
                    message: An unexpected error occurred.
        '503':
          description: '`IDEMPOTENCY_UNAVAILABLE`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                IDEMPOTENCY_UNAVAILABLE:
                  summary: IDEMPOTENCY_UNAVAILABLE
                  value:
                    statusCode: 503
                    type: API_ERROR
                    code: IDEMPOTENCY_UNAVAILABLE
                    message: >-
                      The idempotent request outcome could not be safely
                      determined.
      security:
        - apiKey: []
components:
  schemas:
    ConfirmTreasuryBankTransfer:
      type: object
      properties:
        product:
          type: string
          const: CARD
          description: Bank transfer confirmations are available for `CARD` only.
        network:
          type: string
          enum:
            - FPS
            - CHATS
          description: >-
            The bank rail from your funding instructions: `FPS` (HKD) or `CHATS`
            (USD).
        amount:
          type: object
          properties:
            amount:
              type: string
              maxLength: 30
              pattern: ^\d+(?:\.\d{1,2})?$
            currency:
              type: string
              enum:
                - HKD
                - USD
          required:
            - amount
            - currency
        referenceId:
          type: string
          pattern: ^IBM-[A-F0-9]{6}$
          description: The `IBM-XXXXXX` Reference ID from your bank instructions.
      required:
        - product
        - network
        - amount
        - referenceId
      additionalProperties: false
    TreasuryBankTransferConfirmation:
      type: object
      properties:
        id:
          type: string
          description: The confirmation's ID.
        product:
          type: string
          const: CARD
        status:
          type: string
          description: The confirmation status, for example `PENDING`.
        amount:
          type: object
          properties:
            amount:
              type: string
              description: Decimal string, preserving the asset precision.
            currency:
              type: string
          required:
            - amount
            - currency
          description: The confirmed transfer amount.
        referenceId:
          type: string
          description: The Reference ID this confirmation applies to.
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: When the confirmation was recorded, in UTC.
      required:
        - id
        - product
        - status
        - amount
        - referenceId
        - createdAt
    ErrorResponse:
      type: object
      properties:
        statusCode:
          type: integer
          minimum: 100
          maximum: 599
          description: The HTTP status code, repeated in the body for convenience.
        type:
          type: string
          enum:
            - INVALID_REQUEST_ERROR
            - AUTHENTICATION_ERROR
            - PERMISSION_ERROR
            - RATE_LIMIT_ERROR
            - API_ERROR
            - UPSTREAM_ERROR
          description: >-
            The broad kind of error, for example `RATE_LIMIT_ERROR`. It's always
            present: use it to decide whether to retry, re-authenticate or fix
            the request.
        code:
          description: >-
            A stable, machine-readable error code, for example
            `CARD_CREATION_REQUIRES_DEPOSIT`. It's present when there's a
            specific action you can take, and each endpoint lists the codes it
            can return.
          type: string
        message:
          type: string
          description: >-
            A plain-English explanation of the error that's safe to show to your
            users.
        param:
          description: >-
            The request field that caused a validation error, for example
            `spendCap`.
          type: string
        details:
          description: >-
            Extra structured information, such as the list of validation issues
            or the API-key scopes your key is missing.
        requestId:
          description: >-
            A unique ID for this request. Include it when you contact Reap
            Support so the team can find it.
          type: string
      required:
        - statusCode
        - type
        - message
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: Enter your API key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.