4TU.ResearchData API

Public REST API for the 4TU.ResearchData repository, the science/engineering/design research data repository of the 4TU.Federation, hosted and operated by TU Delft Library. Twelve endpoints verified live and unauthenticated on 2026-08-19: dataset listing, search, retrieval, files and versions on /v2; datasets and depositing groups on /v3; plus the license and category vocabularies. Depositor endpoints under /v2/account/ take an opaque personal bearer token. The /v2 surface is backward compatible with the Figshare v2 API shape as a migration requirement — uuid supersedes the numeric id and usage errors return precise HTTP codes rather than a blanket 400. Datasets carry versioned DataCite DOIs under the 10.4121 prefix and expose ORCID iDs on author records.

Documentation

Specifications

Schemas & Data

Other Resources

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/4tu-researchdata"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

tu-delft-4tu-researchdata-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: 4TU.ResearchData API
  version: v2+v3
  summary: Public read API for the 4TU.ResearchData repository operated by TU Delft Library.
  description: >-
    Public, unauthenticated read interface to the 4TU.ResearchData repository at
    https://data.4tu.nl, the science/engineering/design research data repository of the
    4TU.Federation. The service runs on `djehuty`, open-source repository software written by
    4TU.ResearchData and Nikhef — it is NOT a Figshare, Elsevier Pure, Dataverse or DSpace
    tenancy. The `/v2` surface is deliberately backward compatible with the Figshare v2 API
    shape (differences: `uuid` supersedes `id`, and usage errors return precise HTTP codes
    rather than always 400); `/v3` is djehuty's own surface. Endpoints under `/v2/account/`
    and parts of `/v3` require a personal API token.

    OPERATOR NOTE: data.4tu.nl resolves to 131.180.169.22, inside the RIPE `DUNET` inetnum
    registered to Technische Universiteit Delft, and re3data records TU Delft Library as the
    hosting institution for the 4TU.Federation consortium (with TU Eindhoven, University of
    Twente and Wageningen University as the other partners). It is therefore institution-operated
    infrastructure that is co-owned by a four-university consortium, not a vendor platform.
  contact:
    name: 4TU.ResearchData
    email: researchdata@4tu.nl
    url: https://data.4tu.nl/info/about-4turesearchdata/contact
  license:
    name: EUPL-1.2 (djehuty software)
    url: https://github.com/4TUResearchData/djehuty/blob/main/LICENSE
  termsOfService: https://data.4tu.nl/info/about-4turesearchdata/policies-guidelines
servers:
  - url: https://data.4tu.nl
    description: 4TU.ResearchData production (TU Delft Library operated)
tags:
  - name: Datasets
    description: Published datasets (called "articles" on the Figshare-compatible v2 surface).
  - name: Collections
    description: Curated groupings of published datasets.
  - name: Reference
    description: Controlled vocabularies — licenses, categories and depositing groups.
  - name: Account
    description: Token-authenticated endpoints scoped to a depositor account.
