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

# Create Transfer

> Initiate a transfer. The request is a Bridge-style `source` / `destination` pair; only four pairings are accepted:

- `usd/ach_push` → `usdc/ethereum` — bank onramp
- `usdc/ethereum` → `usd/ach` — wallet offramp
- `usdc/ethereum` → `c0/ethereum` — deposit into C0
- `c0/ethereum` → `usdc/ethereum` — withdraw from C0

Crypto sources must be one of your organization's wallets (`GET /v1/wallets`); supply `from_address`. Bank sources/destinations supply the `bank_account.id` via `external_account_id`. Fiat legs route through Bridge.xyz; the USDC↔C0 pairings execute on-chain. The response is the same unified `Transfer` shape returned by `GET /v1/transfers`.



## OpenAPI

````yaml /api-reference/openapi.json post /transfers
openapi: 3.1.0
info:
  title: Camino Treasury API
  description: >-
    API for managing treasury wallets, tracking transfers (on-chain and fiat) in
    a unified feed, depositing into C0, withdrawing to wallets, and claiming
    yield distributions.
  version: 1.0.0
servers:
  - url: https://api.caminotreasury.com/v1
security:
  - apiKeyAuth: []
paths:
  /transfers:
    post:
      tags:
        - Transfers
      summary: Create Transfer
      description: >-
        Initiate a transfer. The request is a Bridge-style `source` /
        `destination` pair; only four pairings are accepted:


        - `usd/ach_push` → `usdc/ethereum` — bank onramp

        - `usdc/ethereum` → `usd/ach` — wallet offramp

        - `usdc/ethereum` → `c0/ethereum` — deposit into C0

        - `c0/ethereum` → `usdc/ethereum` — withdraw from C0


        Crypto sources must be one of your organization's wallets (`GET
        /v1/wallets`); supply `from_address`. Bank sources/destinations supply
        the `bank_account.id` via `external_account_id`. Fiat legs route through
        Bridge.xyz; the USDC↔C0 pairings execute on-chain. The response is the
        same unified `Transfer` shape returned by `GET /v1/transfers`.
      operationId: createTransfer
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTransferRequest'
      responses:
        '201':
          description: Transfer created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transfer'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/IdempotencyInFlight'
        '422':
          $ref: '#/components/responses/IdempotencyMismatch'
        '429':
          $ref: '#/components/responses/RateLimited'
        '502':
          description: >-
            Upstream failure (Bridge for fiat legs, on-chain swap for crypto
            legs).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      description: >-
        Caller-chosen string (≤256 chars) that uniquely identifies this request.
        Resending the same key replays the original response; reusing the same
        key with a different body returns 422. Keys are scoped per organization.
      schema:
        type: string
        minLength: 1
        maxLength: 256
  schemas:
    CreateTransferRequest:
      type: object
      description: >-
        Bridge-style transfer request. The (source.currency /
        source.payment_rail) → (destination.currency / destination.payment_rail)
        tuple selects the backend; only four pairings are valid.
      required:
        - amount
        - source
        - destination
      properties:
        amount:
          type: string
          description: Human-decimal amount in the source currency.
        client_reference_id:
          type: string
          minLength: 1
          maxLength: 256
          description: Optional caller-supplied idempotency / correlation id.
        developer_fee:
          type: string
          description: Optional developer fee, in source currency units.
        source:
          type: object
          required:
            - currency
            - payment_rail
          properties:
            currency:
              type: string
              enum:
                - usd
                - usdc
                - c0
            payment_rail:
              type: string
              enum:
                - ach_push
                - ethereum
            from_address:
              type: string
              pattern: ^0x[a-fA-F0-9]{40}$
              description: >-
                Required when `payment_rail` is `ethereum`. Must be one of your
                organization's wallets (`GET /v1/wallets`).
            external_account_id:
              type: string
              format: uuid
              description: >-
                Required when `payment_rail` is `ach_push`. The `id` of a `GET
                /v1/bank-accounts` row.
        destination:
          type: object
          required:
            - currency
            - payment_rail
          properties:
            currency:
              type: string
              enum:
                - usd
                - usdc
                - c0
            payment_rail:
              type: string
              enum:
                - ach
                - ethereum
            to_address:
              type: string
              pattern: ^0x[a-fA-F0-9]{40}$
              description: Required when `payment_rail` is `ethereum`.
            external_account_id:
              type: string
              format: uuid
              description: >-
                Required when `payment_rail` is `ach`. The `id` of a `GET
                /v1/bank-accounts` row.
      example:
        amount: '100.00'
        source:
          currency: usdc
          payment_rail: ethereum
          from_address: '0x742d35cc6634c0532925a3b844bc454e4438f44e'
        destination:
          currency: c0
          payment_rail: ethereum
          to_address: '0x742d35cc6634c0532925a3b844bc454e4438f44e'
    Transfer:
      type: object
      description: >-
        A transfer initiated by the organization. Covers wallet→wallet
        (on-chain), bank→wallet (Bridge onramp), and wallet→bank (Bridge
        offramp) under one unified shape. Each row has a symmetric `from` and
        `to` side.
      required:
        - id
        - from
        - to
        - status
        - transactionHash
        - createdAt
        - updatedAt
      properties:
        id:
          type: string
          format: uuid
          description: Camino-owned UUID.
        from:
          $ref: '#/components/schemas/TransferSide'
        to:
          $ref: '#/components/schemas/TransferSide'
        status:
          type: string
          enum:
            - pending
            - submitted
            - completed
            - failed
        transactionHash:
          type: string
          nullable: true
          description: >-
            On-chain hash once the wallet-side leg (if any) has been submitted;
            `null` otherwise.
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
      example:
        id: 9c1a8b2e-4f3d-4a5b-8c6d-7e8f9a0b1c2d
        from:
          address: null
          bankAccount:
            id: 11111111-2222-3333-4444-555555555555
            bankName: Acme Bank
            accountOwnerName: Acme Corp
            accountNumberLast4: '1234'
          chainId: null
          currency: usd
          amount: '100.00'
        to:
          address: '0x742d35cc6634c0532925a3b844bc454e4438f44e'
          bankAccount: null
          chainId: 1
          currency: usdc
          amount: '99.50'
        status: pending
        transactionHash: null
        createdAt: '2026-05-20T12:00:00.000Z'
        updatedAt: '2026-05-20T12:03:42.000Z'
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Error message
        details:
          type: object
          description: Optional validation details
    TransferSide:
      type: object
      description: >-
        One side of a transfer. Exactly one of `address` (wallet) or
        `bankAccount` (bank) is populated.
      required:
        - address
        - bankAccount
        - chainId
        - currency
        - amount
      properties:
        address:
          type: string
          nullable: true
          description: >-
            Lowercase 0x-address when this side is a wallet; `null` when it's a
            bank account.
        bankAccount:
          type: object
          nullable: true
          description: >-
            Embedded display fields when this side is a bank account; `null`
            when it's a wallet. For the full record (routing number, currency,
            etc.) find the same `id` in `GET /v1/bank-accounts`.
          required:
            - id
            - bankName
            - accountOwnerName
            - accountNumberLast4
          properties:
            id:
              type: string
              format: uuid
            bankName:
              type: string
            accountOwnerName:
              type: string
            accountNumberLast4:
              type: string
        chainId:
          type: integer
          nullable: true
          description: Chain the wallet side lives on; `null` for bank sides.
        currency:
          type: string
          enum:
            - usdc
            - usdt
            - usd
            - c0
          description: >-
            Lowercase symbol. `usdt` only appears on legacy rows; new transfers
            use `usdc`, `usd`, or `c0`.
        amount:
          type: string
          description: >-
            Human-decimal string in the side's `currency`. The two sides may
            differ (Bridge fees/rate).
  responses:
    BadRequest:
      description: Bad Request - Invalid input
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Unauthorized - Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Not Found - Resource does not exist
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    IdempotencyInFlight:
      description: >-
        Conflict — a request with the same Idempotency-Key is still in flight.
        Wait and retry.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    IdempotencyMismatch:
      description: >-
        Unprocessable — the Idempotency-Key was previously used with a different
        request body.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: Too Many Requests - Rate limit exceeded. Check the `Retry-After` header.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key for authentication. Pass your key in the `x-api-key` header.

````