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

# Assets abfragen

> Fragt Assets mit Filter, Sortierung, Feldauswahl, Seitengröße und Expands ab.

Für `select`, `filter` und `sort` stehen nur die Felder des Assets zur Verfügung (siehe `AssetDto`). Expands ergänzen verwandte Daten; `data.`-Pfade in einem Expand werden gegen die Typen aufgelöst.

Mit `select` enthalten die Elemente der Antwort nur die gewählten Eigenschaften, und die Expands stehen auf der obersten Ebene des Elements. Ohne `select` ist ein Element das vollständige Asset mit seinen Expands in `expands`.

Eine Seite hat `limit` Elemente (Standard 50). Gibt es mehr, ist `hasMore` wahr, und `nextCursor` setzt mit `POST /cursor/continue` fort. Ein Expand, der zu einem Asset mehr Zeilen hat als sein `limit`, steht in `incompleteExpands`; er wird mit `POST /assets/expand` fortgesetzt.

Braucht das Recht `api_read` (*Lesen*).




## OpenAPI

````yaml /api-reference/openapi.de.yaml post /assets/query
openapi: 3.0.3
info:
  title: Docusnap365 REST-API
  version: v1
  description: >
    Die öffentliche REST-API von Docusnap365 zum Lesen, Abfragen und Schreiben
    von Assets.


    **Ablauf einer Anfrage.** Jede Anfrage durchläuft diese Prüfungen in dieser
    Reihenfolge: den API-Schlüssel (401, wenn er fehlt oder ungültig ist), die
    Rechte des Schlüssels (403, wenn ihm das Recht für die Operation fehlt), das
    Anfrage-Kontingent (429, oder 503, wenn das Kontingent nicht geprüft werden
    kann), danach die Operation selbst. Die Rechte vergeben Sie beim Anlegen des
    API-Schlüssels unter *Verwaltung › Integrationen › API-Schlüssel*: *Lesen*
    (`api_read`) oder *Lesen und Schreiben* (`api_write`).


    **Anfrage-Kontingent.** Jeder Aufruf einer Operation zählt als eine Anfrage.
    Das Kontingent teilt sich die Subscription mit dem MCP-Server. Sobald eine
    Anfrage gezählt ist, begleiten die `X-RateLimit-*`-Kopfzeilen die Antwort,
    auch eine Fehlerantwort; eine Subscription ohne Obergrenze bekommt keine.


    **Fehler.** Fehler sind `application/problem+json` (RFC 9457) mit den
    Feldern `type`, `title`, `status`, `detail`, `instance`, `errorCode`,
    `traceId` und `errors`. `detail` darf nicht ausgewertet werden. Ausnahmen:
    Die Antwort 401 hat weder Körper noch Content-Type, auch wenn der
    API-Schlüssel fehlt. Und auf dem Schreibweg wird ein Fehler des
    Ingest-Dienstes unverändert zurückgegeben und trägt stattdessen
    `errorMessage`.
servers:
  - url: https://api.docusnap365.com/api/v1
security:
  - ApiKeyAuth: []
tags:
  - name: Assets
    description: Einzelne Assets lesen und schreiben.
  - name: Query
    description: Assets mit Filter, Sortierung, Expands und seitenweiser Ausgabe abfragen.
