UvA Library Linked Open Data API (Triply)

REST API over the University of Amsterdam Library's Linked Open Data datasets (books, catalogue, images, letters, maps, audio, video, music, archaeological objects, and more), served on the Triply platform. Backed by SPARQL, GraphQL, Elasticsearch, and table-view query interfaces.

Documentation

Specifications

Schemas & Data

Other Resources

OpenAPI Specification

university-of-amsterdam-lod-triply-api.yaml Raw ↑
openapi: 3.0.3
info:
  title: TriplyDB API
  version: 26.5.104
  description: >
    REST API for TriplyDB — a linked data database platform.


    ## Authentication


    Read operations on publicly published datasets can be performed without

    authentication. Write operations and read operations on private or internal

    datasets require a valid API token.


    ### Creating an API token


    1. Log into your TriplyDB instance.

    2. Click on the user menu in the top-right corner and click on "User
    settings".

    3. Go to the "API tokens" tab.

    4. Click "Create token", enter a description (e.g., "my-script") and select
       the appropriate access rights.
    5. Click "Create" and copy the token. It is only shown once upon creation.


    ### Using the API token


    Include the token in the `Authorization` header of your HTTP requests:


    ```

    Authorization: Bearer YOUR_TOKEN

    ```


    ### Security considerations


    - **Do not commit tokens to git repositories.**

    - **Do not share tokens** with anyone who should not have access to your
      TriplyDB resources.
    - **Rotate tokens regularly**, especially if you suspect a compromise.


    ## Pagination


    List endpoints are paginated. The response includes a `Link` header

    ([RFC 8288](https://www.rfc-editor.org/rfc/rfc8288)) with URLs for

    navigating the result set. To paginate, follow the URLs in the `Link`

    header rather than constructing URLs manually.


    The `Link` header contains up to three relations:


    | Relation | Meaning |

    |----------|---------|

    | `first`  | URL to the first page of results |

    | `next`   | URL to the next page (absent when on the last page) |

    | `prev`   | URL to the previous page (absent when on the first page) |


    Example response header:


    ```

    Link: <https://api.example.com/datasets/user/ds?limit=30>; rel="first",
          <https://api.example.com/datasets/user/ds?since=6435a&limit=30>; rel="next"
    ```


    To iterate through all results, keep following the `rel="next"` URL until

    it is no longer present. You can control the page size with the `limit`

    query parameter (default: 30).


    ## Content negotiation


    Linked data endpoints support format negotiation in two ways:


    1. **Accept header** — set the `Accept` request header to the desired media
    type.

    2. **URL extension** — append a format extension to the URL path (e.g.,
    `/run.csv`).
       When present, the extension takes precedence over the `Accept` header.
  contact:
    name: Triply
    url: https://triply.cc
security:
  - bearerAuth: []
  - {}
tags:
  - name: Datasets
    description: Dataset CRUD
  - name: Graphs
    description: Named graph management
  - name: SPARQL
    description: SPARQL query endpoints
    externalDocs:
      description: SPARQL 1.1 Protocol
      url: https://www.w3.org/TR/sparql11-protocol/
  - name: GraphQL
    description: GraphQL endpoints
    externalDocs:
      description: GraphQL Specification
      url: https://spec.graphql.org/
  - name: Search
    description: Elasticsearch and simple search
    externalDocs:
      description: Elasticsearch Query DSL
      url: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html
  - name: Assets
    description: File asset management
  - name: Jobs
    description: |
      Data import jobs. Linked data can be uploaded in two ways:

      **Simple upload** (< 5 MB): Send the file as `multipart/form-data` in
      the `POST /datasets/{account}/{dataset}/jobs` request. The job is
      created with the file attached in a single request.

      **Large-scale upload**: For files larger than 5 MB, create a job with
      a JSON body first (without a file), then upload file(s) using the
      [tus resumable upload protocol](https://tus.io/protocols/resumable-upload)
      against the job's upload endpoint, then start the job. See
      [TriplyDB Uploads](https://github.com/TriplyDB/TriplyDBUploads) for
      a reference implementation.
  - name: Hooks
    description: Webhooks
  - name: Queries
    description: Saved SPARQL queries
  - name: Stories
    description: Data stories
  - name: Accounts
    description: Account and group management
  - name: Info
    description: Instance information
  - name: Prefixes
    description: Global RDF prefix management
  - name: Services
    description: Triple store service management
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
  responses:
    BadRequest:
      description: Bad request
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
    Unauthorized:
      description: Authentication required
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
    Forbidden:
      description: Insufficient permissions
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
  headers:
    Link:
      description: |
        RFC 8288 pagination links. Contains `rel="first"` and `rel="next"`
        URIs for cursor-based pagination.
      schema:
        type: string
        example: <https://api.triplydb.com/datasets?limit=20>; rel="first",
          <https://api.triplydb.com/datasets?since=64a1b2c3d4e5f60012345678&limit=20>;
          rel="next"
  parameters:
    account:
      name: account
      in: path
      required: true
      description: Account name (user or group)
      schema:
        type: string
    dataset:
      name: dataset
      in: path
      required: true
      description: Dataset name
      schema:
        type: string
    serviceName:
      name: serviceName
      in: path
      required: true
      description: Service name
      schema:
        type: string
    graphId:
      name: graphId
      in: path
      required: true
      description: Graph identifier
      schema:
        type: string
    assetId:
      name: assetId
      in: path
      required: true
      description: Asset identifier
      schema:
        type: string
    jobId:
      name: jobId
      in: path
      required: true
      description: Job identifier
      schema:
        type: string
    hookId:
      name: hookId
      in: path
      required: true
      description: Hook identifier
      schema:
        type: string
    queryName:
      name: query
      in: path
      required: true
      description: Saved query name
      schema:
        type: string
    versionNr:
      name: versionNr
      in: path
      required: true
      description: Query version number
      schema:
        type: integer
        minimum: 1
    prefix:
      name: prefix
      in: path
      required: true
      description: Prefix label
      schema:
        type: string
    story:
      name: story
      in: path
      required: true
      description: Story name
      schema:
        type: string
    member:
      name: member
      in: path
      required: true
      description: Member account name
      schema:
        type: string
    since:
      name: since
      in: query
      description: Cursor for pagination. Should be provided using the `link` header
      schema:
        type: string
    limit:
      name: limit
      in: query
      description: Maximum number of results
      schema:
        type: integer
        minimum: 1
    sortDirection:
      name: sortDirection
      in: query
      description: Sort direction
      schema:
        type: string
        enum:
          - asc
          - desc
  schemas:
    MaskedMaterializedVariable:
      type: object
      required:
        - type
        - name
        - access
      properties:
        type:
          type: string
          enum:
            - masked-variable
        name:
          type: string
          description: The variable name, including the leading "?" (e.g. "?password").
          example: ?apiKey
        value:
          type: string
          nullable: true
          description: The actual secret value. Present only when the viewer has the
            manageFlowMaskedVariables permission; otherwise omitted.
        access:
          type: boolean
          description: Whether the viewer has permission to see the value.
    ErrorResponse:
      type: object
      required:
        - message
      properties:
        message:
          type: string
          example: Resource not found.
        code:
          type: integer
          example: 404
        errors:
          type: array
          items:
            $ref: "#/components/schemas/ErrorResponse"
    AccessLevel:
      type: string
      enum:
        - public
        - private
        - internal
    DatasetLicenseId:
      type: string
      nullable: true
      enum:
        - CC0 1.0
        - CC BY
        - CC BY-ND
        - CC BY-NC
        - CC BY-NC-ND
        - CC BY-NC-SA
        - CC BY-SA v4.0
        - ODC-By
        - ODC-ODbL
        - PDDL
        - GFDL
        - CC-BY-SA
        - null
    AutoGeneratedIdType:
      type: string
      enum:
        - uuid
        - hex8
        - hex10
    ServiceType:
      type: string
      enum:
        - elasticSearch
        - virtuoso
        - jena
    ServiceStatus:
      type: string
      enum:
        - starting
        - running
        - stopping
        - stopped
        - removing
        - updating
        - error
    LoadStatus:
      type: string
      enum:
        - loaded
        - loading
        - error
        - notLoaded
    IndexJobStatus:
      type: string
      enum:
        - created
        - downloading
        - pending
        - indexing
        - finished
        - canceled
        - error
    IndexJobType:
      type: string
      enum:
        - upload
        - download
    SparqlRequestType:
      type: string
      enum:
        - select
        - construct
        - ask
        - describe
        - update
    GroupRole:
      type: string
      description: Group role identifier (e.g. "owner", "member", or a custom role id)
      example: member
    AccountType:
      type: string
      enum:
        - user
        - org
    JenaReasoner:
      type: string
      enum:
        - OWL
        - RDFS
        - None
    Capability:
      type: string
      enum:
        - sparql
        - sparqlApi
        - elasticSearch
    QueryExecutionStatus:
      type: string
      enum:
        - No versions
        - No dataset
        - Parsing error
        - Warning
        - No suitable service
        - Service error
        - Timeout
        - No results
        - Success
        - No information
    StoryElementWidth:
      type: string
      enum:
        - fullWidth
        - default
    StoryElementHeight:
      type: string
      enum:
        - small
        - medium
        - large
    Prefixes:
      type: object
      additionalProperties:
        type: string
        format: uri
      example:
        rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#
        rdfs: http://www.w3.org/2000/01/rdf-schema#
    Account:
      type: object
      discriminator:
        propertyName: type
        mapping:
          user: "#/components/schemas/User"
          org: "#/components/schemas/Org"
      required:
        - accountName
        - uid
        - createdAt
        - description
        - type
      properties:
        accountName:
          type: string
          example: acme-research
        uid:
          type: string
          readOnly: true
          example: 64a1b2c3d4e5f60012345678
        name:
          type: string
          example: ACME Research Lab
        description:
          type: string
          example: Publishing linked open data for the sciences.
        avatarUrl:
          type: string
          readOnly: true
        createdAt:
          type: string
          format: date-time
          readOnly: true
          example: 2024-01-15T10:30:00.000Z
        updatedAt:
          type: string
          format: date-time
          readOnly: true
        type:
          $ref: "#/components/schemas/AccountType"
        accountType:
          type: string
          enum:
            - user
            - group
          readOnly: true
        pinnedItems:
          type: array
          items:
            type: object
        datasetCount:
          type: integer
          readOnly: true
        queryCount:
          type: integer
          readOnly: true
        storyCount:
          type: integer
          readOnly: true
        email:
          type: string
          format: email
    User:
      allOf:
        - $ref: "#/components/schemas/Account"
        - type: object
          properties:
            type:
              type: string
              enum:
                - user
            orgs:
              type: array
              items:
                $ref: "#/components/schemas/Org"
            authMethod:
              type: string
            verified:
              type: boolean
            mfaEnabled:
              type: boolean
            legalConsent:
              type: string
              enum:
                - ok
                - expiring
                - expired
                - unset
    Org:
      allOf:
        - $ref: "#/components/schemas/Account"
        - type: object
          properties:
            type:
              type: string
              enum:
                - org
            members:
              type: array
              items:
                $ref: "#/components/schemas/GroupMember"
    GroupMember:
      type: object
      required:
        - role
        - user
        - createdAt
        - updatedAt
      properties:
        role:
          $ref: "#/components/schemas/GroupRole"
        user:
          readOnly: true
          allOf:
            - $ref: "#/components/schemas/User"
        createdAt:
          type: string
          format: date-time
          readOnly: true
        updatedAt:
          type: string
          format: date-time
          readOnly: true
    AccountUpdate:
      type: object
      properties:
        name:
          type: string
        email:
          type: string
          format: email
        accountName:
          type: string
        description:
          type: string
        pinnedItems:
          type: array
          items:
            type: object
    DatasetToggles:
      type: object
      properties:
        browserUi:
          type: boolean
        tableUi:
          type: boolean
        dataEditorUi:
          type: boolean
        dataModelEditorUi:
          type: boolean
        insightsUi:
          type: boolean
        sparqlIdeUi:
          type: boolean
        graphqlUi:
          type: boolean
        elasticsearchUi:
          type: boolean
        graphsUi:
          type: boolean
        servicesUi:
          type: boolean
        assetsUi:
          type: boolean
    Dataset:
      type: object
      required:
        - id
        - name
        - displayName
        - description
        - owner
        - accessLevel
        - createdAt
        - updatedAt
        - graphCount
        - statements
        - serviceCount
        - assetCount
        - tags
        - prefixes
        - exampleResources
        - hasDataQualityIssues
        - toggles
      properties:
        id:
          type: string
          readOnly: true
          example: 64a1b2c3d4e5f60012345678
        name:
          type: string
          example: knowledge-graph
        displayName:
          type: string
          example: Knowledge Graph
        description:
          type: string
          example: An enterprise knowledge graph linking people, projects, and
            publications.
        avatarUrl:
          type: string
          readOnly: true
        owner:
          readOnly: true
          allOf:
            - $ref: "#/components/schemas/Account"
        accessLevel:
          $ref: "#/components/schemas/AccessLevel"
        license:
          $ref: "#/components/schemas/DatasetLicenseId"
        createdAt:
          type: string
          format: date-time
          readOnly: true
          example: 2024-03-01T12:00:00.000Z
        updatedAt:
          type: string
          format: date-time
          readOnly: true
        graphCount:
          type: integer
          readOnly: true
          example: 3
        statements:
          type: integer
          readOnly: true
          example: 1250000
        lastGraphsUpdateTime:
          type: string
          format: date-time
          readOnly: true
        serviceCount:
          type: integer
          readOnly: true
          example: 1
        assetCount:
          type: integer
          readOnly: true
          example: 0
        tags:
          type: array
          items:
            type: string
          example:
            - linked-data
            - knowledge-graph
        prefixes:
          $ref: "#/components/schemas/Prefixes"
        exampleResources:
          type: array
          items:
            type: string
        hasDataQualityIssues:
          type: boolean
          readOnly: true
        autogeneratedIdType:
          $ref: "#/components/schemas/AutoGeneratedIdType"
        toggles:
          $ref: "#/components/schemas/DatasetToggles"
    DatasetVerbose:
      allOf:
        - $ref: "#/components/schemas/Dataset"
        - type: object
          properties:
            services:
              type: array
              items:
                $ref: "#/components/schemas/ServiceMetadata"
            largestGraphs:
              type: array
              items:
                $ref: "#/components/schemas/Graph"
            openJobs:
              type: array
              items:
                $ref: "#/components/schemas/IndexJob"
    NewDataset:
      type: object
      properties:
        name:
          type: string
          example: knowledge-graph
        displayName:
          type: string
          example: Knowledge Graph
        description:
          type: string
          example: An enterprise knowledge graph.
        accessLevel:
          $ref: "#/components/schemas/AccessLevel"
        license:
          $ref: "#/components/schemas/DatasetLicenseId"
        autogeneratedIdType:
          $ref: "#/components/schemas/AutoGeneratedIdType"
    UpdateDataset:
      type: object
      properties:
        displayName:
          type: string
        description:
          type: string
        name:
          type: string
        accessLevel:
          $ref: "#/components/schemas/AccessLevel"
        license:
          $ref: "#/components/schemas/DatasetLicenseId"
        exampleResources:
          type: array
          items:
            type: string
        tags:
          type: array
          items:
            type: string
        autogeneratedIdType:
          $ref: "#/components/schemas/AutoGeneratedIdType"
        toggles:
          $ref: "#/components/schemas/DatasetToggles"
    Graph:
      type: object
      required:
        - graphName
        - id
        - numberOfStatements
      properties:
        graphName:
          type: string
          example: https://example.org/graph/main
        id:
          type: string
          readOnly: true
          example: 64a1b2c3d4e5f60012345679
        numberOfStatements:
          type: integer
          readOnly: true
          example: 500000
        importedAt:
          type: string
          format: date-time
          readOnly: true
        uploadedAt:
          type: string
          format: date-time
          readOnly: true
        importedFrom:
          type: object
          properties:
            dataset:
              type: string
            graphName:
              type: string
            datasetName:
              type: string
            datasetAvatarUrl:
              type: string
        qualityReport:
          type: object
        qualityReportFor:
          type: string
    ServiceMetadata:
      type: object
      required:
        - type
        - name
        - id
        - status
        - capabilities
        - createdAt
      properties:
        type:
          $ref: "#/components/schemas/ServiceType"
        version:
          type: string
          readOnly: true
        capabilities:
          type: array
          readOnly: true
          items:
            $ref: "#/components/schemas/Capability"
        name:
          type: string
          example: sparql
        id:
          type: string
          readOnly: true
          example: 64a1b2c3d4e5f6001234567a
        numberOfLoadedStatements:
          type: integer
          readOnly: true
        numberOfLoadedGraphs:
          type: integer
          readOnly: true
        numberOfGraphs:
          type: integer
          readOnly: true
        numberOfGraphErrors:
          type: integer
          readOnly: true
        error:
          readOnly: true
          allOf:
            - $ref: "#/components/schemas/ErrorResponse"
        status:
          readOnly: true
          allOf:
            - $ref: "#/components/schemas/ServiceStatus"
        endpoint:
          type: string
          readOnly: true
        outOfSync:
          type: boolean
          readOnly: true
        loadedAt:
          type: string
          format: date-time
          readOnly: true
        createdAt:
          type: string
          format: date-time
          readOnly: true
        config:
          $ref: "#/components/schemas/ServiceConfig"
    ServiceConfig:
      type: object
      description: >
        Service-specific configuration. For Jena services, set `reasonerType`.

        For Elasticsearch services, set `indexTemplates` and/or
        `componentTemplates`.
      properties:
        reasonerType:
          $ref: "#/components/schemas/JenaReasoner"
        indexTemplates:
          type: array
          description: Elasticsearch index templates
          items:
            type: object
            properties:
              name:
                type: string
              index_patterns:
                type: string
        componentTemplates:
          type: array
          description: Elasticsearch component templates (mappings, settings)
          items:
            type: object
            properties:
              name:
                type: string
              template:
                type: object
                properties:
                  mappings:
                    type: object
                  settings:
                    type: object
    CreateService:
      type: object
      required:
        - name
        - type
      properties:
        name:
          type: string
        type:
          $ref: "#/components/schemas/ServiceType"
        config:
          $ref: "#/components/schemas/ServiceConfig"
    UpdateService:
      type: object
      properties:
        name:
          type: string
    ServiceActions:
      type: object
      properties:
        start:
          type: boolean
        sync:
          type: boolean
        restart:
          type: boolean
    ServiceGraphInfo:
      type: object
      required:
        - graphName
        - status
        - statements
      properties:
        graphName:
          type: string
        status:
          $ref: "#/components/schemas/LoadStatus"
        statements:
          type: integer
        error:
          type: string
    Asset:
      type: object
      required:
        - assetName
        - createdAt
        - identifier
        - versions
        - url
      properties:
        assetName:
          type: string
          example: schema-diagram.png
        createdAt:
          type: string
          format: date-time
          readOnly: true
        identifier:
          type: string
          readOnly: true
          example: 64a1b2c3d4e5f6001234567b
        versions:
          type: array
          readOnly: true
          items:
            $ref: "#/components/schemas/AssetVersion"
        url:
          type: string
          readOnly: true
    AssetVersion:
      type: object
      required:
        - id
        - uploadedAt
        - url
        - fileSize
      properties:
        id:
          type: string
          readOnly: true
        uploadedAt:
          type: string
          format: date-time
          readOnly: true
        url:
          type: string
          readOnly: true
        fileSize:
          type: integer
          readOnly: true
          example: 204800
        uploadedBy:
          type: object
          properties:
            name:
              type: string
            accountName:
              type: string
    IndexJob:
      type: object
      required:
        - createdAt
        - datasetId
        - downloadedBytes
        - downloadingProgress
        - files
        - indexedGraphCount
        - indexingProgress
        - jobId
        - skippedFileCount
        - skippedFileNames
        - status
        - type
        - updatedAt
      properties:
        baseIRI:
          type: string
        createdAt:
          type: string
          format: date-time
          readOnly: true
        datasetId:
          type: string
          readOnly: true
        defaultGraphName:
          type: string
        downloadedBytes:
          type: integer
          readOnly: true
        downloadingProgress:
          type: number
          readOnly: true
          example: 1
        downloadUrls:
          type: array
          items:
            type: string
        error:
          readOnly: true
          allOf:
            - $ref: "#/components/schemas/ErrorResponse"
        files:
          type: array
          readOnly: true
          items:
            type: object
            properties:
              fileName:
                type: string
              fileSize:
                type: integer
              sourceFileId:
                type: string
        graphNames:
          type: array
          readOnly: true
          items:
            type: string
        indexedGraphCount:
          type: integer
          readOnly: true
        indexingProgress:
          type: number
          readOnly: true
        jobId:
          type: string
          readOnly: true
          example: 64a1b2c3d4e5f6001234567c
        skippedFileCount:
          type: integer
          readOnly: true
        skippedFileNames:
          type: array
          readOnly: true
          items:
            type: string
        status:
          readOnly: true
          allOf:
            - $ref: "#/components/schemas/IndexJobStatus"
        type:
          $ref: "#/components/schemas/IndexJobType"
        updatedAt:
          type: string
          format: date-time
          readOnly: true
    Hook:
      allOf:
        - $ref: "#/components/schemas/HookCreate"
        - type: object
          required:
            - id
          properties:
            id:
              type: string
              readOnly: true
              example: 64a1b2c3d4e5f6001234567d
    HookCreate:
      type: object
      required:
        - url
        - active
        - payloadFormat
        - onEvents
      properties:
        url:
          type: string
          format: uri
          example: https://example.com/webhook
        active:
          type: boolean
          example: true
        payloadFormat:
          type: string
          enum:
            - JSON
            - formEncoded
          example: JSON
        onEvents:
          type: object
          properties:
            graphImport:
              type: boolean
            linkedDataUpload:
              type: boolean
            fileUpload:
              type: boolean
    WebHookTriggerRecord:
      type: object
      readOnly: true
      properties:
        id:
          type: string
        url:
          type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        statusCode:
          type: integer
          example: 200
        responseText:
          type: string
        errorCode:
          type: string
        errorMessage:
          type: string
        eventName:
          type: string
          example: graphImport
        payloadFormat:
          type: string
        payload:
          type: object
    Query:
      type: object
      required:
        - id
        - name
        - description
        - owner
        - accessLevel
        - service
        - serviceConfig
        - tags
        - link
        - version
        - numberOfVersions
        - createdAt
        - updatedAt
      properties:
        id:
          type: string
          readOnly: true
          example: 64a1b2c3d4e5f6001234567f
        name:
          type: string
          example: top-10-classes
        displayName:
          type: string
          example: Top 10 Classes
        description:
          type: string
          example: Returns the 10 most frequently used RDF classes.
        owner:
          readOnly: true
          allOf:
            - $ref: "#/components/schemas/Account"
        accessLevel:
          $ref: "#/components/schemas/AccessLevel"
        dataset:
          $ref: "#/components/schemas/Dataset"
        service:
          type: string
          readOnly: true
        serviceConfig:
          type: object
          properties:
            type:
              type: string
              enum:
                - speedy
                - virtuoso
                - jena
                - blazegraph
            service:
              type: object
              properties:
                id:
                  type: string
                name:
                  type: string
                type:
                  type: string
        tags:
          type: array
          items:
            type: string
          example:
            - sparql
            - classes
        link:
          type: string
          readOnly: true
        version:
          type: integer
          readOnly: true
          example: 1
        versionsInformation:
          type: array
          readOnly: true
          items:
            $ref: "#/components/schemas/VersionInformation"
        numberOfVersions:
          type: integer
          readOnly: true
          example: 1
        requestConfig:
          $ref: "#/components/schemas/QueryRequestConfig"
        renderConfig:
          $ref: "#/components/schemas/QueryRenderConfig"
        createdAt:
          type: string
          format: date-time
          readOnly: true
        updatedAt:
          type: string
          format: date-time
          readOnly: true
        variables:
          type: array
          items:
            $ref: "#/components/schemas/VariableConfig"
        lastQueriedAt:
          type: string
          format: date-time
          readOnly: true
        executionStats:
          readOnly: true
          allOf:
            - $ref: "#/components/schemas/QueryExecutionStatistics"
    QueryCreate:
      type: object
      required:
        - name
      properties:
        name:
          type: string
        displayName:
          type: string
        description:
          type: string
        accessLevel:
          $ref: "#/components/schemas/AccessLevel"
        dataset:
          type: string
        tags:
          type: array
          items:
            type: string
        serviceConfig:
          type: object
          properties:
            type:
              type: string
            service:
              type: string
        requestConfig:
          type: object
          properties:
            payload:
              type: object
              properties:
                query:
                  type: string
                update:
                  type: string
            headers:
              type: object
              additionalProperties:
                type: string
            ldFrame:
              type: object
        renderConfig:
          $ref: "#/components/schemas/QueryRenderConfig"
        variables:
          type: array
          items:
            $ref: "#/components/schemas/VariableConfig"
    QueryMetaUpdate:
      type: object
      properties:
        name:
          type: string
        displayName:
          type: string
        description:
          type: string
        accessLevel:
          $ref: "#/components/schemas/Ac

# --- truncated at 32 KB (114 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/university-of-amsterdam/refs/heads/main/openapi/university-of-amsterdam-lod-triply-api.yaml