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

# Create order

> Creates an order from a quote and returns the full order. Use the `organizationId` the quote was created with. The order's `id` is the `quoteId`.

One quote makes one order. Sending the same `quoteId` again returns the existing order with `200`, even after the quote has expired, so a retry never creates a second order. If two requests with the same `quoteId` arrive at the same time, one gets `201` and the other gets `409` `conflict`; read the order to get it.

`fundingInstructions.reference` is set when the order is created. `fundingInstructions.destination` is absent until the funding details are available. Subscribe to `orderUpdated` to receive the order when they arrive, or read the order again.



## OpenAPI

````yaml openapi-v2.json POST /organization/{organizationId}/order
openapi: 3.1.0
info:
  title: Etherfuse FX API
  description: >-
    Partner-facing ramp API, version 2: payment accounts, quotes, orders and
    webhooks.
  license:
    name: Proprietary
  version: 2.0.0
servers:
  - url: https://api.sand.etherfuse.com
    description: Sandbox
security:
  - ApiKeyAuth: []
tags:
  - name: Payment Accounts
    description: >-
      Register the bank accounts and wallets that money moves from and to, and
      read their readiness per rail.
  - name: Quotes
    description: Price a transfer between two registered payment accounts.
  - name: Orders
    description: Create orders from quotes and track them.
  - name: Webhook Subscriptions
    description: Subscribe to webhook events.
  - name: Webhook Events
    description: Payloads Etherfuse sends to your webhook subscriptions.
  - name: Sandbox
    description: Endpoints that work only in sandbox, for testing.
  - name: Assets
    description: The markets and tokens a quote can use, and the balances of a wallet.
  - name: Authentication
    description: >-
      Partner JWT authentication: exchange a JWT for an access token, or launch
      a user into the app.
  - name: KYC
    description: >-
      Submit a customer's verification data, documents and questionnaire
      answers, import a verification they already passed elsewhere, and check
      where their KYC stands.
  - name: KYB
    description: Check where a business organization's KYB stands.
  - name: Lookup
    description: >-
      Public reference data: exchange rates, stablebonds, bond costs, country
      codes.
  - name: Organizations
    description: >-
      Your organization, your default partner fee, and the customer
      organizations you create.
  - name: Members
    description: >-
      The people who belong to a customer business organization and complete its
      KYB.
  - name: Statements
    description: >-
      Monthly revenue share statements for closed months, as a list or as a CSV
      or PDF download.
