openapi: 3.1.0
servers:
- url: https://balanceplatform-api-test.adyen.com/fx/api/v1
  description: Test Environment
- url: https://balanceplatform-api-live.adyen.com/fx/api/v1
  description: Live Environment
info:
  title: Foreign Exchange API
  description: "The Foreign Exchange API allows you to manage and convert the currencies\
    \ that are enabled for your integration.\n## Authentication\nWe recommend that\
    \ you use an API key to connect to the Foreign Exchange API. You can generate\
    \ an API key in your Customer Area. If you have an Adyen Issuing integration,\
    \ generate an API key in your Balance Platform Customer Area.\n### Credential\
    \ format\n* For the `rates/calculate` endpoint: Generate an API key for the credential\
    \ with the format **ws@BalancePlatform.[YourBalancePlatform]**.\n\n### Header\
    \ format\nTo connect to the Foreign Exchange API, add an `X-API-Key` header with\
    \ the API key as the value, for example:\n\n ```\ncurl\n-H 'Content-Type: application/json'\
    \ \\\n-H 'X-API-Key: ADYEN_API_KEY' \\\n...\n```\n\n## Versioning\n\nThe Foreign\
    \ Exchange API supports [versioning](https://docs.adyen.com/development-resources/versioning)\
    \ using a version suffix in the endpoint URL. This suffix has the following format:\
    \ \"vXX\", where XX is the version number.\n\nFor example:\n\nhttps://balanceplatform-api-test.adyen.com/fx/v1/rates/calculate\n\
    \n## Going live\nWhen going live, generate an API key in your [live Customer Area](https://ca-live.adyen.com/ca/).\
    \ If you have an Adyen Issuing integration, [generate an API key](https://docs.adyen.com/issuing/manage-access/api-credentials-web-service/#generate-api-key)\
    \ in your [live Balance Platform Customer Area](https://balanceplatform-live.adyen.com/balanceplatform/).\
    \ You can then use the API key to send requests to `https://balanceplatform-api-test.adyen.com/fx/v1`.\n\
    \n"
  termsOfService: https://www.adyen.com/legal/terms-and-conditions
  contact:
    name: Adyen Developer Experience team
    url: https://github.com/Adyen/adyen-openapi
  version: '1'
  x-timestamp: '2025-02-11T15:32:15Z'
tags:
- name: Rates
paths:
  /rates/calculate:
    post:
      tags:
      - Rates
      summary: Calculate amount in a different currency
      description: Returns the calculated amounts and rates required to convert the
        currency of a transaction.
      operationId: post-rates-calculate
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CalculateRateRequest'
            examples:
              calculate:
                summary: Calculate an amount in a different currency
                description: The request to calculate an amount in a different currency.
                value:
                  exchangeCalculations:
                  - type: splitPayment
                    sourceAmount:
                      currency: CZK
                      value: 112300
                    targetCurrency: EUR
                    exchangeSide: buy
                  - type: splitRefund
                    sourceAmount:
                      currency: CZK
                      value: 24000
                    targetCurrency: USD
                    exchangeSide: sell
        required: true
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CalculateRateResponse'
              examples:
                calculate:
                  summary: Amount calculated in a different currency
                  description: The response returned when you calculate an amount
                    in a different currency.
                  value:
                    exchangeCalculations:
                    - type: splitPayment
                      exchangeSide: buy
                      sourceAmount:
                        value: 112300
                        currency: CZK
                      targetAmount:
                        value: 4480
                        currency: EUR
                      appliedExchangeRate: 0.039893143366
                    - type: splitRefund
                      exchangeSide: sell
                      sourceAmount:
                        value: 24000
                        currency: CZK
                      targetAmount:
                        value: 992
                        currency: USD
                      appliedExchangeRate: 0.0413333333333
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DefaultErrorResponseEntity'
              examples:
                calculate-401:
                  summary: Unauthorized
                  description: Authentication failed.
                  value:
                    type: https://docs.adyen.com/errors/unauthorized
                    title: Unauthorized
                    status: 401
                    errorCode: '00_401'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DefaultErrorResponseEntity'
              examples:
                calculate-403:
                  summary: Forbidden
                  description: Most commonly happens when user does not have sufficient
                    roles or doesn't own requested resource.
                  value:
                    type: https://docs.adyen.com/errors/forbidden
                    errorCode: '00_403'
                    title: Forbidden
                    detail: User doesn't have access to all token policy resources
                    requestId: d42c493b5176df89e51516c6060cc34c
                    status: 403
        '422':
          description: Unprocessable Entity - a request validation error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DefaultErrorResponseEntity'
              examples:
                calculate-422:
                  summary: Bad request
                  description: Response returned when request parsing has failed or
                    some request fields were invalid.
                  value:
                    type: https://docs.adyen.com/errors/unprocessable-entity
                    errorCode: '999_422_000'
                    title: Validation failure
                    detail: Input data validation failed
                    requestId: 0890cfb8f4278217bd457b49ce572265
                    status: 422
                    invalidFields:
                    - name: exchangeCalculations[0].sourceAmount.currency
                      message: The currency is invalid.
                    - name: exchangeCalculations[0].sourceAmount.value
                      message: The value can't be negative.
      x-methodName: calculate
      x-sortIndex: 1
