Qonto Supplier Invoices API

Bulk-create, list, retrieve, and mark supplier (vendor) invoices as paid or rejected, and attach supporting documents to transactions.

OpenAPI Specification

qonto-openapi.yml Raw ↑
# Provenance: MODELED-FROM-DOCS (2026-07-17).
# Qonto publishes a first-party OpenAPI 3.x document at
# https://api-doc.qonto.com/docs/business-api/reference/openapi_v2.yml and per-endpoint
# OpenAPI fragments under https://docs.qonto.com/api-reference/ . Those hosts are served
# behind Cloudflare and returned HTTP 403 to automated fetches during authoring, so this
# document was MODELED from the public documentation index (https://docs.qonto.com/llms.txt),
# the per-endpoint markdown fragments, and the getting-started auth/rate-limit pages.
# Base URLs, security schemes, and the /v2/transactions and /v2/sepa/transfers paths were
# confirmed verbatim from the docs; the remaining paths are modeled from documented
# resource operations and should be reconciled against the first-party spec when reachable.
openapi: 3.1.0
info:
  title: Qonto Business API
  description: >-
    Business banking API for Qonto - programmatic access to business accounts, EUR
    transactions, SEPA and international transfers, cards, client and supplier invoices,
    SEPA Direct Debit, payment links, terminals, and webhooks. Authenticated with a
    login+secret-key API key or OAuth 2.0. Modeled from public documentation.
  version: v2
  contact:
    name: Qonto Developers
    url: https://docs.qonto.com/
  termsOfService: https://qonto.com/en/legal
servers:
  - url: https://thirdparty.qonto.com
    description: Production
  - url: https://thirdparty-sandbox.staging.qonto.co
    description: Sandbox
tags:
  - name: OAuth
  - name: Organizations & Accounts
  - name: Transactions & Statements
  - name: SEPA Transfers
  - name: International Transfers
  - name: Internal Transfers
  - name: Cards
  - name: Client Invoices
  - name: Supplier Invoices
  - name: SEPA Direct Debit
  - name: Payment Links
  - name: Terminals
  - name: Webhooks
