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

# List purchase orders

> **Erforderliche Berechtigungen:** `purchase_orders:read`

Gibt eine paginierte Liste von Bestellungen des aktuellen Mandanten zurück, inklusive Positionen.
Sortierung nach `created_at` absteigend. Optional nach `project_id`, `supplier_id`, `document_type`, `delivery_date_from` und `delivery_date_to` filterbar.
Die Lieferdatumsfilter beziehen sich auf `delivery_date` der Bestellung, nicht auf einzelne Positionen oder verknüpfte Lieferungen.
Beide Datumsgrenzen sind inklusive und können einzeln verwendet werden. Für einen einzelnen Tag beide Grenzen auf dasselbe Datum setzen.
Bei aktivem Lieferdatumsfilter werden Bestellungen ohne Lieferdatum ausgeschlossen. Alle Filter werden mit UND verknüpft; `total` zählt nur passende Bestellungen.
Datumswerte müssen gültige Kalenderdaten im Format `YYYY-MM-DD` sein (ohne Uhrzeit oder Zeitzone).
Ungültige Datumswerte oder `delivery_date_from` nach `delivery_date_to` führen zu HTTP 400.

Beispiel: `GET /v1/purchase-orders?delivery_date_from=2026-11-01&delivery_date_to=2026-11-30`


Filter purchase orders by their delivery date using `delivery_date_from` and `delivery_date_to`.
Both parameters are optional and inclusive. Use valid calendar dates in `YYYY-MM-DD` format, without a time or timezone.

```http theme={null}
GET /v1/purchase-orders?delivery_date_from=2026-11-01&delivery_date_to=2026-11-30
```

* Supply only `delivery_date_from` for orders due on or after that date.
* Supply only `delivery_date_to` for orders due on or before that date.
* Set both to the same date to retrieve orders for a single day.

The filters apply to the purchase order's `delivery_date`, not item dates or linked deliveries.
Orders without a delivery date are excluded when either date filter is supplied.
Combine these parameters with `project_id`, `supplier_id`, and `document_type`; all supplied filters must match.
Pagination and the `total` count apply to the filtered results. Results remain sorted by `created_at` descending.

Invalid dates, timestamps, or a `delivery_date_from` later than `delivery_date_to` return HTTP 400.
Omitting both date parameters preserves the existing list behavior, including orders without a delivery date.


## OpenAPI