paths:
  /assets/query:
    post:
      tags:
        - Query
      summary: Assets abfragen
      description: >
        Fragt Assets mit Filter, Sortierung, Feldauswahl, Seitengröße und
        Expands ab.


        Für `select`, `filter` und `sort` stehen nur die Felder des Assets zur
        Verfügung (siehe `AssetDto`). Expands ergänzen verwandte Daten;
        `data.`-Pfade in einem Expand werden gegen die Typen aufgelöst.


        Mit `select` enthalten die Elemente der Antwort nur die gewählten
        Eigenschaften, und die Expands stehen auf der obersten Ebene des
        Elements. Ohne `select` ist ein Element das vollständige Asset mit
        seinen Expands in `expands`.


        Eine Seite hat `limit` Elemente (Standard 50). Gibt es mehr, ist
        `hasMore` wahr, und `nextCursor` setzt mit `POST /cursor/continue` fort.
        Ein Expand, der zu einem Asset mehr Zeilen hat als sein `limit`, steht
        in `incompleteExpands`; er wird mit `POST /assets/expand` fortgesetzt.


        Braucht das Recht `api_read` (*Lesen*).
      operationId: queryAssets
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiQueryRequest'
            examples:
              Assets, deren Name einen Text enthält, das neueste zuerst:
                value:
                  select:
                    - id
                    - name
                    - createdAt
                  filter:
                    logic: And
                    conditions:
                      - path: name
                        op: Contains
                        value: server
                  sort:
                    - path: createdAt
                      desc: true
                  limit: 20
              Ein Asset mit den erfassten Daten des Typs:
                value:
                  select:
                    - id
                    - name
                  filter:
                    conditions:
                      - path: id
                        op: Eq
                        value: 3f2504e0-4f89-11d3-9a0c-0305e82c3301
                  expands:
                    - name: object_data
                      select:
                        - id
                        - data
      responses:
        '200':
          description: Eine Seite Assets.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Extra-Remaining:
              $ref: '#/components/headers/X-RateLimit-Extra-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiQueryResponse'
        '400':
          description: >-
            Der Körper lässt sich nicht lesen, ein Pfad steht nicht zur
            Verfügung, ein Filterwert passt nicht zum Feld, oder ein Operator
            lässt sich auf das Feld nicht anwenden.
          x-error-codes:
            - VALIDATION_FAILED
            - UNKNOWN_PATH
            - FIELD_TYPE_MISMATCH
            - UNSUPPORTED_OPERATOR
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                Ein Feld, das nicht zur Verfügung steht:
                  value:
                    type: urn:ds365:error:unknown-path
                    title: Unknown field path
                    status: 400
                    detail: Field 'hostname' is not configured for source 'objects'
                    instance: /api/v1/assets/query
                    errorCode: UNKNOWN_PATH
                    traceId: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
                    errors:
                      - code: UNKNOWN_PATH
                        path: filter
                        data:
                          field: hostname
                          source: objects
                          origin: filter
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/ForbiddenRead'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
components:
  schemas:
    ApiQueryRequest:
      title: Abfrage
      type: object
      properties:
        select:
          type: array
          items:
            type: string
          description: >-
            Die Felder, die geliefert werden. Ohne Angabe alle Felder des
            Assets.
        filter:
          $ref: '#/components/schemas/ApiFilterGroup'
        sort:
          type: array
          items:
            $ref: '#/components/schemas/ApiSortField'
          description: >-
            Die Sortierung. Ohne Angabe nach Id. Die Id ist immer der letzte
            Sortierschlüssel, wenn sie nicht ausdrücklich sortiert wird.
        limit:
          type: integer
          format: int32
          default: 50
          description: Die Seitengröße.
        expands:
          type: array
          items:
            $ref: '#/components/schemas/ApiExpandDefinition'
          description: >-
            Verwandte Daten, die zu jedem Asset gelesen werden. Ein unbekannter
            Name wird ohne Fehler übersprungen.
    ApiQueryResponse:
      title: Abfrageantwort
      type: object
      required:
        - items
      properties:
        items:
          type: array
          items:
            anyOf:
              - $ref: '#/components/schemas/AssetDto'
              - $ref: '#/components/schemas/ExpandRow'
          description: Die Assets, bei einem Expand-Cursor die Zeilen des Expands.
        nextCursor:
          type: string
          nullable: true
          description: >-
            Vorhanden, wenn es weitere Elemente gibt. Gilt eine Stunde lang, für
            denselben Benutzer und dieselbe Subscription.
        hasMore:
          type: boolean
          description: Wahr, wenn es weitere Elemente gibt.
        incompleteExpands:
          type: object
          nullable: true
          additionalProperties:
            $ref: '#/components/schemas/ApiIncompleteExpand'
          description: >-
            Expands mit mehr Zeilen als ihr `limit`, mit dem Schlüssel
            `name:parentId`.
    ProblemDetails:
      title: Problembeschreibung
      type: object
      description: >-
        Ein Fehler nach RFC 9457. `errors` ist nie leer; bei einem Fehler ist
        `errors[0].code` gleich `errorCode`.
      properties:
        type:
          type: string
          description: >-
            Ein URN, abgeleitet aus `errorCode`, zum Beispiel
            `urn:ds365:error:not-found`. Er lässt sich nicht auflösen.
        title:
          type: string
          description: Ein fester englischer Text je Code.
        status:
          type: integer
          description: Der HTTP-Statuscode.
        detail:
          type: string
          description: >-
            Ein technischer englischer Satz. Der Text kann sich ändern und soll
            nicht ausgewertet werden.
        instance:
          type: string
          description: Der Anfragepfad.
        errorCode:
          type: string
          description: >-
            Der Fehlercode. Die Codes einer Operation stehen in `x-error-codes`
            ihrer Antwort.
        traceId:
          type: string
          description: Die Trace-Id der Anfrage. Dem Support nennen.
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ProblemErrorItem'
    ApiFilterGroup:
      title: Filtergruppe
      type: object
      properties:
        logic:
          allOf:
            - $ref: '#/components/schemas/FilterLogic'
          default: And
        conditions:
          type: array
          items:
            $ref: '#/components/schemas/ApiFilterCondition'
        groups:
          type: array
          items:
            $ref: '#/components/schemas/ApiFilterGroup'
          description: >-
            Verschachtelte Gruppen. Sie werden mit den Bedingungen über `logic`
            verknüpft.
    ApiSortField:
      title: Sortierfeld
      type: object
      required:
        - path
      properties:
        path:
          type: string
          description: Das Feld, nach dem sortiert wird.
        desc:
          type: boolean
          default: false
          description: Absteigend sortieren.
        nulls:
          allOf:
            - $ref: '#/components/schemas/NullsPosition'
          default: Default
    ApiExpandDefinition:
      title: Expand-Definition
      type: object
      required:
        - name
      properties:
        name:
          type: string
          enum:
            - object_data
            - object_essentials
            - object_blocks
            - children
          description: >
            Die verwandten Daten. `object_data` sind die erfassten Daten des
            Typs (eine Zeile), `object_essentials` die Essentials (eine Zeile je
            Typ), `object_blocks` die Blöcke des Assets (sehr viele Zeilen;
            immer ein `limit` setzen), `children` die untergeordneten Assets.
        select:
          type: array
          items:
            type: string
          description: >-
            Die Felder des Expands. In `object_data`, `object_essentials` und
            `object_blocks` auch Pfade in `data`, zum Beispiel `data.cpuCores`
            (abhängig vom Typ des Assets).
        filter:
          $ref: '#/components/schemas/ApiFilterGroup'
        sort:
          type: array
          items:
            $ref: '#/components/schemas/ApiSortField'
        limit:
          type: integer
          format: int32
          default: 50
          description: Die Zahl der Zeilen je Asset.
    AssetDto:
      title: Asset
      type: object
      additionalProperties: true
      description: >
        Ein Asset. Mit `select` auf `POST /assets/query` enthält ein Element nur
        die gewählten Eigenschaften und die nach oben gezogenen Expands unter
        ihrem Namen (`object_data` als Objekt, die übrigen als Liste).
      properties:
        id:
          type: string
          format: uuid
        entityId:
          type: string
          format: uuid
          nullable: true
        schemaId:
          type: string
          format: uuid
          description: Der Typ des Assets.
        parentId:
          type: string
          format: uuid
          nullable: true
        name:
          type: string
        objectType:
          type: string
        type:
          type: string
        iconId:
          type: string
        sourceType:
          type: string
        organizationId:
          type: string
          format: uuid
          nullable: true
        locationId:
          type: string
          format: uuid
          nullable: true
        platformId:
          type: string
          format: uuid
          nullable: true
        domainId:
          type: string
          format: uuid
          nullable: true
        version:
          type: integer
          format: int32
        status:
          type: string
        isManually:
          type: boolean
        createdAt:
          type: string
          format: date-time
          nullable: true
        createdBy:
          type: string
          format: uuid
          nullable: true
        createdByDisplayName:
          type: string
        modifiedAt:
          type: string
          format: date-time
          nullable: true
        modifiedBy:
          type: string
          format: uuid
          nullable: true
        modifiedByDisplayName:
          type: string
        deletedAt:
          type: string
          format: date-time
          nullable: true
        deletedBy:
          type: string
          format: uuid
          nullable: true
        deletedByDisplayName:
          type: string
        expands:
          type: object
          nullable: true
          additionalProperties:
            type: array
            items:
              $ref: '#/components/schemas/ExpandRow'
          description: >-
            Die Expands nach Namen. Nur in der vollständigen Form, nicht, wenn
            `select` sie nach oben gezogen hat.
    ExpandRow:
      title: Expand-Zeile
      type: object
      additionalProperties: true
      description: >-
        Eine Zeile eines Expands. Spalten ohne Wert fehlen. JSON-Spalten
        (`data`) werden als JSON geliefert.
    ApiIncompleteExpand:
      title: Unvollständiger Expand
      type: object
      required:
        - parentId
        - cursor
      properties:
        parentId:
          type: string
          format: uuid
          description: Das Asset, dessen Expand unvollständig ist.
        cursor:
          type: string
          description: >-
            Der Cursor, mit dem der Expand über `POST /assets/expand`
            fortgesetzt wird.
        loadedCount:
          type: integer
          format: int32
          description: Die Zahl der schon gelieferten Zeilen.
    ProblemErrorItem:
      title: Fehlerelement
      type: object
      required:
        - code
      properties:
        code:
          type: string
          description: Der besondere Code dieses Elements.
        path:
          type: string
          description: >-
            Das Feld oder der Parameter, den der Fehler betrifft. Fehlt, wenn er
            die ganze Anfrage betrifft.
        data:
          type: object
          additionalProperties: true
          description: >-
            Weitere Werte, zum Beispiel `entityType` und `id` eines fehlenden
            Assets oder `missingScopes`. Fehlt, wenn leer.
    FilterLogic:
      title: Logischer Operator
      type: string
      description: Wie die Bedingungen und Gruppen einer Gruppe verknüpft werden.
      enum:
        - And
        - Or
    ApiFilterCondition:
      title: Filterbedingung
      type: object
      required:
        - path
        - op
      properties:
        path:
          type: string
          description: >-
            Das Feld. Es stehen nur die Felder der Hauptabfrage zur Verfügung,
            in einem Expand die Felder dieses Expands.
        op:
          $ref: '#/components/schemas/FilterOperator'
        value:
          description: >-
            Der Vergleichswert. Sein JSON-Typ muss zum Feld passen; bei `In` und
            `NotIn` eine Liste.
        arrayFilter:
          $ref: '#/components/schemas/ApiFilterGroup'
    NullsPosition:
      title: Stellung leerer Werte
      type: string
      description: >-
        Wo leere Werte in der Sortierung stehen. `Default` überlässt es der
        Datenbank.
      enum:
        - Default
        - First
        - Last
    FilterOperator:
      title: Filteroperator
      type: string
      description: >
        Der Operator einer Bedingung. Im Anfragekörper ohne Beachtung der
        Schreibweise.


        `Eq`, `Neq`, `Gt`, `Gte`, `Lt`, `Lte` vergleichen. `Neq` und `NotIn`
        behalten Zeilen, deren Feld leer ist. `Contains`, `StartsWith`,
        `EndsWith` vergleichen Text ohne Beachtung der Schreibweise; `%`, `_`
        und `\` in `value` gelten wörtlich. `Like` ist SQL-LIKE mit den
        Platzhaltern des Aufrufers und mit Beachtung der Schreibweise. `In` und
        `NotIn` nehmen eine Liste in `value`. `IsNull` und `IsNotNull` brauchen
        kein `value`. `ArrayAny` trifft zu, wenn mindestens ein Element eines
        JSON-Arrays `arrayFilter` erfüllt. `ArrayContains` trifft zu, wenn das
        JSON-Array `value` enthält.


        Vergleichs- und Listenoperatoren (`Eq`, `Neq`, `Gt`, `Gte`, `Lt`, `Lte`,
        `In`, `NotIn`) werden auf einem Feld, das ein JSON-Objekt oder -Array
        enthält, abgelehnt.
      enum:
        - Eq
        - Neq
        - Gt
        - Gte
        - Lt
        - Lte
        - Contains
        - StartsWith
        - EndsWith
        - Like
        - In
        - NotIn
        - IsNull
        - IsNotNull
        - ArrayAny
        - ArrayContains
  headers:
    X-RateLimit-Limit:
      description: >-
        Enthaltene Anfragen je Kontingentperiode. Wird für eine Subscription
        ohne Obergrenze nicht gesendet.
      schema:
        type: integer
    X-RateLimit-Remaining:
      description: >-
        Noch verfügbare enthaltene und zusätzliche Anfragen der laufenden
        Periode.
      schema:
        type: integer
    X-RateLimit-Extra-Remaining:
      description: >-
        Noch verfügbare zusätzliche Anfragen. Sie werden mit der Periode nicht
        zurückgesetzt.
      schema:
        type: integer
    X-RateLimit-Reset:
      description: Beginn der nächsten Kontingentperiode als Unix-Zeit in Sekunden.
      schema:
        type: integer
        format: int64
    Retry-After:
      description: >-
        Beginn der nächsten Kontingentperiode als HTTP-Datum. Derselbe Zeitpunkt
        wie `X-RateLimit-Reset`.
      schema:
        type: string
  responses:
    Unauthorized:
      description: Der API-Schlüssel fehlt oder ist ungültig.
      x-error-codes:
        - UNAUTHORIZED
    ForbiddenRead:
      description: >-
        Dem Schlüssel fehlt das Recht `api_read` (*Lesen*), oder die
        Berechtigungsschicht der Datenbank hat den Zugriff verweigert.
      x-error-codes:
        - FORBIDDEN
        - PERMISSION_DENIED
        - MODULE_NOT_IN_EDITION
        - TENANT_FROZEN
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          examples:
            Ein Schlüssel ohne das nötige Recht:
              value:
                type: urn:ds365:error:forbidden
                title: Forbidden
                status: 403
                detail: 'Missing required scopes: api_read'
                instance: /api/v1/assets
                errorCode: FORBIDDEN
                traceId: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
                errors:
                  - code: FORBIDDEN
                    data:
                      missingScopes:
                        - api_read
    TooManyRequests:
      description: >-
        Das Anfrage-Kontingent der Subscription ist aufgebraucht, enthaltene und
        zusätzliche Anfragen gleichermaßen. Wiederholen nach dem Zeitpunkt in
        `Retry-After`. Auch eine abgelehnte Anfrage wird gezählt.
      x-error-codes:
        - REST_REQUEST_QUOTA_EXCEEDED
      headers:
        Retry-After:
          $ref: '#/components/headers/Retry-After'
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Extra-Remaining:
          $ref: '#/components/headers/X-RateLimit-Extra-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          examples:
            Das Kontingent ist aufgebraucht:
              value:
                type: urn:ds365:error:rest-request-quota-exceeded
                title: Request quota exceeded
                status: 429
                detail: >-
                  The request quota of 10000 requests per period is exhausted
                  until 2026-12-01T00:00:00.0000000+00:00.
                instance: /api/v1/assets
                errorCode: REST_REQUEST_QUOTA_EXCEEDED
                traceId: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
                errors:
                  - code: REST_REQUEST_QUOTA_EXCEEDED
                    data:
                      requestsLimit: 10000
                      requestsUsed: 10000
                      quotaResetAt: '2026-12-01T00:00:00+00:00'
    InternalError:
      description: >-
        Ein unerwarteter Fehler. `detail` ist ein fester Satz; bei einer Meldung
        die `traceId` angeben.
      x-error-codes:
        - INTERNAL_ERROR
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    ServiceUnavailable:
      description: >-
        Das Kontingent konnte nicht geprüft werden und die Anfrage wurde deshalb
        nicht bedient, oder die Datenbank ist vorübergehend ausgefallen. Ein
        erneuter Versuch kann gelingen.
      x-error-codes:
        - SERVICE_UNAVAILABLE
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Der API-Schlüssel der Subscription. Jede Operation nennt in
        `x-pat-scopes` das Recht, das sie braucht: `api_read` (in der Oberfläche
        *Lesen*) oder `api_write` (*Lesen und Schreiben*). Der Schlüssel wird
        unter *Verwaltung › Integrationen › API-Schlüssel* angelegt.

````

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