paths:
  /oauth2/token:
    post:
      operationId: createOrRefreshTokens
      tags: [OAuth]
      summary: Create or refresh OAuth 2.0 tokens
      description: >-
        Exchange an authorization code (or a refresh token) for an access token
        (valid 1 hour), plus a refresh token (valid 90 days) when offline_access is
        requested and an ID token when openid is requested. Must be called from your
        backend so the client secret is never exposed.
      security: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              required: [grant_type, client_id, client_secret]
              properties:
                grant_type:
                  type: string
                  enum: [authorization_code, refresh_token]
                client_id: { type: string }
                client_secret: { type: string }
                code: { type: string }
                refresh_token: { type: string }
                redirect_uri: { type: string, format: uri }
      responses:
        '200':
          description: Token set
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TokenSet' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /v2/organization:
    get:
      operationId: getOrganization
      tags: [Organizations & Accounts]
      summary: Retrieve the authenticated organization and list bank accounts
      description: 'OAuth scope: organization.read'
      responses:
        '200': { description: Organization with bank accounts }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '429': { $ref: '#/components/responses/TooManyRequests' }
  /v2/memberships:
    get:
      operationId: listMemberships
      tags: [Organizations & Accounts]
      summary: List memberships
      description: 'OAuth scope: organization.read'
      parameters:
        - { $ref: '#/components/parameters/CurrentPage' }
        - { $ref: '#/components/parameters/PerPage' }
      responses:
        '200': { description: A paginated list of memberships }
        '429': { $ref: '#/components/responses/TooManyRequests' }
    post:
      operationId: createMembership
      tags: [Organizations & Accounts]
      summary: Create a membership
      description: 'OAuth scope: membership.write'
      responses:
        '201': { description: Membership created }
  /v2/labels:
    get:
      operationId: listLabels
      tags: [Organizations & Accounts]
      summary: List labels
      description: 'OAuth scope: organization.read'
      responses:
        '200': { description: A list of labels }
  /v2/teams:
    get:
      operationId: listTeams
      tags: [Organizations & Accounts]
      summary: List teams
      description: 'OAuth scope: team.read'
      responses:
        '200': { description: A list of teams }
    post:
      operationId: createTeam
      tags: [Organizations & Accounts]
      summary: Create a team
      description: 'OAuth scope: team.write'
      responses:
        '201': { description: Team created }
  /v2/transactions:
    get:
      operationId: listTransactions
      tags: [Transactions & Statements]
      summary: List transactions
      description: 'OAuth scope: organization.read'
      parameters:
        - { name: bank_account_id, in: query, schema: { type: string } }
        - { name: iban, in: query, schema: { type: string } }
        - name: status[]
          in: query
          schema: { type: array, items: { type: string, enum: [pending, declined, completed] } }
        - { name: updated_at_from, in: query, schema: { type: string, format: date-time } }
        - { name: settled_at_from, in: query, schema: { type: string, format: date-time } }
        - name: includes[]
          in: query
          schema: { type: array, items: { type: string } }
        - { $ref: '#/components/parameters/CurrentPage' }
        - { $ref: '#/components/parameters/PerPage' }
      responses:
        '200': { description: A paginated list of transactions }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '429': { $ref: '#/components/responses/TooManyRequests' }
  /v2/transactions/{id}:
    get:
      operationId: getTransaction
      tags: [Transactions & Statements]
      summary: Retrieve a transaction
      description: 'OAuth scope: organization.read'
      parameters:
        - { name: id, in: path, required: true, schema: { type: string } }
      responses:
        '200': { description: A single transaction }
        '404': { description: Not found }
  /v2/statements:
    get:
      operationId: listStatements
      tags: [Transactions & Statements]
      summary: List statements
      description: 'OAuth scope: organization.read'
      responses:
        '200': { description: A list of account statements }
  /v2/cards:
    get:
      operationId: listCards
      tags: [Cards]
      summary: List cards
      description: 'OAuth scope: card.read'
      responses:
        '200': { description: A paginated list of cards }
    post:
      operationId: createCard
      tags: [Cards]
      summary: Create a card
      description: 'OAuth scope: card.write. Issues a virtual or physical card.'
      parameters:
        - { $ref: '#/components/parameters/IdempotencyKey' }
      responses:
        '201': { description: Card created }
  /v2/sepa/transfers:
    get:
      operationId: listSepaTransfers
      tags: [SEPA Transfers]
      summary: List SEPA transfers
      description: 'OAuth scope: organization.read'
      responses:
        '200': { description: A paginated list of SEPA transfers }
    post:
      operationId: createSepaTransfer
      tags: [SEPA Transfers]
      summary: Create a SEPA transfer
      description: >-
        OAuth scope: payment.write. Creates a single SEPA credit transfer in EUR
        (standard or instant). Sensitive; requires Strong Customer Authentication (SCA)
        unless the beneficiary is trusted (Embed partners only).
      parameters:
        - { $ref: '#/components/parameters/IdempotencyKey' }
        - { $ref: '#/components/parameters/ScaSessionToken' }
        - { $ref: '#/components/parameters/MfaHeader' }
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/SepaTransferRequest' }
      responses:
        '201': { description: Transfer created }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '422': { description: Validation error (e.g. insufficient limits) }
  /v2/sepa/bulk_transfers:
    post:
      operationId: createSepaBulkTransfer
      tags: [SEPA Transfers]
      summary: Create a bulk SEPA transfer
      description: 'OAuth scope: payment.write'
      parameters:
        - { $ref: '#/components/parameters/ScaSessionToken' }
      responses:
        '201': { description: Bulk transfer created }
  /v2/beneficiaries:
    get:
      operationId: listBeneficiaries
      tags: [SEPA Transfers]
      summary: List SEPA beneficiaries
      description: 'OAuth scope: organization.read'
      responses:
        '200': { description: A list of SEPA beneficiaries }
  /v2/internal_transfers:
    post:
      operationId: createInternalTransfer
      tags: [Internal Transfers]
      summary: Create an internal transfer
      description: 'OAuth scope: internal_transfer.write'
      parameters:
        - { $ref: '#/components/parameters/IdempotencyKey' }
      responses:
        '201': { description: Internal transfer created }
  /v2/international_transfers/currencies:
    get:
      operationId: listInternationalCurrencies
      tags: [International Transfers]
      summary: Get available currencies for international transfers
      description: 'OAuth scope: organization.read'
      responses:
        '200': { description: A list of supported currencies }
  /v2/international_transfers:
    post:
      operationId: createInternationalTransfer
      tags: [International Transfers]
      summary: Create an international transfer
      description: 'OAuth scope: international_transfer.write'
      parameters:
        - { $ref: '#/components/parameters/ScaSessionToken' }
      responses:
        '201': { description: International transfer created }
  /v2/client_invoices:
    get:
      operationId: listClientInvoices
      tags: [Client Invoices]
      summary: List client invoices
      description: 'OAuth scope: client_invoices.read'
      responses:
        '200': { description: A paginated list of client invoices }
    post:
      operationId: createClientInvoice
      tags: [Client Invoices]
      summary: Create a client invoice
      description: 'OAuth scope: client_invoice.write'
      responses:
        '201': { description: Client invoice created }
  /v2/supplier_invoices:
    get:
      operationId: listSupplierInvoices
      tags: [Supplier Invoices]
      summary: List supplier invoices
      description: 'OAuth scope: supplier_invoice.read'
      responses:
        '200': { description: A paginated list of supplier invoices }
    post:
      operationId: createSupplierInvoices
      tags: [Supplier Invoices]
      summary: Create supplier invoices
      description: 'OAuth scope: supplier_invoice.write'
      responses:
        '201': { description: Supplier invoices created }
  /v2/attachments:
    post:
      operationId: uploadAttachment
      tags: [Supplier Invoices]
      summary: Upload an attachment
      description: 'OAuth scope: attachment.write'
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file: { type: string, format: binary }
      responses:
        '201': { description: Attachment uploaded }
  /v2/sepa/direct_debit_collections/mandates:
    post:
      operationId: createSddMandate
      tags: [SEPA Direct Debit]
      summary: Create a SEPA Direct Debit mandate
      description: 'OAuth scope: sepa_direct_debit.write'
      responses:
        '201': { description: Mandate created }
  /v2/sepa/direct_debit_collections:
    get:
      operationId: listSddCollections
      tags: [SEPA Direct Debit]
      summary: List SEPA Direct Debit collections
      description: 'OAuth scope: sepa_direct_debit.read'
      responses:
        '200': { description: A list of SDD collections }
  /v2/payment_links:
    get:
      operationId: listPaymentLinks
      tags: [Payment Links]
      summary: List payment links
      description: 'OAuth scope: payment_link.read'
      responses:
        '200': { description: A list of payment links }
    post:
      operationId: createPaymentLink
      tags: [Payment Links]
      summary: Create a payment link
      description: 'OAuth scope: payment_link.write'
      responses:
        '201': { description: Payment link created }
  /v2/terminals:
    get:
      operationId: listTerminals
      tags: [Terminals]
      summary: List terminals
      description: 'OAuth scope: terminal.read'
      responses:
        '200': { description: A list of terminals }
  /v2/terminal_payments:
    post:
      operationId: createTerminalPayment
      tags: [Terminals]
      summary: Create a terminal payment
      description: 'OAuth scope: terminal.write'
      responses:
        '201': { description: Terminal payment created }
  /v2/webhook_subscriptions:
    get:
      operationId: listWebhookSubscriptions
      tags: [Webhooks]
      summary: List webhook subscriptions
      description: 'OAuth scope: webhook'
      responses:
        '200': { description: A list of webhook subscriptions }
    post:
      operationId: createWebhookSubscription
      tags: [Webhooks]
      summary: Create a webhook subscription
      description: 'OAuth scope: webhook (plus the scope required for each subscribed event)'
      responses:
        '201': { description: Webhook subscription created }
  /v2/webhook_subscriptions/{id}:
    delete:
      operationId: deleteWebhookSubscription
      tags: [Webhooks]
      summary: Delete a webhook subscription
      description: 'OAuth scope: webhook'
      parameters:
        - { name: id, in: path, required: true, schema: { type: string } }
      responses:
        '204': { description: Deleted }
