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

# Rechtstipp oder Blogartikel erstellen

> Generiert aus einem Thema einen recherchierten, SEO-tauglichen Artikel
(österreichisches oder Schweizer Recht, je nach `land`), **speichert**
ihn im Verlauf des Anwalts und gibt ihn inkl. `id` zurück. Die `id`
verwendest du beim [Feedback](#tag/Feedback) als `target_id`.

Die Paragraphen im Text sind über `markdown_linked` bereits als Links
eingebettet. **Minimal:** nur `topic` + `land` senden — `filters` wird
dann mit dem Land-Default gefüllt.

**Dauer:** die Recherche + Generierung braucht ~1 Minute — Timeout
entsprechend großzügig setzen.

**Auth:** erfordert das WP-JWT des Anwalts (Service-Key → `403`).




## OpenAPI

````yaml /openapi.yaml post /rechtstipps
openapi: 3.1.0
info:
  title: LexGPT Partner API
  version: 2.0.0
  description: >
    Öffentliche API für Partner-Integrationen. Kern-Funktionen:


    - **Rechtstipp erstellen & verwalten** — Thema rein, recherchierter
      SEO-Artikel mit verlinkten Paragraphen raus. Jeder Tipp wird gespeichert
      und bekommt eine `id` (dient beim Feedback als `target_id`).
    - **Feedback** — Rückmeldung zu einem Rechtstipp, über seine `id` verknüpft.


    Diese Doku beschreibt nur die öffentliche Partner-Fläche. Interne Endpunkte

    (Recherche-Chat, Admin) sind bewusst nicht Teil des Vertrags.


    **Auth:** Der Tipp-Lebenszyklus (`/rechtstipps`) läuft pro eingeloggtem

    Anwalt und erfordert dessen **finditoo-WP-JWT** — ein reiner Service-Key
    wird

    hier mit `403` abgewiesen. `/feedback` und `/rechtstipp/options` akzeptieren

    zusätzlich einen Service-Key.


    Verfügbare Länder: **AT** und **CH**. `DE` ist auf der Roadmap

    (Anfragen liefern bis dahin `400`).
servers:
  - url: https://dashboard.lex-gpt.ai/api
    description: Produktion
security:
  - bearerAuth: []
tags:
  - name: Rechtstipp
    description: Erstellen & verwalten (pro Anwalt gespeichert)
  - name: Feedback
    description: Rückmeldungen
paths:
  /rechtstipps:
    post:
      tags:
        - Rechtstipp
      summary: Rechtstipp oder Blogartikel erstellen
      description: |
        Generiert aus einem Thema einen recherchierten, SEO-tauglichen Artikel
        (österreichisches oder Schweizer Recht, je nach `land`), **speichert**
        ihn im Verlauf des Anwalts und gibt ihn inkl. `id` zurück. Die `id`
        verwendest du beim [Feedback](#tag/Feedback) als `target_id`.

        Die Paragraphen im Text sind über `markdown_linked` bereits als Links
        eingebettet. **Minimal:** nur `topic` + `land` senden — `filters` wird
        dann mit dem Land-Default gefüllt.

        **Dauer:** die Recherche + Generierung braucht ~1 Minute — Timeout
        entsprechend großzügig setzen.

        **Auth:** erfordert das WP-JWT des Anwalts (Service-Key → `403`).
      operationId: createRechtstipp
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RechtstippCreate'
            examples:
              minimal_at:
                summary: Minimal (AT) — filters weggelassen → Land-Default
                value:
                  topic: Kündigungsfristen im Mietrecht
                  kind: rechtstipp
                  land: AT
                  as_of: '2026-07-23'
              voll_at:
                summary: Voll (AT) — filters explizit
                value:
                  topic: Betriebsbedingte Kündigung
                  kind: blog
                  land: AT
                  as_of: '2026-07-23'
                  filters:
                    geographic:
                      - bundesrecht
                    legislation: true
                    judikatur: true
                    courts: []
                    germanCourts: []
                    swissCantons: []
                    eurlex: true
                    documentTypes: []
              minimal_ch:
                summary: Minimal (CH) — Land-Default (Bundesrecht, ganze Schweiz)
                value:
                  topic: Kündigungsfristen im Arbeitsvertrag
                  kind: rechtstipp
                  land: CH
              kantone_ch:
                summary: CH mit Kantons-Scope — swissCantons zusätzlich zum Bundesrecht
                value:
                  topic: Ferienanspruch nach OR
                  kind: rechtstipp
                  land: CH
                  filters:
                    geographic:
                      - ch
                    legislation: true
                    judikatur: true
                    courts: []
                    germanCourts: []
                    swissCantons:
                      - ZH
                      - BE
                    eurlex: false
                    documentTypes: []
      responses:
        '200':
          description: Erstellter & gespeicherter Artikel (inkl. `id`)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RechtstippResponse'
        '400':
          description: Ungültige Eingabe (z. B. `land` noch nicht freigeschaltet)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Fehlende/ungültige Authentifizierung
        '403':
          description: >-
            Service-Key statt Anwalts-WP-JWT (dieser Endpunkt braucht einen
            eingeloggten Anwalt)
        '502':
          description: Generierung fehlgeschlagen
components:
  schemas:
    RechtstippCreate:
      type: object
      required:
        - topic
      properties:
        topic:
          type: string
          description: Thema/Fragestellung.
          example: Kündigungsfristen im Mietrecht
        kind:
          type: string
          enum:
            - rechtstipp
            - blog
          default: rechtstipp
          description: '`rechtstipp` (kurz, Endkunden) oder `blog` (länger, Fachpublikum).'
        land:
          type: string
          enum:
            - AT
            - DE
            - CH
          default: AT
          description: |
            Rechtsordnung + Wording. ISO-Code bevorzugt; Alt-Freitext
            ("Österreich"/"Schweiz") wird toleriert. Steuert NICHT die
            Retrieval-Jurisdiktion (das macht `filters.geographic`). Verfügbar:
            **AT** und **CH** — `DE` liefert `400` (Roadmap).
        filters:
          $ref: '#/components/schemas/FilterConfig'
        as_of:
          type: string
          format: date
          description: Optionaler Stichtag (YYYY-MM-DD).
          example: '2026-07-23'
    RechtstippResponse:
      type: object
      description: |
        Antwort von `POST /rechtstipps` (alle Generator-Felder PLUS
        `id`/`created_at`). Die fertig verlinkten Varianten (`markdown_linked`,
        `html_linked`) gibt es **nur** hier auf der Erstellen-Response;
        `markdown_tokenized` + `citations` werden gespeichert und kommen auch
        bei `GET`/`PATCH` zurück (`RechtstippStored`).
      properties:
        id:
          type: string
          format: uuid
          description: Tipp-ID → beim Feedback als `target_id`.
        created_at:
          type: string
          format: date-time
        kind:
          type: string
        topic:
          type: string
        title:
          type: string
          description: Generierte H1.
        markdown:
          type: string
          description: Artikel MIT Quellen-Markern ([§ …]).
        markdown_clean:
          type: string
          description: Artikel OHNE Marker (Veröffentlichung/Kopieren).
        markdown_tokenized:
          type: string
          description: Marker durch `{{CITATION_n}}` ersetzt (für granulare Integration).
        markdown_linked:
          type: string
          description: |
            Artikel mit Paragraphen bereits als `[Label](URL)` eingebettet — der
            einfachste Weg zu verlinkten Paragraphen. Hinweis: die Auflösung
            greift aktuell für AT-Quellen (RIS/EUR-Lex); bei CH bleiben Marker
            derzeit überwiegend unverlinkt (Fedlex-Verlinkung in Arbeit).
        html:
          type: string
          description: Minimal-HTML (marker-frei).
        html_linked:
          type: string
          description: HTML mit eingebetteten Paragraphen-Links.
        word_count:
          type: integer
        sources:
          type: array
          items:
            $ref: '#/components/schemas/Source'
        citations:
          type: array
          items:
            $ref: '#/components/schemas/Citation'
    Error:
      type: object
      properties:
        detail:
          type: string
    FilterConfig:
      type: object
      description: Retrieval-Scope (Jurisdiktion etc.). Wird weggelassen → Land-Default.
      properties:
        geographic:
          type: array
          items:
            type: string
          description: |
            Bestimmt die Retrieval-Jurisdiktion: `["bundesrecht"]` (AT, plus
            optionale Bundesland-Slugs) bzw. `["ch"]` (Schweiz). Gültige Werte
            liefert `GET /rechtstipp/options`.
        legislation:
          type: boolean
          default: true
        judikatur:
          type: boolean
          default: true
        courts:
          type: array
          items:
            type: string
        germanCourts:
          type: array
          items:
            type: string
        swissCantons:
          type: array
          items:
            type: string
          description: >
            Nur CH: kantonales Recht zusätzlich zum Bundesrecht —

            2-Buchstaben-Codes (`ZH`, `BE`, …) aus `GET
            /rechtstipp/options?country=CH`.
        eurlex:
          type: boolean
          default: true
        documentTypes:
          type: array
          items:
            type: string
    Source:
      type: object
      properties:
        law_short:
          type: string
          nullable: true
          example: ABGB
        section_id:
          type: string
          nullable: true
          example: § 1295
        title:
          type: string
          nullable: true
        category:
          type: string
          nullable: true
          example: bundesrecht
        source_id:
          type: string
          nullable: true
        html_url:
          type: string
          nullable: true
          description: Volltext-Link (RIS/EUR-Lex).
        content:
          type: string
          nullable: true
          description: Textauszug (Fundstelle).
    Citation:
      type: object
      description: Aufgelöster Quellen-Marker (ADR 0001).
      properties:
        index:
          type: integer
        marker:
          type: string
          example: § 1295 ABGB
        label:
          type: string
          example: § 1295 ABGB
        matched:
          type: boolean
        source_index:
          type: integer
          nullable: true
        url:
          type: string
          nullable: true
        parts:
          type: array
          description: |
            Nur bei Mehrfachzitaten (z. B. `§§ 30, 31 IO`): jeder Teil einzeln
            aufgelöst. Der Marker selbst bleibt in `markdown_linked` bewusst
            unverlinkt (nie ein falscher Link) — mit `parts` kannst du granular
            selbst verlinken.
          items:
            type: object
            properties:
              marker:
                type: string
                example: § 30 IO
              matched:
                type: boolean
              source_index:
                type: integer
                nullable: true
              url:
                type: string
                nullable: true
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: |
        `Authorization: Bearer <TOKEN>`. Für den Tipp-Lebenszyklus
        (`/rechtstipps`) ist `<TOKEN>` das **finditoo-WP-JWT des eingeloggten
        Anwalts** (ein Service-Key wird hier mit `403` abgewiesen). `/feedback`
        und `/rechtstipp/options` akzeptieren zusätzlich einen **Service-Key**
        (Maschine-zu-Maschine). Behandle Tokens als Secret; niemals in
        Chats/Slack teilen.

````