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

# RVO-Rechte-Probe

> Diagnostiziert die 4 DATEV-RVO-Lese-Rechte einer Read-Verbindung (Stammdaten, Auswertungen, Kontobuchungen, OPOS) durch jeweils einen leichten Read-Call gegen die zugehörigen DATEV-Endpoints. Klassifiziert die Antwort als `ok` / `permission` / `expired` / `error` — damit Make-Apps, CLI, MCP und AI-Agents vor dem eigentlichen Datenabruf deterministisch wissen, welche RVO-Teilrechte fehlen.

Nicht-destruktiv (nur GETs gegen DATEV). **Kosten:** 0 Credits.



## OpenAPI

````yaml GET /v2/datev-rewe-read/permissions
openapi: 3.1.0
info:
  title: Business OS API
  description: >-
    API für Business OS – Zugang zu DATEV und Banking Enterprise-Schnittstellen.
    Alle Endpoints erfordern einen API Key im `x-api-key` Header. Credits werden
    pro API-Call abgezogen.
  version: 2.0.0
  contact:
    name: Business OS Support
    email: impressum@business-os.de
    url: https://business-os.de/kontakt
servers:
  - url: https://api.business-os.de
    description: Production
security:
  - ApiKeyAuth: []
tags:
  - name: DATEV Allgemein
    description: >-
      Modulübergreifende DATEV-Endpunkte (z. B. Abo-/Service-Diagnose für
      Mandanten)
  - name: DATEV DUO
    description: DATEV Unternehmen Online — Kassenbuch, Belegbilder und Buchungsvorschläge
  - name: DATEV ReWe - Write
    description: 'DATEV Rechnungswesen — Write: Buchungen, Kontakte, Belegtypen, Steuersätze'
  - name: DATEV ReWe - Read
    description: >-
      DATEV Rechnungswesen — Read (Export): Geschäftsjahre und weitere
      Lesemodule
  - name: Banking AIS
    description: >-
      Account Information Services — Verbindungen, Kontostände und Transaktionen
      verwalten
  - name: Banking PIS
    description: Payment Initiation Services — Zahlungen ausführen und Status abrufen
  - name: Banking Webhooks
    description: Webhook-Konfiguration für Echtzeit-Benachrichtigungen
