University of Bristol Research Portal OAI-PMH

The one institution-operated, keyless, machine-readable API surface the University of Bristol publishes. OAI-PMH 2.0 metadata harvesting for the University of Bristol Research Portal, served from the university's own registrable domain under its own identifier namespace (oai:research-information.bris.ac.uk:...). Seven metadata formats are supported — mods, qdc, oai_dc, oai_cerif_openaire (OpenAIRE CERIF profile 1.2), xmetadiss, nl_didl and uketd_dc — across 3,878 sets, and ListRecords with oai_dc reports a completeListSize of 590,974 with a page size of 100. Five of the six verbs execute anonymously; Identify returns HTTP 500 with a Pure HTML error page, so the repository cannot describe itself, and that defect is recorded rather than smoothed over. The research-information system behind the portal is Elsevier Pure, but this interface is an open protocol on the institution's host under the institution's identity — Elsevier's own product API at /ws/api is a separate, vendor-owned surface and is recorded below as a tenant relationship, not as Bristol's.

Operations 1

GET / OAI-PMH 2.0 request #

Documentation

Specifications

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/research-portal-oai-pmh"
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 form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

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

OpenAPI Specification

university-of-bristol-research-portal-oai-pmh-openapi.yml Raw ↑
# authorship: derived by API Evangelist from live, unauthenticated probes of the endpoint
# on 2026-08-30. The University of Bristol publishes no such document; this is OURS, not theirs.
# x-method: derived
# x-source-url: https://research-information.bris.ac.uk/ws/oai
openapi: 3.1.0
info:
  title: University of Bristol Research Portal OAI-PMH
  summary: Institution-operated OAI-PMH 2.0 metadata harvesting interface for the University of Bristol Research Portal.
  description: |-
    Keyless, public OAI-PMH 2.0 harvesting interface operated by the University of Bristol at
    `research-information.bris.ac.uk`, on the university's own registrable domain (`bris.ac.uk`).

    OPERATOR: The research-information system behind this portal is Elsevier Pure. THIS interface
    is the OpenArchives OAI-PMH 2.0 protocol served from the institution's own host under the
    institution's own identifier namespace (`oai:research-information.bris.ac.uk:...`), which is
    the operator distinction this description turns on. Elsevier's own product API is a DIFFERENT
    surface at `/ws/api` — `info.title: "Pure API"`, `info.contact.email: pure-support@elsevier.com`,
    `servers: [{url: /ws/api}]`, 826 paths, api-key gated (verified 2026-08-30 by fetching
    https://research-information.bris.ac.uk/ws/api/openapi.json, 200, 1,740,065 bytes). That is the
    VENDOR's contract, is recorded in apis.yml as a tenant relationship, and is deliberately NOT
    described here.

    PROVENANCE: The University of Bristol publishes no OpenAPI description of this endpoint. This
    document was DERIVED from live, unauthenticated probes on 2026-08-30 — every operation,
    parameter, metadata prefix, set and error code below was observed in an actual response.
    Nothing is inferred from documentation or from another institution's deployment.

    OBSERVED AT PROBE TIME (2026-08-30):
      * 7 metadata formats: `mods` (MODS 3.8), `qdc`, `oai_dc`, `oai_cerif_openaire`
        (OpenAIRE CERIF profile 1.2), `xmetadiss`, `nl_didl`, `uketd_dc` (EThOS/UKETD).
      * 3,878 sets, including the seven OpenAIRE CRIS sets
        (`openaire_cris_publications`, `_patents`, `_persons`, `_orgunits`, `_events`,
        `_equipments`, `_products`), the Pure sets `persons:all`, `publications:all`,
        `publications:withFiles`, and per-year variants.
      * `completeListSize` of 590,974 for `ListIdentifiers`/`ListRecords` with `oai_dc`;
        page size 100 with a `resumptionToken`.
      * `completeListSize` of 9,750 for `openaire_cris_persons` under `oai_cerif_openaire`.
      * Every response advertises the OpenAIRE CERIF 1.2 profile in `xsi:schemaLocation`.

    TWO DEFECTS OBSERVED AND REPORTED AS OBSERVED, not smoothed over:
      1. `?verb=Identify` returns **HTTP 500** with a `text/html` Pure error page instead of an
         OAI-PMH `Identify` response. The mandatory OAI-PMH 2.0 self-description verb is therefore
         unavailable, which means `repositoryName`, `adminEmail`, `earliestDatestamp`,
         `deletedRecord` policy and `granularity` cannot be read from the repository itself.
      2. `?verb=ListRecords&metadataPrefix=oai_cerif_openaire&set=openaire_cris_persons` returns a
         `200` with an EMPTY `<ListRecords>` carrying only a `resumptionToken`
         (`completeListSize="9750"`) — a first page with zero records.

    OAI-PMH returns HTTP 200 for protocol-level errors and signals the condition in an
    `<error code="...">` element. Four error codes were provoked and observed; see errors/.
  version: '2.0'
  contact:
    name: University of Bristol Research Information Support
    url: https://research-information.bris.ac.uk/
  license:
    name: OpenArchives Initiative Protocol for Metadata Harvesting 2.0
    url: https://www.openarchives.org/OAI/openarchivesprotocol.html
  x-provenance:
    generated: '2026-08-30'
    method: derived
    source: live unauthenticated probes of https://research-information.bris.ac.uk/ws/oai
  x-operator: institution
servers:
  - url: https://research-information.bris.ac.uk/ws/oai
    description: University of Bristol Research Portal OAI-PMH 2.0 base URL (keyless)
tags:
  - name: OAI-PMH
    description: OpenArchives Initiative Protocol for Metadata Harvesting 2.0 verbs.
paths:
  /:
    get:
      tags: [OAI-PMH]
      summary: OAI-PMH 2.0 request
      operationId: oaiPmhRequest
      description: |-
        Single OAI-PMH 2.0 endpoint. The `verb` query parameter selects the operation. All six
        verbs execute anonymously; no API key, token or affiliation is required.

        `Identify` is the one verb that does NOT work on this deployment: it returned HTTP 500 with
        an HTML error page on 2026-08-30. Every other verb returned a well-formed OAI-PMH XML
        document.
      parameters:
        - name: verb
          in: query
          required: true
          description: The OAI-PMH verb to execute.
          schema:
            type: string
            enum:
              - Identify
              - ListMetadataFormats
              - ListSets
              - ListIdentifiers
              - ListRecords
              - GetRecord
          examples:
            listSets:
              value: ListSets
        - name: metadataPrefix
          in: query
          required: false
          description: |-
            Metadata format. Required for `ListIdentifiers`, `ListRecords` and `GetRecord`.
            Seven prefixes were observed as supported.
          schema:
            type: string
            enum: [mods, qdc, oai_dc, oai_cerif_openaire, xmetadiss, nl_didl, uketd_dc]
        - name: identifier
          in: query
          required: false
          description: OAI identifier of a single record. Required for `GetRecord`.
          schema:
            type: string
            examples:
              - oai:research-information.bris.ac.uk:openaire_cris_publications/8f9e7938-b6d4-4aa4-8a5e-6acccbe922a9
        - name: set
          in: query
          required: false
          description: |-
            Set to restrict a selective harvest to. 3,878 sets were observed. An unsupported value
            returns `badArgument`, not `noSetHierarchy`.
          schema:
            type: string
            examples:
              - openaire_cris_publications
              - publications:withFiles
        - name: from
          in: query
          required: false
          description: Lower bound of the datestamp range for selective harvesting.
          schema:
            type: string
            examples: ['2025-01-01T00:00:00Z']
        - name: until
          in: query
          required: false
          description: Upper bound of the datestamp range for selective harvesting.
          schema:
            type: string
            examples: ['2026-01-01T00:00:00Z']
        - name: resumptionToken
          in: query
          required: false
          description: |-
            Flow-control token from a previous incomplete list. Exclusive — combining it with
            `metadataPrefix` returns `badArgument` ("resumptionToken is exclusive!").
          schema:
            type: string
            examples: ['oai_dc/590974/496378582/100/0/641556/x/x/x']
      responses:
        '200':
          description: |-
            An OAI-PMH 2.0 XML response. Protocol-level failures are ALSO returned as 200 with an
            `<error code="...">` element — read the body, not the status.
          content:
            text/xml:
              schema:
                type: string
                contentMediaType: text/xml
              examples:
                listSets:
                  summary: ListSets (observed 2026-08-30)
                  externalValue: https://research-information.bris.ac.uk/ws/oai?verb=ListSets
                badVerb:
                  summary: Protocol error carried inside a 200
                  externalValue: https://research-information.bris.ac.uk/ws/oai?verb=Bogus
        '500':
          description: |-
            Observed for `?verb=Identify` only. Returns a `text/html` Pure error page titled
            "500 Internal server error", not an OAI-PMH document.
          content:
            text/html:
              schema:
                type: string