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

> ## Agent Instructions
> If you are an AI assistant operating Infinite for a user, read the skill first: https://docs.infinite.dev/agent-skill.md (setup per host, tool reference, rules for moving money, journeys).
> When operating Infinite for a user, use the MCP server. Sign in at https://bot.api.infinite.dev/mcp (production, acts as the user) or send `Authorization: Bearer <key>` to https://bot.api.infinite.dev/mcp/sse. Prefer its tools over raw HTTP; use REST only for steps no tool covers, and check `get_endpoint_schema` before guessing a request shape.
> Net-new Infinite Connect (org_connect) is operator-assisted: do not grant end users shared org_connect Auth Kit membership or the shared platform org API key — those credentials are org-wide on /v1. BYO org keys onboard under that customer's org id. Operator sessions should show org_connect in get_organization_info.
> The key decides the tools. Every organization key (`sk_sandbox_…` / `sk_live_…`) gets docs, onboarding, `get_account_balance`, and request logs for your own organization. BYO organizations add payees an agent will pay with `create_payee` (payable once ACTIVE). Platform Connect sessions instead get bound-customer payment lookups (`get_quote`, `get_transfer`, `list_transfers`, `list_account_balances`), payee drafts (`create_payee_draft` / `get_payee_draft`; screening only, never payable), and transfer drafts that wait for Infinite approval (`create_transfer_draft` / `get_transfer_draft`; never POST /v1/transfers). Where offered, platform `create_transfer` files a real transfer that Infinite holds in review before funding; it cannot be submitted from DRAFT.
> An agent key (`sk_sandbox_agent_…` / `sk_live_agent_…`) moves money within that agent's limits: `create_transfer` → `submit_transfer` → `wait_for_transfer`.
> On sandbox organization-key sessions, `sandbox_approve_customer` (makes the capabilities you pass READY, and related ones may turn READY too; `request_capabilities` is not needed), `sandbox_fund_account`, and `sandbox_complete_transfer` stand in for verification, funding, and settlement, so a whole flow runs from MCP. BYO keys can pass `customerId` on each call without binding; platform sessions must bind a customer first (`create_business_customer` auto-binds, or send `X-Infinite-On-Behalf-Of`).
> When searching documentation without a key, use the docs MCP at https://docs.infinite.dev/mcp.
> Start in sandbox (https://sandbox.api.infinite.dev). Do not use production unless the user explicitly asks.
> Confirm amount, currency, and payee with the user before any payment is submitted. Pass the invoice number as `reference` on `create_transfer`; the summary says what the payee will see.
> REST amounts are integer minor units (`"4000"` = 40.00 USD). MCP payment tools take exact decimal strings (`"40.00"`). Never mix them.
> Agent denials return `403 { denial: { code, message, window, limit, used, remaining, attemptedAmount, currency }, hint }` with decimal amounts; per-transfer denials omit `used` and `remaining`. Report them to the user; do not work around them.

# Simulate a fixed-route source deposit

> Sandbox-only: triggers the fixed-route sweep without on-chain funds or provider webhooks. Works for fiat (`vba_`) and crypto (`inw_`) source routes. Does not use account fund-in -- Infinite wallets cannot be credited that way. When the sweep target is a treasury Infinite wallet and the destination is a mintable sandbox token (USDT or USAT on Ethereum), this also mints that token to the vault so GET treasury and withdrawals see a real testnet balance. When the sweep target is a fiat balance account, this credits that balance immediately and emits `balance.credited`. A reused `reference` with the same amount returns the existing sweep and leaves its recorded rail and remitter unchanged. An unfinished sweep resumes from that deposit, not the later `rail`. Use a new reference per rail. On a fiat pay-in that lists sourceRails, `rail` is ACH, WIRE, or SWIFT. Omit it to book the stored rail (ACH when the route accepts ACH and wire). Wire, ACH, and SWIFT deposits populate `source.originator` with a sandbox remitter unless you pass `originator` or the route has `allowedSenderBanks`. The ACH remitter is the originator name and routing number only.

## Source account id

Pass the fixed route's **source account id** -- `vba_…` for fiat mailboxes, `inw_…` for crypto deposit wallets. This is the public fixed-route id.

The sweep runs without a real provider deposit. When the destination is a treasury Infinite wallet (`inw_…`) on a mintable sandbox token (USDT or USAT on Ethereum today), the endpoint also mints that token to the vault so `GET /v1/customers/{id}/treasury` and later withdrawals see a chain balance. Circle test USDC and Tron are not mintable this way.

When the sweep target is a fiat balance account, the same call credits that balance immediately and emits `balance.credited`. Replaying the same `reference` does not credit twice.

On a fiat pay-in that lists `sourceRails`, pass `rail` (`ACH`, `WIRE`, or `SWIFT`) to choose the inbound rail. Omit it to book the route's stored rail -- ACH when the route accepts ACH and wire. Domestic wire is `WIRE`. A rail the route does not accept is rejected when no sweep exists for that `reference` and amount. Reusing `reference` with the same amount returns the existing sweep and leaves its recorded rail and remitter unchanged. An unfinished sweep resumes from that deposit; use a new reference for each rail.

Wire, ACH, and SWIFT simulations populate `source.originator` (and the same field on `transfer.created` / `transfer.updated` webhooks) with a sandbox remitter. The ACH remitter is the originator name and routing number only. Pass `originator` to override, or `{}` to leave it null. Crypto sources stay null unless `originator` is set. Routes with `allowedSenderBanks` do not get a default remitter -- omit `originator` and `senderBank` to exercise the unattributed fail-closed path.

`POST /v1/sandbox/accounts/{id}/fund-in` cannot replace this call for `inw_` accounts.


## OpenAPI

````yaml post /v1/sandbox/fixed-routes/{id}/simulate-deposit
openapi: 3.0.0
info:
  title: Infinite API
  description: API for Infinite
  version: '1.0'
  contact: {}
servers:
  - url: https://sandbox.api.infinite.dev
    description: Sandbox
  - url: https://api.infinite.dev
    description: Production
security: []
tags:
  - name: Accounts
    description: Virtual and external account management
  - name: Customers
    description: Customer identity management
  - name: Documents
    description: Document upload and management
  - name: Fixed Routes
    description: Fixed route management
  - name: External Bank Accounts
    description: External bank account management
  - name: External Wallets
    description: External wallet management
  - name: Infinite Wallets
    description: Infinite Wallet management
  - name: Organizations
    description: Organization management
  - name: Quotes
    description: Quote creation and management
  - name: Transfers
    description: Money movement and transaction tracking
  - name: Verification
    description: Identity verification workflows
  - name: Terms of Service
    description: Terms of Service acceptance
  - name: Health
    description: System health and monitoring
  - name: Sandbox
    description: Sandbox utilities
paths:
  /v1/sandbox/fixed-routes/{id}/simulate-deposit:
    servers:
      - url: https://sandbox.api.infinite.dev
        description: Sandbox
    post:
      tags:
        - Sandbox
      summary: Simulate a fixed-route source deposit
      description: >-
        Sandbox-only: triggers the fixed-route sweep without on-chain funds or
        provider webhooks. Works for fiat (`vba_`) and crypto (`inw_`) source
        routes. Does not use account fund-in -- Infinite wallets cannot be
        credited that way. When the sweep target is a treasury Infinite wallet
        and the destination is a mintable sandbox token (USDT or USAT on
        Ethereum), this also mints that token to the vault so GET treasury and
        withdrawals see a real testnet balance. When the sweep target is a fiat
        balance account, this credits that balance immediately and emits
        `balance.credited`. A reused `reference` with the same amount returns
        the existing sweep and leaves its recorded rail and remitter unchanged.
        An unfinished sweep resumes from that deposit, not the later `rail`. Use
        a new reference per rail. On a fiat pay-in that lists sourceRails,
        `rail` is ACH, WIRE, or SWIFT. Omit it to book the stored rail (ACH when
        the route accepts ACH and wire). Wire, ACH, and SWIFT deposits populate
        `source.originator` with a sandbox remitter unless you pass `originator`
        or the route has `allowedSenderBanks`. The ACH remitter is the
        originator name and routing number only.
      operationId: SandboxController_simulateFixedRouteDeposit_v1
      parameters:
        - name: X-API-Key
          in: header
          description: API key
          required: false
          schema:
            type: string
        - name: id
          required: true
          in: path
          description: >-
            Fixed route source account id (`vba_` for fiat, `inw_` for crypto
            deposit wallets)
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SandboxSimulateFixedRouteDepositDto'
      responses:
        '200':
          description: Fixed route sweep simulated successfully
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/SandboxSimulateFixedRouteDepositResponseDto
        '401':
          description: Unauthorized - Invalid or missing authentication credentials
      security:
        - bearer: []
      x-codeSamples:
        - lang: bash
          label: CLI
          source: >-
            # Requires: npm i -g @infinite_dev/cli && export
            INFINITE_API_KEY=sk_sandbox_...

            # Escape hatch for any endpoint: infinite api <METHOD> <path>

            infinite api POST
            /v1/sandbox/fixed-routes/vba_abc123/simulate-deposit \
              --body '<request-json>'
        - lang: text
          label: MCP
          source: >-
            Simulate a fixed-route source deposit (vba_abc123).


            # Infinite MCP is read-only for this endpoint — use a dedicated MCP
            tool when one exists, otherwise run the CLI tab.
components:
  schemas:
    SandboxSimulateFixedRouteDepositDto:
      type: object
      properties:
        amount:
          type: string
          description: >-
            Deposit amount in major units (e.g. "1000.00" for USD, "100.5" for
            USDT)
          example: '1000.00'
        currency:
          type: string
          description: Deposit currency; defaults to the route source currency when omitted
          example: USD
        reference:
          type: string
          description: >-
            Idempotency reference for the simulated deposit. A reused reference
            returns the existing sweep. Its rail and remitter stay as first
            recorded, and an unfinished sweep resumes from that deposit rather
            than the later rail. Use a new reference to simulate a different
            inbound rail.
          example: sandbox_test_deposit_1
        rail:
          type: string
          description: >-
            Inbound rail for a fiat pay-in that lists sourceRails. ACH, WIRE, or
            SWIFT. Omit to book the route's stored rail (ACH when the route
            accepts ACH and wire). Domestic wire is WIRE. Ignored when the route
            has no sourceRails.
          enum:
            - ACH
            - WIRE
            - SWIFT
          example: WIRE
        senderBank:
          description: >-
            Sender bank reported for the simulated deposit, for exercising the
            allowedSenderBanks restriction on fiat pay-in routes. When omitted
            on a wire/FedWire/SWIFT route with no allowlist, a default remitter
            is used so `source.originator` is populated. Omit both this and
            `originator` on an allowlisted route to simulate a deposit without
            sender-bank data.
          allOf:
            - $ref: '#/components/schemas/AllowedSenderBankDto'
        originator:
          description: >-
            Inbound remitter identity persisted on the sweep transfer as
            `source.originator` (and transfer webhooks). Wire/FedWire/SWIFT/ACH
            simulations default a sandbox remitter when this is omitted and the
            route has no allowedSenderBanks. The ACH default is the originator
            name and routing number only. Pass an empty object to skip the
            default and leave originator null. Crypto sources stay null unless
            this is set.
          nullable: true
          type: object
          allOf:
            - $ref: '#/components/schemas/SandboxDepositOriginatorDto'
      required:
        - amount
    SandboxSimulateFixedRouteDepositResponseDto:
      type: object
      properties:
        accountId:
          type: string
          description: Fixed route source account ID
          example: acc_123
        transferId:
          type: string
          description: Sweep transfer created or replayed for this simulation
          example: tfr_123
        sweepReferenceId:
          type: string
          description: Sweep idempotency key used for this simulation
          example: sandbox_sim_550e8400-e29b-41d4-a716-446655440000
      required:
        - accountId
        - transferId
        - sweepReferenceId
    AllowedSenderBankDto:
      type: object
      properties:
        bankName:
          type: string
          description: >-
            Sender bank name. Matched ignoring case, whitespace, and
            punctuation.
          example: JPMorgan Chase
          maxLength: 200
        routingNumber:
          type: string
          description: Sender bank routing number (e.g. US ABA). Matched on digits only.
          example: '021000021'
        swiftBic:
          type: string
          description: Sender bank SWIFT/BIC code (8 or 11 characters)
          example: CHASUS33
    SandboxDepositOriginatorDto:
      type: object
      properties:
        name:
          type: string
          description: Originator / remitter name
          example: Sandbox Originator LLC
        bankName:
          type: string
          description: Originating bank name
          example: Sandbox Test Bank
        routingNumber:
          type: string
          description: Originating bank routing number (e.g. US ABA)
          example: '021000021'
        accountNumber:
          type: string
          description: Originating account number or IBAN
          example: '000123456789'
        swiftBic:
          type: string
          description: Originating bank SWIFT/BIC
          example: CHASUS33
        bankCountry:
          type: string
          description: >-
            ISO 3166-1 alpha-2 country of the originating bank. Inferred from
            routing/BIC/IBAN when omitted.
          example: US
  securitySchemes:
    bearer:
      scheme: bearer
      bearerFormat: API Key
      type: http
      description: API Key in Bearer format (e.g., Bearer sk_test_...)

````

## Related topics

- [Fixed Routes](/concepts/fixed-routes.md)
- [Update a fixed route](/api-reference/fixed-routes/update-a-fixed-route.md)
- [Get a fixed route by ID](/api-reference/fixed-routes/get-a-fixed-route-by-id.md)
- [List fixed routes for a customer](/api-reference/customers/list-fixed-routes-for-a-customer.md)
- [Simulate account funding](/api-reference/sandbox/simulate-account-funding.md)
