Spiral Open Access Repository

Spiral is Imperial College London's open-access institutional repository, holding 90,000+ research outputs on the DSpace-CRIS platform. As a DSpace deployment it exposes standard OAI-PMH metadata harvesting and a DSpace REST API. Endpoint paths follow DSpace conventions; large-scale harvesting may be rate-limited.

OpenAPI Specification

imperial-college-london-spiral.yaml Raw ↑
openapi: 3.0.3
info:
  title: Spiral Open Access Repository (DSpace 7 REST API)
  description: >-
    OpenAPI description of the read-oriented, publicly accessible subset of the
    DSpace 7.6.1 REST API powering Imperial College London's Spiral open-access
    repository. The live API root reports `dspaceVersion: DSpace 7.6.1` and
    `crisVersion: cris-2023.02.05`. Responses are HAL+JSON
    (application/hal+json). DSpace does not ship a vendor OpenAPI document; this
    description was authored from the live HAL contract and real responses
    observed at https://spiral.imperial.ac.uk/server/api . Only anonymous,
    read-only endpoints verified against the running instance are included;
    write, workflow, and authenticated administration endpoints are omitted.
  version: 7.6.1
  contact:
    name: Imperial College London - Spiral
    url: https://spiral.imperial.ac.uk/
  license:
    name: DSpace BSD License
    url: https://github.com/DSpace/DSpace/blob/main/LICENSE
servers:
  - url: https://spiral.imperial.ac.uk/server/api
    description: Spiral DSpace 7 REST API (production)
tags:
  - name: Root
    description: API entry point and link index.
  - name: Core
    description: Communities, collections, and items.
  - name: Discover
    description: Search and browse over indexed objects.
paths:
  /:
    get:
      tags:
        - Root
      summary: API root
      description: >-
        Returns the HAL root document listing the DSpace version and the
        navigable `_links` to every API endpoint.
      operationId: getRoot
      responses:
        '200':
          description: Root document.
          content:
            application/hal+json:
              schema:
                $ref: '#/components/schemas/Root'
  /core/communities:
    get:
      tags:
        - Core
      summary: List top-level and all communities
      operationId: getCommunities
      parameters:
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/Size'
      responses:
        '200':
          description: Paginated list of communities.
          content:
            application/hal+json:
              schema:
                $ref: '#/components/schemas/CommunityPage'
  /core/communities/{uuid}:
    get:
      tags:
        - Core
      summary: Get a single community by UUID
      operationId: getCommunity
      parameters:
        - $ref: '#/components/parameters/Uuid'
      responses:
        '200':
          description: A community.
          content:
            application/hal+json:
              schema:
                $ref: '#/components/schemas/Community'
        '404':
          $ref: '#/components/responses/NotFound'
  /core/collections:
    get:
      tags:
        - Core
      summary: List collections
      operationId: getCollections
      parameters:
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/Size'
      responses:
        '200':
          description: Paginated list of collections.
          content:
            application/hal+json:
              schema:
                $ref: '#/components/schemas/HalPage'
  /core/collections/{uuid}:
    get:
      tags:
        - Core
      summary: Get a single collection by UUID
      operationId: getCollection
      parameters:
        - $ref: '#/components/parameters/Uuid'
      responses:
        '200':
          description: A collection.
          content:
            application/hal+json:
              schema:
                $ref: '#/components/schemas/Collection'
        '404':
          $ref: '#/components/responses/NotFound'
  /core/items/{uuid}:
    get:
      tags:
        - Core
      summary: Get a single item by UUID
      operationId: getItem
      parameters:
        - $ref: '#/components/parameters/Uuid'
      responses:
        '200':
          description: An item (a deposited research output).
          content:
            application/hal+json:
              schema:
                $ref: '#/components/schemas/Item'
        '404':
          $ref: '#/components/responses/NotFound'
  /dso/find:
    get:
      tags:
        - Core
      summary: Find a DSpaceObject by UUID
      operationId: dsoFind
      parameters:
        - name: uuid
          in: query
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: The resolved DSpace object.
          content:
            application/hal+json:
              schema:
                $ref: '#/components/schemas/Item'
        '404':
          $ref: '#/components/responses/NotFound'
  /discover/search/objects:
    get:
      tags:
        - Discover
      summary: Search indexed objects
      description: >-
        Full-text and faceted search over indexed DSpace objects. Restrict to a
        type with `dsoType` (e.g. `item`, `collection`, `community`).
      operationId: searchObjects
      parameters:
        - name: query
          in: query
          required: false
          schema:
            type: string
          description: Lucene/Solr query string.
        - name: dsoType
          in: query
          required: false
          schema:
            type: string
            enum: [item, collection, community]
        - name: scope
          in: query
          required: false
          schema:
            type: string
            format: uuid
          description: Restrict the search to a community/collection UUID.
        - name: sort
          in: query
          required: false
          schema:
            type: string
          description: 'Sort spec, e.g. `dc.date.accessioned,DESC`.'
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/Size'
      responses:
        '200':
          description: A discovery search result.
          content:
            application/hal+json:
              schema:
                $ref: '#/components/schemas/SearchResult'
