TUM Research Information API

TUM Research Information API

Access publication and project data from the TUM Pure research information system. Query publications and projects by organization or person with optional type filtering.

Overview

This API provides access to publication and project data from the TUM research information system (Pure). You can retrieve publications and projects associated with specific organizations or persons, with optional filtering by type.

Base URL: https://fisapi.it.tum.de/

Available Data

Publications and projects count only what the API returns (see the notes on each endpoint); authors and organizations count all synced records.

191,546
Publications
2,613
Authors
1,384
Projects
1,286
Organizations

Pagination

/publications and /projects are paginated: 50 items per page by default, at least 10 and at most 100 (per_page). page is capped at 10000. Invalid or out-of-range page/per_page values don't cause an error: a non-numeric value falls back to the default and other values are clamped; the pagination object in the response shows the values used. A page past the last page returns 404. Results are sorted with a stable tie-breaker, so walking the pages neither skips nor repeats records. /publication-types is not paginated.

Caching

Successful responses carry an ETag. Send it back in If-None-Match and you get 304 Not Modified without a body if nothing changed. Cache-Control is private, max-age=60, stale-while-revalidate=300 for /publications and /projects and private, max-age=3600, stale-while-revalidate=86400 for /publication-types; errors are sent with no-store. The server also caches results: up to 5 minutes for publications and projects (the availableTypes list up to 15 minutes), up to 24 hours for /publication-types, so changes in Pure can take that long to appear after they have been synced.

Rate Limits

Requests are limited per API token in fixed 60-second windows (60 requests per minute unless the operator configured otherwise). Over the limit you get 429 with a Retry-After header giving the seconds until the window resets. Repeated failed authentication from one IP address is limited the same way. The search tools on this page are limited per IP address, and the API Tester to 20 requests per minute per IP address.

Methods and CORS

