> ## Documentation Index
> Fetch the complete documentation index at: https://rain-sandbox-trial.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a transfer

> Creates a transfer from a quote. The response includes a deposit address where the user should send crypto. The transfer expires if funds are not deposited before the expiration time.



## OpenAPI

````yaml /openapi.json post /transfers
openapi: 3.0.3
info:
  title: Issuing API
  description: This is the specification for Rain's Issuing API.
  termsOfService: https://www.rain.xyz/legal/authorized-user-terms
  contact:
    email: support@rain.xyz
  version: 1.3.0
servers:
  - url: https://api-dev.rain.xyz/v1
    description: Sandbox server
  - url: https://api.rain.xyz/v1
    description: Production server
security: []
tags:
  - name: paymentRoutes
    description: >-
      **Endpoint Migration:** The `/v1/automations` endpoints have been renamed
      to `/v1/payment-routes`. The old `/v1/automations` paths remain available
      as deprecated aliases during migration. Update your integrations to use
      `/v1/payment-routes` as the deprecated endpoints will be removed in a
      future release.
  - name: simulate
    description: >-
      Transaction simulation endpoints for testing integration flows in
      non-production environments. These endpoints let you trigger transaction
      events programmatically to automate integration tests and verify webhook
      handling without depending on external systems or staging real deposits.
      **Sandbox only** — all simulation endpoints return `404 Not Found` in
      production.
  - name: raindrops
    description: >-
      Rewards and points management endpoints. Custom API keys need
      `raindrops:read`/`raindrops:write` for general rewards endpoints and
      `raindrops-travel:read`/`raindrops-travel:write` for travel redemption
      endpoints.
    x-group: rewards