components:
  schemas:
    Amount:
      required:
      - currency
      - value
      type: object
      properties:
        currency:
          type: string
          description: The three-character [ISO currency code](https://docs.adyen.com/development-resources/currency-codes#currency-codes).
        value:
          type: integer
          description: The amount of the transaction, in [minor units](https://docs.adyen.com/development-resources/currency-codes#minor-units).
          format: int64
    CalculateRateRequest:
      required:
      - exchangeCalculations
      type: object
      properties:
        exchangeCalculations:
          maxItems: 1000
          minItems: 1
          type: array
          description: An array of objects, where each object defines a currency and
            value for which you want to perform an exchange calculation.
          items:
            $ref: '#/components/schemas/CalculateRateRequestItem'
      description: The request to calculate an amount in a different currency.
    CalculateRateRequestItem:
      required:
      - exchangeSide
      - sourceAmount
      - targetCurrency
      - type
      type: object
      properties:
        exchangeSide:
          description: 'The operation performed on the source amount. Possible values:

            * **buy**

            * **sell**'
          $ref: '#/components/schemas/ExchangeSide'
        sourceAmount:
          description: An object specifying the currency and value for which you want
            to perform an exchange calculation.
          $ref: '#/components/schemas/Amount'
        targetCurrency:
          type: string
          description: The currency to which you want to convert the source amount.
        type:
          description: 'The type of transaction. Possible values:

            * **splitPayment**: for payments

            * **splitRefund**: for refunds'
          $ref: '#/components/schemas/RateType'
      description: The request parameters required to calculate an amount in a different
        currency.
    ExchangeSide:
      type: string
      enum:
      - buy
      - sell
    RateType:
      type: string
      enum:
      - splitPayment
      - balanceConversion
      - transfer
      - splitRefund
    CalculateRateResponse:
      type: object
      properties:
        exchangeCalculations:
          type: array
          description: An array of objects, where each object returns a currency and
            value for which you performed an exchange calculation. You can use the
            calculated amounts in your payment requests.
          items:
            $ref: '#/components/schemas/CalculateRateResponseItem'
      description: The response returned when you calculate an amount in a different
        currency.
    CalculateRateResponseItem:
      type: object
      properties:
        appliedExchangeRate:
          type: number
          description: The exchange rate to convert the source currency to the target
            currency. This includes Adyen's markup.
        exchangeSide:
          type: string
          description: 'The operation performed on the source amount. Possible values:

            * **buy**

            * **sell**'
        sourceAmount:
          description: The currency of the amount you converted (the source amount).
          $ref: '#/components/schemas/Amount'
        targetAmount:
          description: An object specifying the currency and value to which you want
            to convert the source amount (the target amount).
          $ref: '#/components/schemas/Amount'
        type:
          type: string
          description: 'The type of transaction. Possible values:

            * **splitPayment**: for payments

            * **splitRefund**: for refunds'
      description: The response parameters returned when you calculate an amount in
        a different currency.
    DefaultErrorResponseEntity:
      type: object
      properties:
        detail:
          type: string
          description: A human-readable explanation specific to this occurrence of
            the problem.
        errorCode:
          type: string
          description: Unique business error code.
        instance:
          type: string
          description: A URI that identifies the specific occurrence of the problem
            if applicable.
        invalidFields:
          type: array
          description: Array of fields with validation errors when applicable.
          items:
            $ref: '#/components/schemas/InvalidField'
        requestId:
          type: string
          description: The unique reference for the request.
        status:
          type: integer
          description: The HTTP status code.
          format: int32
        title:
          type: string
          description: A short, human-readable summary of the problem type.
        type:
          type: string
          description: A URI that identifies the validation error type. It points
            to human-readable documentation for the problem type.
      description: Standardized error response following RFC-7807 format
      externalDocs:
        url: https://www.rfc-editor.org/rfc/rfc7807
    InvalidField:
      required:
      - message
      - name
      - value
      type: object
      properties:
        name:
          type: string
          description: The field that has an invalid value.
        value:
          type: string
          description: The invalid value.
        message:
          type: string
          description: Description of the validation error.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      name: X-API-Key
      in: header
    BasicAuth:
      type: http
      scheme: basic
jsonSchemaDialect: https://spec.openapis.org/oas/3.1/dialect/base