All endpoints are read-only and accept GET and HEAD; other methods get 405 with an Allow: GET, HEAD header. Browsers can call /publications, /projects and /publication-types from the allowed origins (HTTPS pages on the configured domains and their subdomains, plus http://localhost); the CORS preflight (OPTIONS) is answered with 204 without a token.

Authentication

/publications, /projects, /publication-types and /metrics require authentication using a Bearer token. You must include the token in the Authorization header of every request to them. /health and this documentation page need no token.

Need an API token? Contact cio@tum.de to request access.

Using Your Token

Include the token in the Authorization header:

Authorization: Bearer YOUR_API_TOKEN

Example Request

curl -H "Authorization: Bearer YOUR_API_TOKEN" \
     "https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC"

Error Responses

Status Response Description
401 {"error": "Missing Authorization header. Use: Authorization: Bearer <token>"} No token provided, the header isn't Bearer <token>, or the token is longer than 64 characters
401 {"error": "Invalid API token"} Token not recognized
401 {"error": "API token has been revoked"} Token was revoked by administrator
429 {"error": "Rate limit exceeded. Try again later."} Your token's rate limit is used up, or too many failed authentication attempts came from your IP address. Wait for the number of seconds in Retry-After.
503 {"error": "Authentication service unavailable"} The token could not be checked (server-side problem). Retry after the seconds in Retry-After.

All 401 responses include a WWW-Authenticate: Bearer header.

API Endpoints

GET /publications

Retrieve publications by organization or person TUM ID. When querying by organization, publications from all child organizations in the hierarchy are automatically included.

Note: Only publications that are public in Pure are returned: visibility FREE and either workflow step approved or exclusively external organization affiliations (Pure assigns no workflow to those). Entries in intermediate workflow states (entryInProgress, forApproval, forRevalidation) and non-public entries are excluded.

Parameters

Parameter Type Required Description
tumId string Required The TUM ID of the organization or person. Supports multiple IDs separated by commas (e.g., TUS1ABC,TUS2DEF). Max 1000 characters.
by string Required Filter type: org for organization, person for person
type string Optional Filter by publication type, exact match (see available types below). Max 255 characters.
keywords string Optional Filter on the publication's keywords. Max 200 characters. Terms are separated by spaces, commas or semicolons. A publication matches if it has any of the terms (machine learning finds "machine" or "learning"; it is not a phrase search). Words of 3 or more letters/digits match whole indexed words only (no substrings or prefixes), and common stopwords such as "the" or "and" are ignored. Other terms such as AI, e-learning or C# match as whole terms, case-insensitively (at most 5 of them). Single characters are ignored.
year integer Optional Filter by publication year (4-digit, e.g. 2024). Range: 1900-2100.
sort string Optional Sort field: year (publicationDate) or title. Default: year.
order string Optional Sort direction: asc or desc. Default: desc.
page integer Optional Page number for pagination (default: 1, max: 10000)
per_page integer Optional Number of results per page (min: 10, max: 100, default: 50)

Response

{
    "orgTumIds": ["TUS1ABC"],            // or "personTumIds" depending on 'by' parameter
                                         // Array of successfully found TUM IDs
    "pagination": {
        "page": 1,
        "per_page": 50,
        "total": 150,
        "total_pages": 3
    },
    "count": 50,                         // Number of publications in current page
    "sort": "year",                      // active sort field
    "order": "desc",                     // active sort direction
    "availableTypes": ["Article", "Chapter", "Conference contribution"],
                                         // distinct publication types in the filtered set
                                         // (ignores the active type filter, so consumers can switch)
    "filteredByType": "Article",         // only present if type filter was used
    "filteredByKeywords": "machine learning",  // only present if the keywords filter was applied
    "filteredByYear": 2024,              // only present if year filter was used
    "notFoundIds": ["TUS9XYZ"],          // only present if some (not all) IDs were not found
    "publications": [
        {
            "uuid": "12345678-1234-1234-1234-123456789abc",
            "typeDiscriminator": "JournalArticle",
            "title": "Publication Title",
            "subTitle": "Optional Subtitle",
            "abstract": "This paper presents...",
            "keywords": "machine learning; artificial intelligence; healthcare",
            "type": "Article",
            "publicationStatus": "Published",   // Pure's current publication status
            "publicationDate": 2024,             // year of that status (integer); the year filter matches it
            "authors": "Smith, John; Doe, Jane",
            "doi": "10.1234/example.2024.001",
            "pages": "1-15",
            "articleNumber": "e12345",
            "numberOfPages": 15,
            "volume": "42",
            "journalNumber": "3",
            "journalTitle": "Journal of Example Research",
            "issn": "1234-5678",
            "isbn": "978-3-16-148410-0",
            "publisher": "Springer Nature",
            "peerReview": 1,                     // 1, 0, or null if Pure doesn't say
            "openAccess": "Gold",
            "patentNumber": null,            // patent-specific (null for non-patents)
            "ipc": null,                     // patent-specific, IPC codes joined with "; "
            "patentDate": null,              // patent filing/grant date (YYYY-MM-DD)
            "priorityDate": null,            // patent priority date (YYYY-MM-DD)
            "priorityNumber": null,          // patent priority application number
            "country": null,                 // patent jurisdiction (e.g., "Germany")
            "url": "https://portal.fis.tum.de/en/publications/12345678-1234-1234-1234-123456789abc"
        }
    ]
}

Patent records populate the patent-specific fields (e.g. "patentNumber": "WO 2019/243144 A1", "country": "Germany"); they are null for all other publication types. Fields Pure doesn't provide are null or empty. If only some of the given IDs are unknown, the response is 200 and lists them in notFoundIds; if none is known, it is 404.

Available Publication Types

Abstract Anthology Article Book Chapter Comment/debate Commissioned report Conference article Conference contribution Discussion paper Doctoral Thesis Editorial Entry for encyclopedia/dictionary Featured article Foreword/postscript Letter Master's Thesis Meeting Abstract Other contribution Paper Patent Poster Preprint Review article Scientific review Short survey Software Working paper
GET /publication-types

Retrieve all currently available publication types. This endpoint returns a simple list of all publication type values that can be used with the type parameter in the publications endpoint. It applies the same visibility rule as /publications, so it lists only types that /publications can return.

Parameters

This endpoint takes no parameters and is not paginated. The list is cached on the server for up to 24 hours.

Response

{
    "count": 15,
    "types": [
        "Article",
        "Book",
        "Conference",
        "Contribution to Book/Anthology",
        "Patent",
        "Thesis",
        "..."
    ]
}
GET /projects

Retrieve projects by organization or person TUM ID. With by=org, a project matches when its managing organization is one of the given organizations or one of their sub-organizations; participating organizations are not considered. With by=person, a project matches when the person is a participant.

Note: Only projects with Pure workflow step validated are returned. Projects in earlier states (entryInProgress, forApproval, approved, forRevalidation) and projects without a workflow step are excluded.

Parameters

Parameter Type Required Description
tumId string Required The TUM ID of the organization or person. Supports multiple IDs separated by commas (e.g., TUS1ABC,TUS2DEF). Max 1000 characters.
by string Required Filter type: org for organization, person for person
type string Optional Filter by project type, exact match (e.g., "Research"). Max 255 characters.
year integer Optional Filter by project start year (4-digit, e.g. 2024). Range: 1900-2100.
sort string Optional Sort field: year (startDate) or title. Default: year.
order string Optional Sort direction: asc or desc. Default: desc.
page integer Optional Page number for pagination (default: 1, max: 10000)
per_page integer Optional Number of results per page (min: 10, max: 100, default: 50)

Response

{
    "orgTumIds": ["TUS1ABC"],     // or "personTumIds" depending on 'by' parameter
                                  // Array of successfully found TUM IDs
    "pagination": {
        "page": 1,
        "per_page": 50,
        "total": 75,
        "total_pages": 2
    },
    "count": 50,                  // Number of projects in current page
    "sort": "year",               // active sort field
    "order": "desc",              // active sort direction
    "filteredByType": "Research", // only present if type filter was used
    "filteredByYear": 2024,       // only present if year filter was used
    "notFoundIds": ["TUS9XYZ"],   // only present if some (not all) IDs were not found
    "projects": [
        {
            "uuid": "...",
            "title": "Project Title",
            "description": "Project description...",
            "type": "Research",
            "startDate": "2020-01-01",
            "endDate": "2023-12-31",
            "managingOrgUuid": "...",              // UUID of the managing organization
            "url": "https://gepris.dfg.de/...",    // first external link in Pure (may be empty)
            "portalUrl": "https://portal.fis.tum.de/en/projects/..."
        }
    ]
}

The keywords parameter is not supported for projects and is ignored.

GET /health

Database liveness check for load balancers and monitoring. No authentication, no rate limit.

Response

// 200 OK
{"status": "healthy", "checks": {"database": "up"}}

// 503 Service Unavailable
{"status": "unhealthy", "checks": {"database": "down"}}
GET /metrics

Prometheus metrics in text format (text/plain; version=0.0.4): request counters and latency histograms per endpoint, database status, record counts and last sync times. Requires a Bearer token and counts against its rate limit.

Tools

Search for organization TUM IDs by name. Enter part of the organization name to find matching entries.

Enter a search term to find organizations.

Search for person TUM IDs by name. Enter part of the person's first or last name to find matching entries.

Enter a search term to find authors.

Test API endpoints interactively. Build queries using the form below or enter a complete URL directly.

Query Builder

Note: The API Tester uses an internal token for demonstration purposes. To test with your own token, use curl or your preferred HTTP client.

Use these type values with the type parameter to filter publications.

Type Value Example Usage
Abstract /publications?by=org&tumId=...&type=Abstract
Anthology /publications?by=org&tumId=...&type=Anthology
Article /publications?by=org&tumId=...&type=Article
Book /publications?by=org&tumId=...&type=Book
Chapter /publications?by=org&tumId=...&type=Chapter
Comment/debate /publications?by=org&tumId=...&type=Comment%2Fdebate
Commissioned report /publications?by=org&tumId=...&type=Commissioned+report
Conference article /publications?by=org&tumId=...&type=Conference+article
Conference contribution /publications?by=org&tumId=...&type=Conference+contribution
Discussion paper /publications?by=org&tumId=...&type=Discussion+paper
Doctoral Thesis /publications?by=org&tumId=...&type=Doctoral+Thesis
Editorial /publications?by=org&tumId=...&type=Editorial
Entry for encyclopedia/dictionary /publications?by=org&tumId=...&type=Entry+for+encyclopedia%2Fdictionary
Featured article /publications?by=org&tumId=...&type=Featured+article
Foreword/postscript /publications?by=org&tumId=...&type=Foreword%2Fpostscript
Letter /publications?by=org&tumId=...&type=Letter
Master's Thesis /publications?by=org&tumId=...&type=Master%27s+Thesis
Meeting Abstract /publications?by=org&tumId=...&type=Meeting+Abstract
Other contribution /publications?by=org&tumId=...&type=Other+contribution
Paper /publications?by=org&tumId=...&type=Paper
Patent /publications?by=org&tumId=...&type=Patent
Poster /publications?by=org&tumId=...&type=Poster
Preprint /publications?by=org&tumId=...&type=Preprint
Review article /publications?by=org&tumId=...&type=Review+article
Scientific review /publications?by=org&tumId=...&type=Scientific+review
Short survey /publications?by=org&tumId=...&type=Short+survey
Software /publications?by=org&tumId=...&type=Software
Working paper /publications?by=org&tumId=...&type=Working+paper

Usage Examples

Get all available publication types

GET https://fisapi.it.tum.de/publication-types

Get all publications by organization

GET https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC

Get all publications by person

GET https://fisapi.it.tum.de/publications?by=person&tumId=go42tum

Get publications from multiple orgs

GET https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC,TUS2DEF

Get publications from multiple authors

GET https://fisapi.it.tum.de/publications?by=person&tumId=go42tum,ab12tum

Get only articles by organization

GET https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&type=Article

Get conference papers by person

GET https://fisapi.it.tum.de/publications?by=person&tumId=go42tum&type=Conference

Filter by keywords

GET https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&keywords=machine%20learning

Combine type and keywords filters

GET https://fisapi.it.tum.de/publications?by=person&tumId=go42tum&type=Article&keywords=AI

Filter publications by year

GET https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&year=2024

Filter projects by start year

GET https://fisapi.it.tum.de/projects?by=org&tumId=TUS1ABC&year=2024

Sort publications by title (A-Z)

GET https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&sort=title&order=asc

Sort projects by year (oldest first)

GET https://fisapi.it.tum.de/projects?by=org&tumId=TUS1ABC&sort=year&order=asc

Get all projects by organization

GET https://fisapi.it.tum.de/projects?by=org&tumId=TUS1ABC

Get all projects by person

GET https://fisapi.it.tum.de/projects?by=person&tumId=go42tum

Get projects from multiple orgs

GET https://fisapi.it.tum.de/projects?by=org&tumId=TUS1ABC,TUS2DEF

Get projects from multiple persons

GET https://fisapi.it.tum.de/projects?by=person&tumId=go42tum,ab12tum

Get second page of publications

GET https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&page=2

Get 25 publications per page

GET https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&per_page=25

Combine pagination with filters

GET https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&type=Article&page=3&per_page=20

JavaScript Example

// API token - replace with your actual token
const API_TOKEN = 'YOUR_API_TOKEN';

// Helper function to make authenticated requests
async function apiFetch(url) {
    const response = await fetch(url, {
        headers: {
            'Authorization': `Bearer ${API_TOKEN}`
        }
    });
    if (!response.ok) {
        throw new Error(`API error: ${response.status}`);
    }
    return response.json();
}

// Fetch all available publication types
async function getPublicationTypes() {
    const url = 'https://fisapi.it.tum.de/publication-types';
    const data = await apiFetch(url);

    console.log(`Found ${data.count} publication types`);
    return data.types;
}

// Example usage
getPublicationTypes()
    .then(types => {
        console.log('Available types:', types);
    });

// Fetch publications for one or more organizations
async function getOrgPublications(orgTumIds, options = {}) {
    // orgTumIds can be a string or an array
    const ids = Array.isArray(orgTumIds) ? orgTumIds.join(',') : orgTumIds;
    let url = `https://fisapi.it.tum.de/publications?by=org&tumId=${ids}`;

    if (options.type) {
        url += `&type=${encodeURIComponent(options.type)}`;
    }
    if (options.keywords) {
        url += `&keywords=${encodeURIComponent(options.keywords)}`;
    }
    if (options.year) {
        url += `&year=${encodeURIComponent(options.year)}`;
    }
    if (options.sort) {
        url += `&sort=${encodeURIComponent(options.sort)}`;
    }
    if (options.order) {
        url += `&order=${encodeURIComponent(options.order)}`;
    }
    if (options.page) {
        url += `&page=${options.page}`;
    }
    if (options.per_page) {
        url += `&per_page=${options.per_page}`;
    }

    const data = await apiFetch(url);

    console.log(`Found ${data.pagination.total} total publications`);
    console.log(`Page ${data.pagination.page} of ${data.pagination.total_pages}`);
    if (data.notFoundIds && data.notFoundIds.length > 0) {
        console.log(`Not found: ${data.notFoundIds.join(', ')}`);
    }
    return data;
}

// Example usage - single organization with type filter
getOrgPublications('TUS1ABC', { type: 'Article' })
    .then(data => {
        data.publications.forEach(pub => {
            console.log(`${pub.title} (${pub.publicationDate})`);
        });
    });

// Example usage - filter by keywords with pagination
getOrgPublications('TUS1ABC', { keywords: 'machine learning', page: 1, per_page: 25 })
    .then(data => {
        console.log(`Showing ${data.count} of ${data.pagination.total} results`);
        data.publications.forEach(pub => {
            console.log(`${pub.title} - Keywords: ${pub.keywords}`);
        });
    });

// Example usage - combine type and keywords filters with pagination
getOrgPublications('TUS1ABC', { type: 'Article', keywords: 'AI', page: 2 })
    .then(data => {
        data.publications.forEach(pub => {
            console.log(`${pub.title} (${pub.publicationDate})`);
        });
    });

cURL Example

# Set your API token (replace with your actual token)
TOKEN="YOUR_API_TOKEN"

# Get all available publication types
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publication-types"

# Get all publications for an organization
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC"

# Get publications from multiple organizations
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC,TUS2DEF"

# Get only journal articles
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&type=Article"

# Filter by keywords
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&keywords=machine%20learning"

# Combine type and keywords filters
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=person&tumId=go42tum&type=Article&keywords=AI"

# Filter publications by year
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&year=2024"

# Filter projects by start year
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/projects?by=org&tumId=TUS1ABC&year=2024"

# Sort publications alphabetically by title
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&sort=title&order=asc"

# Sort projects by year ascending
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/projects?by=org&tumId=TUS1ABC&sort=year&order=asc"

# Get publications for a person
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=person&tumId=go42tum"

# Get publications from multiple persons
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=person&tumId=go42tum,ab12tum"

# Get all projects for an organization
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/projects?by=org&tumId=TUS1ABC"

# Get projects from multiple organizations
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/projects?by=org&tumId=TUS1ABC,TUS2DEF"

# Get projects for a person
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/projects?by=person&tumId=go42tum"

# Get projects from multiple persons
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/projects?by=person&tumId=go42tum,ab12tum"

# Get second page of publications (50 per page by default)
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&page=2"

# Get 25 publications per page
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&per_page=25"

# Combine pagination with filters
curl -H "Authorization: Bearer $TOKEN" \
     "https://fisapi.it.tum.de/publications?by=org&tumId=TUS1ABC&type=Article&page=3&per_page=20"

PHP Example

// API token - replace with your actual token
define('API_TOKEN', 'YOUR_API_TOKEN');

// Helper function to make authenticated API requests
function apiFetch($url) {
    $context = stream_context_create([
        'http' => [
            'header' => 'Authorization: Bearer ' . API_TOKEN
        ]
    ]);
    $response = file_get_contents($url, false, $context);
    return json_decode($response, true);
}

// Fetch all available publication types
function fetchPublicationTypes() {
    $url = 'https://fisapi.it.tum.de/publication-types';
    $data = apiFetch($url);
    return $data['types'];
}

// Example usage
$types = fetchPublicationTypes();
echo "Available publication types:\n";
foreach ($types as $type) {
    echo "- $type\n";
}

// Fetch publications using PHP
function fetchPublications($tumIds, $by = 'org', $options = []) {
    $baseUrl = 'https://fisapi.it.tum.de/publications';

    // Handle both string and array inputs
    $ids = is_array($tumIds) ? implode(',', $tumIds) : $tumIds;

    $params = [
        'tumId' => $ids,
        'by' => $by
    ];

    if (!empty($options['type'])) {
        $params['type'] = $options['type'];
    }

    if (!empty($options['keywords'])) {
        $params['keywords'] = $options['keywords'];
    }

    if (!empty($options['year'])) {
        $params['year'] = $options['year'];
    }

    if (!empty($options['sort'])) {
        $params['sort'] = $options['sort'];
    }

    if (!empty($options['order'])) {
        $params['order'] = $options['order'];
    }

    if (!empty($options['page'])) {
        $params['page'] = $options['page'];
    }

    if (!empty($options['per_page'])) {
        $params['per_page'] = $options['per_page'];
    }

    $url = $baseUrl . '?' . http_build_query($params);

    return apiFetch($url);
}

// Example usage - single organization with type filter
$data = fetchPublications('TUS1ABC', 'org', ['type' => 'Article']);
echo "Found " . $data['pagination']['total'] . " articles total\n";
echo "Showing page " . $data['pagination']['page'] . " of " . $data['pagination']['total_pages'] . "\n";

foreach ($data['publications'] as $pub) {
    echo "- " . $pub['title'] . "\n";
}

// Example usage - filter by keywords with pagination
$data = fetchPublications('TUS1ABC', 'org', [
    'keywords' => 'machine learning',
    'page' => 1,
    'per_page' => 25
]);
echo "Found " . $data['pagination']['total'] . " publications about machine learning\n";
echo "Showing " . $data['count'] . " results on this page\n";

foreach ($data['publications'] as $pub) {
    echo "- " . $pub['title'] . " (Keywords: " . $pub['keywords'] . ")\n";
}

// Example usage - combine type and keywords filters with pagination
$data = fetchPublications('TUS1ABC', 'org', [
    'type' => 'Article',
    'keywords' => 'AI',
    'page' => 2
]);
echo "Page 2 - Found " . $data['count'] . " articles about AI\n";

Error Responses

Errors are JSON objects of the form {"error": "<message>"}, sent with Cache-Control: no-store. Some add fields, as noted below. Method and authentication checks (405, 401, 429, 503) run first; the parameter checks run in the order listed.

Status Code Error Description
400 tumId parameter too long (max 1000 chars) The tumId parameter exceeds 1000 characters
400 type parameter too long (max 255 chars) The type parameter exceeds 255 characters
400 keywords parameter too long (max 200 chars) The keywords parameter exceeds 200 characters (/publications only)
400 Invalid year parameter (must be a 4-digit year between 1900 and 2100) The year parameter is not a 4-digit year between 1900 and 2100
400 Invalid sort parameter (must be "year" or "title") The sort parameter must be "year" or "title"
400 Invalid order parameter (must be "asc" or "desc") The order parameter must be "asc" or "desc"
400 Missing required parameter: tumId The tumId parameter was not provided or is empty
400 Missing or invalid parameter: by (must be "person" or "org") The by parameter must be "org" or "person"
401 Missing Authorization header. Use: Authorization: Bearer <token> No valid Authorization: Bearer header was sent (see Authentication)
401 Invalid API token The provided token is not valid
401 API token has been revoked The token was revoked by an administrator
404 No persons found with provided tumIds None of the given person IDs is known. The response adds notFoundIds.
404 No organizations found with provided tumIds None of the given organization IDs is known. The response adds notFoundIds.
404 Page N out of range; total_pages is M The requested page is past the last page. The response adds the pagination object.
405 Method not allowed Only GET and HEAD are accepted (see the Allow header)
429 Rate limit exceeded. Try again later. Rate limit used up; wait for the seconds in Retry-After
500 Internal server error An unexpected server-side error occurred
500 Database error A database query failed
503 Service temporarily unavailable The database can't be reached; retry after the seconds in Retry-After
503 Authentication service unavailable The token could not be checked; retry after the seconds in Retry-After

API Tester and Search Tools

The tools on this page return these additional errors:

Status Code Error Description
403 Cross-origin request not allowed The tools only answer requests made from this page
429 Rate limit exceeded. Try again later. Per-IP limit of the tool used up
503 API Tester is not available on this server The API Tester is not set up on this server
503 API Tester is busy, try again in a few seconds Too many tester requests at once
502 Failed to connect to API The tester could not reach the API

Otherwise the API Tester shows the API's own response, including its status code.