````yaml GET /purchase-orders
openapi: 3.0.3
info:
  title: comstruct Public API
  description: >
    Die comstruct API ist eine umfassende und flexible Lösung zur Optimierung
    des Materialbeschaffungsprozesses für Unternehmen. Diese API bietet eine
    einfache Schnittstelle für Entwickler, um auf Materialbeschaffungsdaten
    zuzugreifen und diese zu verwalten, einschließlich Lieferanteninformationen,
    Lieferungen und Projekte.


    ## Erste Schritte

    Um Zugang zur comstruct API zu erhalten, wenden Sie sich bitte an Ihren
    zuständigen Customer Success Manager. Unser Expertenteam steht Ihnen mit
    erstklassigem Support zur Verfügung, um Ihnen zu helfen, das Beste aus
    unserer API herauszuholen.


    ## Authentifizierung

    Alle API-Endpunkte unter `/v1` erfordern eine Authentifizierung mittels
    API-Schlüssel im `x-api-key`-Header. Jeder API-Schlüssel hat spezifische
    Berechtigungen (Scopes), die bestimmen, welche Endpunkte und Operationen
    verfügbar sind. Die Authentifizierung wird durch Middleware durchgesetzt,
    die den API-Schlüssel und die Berechtigungen für jede Anfrage validiert.


    Kalender-Endpunkte unter `/calendars` und IDS-Endpunkte unter `/ids` liegen
    **ohne** `/v1`-Präfix (Basis-URL `https://api.comstruct.com`). Kalender
    verwenden Token-basierte Authentifizierung; IDS ist ein öffentlicher
    Callback ohne API-Schlüssel.


    ## Datenformate

    - Alle Zeitstempel sind im ISO 8601-Format (UTC)

    - Geldbeträge werden als Dezimalzahlen dargestellt

    - IDs sind UUIDs, sofern nicht anders angegeben


    ## Anfragegrößenbeschränkungen

    - PDF-Rechnungsverarbeitung, benutzerdefinierte Rechnungsverarbeitung und
    Workflow-Verarbeitung: 32MiB

    - Asynchroner Lieferschein-PDF-Upload (`POST /deliveries/pdf`): 16MiB

    - Alle anderen Endpunkte: 10MiB


    ## Fehlerbehandlung

    Die API verwendet Standard-HTTP-Statuscodes und gibt detaillierte
    Fehlermeldungen im JSON-Format zurück. Weitere Details finden Sie in den
    Fehlerschemas.


    ## Integrationsmuster

    - **SAP-Integration**: Spezialisierte Endpunkte für SAP-ERP-Systeme

    - **Projektverwaltung**: Vollständiges Projektlebenszyklusmanagement mit
    Benutzerrollen

    - **Lieferverfolgung**: Unterstützung mehrerer Lieferscheinformate
    (OpenTrans, PAHM, Q-Point, benutzerdefiniert)

    - **Rechnungsverarbeitung**: Automatisierte Rechnungsanalyse und
    -validierung mit KI/GPT-Unterstützung

    - **Auftragsverwaltung**: IDS-Auftragsverarbeitung mit XML-Parsing und
    Projektkalenderintegration

    - **Kalenderintegration**: Separate Kalender-Endpunkte für
    iCalendar-Abonnement-Feeds
  version: 1.0.11
  license:
    name: Proprietary
    url: https://comstruct.com
  contact:
    name: comstruct ICT GmbH
    url: https://comstruct.com
    email: support@comstruct.com
  termsOfService: https://comstruct.com/datenschutzerklarung/
  x-logo:
    url: https://app.comstruct.com/logo-light-text.png
    altText: comstruct logo
servers:
  - url: https://api.comstruct.com/v1
    description: Haupt-API-Endpunkte (erfordert API-Schlüssel-Authentifizierung)
    variables: {}
  - url: https://api.comstruct.com
    description: Basisserver für Kalender- und IDS-Endpunkte (andere Authentifizierung)
    variables: {}
security:
  - ApiKey: []
tags:
  - name: Projects
    description: Endpunkte für Projekte.
  - name: Projects (SAP)
    description: SAP-spezifische Projekt-Endpunkte.
  - name: Project Regions
    description: Endpunkte für die Verwaltung von Projektregionen.
  - name: Deliveries
    description: Endpunkte für Lieferungen.
  - name: Deliveries (Supplier)
    description: Lieferantenspezifische Liefer-Endpunkte.
  - name: Accounts
    description: Endpunkte für die Verwaltung von Sachkonten.
  - name: Payment Terms
    description: Endpunkte für die Verwaltung von Zahlungsbedingungen.
  - name: Tax Codes
    description: Endpunkte für die Verwaltung von Steuercodes.
  - name: Company Codes
    description: Endpunkte für die Verwaltung von Buchungskreisen (juristische Einheiten).
  - name: Suppliers
    description: Endpunkte für die Verwaltung von Lieferanten.
  - name: Purchase Orders
    description: Endpunkte für Bestellungen.
  - name: Purchase Orders (SAP)
    description: SAP-spezifische Bestellungs-Endpunkte.
  - name: Orders (Supplier)
    description: >-
      Lieferantenspezifische Bestellungs-Endpunkte (Bestätigung, Ablehnung,
      Bearbeitung).
  - name: Suppliers (SAP)
    description: SAP-spezifische Lieferanten-Endpunkte.
  - name: Invoices
    description: Endpunkte für Rechnungen.
  - name: Invoices (Supplier)
    description: Lieferantenspezifische Rechnungs-Endpunkte.
  - name: Invoices (SAP)
    description: SAP-spezifische Rechnungs-Endpunkte.
  - name: Invoice Dimensions
    description: >
      Rechnungs-Dimensionen (benutzerdefinierte Eigenschaften) und Zuweisungen
      auf Rechnung (`header`), Position (`line_item`) oder Kontierung
      (`account`).


      Dimensionen haben den Typ `option` (vordefinierte Werte) oder `text`
      (Freitext über `dimension_id` + `text_value`). Bulk-Konto-POST
      (`/assignments/account/bulk`) unterstützt nur Options-Zuweisungen über
      `option_ids`; Freitext auf Kontoebene über Einzel-POST, PATCH-Bulk oder
      Positions-Bulk.
  - name: Workflows
    description: Endpunkte für Workflow- und Prozessmanagement.
  - name: Calendar
    description: Kalender-Abonnement-Endpunkte mit separater Authentifizierung.
  - name: Orders
    description: Endpunkte für Auftragsverarbeitung und -verwaltung.
