> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kirafin.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Simulate a deposit

> Ask the bank to report an inbound deposit into an active virtual account, so the deposit reaches you through the same path a real one takes. Sandbox only.

<Warning>
  **Sandbox only.** Production has no route for this call and answers `404 route_not_found`, so this page lists one base URL instead of two. There is no production equivalent — a real deposit is what production has.
</Warning>

It returns as soon as the bank has been asked. **No deposit exists yet** — one appears when the bank's callback lands, so read [List virtual account deposits](/api-reference/virtual-accounts/list-virtual-account-deposits) or wait for the `virtual_account.deposit_funds_received` webhook. Nothing in the response identifies the deposit, because it has not been created.


## OpenAPI

````yaml /openapi/kira-api.2026-04-14.json post /v1/virtual-accounts/{virtual_account_id}/simulate-deposit
openapi: 3.1.0
info:
  title: Kira API
  version: '2026-04-14'
  description: >-
    REST API for users, KYC/KYB verification, virtual accounts, payouts,
    recipients, and webhooks. Every request requires an `x-api-key` header and a
    bearer access token (see Authentication). Pin your account to version
    `2026-04-14` before integrating.
  contact:
    name: Kira API Support
    email: support@kirafin.ai
servers:
  - url: https://api.balampay.com
    description: Production
  - url: https://api.balampay.com/sandbox
    description: Sandbox
security:
  - bearerAuth: []
    apiKeyAuth: []
tags:
  - name: Authentication
  - name: Versioning
  - name: Users
  - name: Virtual Accounts
  - name: Recipients
  - name: Quotations
  - name: Payouts
  - name: Reference
paths:
  /v1/virtual-accounts/{virtual_account_id}/simulate-deposit:
    post:
      tags:
        - Virtual Accounts
      summary: Simulate a deposit
      description: >-
        Ask the bank to report an inbound deposit into an active virtual
        account, so the deposit reaches you through the same path a real one
        takes. Sandbox only.
      operationId: post_v1-virtual-accounts-virtual-account-id-simulate-deposit
      parameters:
        - in: path
          name: virtual_account_id
          required: true
          schema:
            type: string
            format: uuid
            example: 3f6c1e8a-91d4-4f2b-9c07-5a1b8e2d4c60
          description: >-
            The virtual account to deposit into. It has to be one of yours, and
            active.
        - in: header
          name: X-Api-Version
          required: false
          description: >-
            Version applied to this request. It wins over your account's pinned
            version — see [Versioning](/using-the-api/versioning).
          schema:
            type: string
            example: '2026-04-14'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SimulateDepositRequest'
            example:
              via_provider: true
              amount: '100.00'
              payment_type: wire
      responses:
        '201':
          description: The bank was asked to report the deposit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SimulateDepositResponse'
              example:
                accepted: true
                virtual_account_id: 3f6c1e8a-91d4-4f2b-9c07-5a1b8e2d4c60
                message: >-
                  The provider was asked to report this deposit. Poll the
                  deposits endpoint to watch it land.
        '400':
          description: >-
            The request was rejected. Two different bodies arrive with this
            status, so read `error` before anything else:


            - **`Invalid data`** — a field is missing or malformed. `details`
            names each problem.

            - **`Bad Request`** — the body was fine but the account cannot
            report a deposit: it is not active yet, its rail does not support
            this, or it has no account number from the bank.
          content:
            application/json:
              examples:
                not-active:
                  summary: The account is not active yet
                  value:
                    statusCode: 400
                    error: Bad Request
                    message: Virtual account is not active
                    timestamp: '2026-09-01T12:00:00.000Z'
                    path: >-
                      /v1/virtual-accounts/3f6c1e8a-91d4-4f2b-9c07-5a1b8e2d4c60/simulate-deposit
                no-account-number:
                  summary: The bank has not minted an account number yet
                  value:
                    statusCode: 400
                    error: Bad Request
                    message: This virtual account has no provider account number yet
                    timestamp: '2026-09-01T12:00:00.000Z'
                    path: >-
                      /v1/virtual-accounts/3f6c1e8a-91d4-4f2b-9c07-5a1b8e2d4c60/simulate-deposit
                scale:
                  summary: The amount carries more than two decimals
                  value:
                    code: validation_error
                    error: Invalid data
                    details:
                      - message: >-
                          Amount must be a positive number with up to 2 decimal
                          places
                via-provider:
                  summary: '`via_provider` was sent as anything but `true`'
                  value:
                    code: validation_error
                    error: Invalid data
                    details:
                      - message: >-
                          `via_provider` must be `true` when present; omit it
                          for amount mode
        '401':
          description: >-
            Your credentials could not be read. The message talks about routing,
            but the cause is one of these:


            - The `Authorization` header is missing.

            - The token is not a token, or was not issued for your account.

            - The `x-api-key` header is missing or wrong.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                code: invalid_request
                message: >-
                  The request could not be matched to a valid route, or was
                  malformed. Verify the path and HTTP method against the API
                  reference. This is a routing or request error, not a
                  credentials or signature problem.
        '404':
          description: No account of yours has that `virtual_account_id`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  statusCode:
                    type: integer
                    description: Repeats the HTTP status.
                  error:
                    type: string
                    description: Always `Not Found`.
                  message:
                    type: string
                    description: What was not found.
                  timestamp:
                    type: string
                    description: When the call was rejected, as an ISO 8601 timestamp.
                  path:
                    type: string
                    description: The path you called.
              example:
                statusCode: 404
                error: Not Found
                message: Virtual account not found
                timestamp: '2026-09-01T12:00:00.000Z'
                path: >-
                  /v1/virtual-accounts/3f6c1e8a-91d4-4f2b-9c07-5a1b8e2d4c60/simulate-deposit
      security:
        - bearerAuth: []
          apiKeyAuth: []
      servers:
        - url: https://api.balampay.com/sandbox
          description: Sandbox
components:
  schemas:
    SimulateDepositRequest:
      type: object
      required:
        - via_provider
        - amount
      properties:
        via_provider:
          type: boolean
          const: true
          description: >-
            Reports the deposit through the bank instead of writing one
            directly. Anything other than `true` is refused rather than
            reinterpreted.
        amount:
          type: string
          description: >-
            How much to deposit in USD, as a positive decimal string with up to
            2 decimals.
          example: '100.00'
        payment_type:
          type: string
          enum:
            - wire
            - ach
          default: wire
          description: The rail the deposit arrives on.
    SimulateDepositResponse:
      type: object
      description: An acknowledgement, not a deposit.
      properties:
        accepted:
          type: boolean
          description: Always `true`. A refusal arrives as a `400` or a `404` instead.
        virtual_account_id:
          type: string
          description: The account the deposit was asked for.
          example: 3f6c1e8a-91d4-4f2b-9c07-5a1b8e2d4c60
        message:
          type: string
          description: What happens next, in one sentence.
    ErrorResponse:
      type: object
      properties:
        message:
          type: string
        code:
          type: string
        statusCode:
          type: number
        error:
          type: string
        timestamp:
          type: string
        path:
          type: string
        details: {}
      required:
        - message
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        The `data.access_token` value from [Get access
        token](/api-reference/authentication/get-access-token).
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key issued by Kira.

````