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

# Create a Quote

> Prices a payout: the amount the beneficiary will receive (`received_amount` in `received_currency`), the
KemyCard fee and the total that will be debited from your balance. **Nothing is debited at this stage.**

The rail follows the beneficiary:

| Beneficiary | `rail` | Received | Paid from (`balance_type`) | Amount per payout |
|---|---|---|---|---|
| SEPA (`rail` `sepa`) | `sepa` | EUR (`amount_eur`, `exchange_rate`) | Payout SEPA (`payout_sepa`) | 25 to 2,499 USD |
| United States (`rail` `us`) | `ach` | USD, no conversion (`amount_eur` and `exchange_rate` are `null`) | Ops Others (`others`) | 100 to 2,499 USD |

Confirm the quote with `POST /payouts` before `expires_at`. `amount_usd` has at most 2 decimals. The fee
depends on your [plan](/getting-started/plans#payouts), is the same for SEPA and ACH, and is charged on top of
the amount.

The checks of the payout are run here and again at confirmation: customer `verified` and `active`, Découverte
monthly limit (SEPA and ACH combined), and a balance that covers `total_debited_usd`.




## OpenAPI

````yaml POST /payouts/quotes
openapi: 3.1.0
info:
  title: KemyCard API
  version: '1.0'
  description: >
    KemyCard API allows you to issue virtual and physical cards, manage KYC/POA
    verification,

    create crypto wallets, virtual bank accounts, purchase gift cards and send
    payouts to bank accounts (SEPA Instant

    in EUR, ACH in USD to the United States).


    Access depends on your plan (see [Plans and
    Pricing](/getting-started/plans)). The free Découverte plan gives

    access to virtual cards with the KYC and POA endpoints and to payouts (SEPA
    and ACH), within monthly limits (25 cards

    created and 5,000 USD loaded on cards per calendar month, 5,000 USD of
    payouts per calendar month), 30 requests

    per minute per API key, 2 allowed IP addresses and 1 active webhook
    endpoint. Starter, Business and Premium give access to every product with no
    monthly limit,

    100 requests per minute per API key, 10 allowed IP addresses and 10 active
    webhook endpoints.


    Plan errors: `402 PLAN_UPGRADE_REQUIRED` (product not included in your
    plan), `403 PLAN_LIMIT_REACHED`

    (limit of your plan reached). While one of your ops balances is negative,
    every request other than `GET`

    returns `403 ACCOUNT_SUSPENDED_NEGATIVE_BALANCE`.
  contact:
    name: KemyCard API Support
    email: hi@kemycard.com
servers:
  - url: https://api.kemycard.com/v1
    description: Production
security:
  - BearerAuth: []
tags:
  - name: Customers
    description: Manage your customers
  - name: Card Products
    description: Browse the card product catalog
  - name: Cards
    description: Issue and manage cards
  - name: KYC
    description: Identity verification
  - name: POA
    description: Proof of address verification
  - name: Wallets
    description: Crypto wallets
  - name: Virtual Accounts
    description: Virtual bank accounts
  - name: Gift Cards
    description: Gift card catalog and purchases
  - name: Payouts
    description: >
      Payouts to bank accounts: SEPA Instant in EUR (paid from your Payout SEPA
      balance) and ACH in USD to bank

      accounts in the United States (paid from your Ops Others balance)
  - name: Balance
    description: Operational balances and transaction history
  - name: Webhooks
    description: Webhook endpoints and delivery management
paths:
  /payouts/quotes:
    post:
      tags:
        - Payouts
      summary: Create a quote
      description: >
        Prices a payout: the amount the beneficiary will receive
        (`received_amount` in `received_currency`), the

        KemyCard fee and the total that will be debited from your balance.
        **Nothing is debited at this stage.**


        The rail follows the beneficiary:


        | Beneficiary | `rail` | Received | Paid from (`balance_type`) | Amount
        per payout |

        |---|---|---|---|---|

        | SEPA (`rail` `sepa`) | `sepa` | EUR (`amount_eur`, `exchange_rate`) |
        Payout SEPA (`payout_sepa`) | 25 to 2,499 USD |

        | United States (`rail` `us`) | `ach` | USD, no conversion (`amount_eur`
        and `exchange_rate` are `null`) | Ops Others (`others`) | 100 to 2,499
        USD |


        Confirm the quote with `POST /payouts` before `expires_at`. `amount_usd`
        has at most 2 decimals. The fee

        depends on your [plan](/getting-started/plans#payouts), is the same for
        SEPA and ACH, and is charged on top of

        the amount.


        The checks of the payout are run here and again at confirmation:
        customer `verified` and `active`, Découverte

        monthly limit (SEPA and ACH combined), and a balance that covers
        `total_debited_usd`.
      operationId: createPayoutQuote
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePayoutQuoteRequest'
      responses:
        '201':
          description: Quote created (status `open`)
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    $ref: '#/components/schemas/PayoutQuote'
                  meta:
                    $ref: '#/components/schemas/Meta'
        '400':
          description: >
            `INSUFFICIENT_BALANCE`: the balance of the rail does not cover
            `total_debited_usd` (`details`: `required`,

            `available`, `balance_type`: `payout_sepa` for SEPA, `others` for
            ACH). `OPERATION_FAILED`: payouts are

            temporarily unavailable, or the bank details of the beneficiary were
            refused (the message tells you what to

            correct).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                sepa:
                  summary: SEPA payout, Payout SEPA balance too low
                  value:
                    success: false
                    error:
                      code: INSUFFICIENT_BALANCE
                      message: Insufficient Payout SEPA balance.
                      details:
                        required: 107
                        available: 50
                        balance_type: payout_sepa
                ach:
                  summary: ACH payout, Ops Others balance too low
                  value:
                    success: false
                    error:
                      code: INSUFFICIENT_BALANCE
                      message: Insufficient Ops Others balance.
                      details:
                        required: 515
                        available: 200
                        balance_type: others
        '403':
          description: >
            `PLAN_LIMIT_REACHED`: the payout would exceed the 5,000 USD per
            month of the Découverte plan

            (`details`: `plan`, `monthly_limit_usd`, `sent_this_month_usd`).
            `FORBIDDEN`: the customer is not active.

            `ACCOUNT_SUSPENDED_NEGATIVE_BALANCE`: one of your ops balances is
            negative.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                success: false
                error:
                  code: PLAN_LIMIT_REACHED
                  message: >-
                    The Découverte plan allows up to 5,000 USD of payouts per
                    month. Upgrade your plan to send more.
                  details:
                    plan: decouverte
                    monthly_limit_usd: 5000
                    sent_this_month_usd: 4900
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          description: >
            Validation error: missing field (`details.missing_fields`), invalid
            `amount_usd` (`details.field`), amount

            out of range (`details.min_amount_usd`, `details.max_amount_usd`),
            or customer not verified

            (`details.required_level`, `details.customer_level`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                success: false
                error:
                  code: VALIDATION_ERROR
                  message: >-
                    Payouts require a verified customer (identity verification
                    approved).
                  details:
                    required_level: verified
                    customer_level: basic
components:
  schemas:
    CreatePayoutQuoteRequest:
      type: object
      required:
        - customer_code
        - beneficiary_code
        - amount_usd
      properties:
        customer_code:
          type: string
          format: uuid
        beneficiary_code:
          type: string
          format: uuid
          description: An active beneficiary of this customer
        amount_usd:
          type: number
          description: >
            Amount of the payout in USD, at most 2 decimals: 25 to 2,499 for
            SEPA, 100 to 2,499 for ACH (US

            beneficiary). The fee is added on top.
          example: 100
    PayoutQuote:
      type: object
      properties:
        quote_code:
          type: string
          format: uuid
          description: >-
            Code to send to `POST /payouts`. It becomes the `code` of the
            payout.
        rail:
          type: string
          enum:
            - sepa
            - ach
          description: >-
            `sepa` (beneficiary with `rail` `sepa`) or `ach` (beneficiary in the
            United States)
          example: sepa
        status:
          type: string
          enum:
            - open
            - expired
            - refused
            - confirmed
          description: >-
            `open` when the quote is created: it can be confirmed until
            `expires_at`
          example: open
        customer_code:
          type: string
          format: uuid
        beneficiary:
          $ref: '#/components/schemas/PayoutBeneficiarySummary'
        amount_usd:
          type: number
          example: 100
        fee_usd:
          type: number
          description: KemyCard fee of your plan, charged on top of the amount
          example: 7
        total_debited_usd:
          type: number
          description: >-
            Total that will be debited at confirmation from the balance given by
            `balance_type`
          example: 107
        received_amount:
          type: number
          nullable: true
          description: Amount the beneficiary will receive, in `received_currency`
          example: 86
        received_currency:
          type: string
          enum:
            - EUR
            - USD
          description: '`EUR` for SEPA, `USD` for ACH (no currency conversion)'
          example: EUR
        amount_eur:
          type: number
          nullable: true
          description: Amount in EUR the beneficiary will receive. `null` for ACH.
          example: 86
        exchange_rate:
          type: number
          nullable: true
          description: '`amount_eur` / `amount_usd`. `null` for ACH.'
          example: 0.86
        balance_type:
          type: string
          enum:
            - payout_sepa
            - others
          description: >-
            Balance debited at confirmation: `payout_sepa` (Payout SEPA) for
            SEPA, `others` (Ops Others) for ACH
          example: payout_sepa
        expires_at:
          type: string
          format: date-time
          description: Confirm the quote before this date, otherwise request a new one
        created_at:
          type: string
          format: date-time
    Meta:
      type: object
      properties:
        request_id:
          type: string
          example: a4f8e2c1b3d97056
        mode:
          type: string
          enum:
            - test
            - live
          example: test
        timestamp:
          type: string
          format: date-time
    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          type: object
          properties:
            code:
              type: string
              description: >
                Error code, for example `AUTHENTICATION_REQUIRED`,
                `AUTHENTICATION_FAILED`, `ACCOUNT_RESTRICTED`,

                `IP_NOT_ALLOWED`, `PLAN_UPGRADE_REQUIRED`, `PLAN_LIMIT_REACHED`,
                `ACCOUNT_SUSPENDED_NEGATIVE_BALANCE`,

                `INSUFFICIENT_BALANCE`, `OPERATION_FAILED`, `FORBIDDEN`,
                `RESOURCE_NOT_FOUND`, `VALIDATION_ERROR`,

                `RATE_LIMIT_EXCEEDED`, `INTERNAL_ERROR`, `wrong_api_host`. See
                [Error Handling](/guides/error-handling).
              example: VALIDATION_ERROR
            message:
              type: string
              example: Missing required fields.
            details:
              type: object
              nullable: true
        meta:
          $ref: '#/components/schemas/Meta'
    PayoutBeneficiarySummary:
      type: object
      properties:
        code:
          type: string
          format: uuid
        name:
          type: string
          example: JANE DOE
        iban_masked:
          type: string
          description: SEPA payouts only
          example: DE89 **** 3000
        account_number_masked:
          type: string
          description: ACH payouts only. Last 4 digits of the US account number.
          example: '**** 9012'
        routing_number:
          type: string
          description: ACH payouts only
          example: '021000021'
        bank_name:
          type: string
          example: Test Bank
        country:
          type: string
          description: Country of the bank account (`US` for ACH)
          example: DE
  responses:
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: RESOURCE_NOT_FOUND
              message: Resource not found.
              details: null
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: API key (sk_test_... or sk_live_...)

````

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