paths:
  /transfers:
    post:
      tags:
        - transfers
      summary: Create a transfer
      description: >-
        Creates a transfer from a quote. The response includes a deposit address
        where the user should send crypto. The transfer expires if funds are not
        deposited before the expiration time.
      operationId: createTransfer
      parameters:
        - name: idempotency-key
          in: header
          description: >-
            Required client-supplied key (1–64 characters) that prevents
            duplicate transfers on retry. Reusing the same key for the same
            transfer intent returns the existing transfer instead of creating a
            new one; reusing it for a different intent returns a 409 conflict.
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 64
      requestBody:
        description: Transfer request with a quote ID
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTransferBody'
        required: true
      responses:
        '201':
          description: Transfer created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferTransactionResponse'
        '400':
          description: >-
            Invalid request — quote expired, insufficient balance, or invalid
            transfer request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Invalid authorization
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            Forbidden — team not approved or quote does not belong to
            organization
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Quote or team not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: >-
            Conflict — quote already used, or the idempotency-key was reused for
            a different transfer intent
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service temporarily unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    CreateTransferBody:
      type: object
      description: Request body to create a transfer from a quote
      required:
        - quoteId
        - refundAddress
      properties:
        quoteId:
          type: string
          format: uuid
          description: >-
            The quote ID to execute. This acts as the Idempotency Key for the
            transfer.
        refundAddress:
          type: string
          description: >-
            The on-chain address to return funds to if the transfer fails or is
            refunded. Required on every transfer request.
        transferMessage:
          type: string
          description: Optional message for the transfer
    TransferTransactionResponse:
      type: object
      description: Transfer wrapped in a transaction response
      required:
        - id
        - type
        - transfer
      properties:
        id:
          type: string
          format: uuid
          description: Unique transaction identifier
        type:
          type: string
          enum:
            - transfer
          description: Transaction type
        transfer:
          $ref: '#/components/schemas/TransferDetails'
    ErrorResponse:
      type: object
      required:
        - statusCode
        - error
      properties:
        statusCode:
          type: number
          description: Status code indicating the request failed
        error:
          type: string
          description: >-
            Error type name, e.g. 'NotFoundError', 'BadRequestError',
            'InternalServerError'
        message:
          type: string
          description: Human-readable error message describing what went wrong
    TransferDetails:
      type: object
      description: Transfer details within a transaction response
      required:
        - source
        - destination
        - exchangeRate
        - fees
        - quoteId
        - status
        - createdAt
        - updatedAt
        - expiresAt
      properties:
        userId:
          type: string
          format: uuid
          description: User ID for consumer accounts. Mutually exclusive with companyId.
        companyId:
          type: string
          format: uuid
          description: Company ID for corporate accounts. Mutually exclusive with userId.
        source:
          $ref: '#/components/schemas/TransferSource'
        destination:
          $ref: '#/components/schemas/TransferDestination'
        exchangeRate:
          type: number
          description: Exchange rate excluding fees
        fees:
          $ref: '#/components/schemas/FeeDetail'
        quoteId:
          type: string
          format: uuid
          description: Quote ID used to create this transfer
        status:
          $ref: '#/components/schemas/TransferStatus'
        createdAt:
          type: string
          format: date-time
          description: When the transfer was created
        updatedAt:
          type: string
          format: date-time
          description: When the transfer was last updated
        expiresAt:
          type: string
          format: date-time
          description: When the transfer expires
        depositAddress:
          $ref: '#/components/schemas/TransferOnchainDepositAddress'
        transferMessage:
          type: string
          description: Optional message for the transfer
    TransferSource:
      type: object
      required:
        - currency
        - rail
        - amount
      properties:
        currency:
          $ref: '#/components/schemas/CryptoCurrency'
        rail:
          $ref: '#/components/schemas/CryptoRail'
        amount:
          type: string
          pattern: ^[0-9]+(\.[0-9]+)?$
          description: Amount sent (decimal string)
    TransferDestination:
      oneOf:
        - title: Onchain Destination
          type: object
          description: Onchain destination with direct wallet address
          required:
            - currency
            - rail
            - amount
            - address
          properties:
            currency:
              $ref: '#/components/schemas/CryptoCurrency'
            rail:
              $ref: '#/components/schemas/CryptoRail'
            amount:
              type: string
              pattern: ^[0-9]+(\.[0-9]+)?$
              description: Amount to receive (decimal string)
            address:
              $ref: '#/components/schemas/OnchainAddress'
        - title: Fiat Destination
          type: object
          description: >-
            Fiat destination via payment account (resolves to
            PaymentAccountExternalFiatAccount details by id)
          required:
            - currency
            - rail
            - amount
            - address
          properties:
            currency:
              $ref: '#/components/schemas/FiatCurrency'
            rail:
              $ref: '#/components/schemas/FiatRail'
            amount:
              type: string
              pattern: ^[0-9]+(\.[0-9]+)?$
              description: Amount to receive (decimal string)
            address:
              $ref: '#/components/schemas/PaymentAccountAddress'
            referenceId:
              type: string
              description: Optional reference ID for the fiat transfer
    FeeDetail:
      type: object
      description: Fee breakdown for a transfer
      properties:
        rain:
          allOf:
            - $ref: '#/components/schemas/FeeAmount'
          description: >-
            Rain's fee for the transaction, charged to the partner
            (informational)
        sender:
          allOf:
            - $ref: '#/components/schemas/FeeAmount'
          description: >-
            Sender fee deducted from the end user's sent amount. See [Sender
            Fees](/docs/sender-fees) for details.
        developer:
          allOf:
            - $ref: '#/components/schemas/FeeAmount'
          deprecated: true
          description: Deprecated alias of `sender`; carries the same values.
    TransferStatus:
      type: string
      enum:
        - pending
        - awaiting_transfer
        - processing
        - settled
        - failed
        - cancelled
        - expired
        - refunded
      description: Current status of the transfer
    TransferOnchainDepositAddress:
      type: object
      required:
        - type
        - address
      properties:
        type:
          type: string
          enum:
            - onchain
          description: Deposit address type
        address:
          type: string
          description: Wallet address to send crypto to
    CryptoCurrency:
      type: string
      enum:
        - usdc
        - rusd
      description: Supported cryptocurrencies
    CryptoRail:
      type: string
      enum:
        - ethereum
        - polygon
        - optimism
        - arbitrum
        - base
        - solana
      description: Supported blockchain networks for crypto operations
    OnchainAddress:
      title: Onchain Address
      type: object
      required:
        - type
        - address
      properties:
        type:
          type: string
          enum:
            - onchain
        address:
          type: string
          description: The blockchain address. Format depends on rail.
    FiatCurrency:
      type: string
      enum:
        - usd
      description: Supported fiat currencies
    FiatRail:
      type: string
      enum:
        - ach
        - wire
      description: Supported fiat payment rails
    PaymentAccountAddress:
      title: Payment Account Id
      type: object
      description: >-
        Reference to a payment account by ID; the account holds
        `PaymentAccountExternalFiatAccountDetails` (external fiat bank account).
      required:
        - type
        - id
      properties:
        type:
          type: string
          enum:
            - paymentAccount
        id:
          type: string
          format: uuid
          description: The payment account ID
    FeeAmount:
      type: object
      description: Fee amount details
      required:
        - currency
        - amount
        - amountUSD
      properties:
        currency:
          type: string
          description: Currency the fee was charged in
        amount:
          type: string
          pattern: ^[0-9]+(\.[0-9]+)?$
          description: Fee amount in the original currency (decimal string)
        amountUSD:
          type: string
          pattern: ^[0-9]+(\.[0-9]+)?$
          description: Fee amount computed in USD at time of transfer (decimal string)
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      name: Api-Key
      in: header

````