paths:
  /organization/{organizationId}/order:
    post:
      tags:
        - Orders
      summary: Create order
      description: >-
        Creates an order from a quote and returns the full order. Use the
        `organizationId` the quote was created with. The order's `id` is the
        `quoteId`.


        One quote makes one order. Sending the same `quoteId` again returns the
        existing order with `200`, even after the quote has expired, so a retry
        never creates a second order. If two requests with the same `quoteId`
        arrive at the same time, one gets `201` and the other gets `409`
        `conflict`; read the order to get it.


        `fundingInstructions.reference` is set when the order is created.
        `fundingInstructions.destination` is absent until the funding details
        are available. Subscribe to `orderUpdated` to receive the order when
        they arrive, or read the order again.
      operationId: v2CreateOrder
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrderRequest'
            example:
              quoteId: 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b
              memo: Invoice 1042
      responses:
        '200':
          description: An order already exists for this quote. Returns that order.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
        '201':
          description: The created order.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
        '400':
          description: >-
            `invalid-request`: the body is malformed, or `memo` is longer than
            255 characters. `quote-expired`: the quote has expired or does not
            exist. Create a new quote.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/OrganizationNotFound'
        '409':
          description: >-
            `conflict`: another request created an order for this quote at the
            same time. Read the order with `GET
            /organization/{organizationId}/order/{id}`, using the `quoteId` as
            the id.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '413':
          $ref: '#/components/responses/PayloadTooLarge'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    OrganizationId:
      name: organizationId
      in: path
      required: true
      description: >-
        The organization this call acts for: your API key's organization or one
        of its customer organizations. Any other id returns `404` `not-found`.
      schema:
        type: string
        format: uuid
  schemas:
    CreateOrderRequest:
      type: object
      required:
        - quoteId
      properties:
        quoteId:
          type: string
          format: uuid
        memo:
          type: string
          maxLength: 255
          description: Your note for the order. Up to 255 characters; longer returns `400`.
    Order:
      type: object
      required:
        - id
        - organizationId
        - status
        - memo
        - source
        - destination
        - fees
        - fundingInstructions
        - claimInstructions
        - createdAt
        - updatedAt
        - completedAt
      properties:
        id:
          type: string
          format: uuid
          description: The order id. Equal to the `quoteId` it was created from.
        organizationId:
          type: string
          format: uuid
          description: The organization the order belongs to.
        failure:
          $ref: '#/components/schemas/OrderFailure'
          description: Present only when `status` is `failed`.
        status:
          $ref: '#/components/schemas/OrderStatus'
        memo:
          type:
            - string
            - 'null'
        source:
          $ref: '#/components/schemas/OrderAmount'
        destination:
          $ref: '#/components/schemas/OrderAmount'
        fees:
          type: array
          items:
            $ref: '#/components/schemas/Fee'
        fundingInstructions:
          $ref: '#/components/schemas/FundingInstructions'
        claimInstructions:
          description: Set while the order is `claimable`. Otherwise null.
          anyOf:
            - $ref: '#/components/schemas/ClaimInstructions'
            - type: 'null'
        authorization:
          description: >-
            Set while the order waits for the account holder to approve a
            transfer we built. Otherwise null. Approve it with `POST
            /organization/{organizationId}/order/{id}/authorization`.
          anyOf:
            - $ref: '#/components/schemas/OrderAuthorization'
            - type: 'null'
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        completedAt:
          type:
            - string
            - 'null'
          format: date-time
      example:
        id: 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b
        organizationId: 7a8b9c0d-1e2f-4a3b-8c4d-5e6f7a8b9c0d
        status: created
        memo: Invoice 1042
        source:
          paymentAccountId: 3f9a2c1e-5b7d-4e8f-9a01-2b3c4d5e6f70
          amount: '1000'
          asset: MXN
          rail: spei
          accountLabel: Operating account
        destination:
          paymentAccountId: 8c1d2e3f-4a5b-4c6d-8e7f-901a2b3c4d5e
          amount: '54.120000'
          asset: USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN
          rail: stellar
          accountLabel: Treasury wallet
        fees:
          - type: transactionFee
            amount: '2.50'
            asset: MXN
            bps: 25
        fundingInstructions:
          rail: spei
          reference: '1000042'
          destination:
            expiresAt: null
            clabe: '646180000000000009'
            bankName: Ejemplo Banco
            recipientName: Ejemplo Receptor
          fundingDeadline: '2026-09-29T17:05:02Z'
        claimInstructions: null
        createdAt: '2026-09-28T17:05:02.114Z'
        updatedAt: '2026-09-28T17:05:02.114Z'
        completedAt: null
    Problem:
      type: object
      description: >-
        RFC 9457 problem details. Every v2 error uses this body with content
        type `application/problem+json`. `errors` is present only on
        `validation-error`. `required` and `missing` are present only on
        `registration-info-required`.
      required:
        - type
        - title
        - status
        - detail
        - instance
      properties:
        type:
          type: string
          format: uri
          description: >-
            `https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem
            slug, for example
            `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on
            this value.
          example: https://docs.etherfuse.com/ramp/v2/errors/quote-expired
        title:
          type: string
          description: Short summary of the problem type.
          example: Quote expired
        status:
          type: integer
          description: The HTTP status code.
          example: 400
        detail:
          type: string
          description: Human-readable explanation of this occurrence. Do not parse it.
          example: >-
            quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not
            exist
        instance:
          type: string
          description: Unique identifier for this occurrence. Quote it to support.
          example: >-
            tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d
        errors:
          type: array
          description: Present on `validation-error`. One entry per invalid field.
          items:
            $ref: '#/components/schemas/FieldViolation'
        required:
          type: array
          description: >-
            Present on `registration-info-required`. Every registration field
            the route requires, as JSON Pointers into the request, for example
            `#/registrationInfo/taxId`.
          items:
            type: string
        missing:
          type: array
          description: >-
            Present on `registration-info-required`. The required fields you
            must still send, as JSON Pointers into the request.
          items:
            type: string
    OrderFailure:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
          enum:
            - fulfillmentFailed
        message:
          type: string
          example: The order could not be completed.
    OrderStatus:
      type: string
      enum:
        - created
        - funded
        - claimable
        - completed
        - failed
        - canceled
        - refunded
      description: >-
        `created`: waiting for the source funds. `funded`: source funds
        received. `claimable`: delivered, waiting for the customer to claim; see
        `claimInstructions`. `completed`: delivered. `failed`: could not be
        completed; see `failure`. `canceled`: canceled before completion.
        `refunded`: the source funds were returned.
    OrderAmount:
      type: object
      required:
        - paymentAccountId
        - amount
        - asset
        - rail
        - accountLabel
      properties:
        paymentAccountId:
          type: string
          format: uuid
        amount:
          type: string
          description: Decimal string.
        asset:
          type: string
        rail:
          $ref: '#/components/schemas/PaymentRail'
        accountLabel:
          type: string
          description: Your organization's label for the account.
    Fee:
      type: object
      required:
        - type
        - amount
        - asset
        - bps
      properties:
        type:
          $ref: '#/components/schemas/FeeType'
        amount:
          type: string
          description: Decimal string.
        asset:
          type: string
          description: The asset the fee is charged in.
        bps:
          type:
            - integer
            - 'null'
          description: >-
            The fee rate in basis points, when the fee has one. Always null on a
            quote.
    FundingInstructions:
      type: object
      description: How the source funds the order.
      required:
        - rail
        - reference
        - fundingDeadline
      properties:
        rail:
          $ref: '#/components/schemas/PaymentRail'
        reference:
          type: string
          description: >-
            Etherfuse's reference for this order's funding. Set when the order
            is created.
          example: '1000042'
        destination:
          $ref: '#/components/schemas/FundingDestination'
          description: >-
            Where to send the funds. Absent until the funding details are
            available.
        fundingDeadline:
          type: string
          format: date-time
          description: >-
            Fund the order before this time, 25 minutes after the order is
            created. An order with no funds by then moves to `canceled`, and we
            send `orderUpdated`.
    ClaimInstructions:
      description: >-
        What the customer needs to accept the funds while the order is
        `claimable`, tagged by `kind`. Prepare the claim with `POST
        /organization/{organizationId}/order/{id}/claim`.
      oneOf:
        - $ref: '#/components/schemas/StellarClaimableBalance'
      discriminator:
        propertyName: kind
        mapping:
          stellarClaimableBalance: '#/components/schemas/StellarClaimableBalance'
    OrderAuthorization:
      type: object
      description: >-
        A transfer we built that waits for the account holder's approval. One is
        pending at a time. When it expires we replace it with a new one, with a
        new `id`, and send `orderUpdated`.
      required:
        - id
        - reason
        - method
        - expiresAt
      properties:
        id:
          type: string
          format: uuid
        reason:
          type: string
          enum:
            - funding
            - claim
          description: >-
            `funding`: we move the source funds from an embedded wallet once
            approved. `claim`: approving accepts the funds of a `claimable`
            order into an embedded wallet.
        method:
          $ref: '#/components/schemas/AuthorizationMethod'
        expiresAt:
          type: string
          format: date-time
          description: Approve before this time.
      example:
        id: 9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d
        reason: funding
        method:
          kind: signature
          algorithm: es256
          message: eyJvcmRlcklkIjoiNWU2ZjdhOGIifQ
        expiresAt: '2026-09-28T17:20:00Z'
    FieldViolation:
      type: object
      required:
        - pointer
        - detail
      properties:
        pointer:
          type: string
          description: >-
            JSON Pointer to the field in the request, for example
            `#/accountDetails/clabe`.
          example: '#/accountDetails/clabe'
        detail:
          type: string
          description: What is wrong with the field.
          example: This field is required.
    PaymentRail:
      type: string
      enum:
        - spei
        - pix
        - solana
        - base
        - polygon
        - monad
        - stellar
        - avalanche
      description: The network that moves the money. For a wallet, the rail is its chain.
    FeeType:
      type: string
      enum:
        - transactionFee
        - partnerFee
        - walletSponsor
        - bridge
    FundingDestination:
      description: >-
        Where to send the funds. The fields follow `fundingInstructions.rail`:
        `spei` gives a CLABE, `pix` gives a BR Code, and a chain gives an
        address. When the source is an embedded wallet there is nowhere to send
        funds: the destination names the order's `authorization`, and we move
        the funds once the holder approves it.
      oneOf:
        - $ref: '#/components/schemas/SpeiFundingDestination'
        - $ref: '#/components/schemas/PixFundingDestination'
        - $ref: '#/components/schemas/BlockchainFundingDestination'
        - $ref: '#/components/schemas/AuthorizationFundingDestination'
    StellarClaimableBalance:
      type: object
      title: stellarClaimableBalance
      required:
        - kind
        - balanceId
        - asset
        - amount
        - claimant
        - expiresAt
      properties:
        kind:
          type: string
          const: stellarClaimableBalance
        balanceId:
          type: string
          description: The Stellar claimable balance ID.
        asset:
          type: string
        amount:
          type: string
          description: Decimal string.
        claimant:
          type: string
          description: The Stellar account that can claim the balance.
        expiresAt:
          type:
            - string
            - 'null'
          format: date-time
    AuthorizationMethod:
      description: >-
        How the holder approves, tagged by `kind`. `signature` is the only kind
        today.
      oneOf:
        - $ref: '#/components/schemas/SignatureAuthorizationMethod'
      discriminator:
        propertyName: kind
        mapping:
          signature: '#/components/schemas/SignatureAuthorizationMethod'
    SpeiFundingDestination:
      type: object
      title: spei
      required:
        - expiresAt
        - clabe
        - bankName
        - recipientName
      properties:
        expiresAt:
          type:
            - string
            - 'null'
          format: date-time
          description: When this destination stops accepting funds, or null.
        clabe:
          type: string
          example: '646180000000000009'
        bankName:
          type: string
        recipientName:
          type: string
    PixFundingDestination:
      type: object
      title: pix
      required:
        - expiresAt
        - brCode
      properties:
        expiresAt:
          type:
            - string
            - 'null'
          format: date-time
          description: When this destination stops accepting funds, or null.
        brCode:
          type: string
          description: The PIX BR Code to pay.
    BlockchainFundingDestination:
      type: object
      title: blockchain
      required:
        - expiresAt
        - address
      properties:
        expiresAt:
          type:
            - string
            - 'null'
          format: date-time
          description: When this destination stops accepting funds, or null.
        address:
          type: string
          description: The address to send to.
        memo:
          type: string
          description: The memo to include. Absent when none is needed.
        preparedTransaction:
          $ref: '#/components/schemas/PreparedTransaction'
    AuthorizationFundingDestination:
      type: object
      title: authorization
      required:
        - expiresAt
        - authorizationId
      properties:
        expiresAt:
          type:
            - string
            - 'null'
          format: date-time
          description: Always null. The authorization carries its own `expiresAt`.
        authorizationId:
          type: string
          format: uuid
          description: The order `authorization` to approve.
    SignatureAuthorizationMethod:
      type: object
      title: signature
      required:
        - kind
        - algorithm
        - message
      properties:
        kind:
          type: string
          const: signature
        algorithm:
          type: string
          const: es256
          description: >-
            ECDSA over P-256 with SHA-256 (the JOSE `ES256` algorithm), using
            the key registered as `signerPublicKey`. We accept the signature as
            DER or as the 64-byte `r||s` form, hex-encoded.
        message:
          type: string
          description: Sign the UTF-8 bytes of this string.
    PreparedTransaction:
      type: object
      description: >-
        A transaction we built for the customer to sign and submit. Absent when
        there is none.
      required:
        - transaction
        - refreshAfter
      properties:
        transaction:
          type: string
          description: >-
            The unsigned transaction, for the customer to sign and submit.
            Solana: base64 of a v0 transaction in wire format. Stellar: base64
            transaction envelope XDR. EVM chains: `0x`-prefixed hex of an
            EIP-1559 transaction. The customer's wallet pays the network fee.
        refreshAfter:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            After this time the transaction can no longer land. On Solana it is
            about 60 seconds after we build it, when the blockhash expires. On
            Stellar it is the order's funding deadline. Null on EVM chains,
            where the transaction has no time limit. A Stellar or EVM
            transaction also goes stale when the wallet's sequence number or
            nonce moves.
  responses:
    Unauthorized:
      description: >-
        `unauthorized`: the `Authorization` header is missing, not ASCII, or
        does not hold a valid API key.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    OrganizationNotFound:
      description: '`not-found`: your API key cannot act for this organization.'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    PayloadTooLarge:
      description: '`payload-too-large`: the request body is too large.'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    InternalError:
      description: >-
        `internal-error`: an unexpected error on our side. Retry with backoff,
        and quote `instance` to support if it persists.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: API key sent in the Authorization header, with no `Bearer` prefix.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.