University of Copenhagen CURIS OAI-PMH Repository Interface

A complete, unauthenticated OAI-PMH 2.0 repository operated by the university on its own host. verb=Identify names the repository "University of Copenhagen", gives adminEmail curis@adm.ku.dk and attributes ownership to the org unit "KU Forskning og Informationssikkerhed". curis.ku.dk resolves to 130.226.237.49, inside the same University of Copenhagen /24 as cmsgw.adm.ku.dk and skema.ku.dk — this is the institution's own infrastructure, not the Elsevier tenancy. Six metadata formats (oai_dc, oai_cerif_openaire, mods, xmetadiss, fi-person, ddf-mxd), 7,430 sets, and 440,535 records in oai_dc over openaire_cris_publications. Declares OpenAIRE CERIF compatibility level 1.1.1. The software underneath is Pure 5.30.3-3, but the protocol is an open OpenArchives standard, so the contract described is Copenhagen's deployment of a public standard rather than a vendor's proprietary API.

Operations 1

GET /oai Issue an OAI-PMH 2.0 request #

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/curis-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 email required.

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

OpenAPI Specification

university-of-copenhagen-curis-oai-pmh-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: University of Copenhagen CURIS OAI-PMH Repository Interface
  version: '2.0'
  x-generated: '2026-08-30'
  x-method: derived
  x-operator: institution
  x-source: >-
    Derived entirely from live probes of https://curis.ku.dk/ws/oai run 2026-08-30. Every
    verb, parameter, metadataPrefix, set and error code below was observed in an actual
    response — see examples/university-of-copenhagen-curis-oai-pmh-examples.yml for the
    captured payloads and status codes. Nothing here is inferred from Pure documentation.
  description: >-
    The Open Archives Initiative Protocol for Metadata Harvesting (OAI-PMH) 2.0 interface
    the University of Copenhagen operates over CURIS, its research information system.

    OPERATOR NOTE — this is the one machine-readable research surface at Copenhagen that is
    genuinely the institution's own, and it is worth being precise about why. The public
    research portal at researchprofiles.ku.dk is an Elsevier Pure tenancy: it CNAMEs to
    ku.elsevierpure.com -> eu.prod.elsevierpure.com -> Cloudflare, and its REST contract at
    /ws/api/524/openapi.yaml is Elsevier's document, api-key gated (401). The OAI-PMH
    harvesting endpoint is a different thing on a different machine. curis.ku.dk resolves to
    130.226.237.49, inside the same University of Copenhagen /24 as cmsgw.adm.ku.dk and
    skema.ku.dk. Its Identify response names the repository "University of Copenhagen", gives
    adminEmail curis@adm.ku.dk, and attributes ownership to the org unit "KU Forskning og
    Informationssikkerhed". The protocol it speaks is an open OpenArchives standard, not a
    vendor API. So the contract described here is Copenhagen's deployment of a public
    standard on Copenhagen's own infrastructure, and it is saved under Copenhagen's slug.
    The Pure REST API is NOT saved here; it is recorded in apis.yml as a tenant relationship.

    The endpoint is unauthenticated, serves 440,535 publication records across 7,430 sets in
    six metadata formats, and is the feed by which Copenhagen's research output reaches
    OpenAIRE and the Danish national research database.
  contact:
    name: CURIS — KU Forskning og Informationssikkerhed
    email: curis@adm.ku.dk
    url: https://researchprofiles.ku.dk/
  license:
    name: OAI-PMH 2.0 protocol specification
    url: http://www.openarchives.org/OAI/openarchivesprotocol.html
servers:
  - url: https://curis.ku.dk/ws
    description: >-
      Production CURIS harvesting host, operated by the University of Copenhagen
      (130.226.237.49). Probed 2026-08-30. Note that the host root https://curis.ku.dk/
      returns 503 — presence of the service is established by the protocol response at
      /oai?verb=Identify, never by the landing page.
tags:
  - name: OAI-PMH
    description: The six OAI-PMH 2.0 verbs, all dispatched from a single path by query parameter.