paths:
  /v2/datev-rewe-read/permissions:
    get:
      tags:
        - DATEV ReWe - Read
      summary: RVO-Rechte-Probe
      description: >-
        Diagnostiziert die 4 DATEV-RVO-Lese-Rechte einer Read-Verbindung
        (Stammdaten, Auswertungen, Kontobuchungen, OPOS) durch jeweils einen
        leichten Read-Call gegen die zugehörigen DATEV-Endpoints. Klassifiziert
        die Antwort als `ok` / `permission` / `expired` / `error` — damit
        Make-Apps, CLI, MCP und AI-Agents vor dem eigentlichen Datenabruf
        deterministisch wissen, welche RVO-Teilrechte fehlen.


        Nicht-destruktiv (nur GETs gegen DATEV). **Kosten:** 0 Credits.
      parameters:
        - $ref: '#/components/parameters/ConnectionIdParam'
      responses:
        '200':
          description: Probe-Ergebnis pro RVO-Teilrecht
          content:
            application/json:
              schema:
                type: object
                properties:
                  subscription:
                    type: string
                    enum:
                      - ok
                      - missing
                      - expired
                      - unknown
                    description: >-
                      Aggregierter Status über alle 4 Teilrechte hinweg. `ok`
                      wenn mindestens eines `ok` ist; `missing` wenn alle 4 mit
                      403 antworten (Service-/RVO-Recht fehlt komplett);
                      `expired` wenn mindestens eines mit 401 antwortet (Token
                      abgelaufen); sonst `unknown`.
                  fiscalYearStartDate:
                    type: string
                    format: date
                    nullable: true
                    description: >-
                      Aus der Stammdaten-Probe (`/accounting/fiscalYears`)
                      abgeleitetes Start-Datum des jüngsten Geschäftsjahres —
                      wird intern für die anderen 3 Probes als Query-Parameter
                      benötigt. `null` wenn Stammdaten-Probe nicht 200
                      zurückgegeben hat.
                    example: '2026-01-01'
                  yearsCount:
                    type: integer
                    nullable: true
                    description: >-
                      Anzahl Geschäftsjahre, die der Mandant in DATEV hat.
                      `null` wenn Stammdaten-Probe nicht 200 zurückgegeben hat.
                    example: 2
                  checks:
                    type: object
                    description: Pro RVO-Teilrecht ein Check-Eintrag.
                    properties:
                      stammdaten:
                        $ref: '#/components/schemas/RvoCheck'
                      auswertungen:
                        $ref: '#/components/schemas/RvoCheck'
                      kontobuchungen:
                        $ref: '#/components/schemas/RvoCheck'
                      opos:
                        $ref: '#/components/schemas/RvoCheck'
                    required:
                      - stammdaten
                      - auswertungen
                      - kontobuchungen
                      - opos
                  tool:
                    type: string
                    example: DATEV Rechnungswesen - Read
                  probedAt:
                    type: string
                    format: date-time
                    description: Zeitstempel der Probe (ISO 8601).
                required:
                  - subscription
                  - checks
                  - tool
                  - probedAt
              example:
                subscription: ok
                fiscalYearStartDate: '2026-01-01'
                yearsCount: 2
                checks:
                  stammdaten:
                    status: ok
                    httpStatus: 200
                  auswertungen:
                    status: ok
                    httpStatus: 200
                  kontobuchungen:
                    status: permission
                    httpStatus: 403
                    message: Access to the requested resource is forbidden.
                  opos:
                    status: ok
                    httpStatus: 200
                tool: DATEV Rechnungswesen - Read
                probedAt: '2026-05-30T09:24:46.125Z'
        '400':
          description: '`connectionId` fehlt im Query-String.'
        '401':
          $ref: '#/components/responses/DatevUnauthorized'
        '404':
          $ref: '#/components/responses/DatevNoConnection404Rewe'
        '500':
          $ref: '#/components/responses/DatevInternal500'
