> ## 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.

# SWIFT Payouts

> Accept crypto deposits and send fiat via SWIFT wire transfers

## Overview

Accept cryptocurrency deposits and send fiat payments via SWIFT wire transfer to any bank account globally.

## How It Works

1. **Create transfer** - Specify crypto source and SWIFT destination
2. **Get deposit instructions** - Receive wallet address and amount
3. **Send crypto** - Customer deposits to the provided address
4. **Receive fiat** - Funds arrive via SWIFT wire transfer

## Prerequisites

* Verified customer (KYB/KYC completed)
* External bank account configured for SWIFT
* Supported stablecoins: USDC, USDT, PYUSD

## Bank Account Setup

<CodeGroup>
  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://api.infinite.dev/v1/external-bank-accounts',
      headers={
          'Authorization': 'Bearer YOUR_API_KEY',
          'Content-Type': 'application/json',
      },
      json={
          'customerId': 'cus_abc123',
          'beneficiaryName': 'Acme Corporation Ltd',
          'beneficiaryType': 'business',
          'paymentRails': ['swift'],
          'beneficiaryAddress': {
              'addressLine1': '123 Business Ave',
              'city': 'New York',
              'state': 'NY',
              'postalCode': '10001',
              'country': 'US',
          },
          'bankName': 'JPMorgan Chase Bank',
          'bankAddress': {
              'addressLine1': '456 Wall Street',
              'city': 'New York',
              'state': 'NY',
              'postalCode': '10005',
              'country': 'US',
          },
          'swiftBic': 'CHASUS33XXX',
          'accountNumber': '1234567890',
      },
  )
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch('https://api.infinite.dev/v1/external-bank-accounts', {
    method: 'POST',
    headers: {
      Authorization: 'Bearer YOUR_API_KEY',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      customerId: 'cus_abc123',
      beneficiaryName: 'Acme Corporation Ltd',
      beneficiaryType: 'business',
      paymentRails: ['swift'],
      beneficiaryAddress: {
        addressLine1: '123 Business Ave',
        city: 'New York',
        state: 'NY',
        postalCode: '10001',
        country: 'US',
      },
      bankName: 'JPMorgan Chase Bank',
      bankAddress: {
        addressLine1: '456 Wall Street',
        city: 'New York',
        state: 'NY',
        postalCode: '10005',
        country: 'US',
      },
      swiftBic: 'CHASUS33XXX',
      accountNumber: '1234567890',
    }),
  });
  ```

  ```bash CLI theme={null}
  export INFINITE_API_KEY=YOUR_API_KEY
  infinite api POST /v1/external-bank-accounts --body '{
    "customerId": "cus_abc123",
    "beneficiaryName": "Acme Corporation Ltd",
    "beneficiaryType": "business",
    "paymentRails": ["swift"],
    "beneficiaryAddress": {
      "addressLine1": "123 Business Ave",
      "city": "New York",
      "state": "NY",
      "postalCode": "10001",
      "country": "US"
    },
    "bankName": "JPMorgan Chase Bank",
    "bankAddress": {
      "addressLine1": "456 Wall Street",
      "city": "New York",
      "state": "NY",
      "postalCode": "10005",
      "country": "US"
    },
    "swiftBic": "CHASUS33XXX",
    "accountNumber": "1234567890"
  }'
  ```

  ```text MCP theme={null}
  Add a SWIFT bank account for cus_abc123: Acme Corporation Ltd (business), JPMorgan Chase Bank, BIC CHASUS33XXX, account 1234567890, beneficiary address 123 Business Ave, New York, NY 10001, US; bank address 456 Wall Street, New York, NY 10005, US.

  # Infinite MCP is read-only today — run the CLI tab to execute.
  ```

  ```bash cURL theme={null}
  curl -X POST "https://api.infinite.dev/v1/external-bank-accounts" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "customerId": "cus_abc123",
      "beneficiaryName": "Acme Corporation Ltd",
      "beneficiaryType": "business",
      "paymentRails": ["swift"],
      "beneficiaryAddress": {
        "addressLine1": "123 Business Ave",
        "city": "New York",
        "state": "NY",
        "postalCode": "10001",
        "country": "US"
      },
      "bankName": "JPMorgan Chase Bank",
      "bankAddress": {
        "addressLine1": "456 Wall Street",
        "city": "New York",
        "state": "NY",
        "postalCode": "10005",
        "country": "US"
      },
      "swiftBic": "CHASUS33XXX",
      "accountNumber": "1234567890"
    }'
  ```
</CodeGroup>

## Creating a SWIFT Transfer

To initiate a crypto-to-SWIFT transfer, you can specify the source in multiple ways:

<CodeGroup>
  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://api.infinite.dev/v1/transfers',
      headers={
          'Authorization': 'Bearer YOUR_API_KEY',
          'Content-Type': 'application/json',
      },
      json={
          'onBehalfOf': 'cus_abc123',
          'amount': {
              'currency': 'usdc',
              'rawValue': '100000000',
          },
          'source': {
              'currency': 'usdc',
              'paymentRail': 'ETHEREUM',
              'accountId': 'ewa_abc123',
          },
          'destination': {
              'currency': 'usd',
              'paymentRail': 'SWIFT',
              'accountId': 'eba_bank_123',
              'swiftReference': 'Invoice #2026-001',
          },
          'paymentReason': 'PAYMENT_FOR_GOODS_AND_SERVICES',
      },
  )
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch('https://api.infinite.dev/v1/transfers', {
    method: 'POST',
    headers: {
      Authorization: 'Bearer YOUR_API_KEY',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      onBehalfOf: 'cus_abc123',
      amount: {
        currency: 'usdc',
        rawValue: '100000000',
      },
      source: {
        currency: 'usdc',
        paymentRail: 'ETHEREUM',
        accountId: 'ewa_abc123',
      },
      destination: {
        currency: 'usd',
        paymentRail: 'SWIFT',
        accountId: 'eba_bank_123',
        swiftReference: 'Invoice #2026-001',
      },
      paymentReason: 'PAYMENT_FOR_GOODS_AND_SERVICES',
    }),
  });
  ```

  ```bash CLI theme={null}
  export INFINITE_API_KEY=YOUR_API_KEY
  infinite api POST /v1/transfers --body '{
    "onBehalfOf": "cus_abc123",
    "amount": {
      "currency": "usdc",
      "rawValue": "100000000"
    },
    "source": {
      "currency": "usdc",
      "paymentRail": "ETHEREUM",
      "accountId": "ewa_abc123"
    },
    "destination": {
      "currency": "usd",
      "paymentRail": "SWIFT",
      "accountId": "eba_bank_123",
      "swiftReference": "Invoice #2026-001"
    },
    "paymentReason": "PAYMENT_FOR_GOODS_AND_SERVICES"
  }'
  ```

  ```text MCP theme={null}
  Send 100 USDC from ewa_abc123 on Ethereum to eba_bank_123 as USD by SWIFT on behalf of cus_abc123, for goods and services, with reference "Invoice #2026-001".

  # With an agent key the assistant calls create_transfer (draft) then submit_transfer; with an org key run the CLI tab.
  ```

  ```bash cURL theme={null}
  curl -X POST "https://api.infinite.dev/v1/transfers" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "onBehalfOf": "cus_abc123",
      "amount": {
        "currency": "usdc",
        "rawValue": "100000000"
      },
      "source": {
        "currency": "usdc",
        "paymentRail": "ETHEREUM",
        "accountId": "ewa_abc123"
      },
      "destination": {
        "currency": "usd",
        "paymentRail": "SWIFT",
        "accountId": "eba_bank_123",
        "swiftReference": "Invoice #2026-001"
      },
      "paymentReason": "PAYMENT_FOR_GOODS_AND_SERVICES"
    }'
  ```