paths:
  /oai:
    get:
      tags: [OAI-PMH]
      operationId: oaiRequest
      summary: Issue an OAI-PMH 2.0 request
      description: >-
        OAI-PMH is a single-endpoint protocol. The `verb` query parameter selects the
        operation; the remaining parameters are conditional on the verb. All six verbs were
        probed live against this host on 2026-08-30 and all six returned a well-formed
        OAI-PMH envelope with HTTP 200 and Content-Type application/xml — including the two
        error cases, which OAI-PMH signals in the body via <error code="..."> rather than by
        HTTP status.
      parameters:
        - name: verb
          in: query
          required: true
          description: The OAI-PMH verb to invoke.
          schema:
            type: string
            enum:
              - Identify
              - ListMetadataFormats
              - ListSets
              - ListIdentifiers
              - ListRecords
              - GetRecord
        - name: metadataPrefix
          in: query
          required: false
          description: >-
            Metadata format to return. Required for GetRecord, ListRecords and
            ListIdentifiers; omitting it returns error code badArgument. The six values below
            are the exact prefixes returned by ListMetadataFormats on this host.
          schema:
            type: string
            enum: [oai_dc, oai_cerif_openaire, mods, xmetadiss, fi-person, ddf-mxd]
        - name: identifier
          in: query
          required: false
          description: >-
            OAI identifier of a single record, required for GetRecord. Observed form is
            `oai:pure.atira.dk:<setSpec>/<uuid>`.
          schema:
            type: string
            examples: ['oai:pure.atira.dk:openaire_cris_publications/39b0bfc0-74bc-11db-bee9-02004c4f4f50']
        - name: set
          in: query
          required: false
          description: >-
            Restrict a list request to one setSpec. 7,430 sets are advertised by ListSets;
            the OpenAIRE CRIS entity sets are the ones a harvester normally wants.
          schema:
            type: string
            examples: [openaire_cris_publications, openaire_cris_persons, openaire_cris_orgunits, openaire_cris_patents]
        - name: from
          in: query
          required: false
          description: >-
            Lower bound on record datestamp. Granularity advertised by Identify is
            YYYY-MM-DDThh:mm:ssZ; earliestDatestamp is 2013-07-05T08:08:50Z.
          schema: {type: string, format: date-time}
        - name: until
          in: query
          required: false
          description: Upper bound on record datestamp, same granularity as `from`.
          schema: {type: string, format: date-time}
        - name: resumptionToken
          in: query
          required: false
          description: >-
            Flow-control token for continuing a paged list request. List responses carry
            <resumptionToken completeListSize="..."> — 440,535 for oai_dc over
            openaire_cris_publications as probed.
          schema: {type: string}
      responses:
        '200':
          description: >-
            A well-formed OAI-PMH 2.0 envelope. Protocol-level failures also arrive as 200
            with an <error code> element rather than a 4xx.
          content:
            application/xml:
              schema:
                $ref: '#/components/schemas/OAIPMHResponse'
components:
  schemas:
    OAIPMHResponse:
      type: object
      description: >-
        Root OAI-PMH element, namespace http://www.openarchives.org/OAI/2.0/. Modelled from
        the captured responses; the authoritative schema is OAI-PMH.xsd at openarchives.org.
      properties:
        responseDate:
          type: string
          format: date-time
          description: UTC timestamp the repository stamped on the response.
        request:
          type: string
          format: uri
          description: Echo of the base URL, with the request arguments as XML attributes.
        error:
          $ref: '#/components/schemas/OAIError'
        Identify:
          $ref: '#/components/schemas/Identify'
      required: [responseDate, request]
    Identify:
      type: object
      description: Repository self-description, captured verbatim from this host on 2026-08-30.
      properties:
        repositoryName: {type: string, examples: ['University of Copenhagen']}
        baseURL: {type: string, format: uri, examples: ['https://curis.ku.dk/ws/oai']}
        protocolVersion: {type: string, examples: ['2.0']}
        adminEmail: {type: string, format: email, examples: ['curis@adm.ku.dk']}
        earliestDatestamp: {type: string, format: date-time, examples: ['2013-07-05T08:08:50Z']}
        deletedRecord: {type: string, enum: [no, persistent, transient], examples: [no]}
        granularity: {type: string, examples: ['YYYY-MM-DDThh:mm:ssZ']}
        description:
          type: object
          description: >-
            Carries an OpenAIRE CERIF profile 1.1 <Service> block declaring compatibility
            level OpenAIRE_Service_Compatibility#1.1.1, the running software version
            (Pure 5.30.3-3) and the owning org unit.
      required: [repositoryName, baseURL, protocolVersion, adminEmail]
    OAIError:
      type: object
      description: Protocol error, returned inside a 200 response.
      properties:
        code:
          type: string
          enum: [badVerb, badArgument, badResumptionToken, cannotDisseminateFormat, idDoesNotExist, noRecordsMatch, noMetadataFormats, noSetHierarchy]
        message: {type: string}
      required: [code]