components:
  parameters:
    ConnectionIdParam:
      name: connectionId
      in: query
      required: true
      schema:
        type: string
        format: uuid
        example: abbc18fd-ba5e-4dfd-afc4-9dec0c0ad145
      description: >-
        UUID der DATEV-Verbindung. Abrufbar über den `/connections`-Endpunkt des
        jeweiligen Moduls (z. B. `GET /v2/datev-duo/connections`).
  schemas:
    RvoCheck:
      type: object
      description: >-
        Ein einzelner RVO-Teilrecht-Probe-Eintrag (siehe
        `/v2/datev-rewe-read/permissions`). `status` ist die normalisierte
        Klassifikation der DATEV-Antwort; `httpStatus` und `message` geben die
        rohen Werte für Debug-Zwecke.
      properties:
        status:
          type: string
          enum:
            - ok
            - permission
            - expired
            - error
            - unknown
          description: >-
            - `ok`: DATEV hat den Probe-Call mit 200 beantwortet → RVO-Recht
            freigeschaltet.

            - `permission`: DATEV antwortet mit 403 → das RVO-Recht für diesen
            Bereich fehlt. Steuerberater/Mandant-Inhaber muss es in DATEV RVO
            aktivieren.

            - `expired`: DATEV antwortet mit 401 → Account-Key (Token) ist
            abgelaufen, Reconnect nötig.

            - `error`: anderer Fehler (5xx, Netzfehler, …).

            - `unknown`: konnte nicht geprüft werden (z. B. weil der
            Stammdaten-Probe vorher gescheitert ist und das
            `fiscalYearStartDate` für die abhängigen Probes fehlte).
        httpStatus:
          type: integer
          nullable: true
          description: Roher HTTP-Status der DATEV-Antwort.
          example: 403
        maesnType:
          type: string
          nullable: true
          description: Fehler-Typ der DATEV-Schnittstelle (z. B. `not_authorized`).
          example: not_authorized
        message:
          type: string
          nullable: true
          description: Roh-Fehler-Message der DATEV-Antwort.
          example: Access to the requested resource is forbidden.
      required:
        - status
    DatevError:
      type: object
      description: >-
        JSON-Fehlerantwort. Bei Fehlern der DATEV-Schnittstelle kann zusätzlich
        `details` gesetzt sein. Bei bekannten Fehlerkategorien ist ein stabiler
        `code` gesetzt, anhand dessen Automatisierungen reagieren können.
      required:
        - error
      properties:
        error:
          type: string
          description: Fehlermeldung
        message:
          type: string
          description: >-
            Zusätzliche Erläuterung; wenn der Header `x-api-key` fehlt: Hinweis
            zur erforderlichen Header-Zeile.
        code:
          type: string
          description: >-
            Stabiler, maschinenlesbarer Fehlercode für bekannte
            Fehlerkategorien. Wird nur gesetzt, wenn die Ursache eindeutig
            erkannt wurde.


            - `datev_connection_invalid`: Account-Key ist abgelaufen oder
            widerrufen — Reconnect über das Dashboard nötig. Begleitet von
            `reconnectUrl`.

            - `datev_export_service_missing`: Mandant hat keine relevante
            DATEV-Subscription gebucht (z. B. Belegbilderservice,
            Rechnungsdatenservice, Datenservice Export Rechnungswesen-Familie).
            Begleitet von `activeSubscriptions` mit der Liste der tatsächlich
            aktiven Services.

            - `datev_endpoint_not_authorized`: Subscription am Mandanten ist
            vorhanden und der Token gilt, aber das DATEV-RVO-Schreib-/Leserecht
            für den konkreten Endpoint fehlt für den authentifizierten Nutzer.
            Reconnect hilft hier nicht — der Steuerberater/Mandant-Inhaber muss
            in DATEV RVO das entsprechende Teilrecht freischalten.
          enum:
            - datev_connection_invalid
            - datev_export_service_missing
            - datev_endpoint_not_authorized
        reconnectUrl:
          type: string
          format: uri
          description: >-
            URL zum Business OS Dashboard, über die der Nutzer die
            DATEV-Verbindung erneuern kann. Gesetzt bei `code =
            datev_connection_invalid`.
        activeSubscriptions:
          type: array
          items:
            type: string
          description: >-
            Liste der aktuell aktiven DATEV-Service-Subscriptions des Mandanten
            (z. B. Belegbilderservice, Rechnungsdatenservice 1.0). Gesetzt bei
            `code = datev_export_service_missing`, damit Automationen erkennen,
            welche Services bereits gebucht sind.
        details:
          type: object
          description: >-
            Strukturierte Zusatzinformationen bei Antworten der
            DATEV-Schnittstelle.
          additionalProperties: true
  responses:
    DatevUnauthorized:
      description: >-
        API-Key fehlt, ist ungültig, widerrufen oder abgelaufen. Fehlt der
        Header `x-api-key`, enthält die Antwort zusätzlich `message`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/DatevError'
          examples:
            ungueltigerKey:
              summary: Ungültiger oder unbekannter Key
              value:
                error: Ungültiger API-Key
            fehlenderHeader:
              summary: Fehlender x-api-key Header
              value:
                error: Fehlende Header
                message: x-api-key Header ist erforderlich.
    DatevNoConnection404Rewe:
      description: >-
        Es ist keine gespeicherte DATEV-Verbindung für das gewählte DATEV
        Rechnungswesen-Produkt (Read oder Write) vorhanden.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/DatevError'
          example:
            error: Keine Verbindung gefunden für DATEV Rechnungswesen - Write
    DatevInternal500:
      description: >-
        Unerwarteter Serverfehler oder fehlende Serverkonfiguration für den
        DATEV-Dienst.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/DatevError'
          example:
            error: API-Dienst nicht konfiguriert.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Dein Business OS API Key. Erstelle einen unter
        [app.business-os.de](https://app.business-os.de/) → API Keys.

````