paths:
  /v2/articles:
    get:
      tags: [Datasets]
      operationId: listArticles
      summary: List published datasets
      description: Returns a page of publicly published datasets, newest first by default.
      parameters:
        - { name: limit,  in: query, required: false, schema: { type: integer, minimum: 1, maximum: 1000, default: 10 } }
        - { name: offset, in: query, required: false, schema: { type: integer, minimum: 0 } }
        - { name: order,  in: query, required: false, schema: { type: string, examples: [published_date] } }
        - { name: order_direction, in: query, required: false, schema: { type: string, enum: [asc, desc] } }
        - { name: institution, in: query, required: false, schema: { type: integer } }
      responses:
        '200':
          description: A list of dataset summaries.
          content:
            application/json:
              schema: { type: array, items: { $ref: '#/components/schemas/DatasetSummary' } }
        '404': { $ref: '#/components/responses/NotFound' }
  /v2/articles/search:
    post:
      tags: [Datasets]
      operationId: searchArticles
      summary: Search published datasets
      description: >-
        Full-text and faceted search over published datasets. A GET against this path returns
        405 with the body `Acceptable methods: ['POST']`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                search_for: { type: string }
                limit: { type: integer }
                offset: { type: integer }
                order: { type: string }
                order_direction: { type: string, enum: [asc, desc] }
      responses:
        '200':
          description: Matching dataset summaries.
          content:
            application/json:
              schema: { type: array, items: { $ref: '#/components/schemas/DatasetSummary' } }
        '405': { $ref: '#/components/responses/MethodNotAllowed' }
  /v2/articles/{uuid}:
    get:
      tags: [Datasets]
      operationId: getArticle
      summary: Get one published dataset
      parameters: [ { $ref: '#/components/parameters/Uuid' } ]
      responses:
        '200':
          description: The full dataset record, including files, authors, funding and license.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Dataset' }
        '404': { $ref: '#/components/responses/NotFound' }
  /v2/articles/{uuid}/files:
    get:
      tags: [Datasets]
      operationId: listArticleFiles
      summary: List the files attached to a dataset
      parameters: [ { $ref: '#/components/parameters/Uuid' } ]
      responses:
        '200':
          description: Files, with size and both supplied and computed MD5 checksums.
          content:
            application/json:
              schema: { type: array, items: { $ref: '#/components/schemas/File' } }
        '404': { $ref: '#/components/responses/NotFound' }
  /v2/articles/{uuid}/versions:
    get:
      tags: [Datasets]
      operationId: listArticleVersions
      summary: List the published versions of a dataset
      parameters: [ { $ref: '#/components/parameters/Uuid' } ]
      responses:
        '200':
          description: Version numbers with their canonical API URLs.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    version: { type: integer }
                    url: { type: string, format: uri }
        '404': { $ref: '#/components/responses/NotFound' }
  /v2/collections:
    get:
      tags: [Collections]
      operationId: listCollections
      summary: List published collections
      parameters:
        - { name: limit,  in: query, required: false, schema: { type: integer } }
        - { name: offset, in: query, required: false, schema: { type: integer } }
      responses:
        '200':
          description: A list of collection summaries.
          content:
            application/json:
              schema: { type: array, items: { $ref: '#/components/schemas/CollectionSummary' } }
  /v2/collections/{uuid}:
    get:
      tags: [Collections]
      operationId: getCollection
      summary: Get one published collection
      parameters: [ { $ref: '#/components/parameters/Uuid' } ]
      responses:
        '200':
          description: The full collection record.
          content:
            application/json:
              schema: { type: object }
        '404': { $ref: '#/components/responses/NotFound' }
  /v2/licenses:
    get:
      tags: [Reference]
      operationId: listLicenses
      summary: List the licenses a depositor may apply
      responses:
        '200':
          description: Licenses offered for data and for software deposits.
          content:
            application/json:
              schema: { type: array, items: { $ref: '#/components/schemas/License' } }
  /v2/categories:
    get:
      tags: [Reference]
      operationId: listCategories
      summary: List the subject category taxonomy
      responses:
        '200':
          description: The hierarchical subject taxonomy, with parent UUIDs.
          content:
            application/json:
              schema: { type: array, items: { $ref: '#/components/schemas/Category' } }
  /v3/datasets:
    get:
      tags: [Datasets]
      operationId: listDatasets
      summary: List published datasets (djehuty v3)
      description: >-
        djehuty's own dataset listing. Same record shape as /v2/articles; note that the
        `url` field in each record still points back at the /v2 path.
      parameters:
        - { name: limit,  in: query, required: false, schema: { type: integer } }
        - { name: offset, in: query, required: false, schema: { type: integer } }
        - { name: order,  in: query, required: false, schema: { type: string } }
        - { name: order_direction, in: query, required: false, schema: { type: string, enum: [asc, desc] } }
      responses:
        '200':
          description: A list of dataset summaries.
          content:
            application/json:
              schema: { type: array, items: { $ref: '#/components/schemas/DatasetSummary' } }
  /v3/groups:
    get:
      tags: [Reference]
      operationId: listGroups
      summary: List the depositing institutions
      description: >-
        The consortium partners a dataset can be associated with. Delft University of
        Technology appears here as one group among the 4TU partners — direct evidence that
        this repository is a consortium surface, not a single-institution one.
      responses:
        '200':
          description: Institutional groups with their domain association.
          content:
            application/json:
              schema: { type: array, items: { $ref: '#/components/schemas/Group' } }
  /v2/account/articles:
    get:
      tags: [Account]
      operationId: listAccountArticles
      summary: List the authenticated depositor's datasets
      security: [ { tokenAuth: [] } ]
      responses:
        '200':
          description: Datasets owned by the token holder.
          content:
            application/json:
              schema: { type: array, items: { $ref: '#/components/schemas/DatasetSummary' } }
        '403': { $ref: '#/components/responses/InvalidSessionToken' }