components:
  parameters:
    Page:
      name: page
      in: query
      required: false
      schema:
        type: integer
        minimum: 0
        default: 0
      description: Zero-based page index.
    Size:
      name: size
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 20
      description: Page size.
    Uuid:
      name: uuid
      in: path
      required: true
      schema:
        type: string
        format: uuid
  responses:
    NotFound:
      description: Object not found.
      content:
        application/json:
          schema:
            type: object
            properties:
              timestamp:
                type: string
                format: date-time
              status:
                type: integer
              message:
                type: string
              path:
                type: string
  schemas:
    Root:
      type: object
      properties:
        dspaceUI:
          type: string
          format: uri
        dspaceName:
          type: string
        dspaceServer:
          type: string
          format: uri
        dspaceVersion:
          type: string
          example: DSpace 7.6.1
        crisVersion:
          type: string
          example: cris-2023.02.05
        type:
          type: string
          example: root
        _links:
          type: object
    MetadataValue:
      type: object
      description: A single metadata field value in DSpace's metadata model.
      properties:
        value:
          type: string
        language:
          type: string
          nullable: true
        authority:
          type: string
          nullable: true
        confidence:
          type: integer
        place:
          type: integer
      required:
        - value
    MetadataMap:
      type: object
      description: >-
        Map of Dublin Core / DSpace metadata field keys (e.g. `dc.title`,
        `dc.contributor.author`) to arrays of metadata values.
      additionalProperties:
        type: array
        items:
          $ref: '#/components/schemas/MetadataValue'
    DSpaceObject:
      type: object
      properties:
        id:
          type: string
          format: uuid
        uuid:
          type: string
          format: uuid
        name:
          type: string
        handle:
          type: string
          example: 10044/1/489
        metadata:
          $ref: '#/components/schemas/MetadataMap'
        type:
          type: string
        _links:
          type: object
    Community:
      allOf:
        - $ref: '#/components/schemas/DSpaceObject'
        - type: object
          properties:
            archivedItemsCount:
              type: integer
            type:
              type: string
              example: community
    Collection:
      allOf:
        - $ref: '#/components/schemas/DSpaceObject'
        - type: object
          properties:
            archivedItemsCount:
              type: integer
            type:
              type: string
              example: collection
    Item:
      allOf:
        - $ref: '#/components/schemas/DSpaceObject'
        - type: object
          properties:
            inArchive:
              type: boolean
            discoverable:
              type: boolean
            withdrawn:
              type: boolean
            lastModified:
              type: string
              format: date-time
            entityType:
              type: string
              nullable: true
            type:
              type: string
              example: item
    PageInfo:
      type: object
      properties:
        size:
          type: integer
        totalElements:
          type: integer
        totalPages:
          type: integer
        number:
          type: integer
    HalPage:
      type: object
      properties:
        _embedded:
          type: object
        _links:
          type: object
        page:
          $ref: '#/components/schemas/PageInfo'
    CommunityPage:
      allOf:
        - $ref: '#/components/schemas/HalPage'
        - type: object
          properties:
            _embedded:
              type: object
              properties:
                communities:
                  type: array
                  items:
                    $ref: '#/components/schemas/Community'
    SearchResult:
      type: object
      properties:
        id:
          type: string
          nullable: true
        scope:
          type: string
          nullable: true
        query:
          type: string
          nullable: true
        appliedFilters:
          type: array
          nullable: true
          items:
            type: object
        sort:
          type: object
          nullable: true
        type:
          type: string
          example: discover
        _links:
          type: object
        _embedded:
          type: object
          properties:
            searchResult:
              type: object
              properties:
                _embedded:
                  type: object
                  properties:
                    objects:
                      type: array
                      items:
                        type: object
                        properties:
                          hitHighlights:
                            nullable: true
                            type: object
                          type:
                            type: string
                            example: discover
                          _embedded:
                            type: object
                            properties:
                              indexableObject:
                                $ref: '#/components/schemas/Item'