> ## 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.

# Einen Expand eines Assets lesen oder fortsetzen

> Liest die verwandten Daten (`expandName`) eines Assets (`parentId`). Ohne `cursor` beginnt die Anfrage den Expand mit den angegebenen `select`, `filter`, `sort` und `limit`. Mit dem Cursor aus `incompleteExpands` setzt sie diesen Expand fort; der Cursor trägt die ursprüngliche Abfrage, und `select`, `filter`, `sort` und `limit` des Körpers werden nicht angewandt. `parentId` und `expandName` müssen zum Cursor passen.

Das übergeordnete Asset muss für den Benutzer sichtbar sein, sonst lautet die Antwort 404.

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




## OpenAPI

````yaml /api-reference/openapi.de.yaml post /assets/expand
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/expand:
    post:
      tags:
        - Query
      summary: Einen Expand eines Assets lesen oder fortsetzen
      description: >
        Liest die verwandten Daten (`expandName`) eines Assets (`parentId`).
        Ohne `cursor` beginnt die Anfrage den Expand mit den angegebenen
        `select`, `filter`, `sort` und `limit`. Mit dem Cursor aus
        `incompleteExpands` setzt sie diesen Expand fort; der Cursor trägt die
        ursprüngliche Abfrage, und `select`, `filter`, `sort` und `limit` des
        Körpers werden nicht angewandt. `parentId` und `expandName` müssen zum
        Cursor passen.


        Das übergeordnete Asset muss für den Benutzer sichtbar sein, sonst
        lautet die Antwort 404.


        Braucht das Recht `api_read` (*Lesen*).
      operationId: getAssetExpand
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiExpandRequest'
            examples:
              Einen Expand beginnen:
                value:
                  parentId: 3f2504e0-4f89-11d3-9a0c-0305e82c3301
                  expandName: children
                  limit: 100
      responses:
        '200':
          description: Eine Seite Expand-Zeilen.
          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/ApiExpandResponse'
        '400':
          description: >-
            Der Körper lässt sich nicht lesen, der Expand-Name ist unbekannt,
            ein Pfad steht nicht zur Verfügung, ein Filterwert passt nicht zum
            Feld, ein Operator lässt sich nicht anwenden, oder der Cursor ist
            ungültig, abgelaufen oder gehört nicht zu diesem Expand dieses
            Assets.
          x-error-codes:
            - VALIDATION_FAILED
            - UNKNOWN_PATH
            - FIELD_TYPE_MISMATCH
            - UNSUPPORTED_OPERATOR
            - INVALID_CURSOR
            - CURSOR_EXPIRED
            - CURSOR_SOURCE_MISMATCH
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/ForbiddenCursor'
        '404':
          description: >-
            Das übergeordnete Asset gibt es nicht, oder es ist für den Benutzer
            nicht sichtbar.
          x-error-codes:
            - NOT_FOUND
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
components:
  schemas:
    ApiExpandRequest:
      title: Expand-Anfrage
      type: object
      required:
        - parentId
        - expandName
      properties:
        parentId:
          type: string
          format: uuid
          description: Das Asset, dessen verwandte Daten gelesen werden.
        expandName:
          type: string
          enum:
            - object_data
            - object_essentials
            - object_blocks
            - children
          description: Die verwandten Daten. Dieselben Namen wie in `ApiExpandDefinition`.
        cursor:
          type: string
          description: >-
            Der Cursor aus `incompleteExpands` oder `nextCursor`. Mit Cursor
            werden `select`, `filter`, `sort` und `limit` nicht angewandt.
        select:
          type: array
          items:
            type: string
        filter:
          $ref: '#/components/schemas/ApiFilterGroup'
        sort:
          type: array
          items:
            $ref: '#/components/schemas/ApiSortField'
        limit:
          type: integer
          format: int32
          default: 50
    ApiExpandResponse:
      title: Expand-Antwort
      type: object
      required:
        - items
      properties:
        items:
          type: array
          items:
            anyOf:
              - $ref: '#/components/schemas/AssetDto'
              - $ref: '#/components/schemas/ExpandRow'
          description: Die Zeilen des Expands. Bei `children` sind es Assets.
        nextCursor:
          type: string
          nullable: true
          description: Vorhanden, wenn es weitere Zeilen gibt.
        hasMore:
          type: boolean
          description: Wahr, wenn es weitere Zeilen gibt.
    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
    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.
    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
    ForbiddenCursor:
      description: >-
        Dem Schlüssel fehlt das Recht `api_read` (*Lesen*), der Cursor wurde für
        einen anderen Benutzer oder eine andere Subscription ausgestellt, oder
        die Berechtigungsschicht der Datenbank hat den Zugriff verweigert.
      x-error-codes:
        - FORBIDDEN
        - CURSOR_USER_MISMATCH
        - CURSOR_DATA_SOURCE_MISMATCH
        - PERMISSION_DENIED
        - MODULE_NOT_IN_EDITION
        - TENANT_FROZEN
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    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.