components:
  securitySchemes:
    tokenAuth:
      type: http
      scheme: token
      description: >-
        `Authorization: token YOUR_TOKEN_HERE`. Tokens are issued from the depositor dashboard
        after logging in; there is no OAuth 2.0 flow and no published scope vocabulary.
  parameters:
    Uuid:
      name: uuid
      in: path
      required: true
      description: The dataset or collection UUID. On this repository `uuid` supersedes the Figshare numeric `id`.
      schema: { type: string, format: uuid }
  responses:
    NotFound:
      description: The resource does not exist.
      content:
        application/json:
          schema: { $ref: '#/components/schemas/Error' }
          examples:
            notFound: { value: { message: 'This resource does not exist.' } }
    MethodNotAllowed:
      description: The HTTP method is not permitted on this path.
      content:
        text/plain:
          schema: { type: string }
          examples:
            postOnly: { value: "Acceptable methods: ['POST']" }
    InvalidSessionToken:
      description: No token, or an unrecognised token, was supplied.
      content:
        application/json:
          schema: { $ref: '#/components/schemas/Error' }
          examples:
            invalidToken:
              value: { message: 'Invalid or unknown session token', code: InvalidSessionToken }
  schemas:
    DatasetSummary:
      type: object
      properties:
        id: { type: [integer, 'null'], description: Legacy Figshare numeric id; null on djehuty-native records. }
        uuid: { type: string, format: uuid }
        title: { type: string }
        doi: { type: string, description: 'DataCite DOI under the 10.4121 prefix.' }
        handle: { type: [string, 'null'] }
        url: { type: string, format: uri }
        published_date: { type: [string, 'null'] }
        thumb: { type: [string, 'null'] }
        defined_type: { type: [integer, 'null'] }
        defined_type_name: { type: [string, 'null'] }
        group_id: { type: [integer, 'null'] }
        url_private_api: { type: string, format: uri }
        url_public_api: { type: string, format: uri }
        url_private_html: { type: string, format: uri }
        url_public_html: { type: string, format: uri }
        timeline: { type: object }
        resource_title: { type: [string, 'null'] }
        resource_doi: { type: [string, 'null'] }
    Dataset:
      allOf:
        - $ref: '#/components/schemas/DatasetSummary'
        - type: object
          properties:
            files: { type: array, items: { $ref: '#/components/schemas/File' } }
            authors: { type: array, items: { $ref: '#/components/schemas/Author' } }
            custom_fields: { type: array }
            description: { type: string }
            funding: { type: [string, 'null'] }
            funding_list: { type: array }
            version: { type: integer }
            status: { type: string }
            size: { type: integer }
            created_date: { type: [string, 'null'] }
            modified_date: { type: [string, 'null'] }
            is_public: { type: boolean }
            is_confidential: { type: boolean }
            is_metadata_record: { type: boolean }
            license: { $ref: '#/components/schemas/License' }
            tags: { type: array, items: { type: string } }
            categories: { type: array, items: { $ref: '#/components/schemas/Category' } }
            references: { type: array, items: { type: string } }
            citation: { type: string }
            is_embargoed: { type: boolean }
            embargo_date: { type: [string, 'null'] }
            embargo_type: { type: [string, 'null'] }
            figshare_url: { type: string, format: uri }
    File:
      type: object
      properties:
        id: { type: [integer, 'null'] }
        uuid: { type: string, format: uuid }
        name: { type: string }
        size: { type: integer }
        is_link_only: { type: boolean }
        is_incomplete: { type: boolean }
        download_url: { type: string, format: uri }
        supplied_md5: { type: [string, 'null'] }
        computed_md5: { type: [string, 'null'] }
    Author:
      type: object
      properties:
        uuid: { type: string, format: uuid }
        full_name: { type: string }
        orcid_id: { type: [string, 'null'], description: 'ORCID iD, where the depositor supplied one.' }
        is_active: { type: boolean }
        url_name: { type: [string, 'null'] }
    CollectionSummary:
      type: object
      properties:
        id: { type: [integer, 'null'] }
        uuid: { type: string, format: uuid }
        title: { type: string }
        doi: { type: string }
        handle: { type: string }
        url: { type: string, format: uri }
        timeline: { type: object }
        published_date: { type: [string, 'null'] }
    License:
      type: object
      properties:
        value: { type: integer }
        name: { type: string }
        url: { type: string, format: uri }
        type: { type: string, enum: [data, software] }
    Category:
      type: object
      properties:
        id: { type: integer }
        uuid: { type: string, format: uuid }
        title: { type: string }
        parent_id: { type: [integer, 'null'] }
        parent_uuid: { type: [string, 'null'] }
        path: { type: string }
        source_id: { type: [integer, 'null'] }
        taxonomy_id: { type: [integer, 'null'] }
    Group:
      type: object
      properties:
        id: { type: integer }
        parent_id: { type: [integer, 'null'] }
        name: { type: string }
        association: { type: string, description: 'The partner institution domain, e.g. tudelft.nl.' }
        is_featured: { type: boolean }
    Error:
      type: object
      properties:
        message: { type: string }
        code: { type: string }
x-artifact:
  generated: '2026-08-19'
  method: derived
  source: >-
    Derived from live unauthenticated probes of https://data.4tu.nl on 2026-08-19 (every path,
    parameter, status code and field name in this document was observed in a real response),
    cross-read against the djehuty API documentation at
    https://raw.githubusercontent.com/4TUResearchData/djehuty/main/docs/api.md and
    https://djehuty.4tu.nl/. 4TU.ResearchData publishes no OpenAPI of its own; the djehuty
    repository tree contains no openapi/swagger file (checked via the GitHub trees API,
    575 entries). This is API Evangelist's derivation, not a 4TU artifact.
  x-operator: institution
  x-operator-evidence: >-
    data.4tu.nl -> 131.180.169.22, RIPE inetnum 131.180.0.0/16 netname DUNET,
    org-name "Technische Universiteit Delft". re3data r3d100010216 lists TU Delft Library as
    a hosting institution alongside the 4TU.Federation.