components:
  securitySchemes:
    SecretKey:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Qonto API key. Value is the organization sign-in and secret key concatenated
        with a colon - "Authorization: {sign-in}:{secret-key}". This resembles HTTP
        Basic auth but is NOT - the value is not Base64 encoded.
    OAuth:
      type: oauth2
      description: >-
        OAuth 2.0 authorization code flow. Access tokens are valid 1 hour; refresh
        tokens 90 days (offline_access). Bearer access token sent in the Authorization
        header.
      flows:
        authorizationCode:
          authorizationUrl: https://oauth.qonto.com/oauth2/auth
          tokenUrl: https://thirdparty.qonto.com/oauth2/token
          scopes:
            openid: OpenID Connect ID token
            offline_access: Issue a refresh token
            organization.read: Read organization, accounts, memberships, labels, transactions
            membership.read: Read the authenticated membership
            membership.write: Create memberships
            team.read: Read teams
            team.write: Create teams
            subscription.read: Read the organization subscription plan
            card.read: Read cards
            card.write: Manage cards
            payment.write: Create SEPA transfers and manage beneficiaries
            internal_transfer.write: Create internal transfers
            international_transfer.write: Create international transfers and beneficiaries
            beneficiary.trust: Trust SEPA beneficiaries
            attachment.read: Read attachments
            attachment.write: Upload attachments
            client.read: Read clients (customers)
            client.write: Manage clients (customers)
            client_invoices.read: Read client invoices, quotes, credit notes
            client_invoice.write: Manage client invoices, quotes, credit notes
            supplier_invoice.read: Read supplier invoices
            supplier_invoice.write: Manage supplier invoices
            product.read: Read products
            product.write: Manage products
            sepa_direct_debit.read: Read SEPA Direct Debit collections/mandates
            sepa_direct_debit.write: Manage SEPA Direct Debit mandates/subscriptions
            payment_link.read: Read payment links
            payment_link.write: Manage payment links
            terminal.read: Read terminals and terminal payments
            terminal.write: Create terminal payments
            einvoicing.read: Read e-invoicing settings
            insurance_contract.read: Read insurance contracts
            insurance_contract.write: Manage insurance contracts
            embed_auth_link.write: Create Embed Auth Links
            webhook: Manage webhook subscriptions
  parameters:
    CurrentPage:
      name: current_page
      in: query
      schema: { type: integer, minimum: 1, default: 1 }
    PerPage:
      name: per_page
      in: query
      schema: { type: integer, minimum: 1, maximum: 100, default: 100 }
    IdempotencyKey:
      name: X-Qonto-Idempotency-Key
      in: header
      description: Client-generated key to safely retry create requests without duplication.
      schema: { type: string }
    ScaSessionToken:
      name: X-Qonto-Sca-Session-Token
      in: header
      description: Strong Customer Authentication (SCA) session token for sensitive operations.
      schema: { type: string }
    MfaHeader:
      name: X-Qonto-MFA
      in: header
      description: Multi-factor authentication challenge header for sensitive operations.
      schema: { type: string }
    StagingToken:
      name: X-Qonto-Staging-Token
      in: header
      description: Sandbox-only staging token.
      schema: { type: string }
  responses:
    Unauthorized:
      description: Missing or invalid authentication
    TooManyRequests:
      description: >-
        Rate limit exceeded (1000 req/10s or 10000 req/10min per IP; or more than
        200 requests returning 401 within 1 hour).
  schemas:
    TokenSet:
      type: object
      properties:
        access_token: { type: string }
        token_type: { type: string, example: bearer }
        expires_in: { type: integer, example: 3600 }
        refresh_token: { type: string }
        id_token: { type: string }
        scope: { type: string }
    SepaTransferRequest:
      type: object
      required: [debit_iban, amount, currency]
      properties:
        debit_iban: { type: string }
        beneficiary_id: { type: string }
        amount: { type: string, example: '100.00' }
        currency: { type: string, enum: [EUR], default: EUR }
        reference: { type: string }
        instant: { type: boolean, default: false }
        scheduled_date: { type: string, format: date }
        attachment_ids:
          type: array
          items: { type: string }
security:
  - SecretKey: []
  - OAuth: []