paths:
  /purchase-orders:
    get:
      tags:
        - Purchase Orders
      summary: Bestellungen auflisten
      description: >
        **Erforderliche Berechtigungen:** `purchase_orders:read`


        Gibt eine paginierte Liste von Bestellungen des aktuellen Mandanten
        zurück, inklusive Positionen.

        Sortierung nach `created_at` absteigend. Optional nach `project_id`,
        `supplier_id`, `document_type`, `delivery_date_from` und
        `delivery_date_to` filterbar.

        Die Lieferdatumsfilter beziehen sich auf `delivery_date` der Bestellung,
        nicht auf einzelne Positionen oder verknüpfte Lieferungen.

        Beide Datumsgrenzen sind inklusive und können einzeln verwendet werden.
        Für einen einzelnen Tag beide Grenzen auf dasselbe Datum setzen.

        Bei aktivem Lieferdatumsfilter werden Bestellungen ohne Lieferdatum
        ausgeschlossen. Alle Filter werden mit UND verknüpft; `total` zählt nur
        passende Bestellungen.

        Datumswerte müssen gültige Kalenderdaten im Format `YYYY-MM-DD` sein
        (ohne Uhrzeit oder Zeitzone).

        Ungültige Datumswerte oder `delivery_date_from` nach `delivery_date_to`
        führen zu HTTP 400.


        Beispiel: `GET
        /v1/purchase-orders?delivery_date_from=2026-11-01&delivery_date_to=2026-11-30`
      operationId: listPurchaseOrders
      parameters:
        - name: limit
          in: query
          description: Anzahl der Einträge pro Seite (max. 500, Standard 25)
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 500
            default: 25
            example: 25
        - name: offset
          in: query
          description: Anzahl der zu überspringenden Einträge für die Paginierung
          required: false
          schema:
            type: integer
            minimum: 0
            default: 0
            example: 0
        - name: project_id
          in: query
          description: Nach Projekt-ID filtern
          required: false
          schema:
            type: string
            format: uuid
        - name: supplier_id
          in: query
          description: Nach Lieferanten-ID filtern
          required: false
          schema:
            type: string
            format: uuid
        - name: document_type
          in: query
          description: Nach Dokumenttyp filtern
          required: false
          schema:
            type: string
            enum:
              - ORDER_CONFIRMATION
              - ORDER
              - ORDER_CONDITIONS
        - name: delivery_date_from
          in: query
          description: >-
            Frühestes Lieferdatum der Bestellung (inklusive). Kann ohne
            delivery_date_to verwendet werden.
          required: false
          schema:
            type: string
            format: date
            example: '2026-11-01'
        - name: delivery_date_to
          in: query
          description: >-
            Spätestes Lieferdatum der Bestellung (inklusive). Muss am oder nach
            delivery_date_from liegen, falls beide angegeben sind.
          required: false
          schema:
            type: string
            format: date
            example: '2026-11-30'
      responses:
        '200':
          description: Erfolgreich
          content:
            application/json:
              schema:
                type: object
                properties:
                  purchaseOrders:
                    type: array
                    items:
                      $ref: '#/components/schemas/PurchaseOrder'
                  total:
                    type: integer
                    description: Gesamtanzahl der Bestellungen
                    example: 150
                  limit:
                    type: integer
                    nullable: true
                    description: Anzahl der Einträge pro Seite
                    example: 25
                  offset:
                    type: integer
                    description: Anzahl der übersprungenen Einträge
                    example: 0
                  hasNext:
                    type: boolean
                    description: Ob weitere Seiten verfügbar sind
                    example: true
                  hasPrevious:
                    type: boolean
                    description: Ob vorherige Seiten verfügbar sind
                    example: false
                  totalPages:
                    type: integer
                    description: Gesamtanzahl der Seiten
                    example: 6
                  currentPage:
                    type: integer
                    description: Aktuelle Seitennummer (0-basiert)
                    example: 0
        '400':
          description: >-
            Ungültige Query-Parameter, ungültiges Lieferdatum oder umgekehrter
            Datumsbereich
        '401':
          description: Nicht autorisiert - Fehlender oder ungültiger API-Schlüssel
        '403':
          $ref: '#/components/responses/Forbidden'
      security:
        - ApiKey:
            - purchase_orders:read