</CodeGroup>

### Response

```json theme={null}
{
  "id": "tfr_abc123",
  "status": "PENDING",
  "sourceAmount": {
    "currency": "USDC",
    "exponent": 6,
    "value": "100000000",
    "displayValue": "100.00"
  },
  "destinationAmount": null,
  "depositInstructions": {
    "type": "crypto",
    "paymentRail": "ETHEREUM",
    "toAddress": "0x1234567890abcdef1234567890abcdef12345678",
    "amount": {
      "currency": "USDC",
      "exponent": 6,
      "value": "100000000",
      "displayValue": "100.00"
    }
  }
}
```

<Info>
  The `destinationAmount` is calculated after the crypto deposit is confirmed, based on current exchange rates and applicable fees.
</Info>

## Deposit Instructions

The transfer response includes deposit instructions with:

* `toAddress` - Destination wallet address
* `amount` - Amount as a `MoneyOutput` object (see [Currency Amount Format](/guides/quotes-and-transfers#currency-amount-format))
* `paymentRail` - Blockchain network

## Transfer States

SWIFT transfers progress through several states:

| Status | Substatus | Description |
| - | - | - |
| `PENDING` | `AWAITING_CRYPTO_DEPOSIT` | Waiting for the customer to send crypto. This ends once the deposit is confirmed. |
| `PENDING` | `SWIFT_PENDING_APPROVAL` | Crypto received, awaiting operations approval |
| `PROCESSING` | `SWIFT_APPROVED` | Approved, ready for SWIFT processing |
| `COMPLETED` | - | SWIFT transfer sent successfully |
| `FAILED` | - | Transfer failed (with reason in metadata) |

Once the crypto deposit is confirmed, `status` is no longer `PENDING`. A compliance or missing-document hold is `IN_REVIEW`. Otherwise the transfer is `PROCESSING`. A confirmed deposit is not still waiting for funds.

## Monitoring Transfer Status

Poll the transfer status to track progress:

<CodeGroup>
  ```python Python theme={null}
  import requests

  response = requests.get(
      'https://api.infinite.dev/v1/transfers/tfr_abc123',
      headers={
          'Authorization': 'Bearer YOUR_API_KEY',
      },
  )
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch('https://api.infinite.dev/v1/transfers/tfr_abc123', {
    headers: {
      Authorization: 'Bearer YOUR_API_KEY',
    },
  });
  ```

  ```bash CLI theme={null}
  export INFINITE_API_KEY=YOUR_API_KEY
  infinite transfers get tfr_abc123
  ```

  ```text MCP theme={null}
  Show me transfer tfr_abc123.
  ```

  ```bash cURL theme={null}
  curl -X GET "https://api.infinite.dev/v1/transfers/tfr_abc123" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```
</CodeGroup>

Check the transfer status endpoint to monitor progress. When completed, the response includes the final destination amount, bank reference, and SWIFT tracking UETR.

## Webhooks

Configure webhooks to receive real-time updates:

```json theme={null}
{
  "id": "evt_abc123",
  "timestamp": "2026-01-15T10:30:00Z",
  "apiVersion": "1.0",
  "organizationId": "org_abc123",
  "type": "transfer.completed",
  "data": {
    "id": "tfr_abc123",
    "status": "COMPLETED",
    "sourceAmount": {
      "currency": "USDC",
      "exponent": 6,
      "value": "100000000",
      "displayValue": "100.00"
    },
    "destinationAmount": {
      "currency": "USD",
      "exponent": 2,
      "value": "9950",
      "displayValue": "99.50"
    }
  }
}
```

## Processing Timeline

* **Crypto confirmation**: 12+ confirmations on Ethereum (\~3 minutes)
* **Processing time**: 1-2 business hours during business days
* **SWIFT delivery**: 1-3 business days depending on destination

## Common Errors

Failed transfers include a `failureReason` in the metadata:

* **Insufficient deposit** - Amount received doesn't match expected
* **Invalid beneficiary** - Incorrect SWIFT/IBAN details
* **Compliance rejection** - Transfer blocked by compliance checks

## Sandbox Testing

* Use test wallet addresses from deposit instructions
* Test with simulated crypto deposits
* Validate using sandbox bank details

## Features

* Real-time tracking with SWIFT UETR
* Same-day processing available

## Support

For any assistance, reach out to us via Slack or contact:

* **General support**: [support@infinite.dev](mailto:support@infinite.dev)
* **Compliance inquiries**: [compliance@infinite.dev](mailto:compliance@infinite.dev)


## Related topics

- [Simulate customer capabilities](/api-reference/sandbox/simulate-customer-capabilities.md)
- [Transfers](/concepts/transfers.md)
- [Quickstart](/quickstart.md)
- [Get customer capabilities](/api-reference/customers/get-customer-capabilities.md)
- [Create a new business customer](/api-reference/customers/create-a-new-business-customer.md)
