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

# Execute a conversion

> Consume a quote. A conversion is always fiat to stablecoin or stablecoin to fiat; the quote already fixed the pair. Your `from_asset` balance is checked now, not at quote time. The call normally returns a terminal `completed` or `failed`; a rare `processing` means the outcome is not yet known — poll `GET /v2/conversions/{id}` or wait for `conversion.completed` / `conversion.failed`. Requires an Idempotency-Key.



## OpenAPI

````yaml /v2/openapi.json post /conversions
openapi: 3.1.0
info:
  title: Jenzy Hermes Multi-asset API
  version: 2.0.0
  description: >-
    Hold, convert and pay out across the assets enabled for your organization.
    Every amount is an exact decimal string beside an `asset` field.
    Authenticate with the same `jz_live_…` API key as `/v1`.
servers:
  - url: https://api.jenzy.com/v2
    description: Production
security: []
paths:
  /conversions:
    post:
      summary: Execute a conversion
      description: >-
        Consume a quote. A conversion is always fiat to stablecoin or stablecoin
        to fiat; the quote already fixed the pair. Your `from_asset` balance is
        checked now, not at quote time. The call normally returns a terminal
        `completed` or `failed`; a rare `processing` means the outcome is not
        yet known — poll `GET /v2/conversions/{id}` or wait for
        `conversion.completed` / `conversion.failed`. Requires an
        Idempotency-Key.
      parameters:
        - schema:
            type: string
            description: >-
              Required. A key you mint per conversion attempt (a UUID works). A
              retry with the same key and body returns the same conversion —
              including finishing one whose outcome was still `processing`. The
              same key with a different body is a 409.
          required: true
          description: >-
            Required. A key you mint per conversion attempt (a UUID works). A
            retry with the same key and body returns the same conversion —
            including finishing one whose outcome was still `processing`. The
            same key with a different body is a 409.
          name: Idempotency-Key
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConversionCreate'
      responses:
        '201':
          description: The conversion, usually already terminal.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Conversion'
        '400':
          description: Malformed body or missing Idempotency-Key header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing, malformed, or revoked API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '402':
          description: '`insufficient_funds` in `from_asset`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: >-
            Organization suspended, request IP not on the allowlist, no
            multi-asset access yet (`onboarding_incomplete` /
            `access_suspended`), or `corridor_not_enabled`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '404':
          description: No quote with this id in your organization.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '409':
          description: >-
            `quote_used` — this quote already has a conversion; or `conflict` —
            this Idempotency-Key was used with a different body, or its original
            request is still in progress.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '422':
          description: '`quote_expired` — request a new quote.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '503':
          description: >-
            `rate_unavailable` — no rate for this pair right now, retry shortly.
            Also `service_incident` / `service_maintenance` when the `/v2`
            shutter is closed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    ConversionCreate:
      type: object
      properties:
        quote_id:
          type: string
          format: uuid
          description: A `quote_id` from `POST /v2/conversions/quotes`.
      required:
        - quote_id
    Conversion:
      type: object
      properties:
        id:
          type: string
          format: uuid
        from_asset:
          type: string
          minLength: 1
          description: >-
            An asset code as `GET /v2/assets` lists it — uppercase, never
            compound (`KES`, `USDT`; never `USDT-TRON`). Network and rail live
            on the payment object.
          example: KES
        to_asset:
          type: string
          minLength: 1
          description: >-
            An asset code as `GET /v2/assets` lists it — uppercase, never
            compound (`KES`, `USDT`; never `USDT-TRON`). Network and rail live
            on the payment object.
          example: USDT
        from_amount:
          type: string
          description: What you paid, in `from_asset`.
          example: '1000.00'
        to_amount:
          type: string
          description: What you received (or will, on `completed`), in `to_asset`.
          example: '7.68075'
        rate:
          type: string
          description: The quote’s rate, for display.
          example: '130.19561892'
        status:
          type: string
          enum:
            - processing
            - completed
            - failed
          description: >-
            `completed` — your balances moved. `failed` — nothing moved; see
            `failure`. `processing` — accepted, outcome not yet known; rare and
            short-lived, poll `GET /v2/conversions/{id}` or wait for the
            webhook.
        failure:
          type:
            - object
            - 'null'
          properties:
            code:
              type: string
              enum:
                - provider_declined
                - limit_exceeded
                - liquidity_unavailable
                - provider_unavailable
            message:
              type: string
          required:
            - code
            - message
          description: Set only on `failed`.
        created_at:
          type: string
          example: '2026-09-09T10:00:10.000Z'
      required:
        - id
        - from_asset
        - to_asset
        - from_amount
        - to_amount
        - rate
        - status
        - failure
        - created_at
    ErrorEnvelope:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - validation_error
                - unauthorized
                - forbidden
                - not_found
                - conflict
                - rate_limited
                - internal_error
                - unknown_institution
                - invalid_mobile_number
                - invalid_account_number
                - mobile_number_institution_mismatch
                - service_unavailable
                - sandbox_only
                - insufficient_funds
                - rail_disabled
                - amount_limit_exceeded
                - org_limit_exceeded
                - service_incident
                - service_maintenance
                - onboarding_incomplete
                - access_suspended
                - corridor_not_enabled
                - unsupported_pair
                - invalid_wallet_address
                - rate_unavailable
                - quote_expired
                - quote_used
                - limit_exceeded
                - amount_below_minimum
                - unsupported_asset
              description: >-
                Stable identifier a client may branch on — never renamed or
                removed.
            message:
              type: string
          required:
            - code
            - message
      required:
        - error
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      description: 'Your Jenzy API key: `Authorization: Bearer jz_live_…`'

````