components:
  schemas:
    PurchaseOrder:
      type: object
      description: >-
        Bestellung, wie sie von GET /purchase-orders und GET
        /purchase-orders/{id} zurückgegeben wird.
      properties:
        id:
          type: string
          format: uuid
        contract_number:
          type: string
          example: PO-2024-001
        alternative_contract_number:
          type: string
          nullable: true
        comment:
          type: string
          nullable: true
          description: Titel der Bestellung
        order_number:
          type: string
          nullable: true
        delivery_date:
          type: string
          format: date
          nullable: true
        delivery_terms:
          type: string
          nullable: true
        delivery_address:
          type: string
          nullable: true
        document_type:
          type: string
          nullable: true
          enum:
            - ORDER_CONFIRMATION
            - ORDER
            - ORDER_CONDITIONS
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
          description: Zeitstempel der letzten Aktualisierung (serverseitig)
        project_id:
          type: string
          format: uuid
        supplier_id:
          type: string
          format: uuid
        payment_term_id:
          type: string
          format: uuid
          nullable: true
        supplier:
          type: object
          properties:
            id:
              type: string
              format: uuid
            title:
              type: string
            external_id:
              type: string
        project:
          type: object
          properties:
            id:
              type: string
              format: uuid
            title:
              type: string
            project_number:
              type: string
        payment_term:
          type: object
          nullable: true
          properties:
            id:
              type: string
              format: uuid
            number:
              type: string
            title:
              type: string
        purchase_order_items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
              external_id:
                type: string
              title:
                type: string
              quantity:
                type: number
              net_price:
                type: number
                nullable: true
              price_per_unit:
                type: number
                nullable: true
              discount:
                type: number
                nullable: true
              special_discount:
                type: number
                nullable: true
              account_id:
                type: string
                format: uuid
                nullable: true
              tax_code_id:
                type: string
                format: uuid
                nullable: true
              product:
                type: object
                properties:
                  title:
                    type: string
                  unit:
                    type: string
                  product_number:
                    type: string
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Fehlermeldung, die beschreibt, was schiefgelaufen ist
        message:
          type: string
          description: Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht
        success:
          type: boolean
          description: Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden
      anyOf:
        - required:
            - error
        - required:
            - message
        - required:
            - success
      example:
        error: Validation failed
        message: The provided data did not pass validation checks
  responses:
    Forbidden:
      description: Verboten - Ungültige oder fehlende Berechtigung
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            invalid_scope:
              summary: Ungültige Berechtigung
              value:
                message: Invalid scope.
            missing_scope:
              summary: Fehlende spezifische Berechtigung
              value:
                error: 'Unauthorized. Missing scope: projects:write'
            missing_invoices_scope:
              summary: Fehlende Rechnungsberechtigung
              value:
                error: 'Unauthorized. Missing scope: invoices:write'
            missing_suppliers_scope:
              summary: Fehlende Lieferantenberechtigung
              value:
                error: 'Unauthorized. Missing scope: suppliers:write'
  securitySchemes:
    ApiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: >
        API-Schlüssel zur Authentifizierung. Kontaktieren Sie Ihren Customer
        Success Manager, um einen API-Schlüssel zu erhalten.


        Jeder Endpunkt erfordert spezifische Berechtigungen (Scopes); die
        erforderlichen Scopes werden pro Endpunkt angezeigt.

````

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