OSIRIS API Basics
For the separate /portfolio/ endpoints, see Portfolio API Basics. An API overview compares the two APIs.
The OSIRIS API provides programmatic access to research information stored in OSIRIS. It can be used to retrieve activities, projects, persons, organizational structures, events, and other data managed by the system.
Unless stated otherwise, all API endpoints:
- return JSON responses
- use HTTP GET requests
- require authentication via an API key
- follow the standard OSIRIS response format described below
The API is designed to support reporting, system integration, data synchronization, and external presentation of research information.
Authentication
API access is controlled through a configurable API key.
The API key can be provided either as a query parameter:
1 | |
or as an HTTP header:
1 | |
Depending on the OSIRIS configuration, API authentication may be disabled. In this case all API requests are accepted without an API key.
Requests originating from authenticated OSIRIS sessions may also be allowed automatically when Sec-Fetch-Site indicates the same site/origin, or (if that header is absent) the Referer host matches.
Google Scholar and OpenAlex topics currently do not check the API key. Projects and proposals also apply separate session permission checks; a valid key alone does not guarantee access to their records.
Response Format
Successful requests return a JSON object with the following structure:
1 2 3 4 5 | |
Fields
| Field | Description |
|---|---|
status |
Application status code returned in the JSON body |
count |
Endpoint-specific count: usually matching rows before pagination; see exceptions below |
data |
Array or object containing the requested data |
The structure of data depends on the endpoint. Person details and person unit memberships return an object; most other endpoints return arrays. Google Scholar and duplicate detection return direct objects without this envelope.
count has endpoint-specific semantics:
| Endpoints / mode | Meaning of count |
|---|---|
| Most lists | Matching output rows before slicing. Search projections may produce several rows per stored document. |
| Aggregation | Number of groups before slicing. |
| Full streamed exports and activity table | Number of streamed records. |
| Publication HTML | Number returned after the endpoint's own limit. |
| Conferences, events, deadlines, spectrum activities | Currently always 0, even when data contains rows. |
| OpenAlex topics | Number of retained matches, capped at 20, before shared slicing. |
ObjectIDs in full/raw documents use MongoDB Extended JSON ({"$oid":"..."}). Projection-based endpoints often supply a separate string id. The shared response helper and stream writer use JSON_NUMERIC_CHECK, so numeric strings can become JSON numbers. Rendered HTML and labels depend on OSIRIS language and settings.
Examples use illustrative values and abbreviated stored documents. Optional projected fields may be absent when the stored field is missing.
Pagination
Endpoints using the shared response helper read limit and offset:
| Parameter | Type | Description |
|---|---|---|
limit |
integer | Maximum rows returned. A non-positive value disables pagination. |
offset |
integer | Number of rows to skip when limit is used. Defaults to 0; negative values become 0. |
1 | |
For an array response with a positive count and positive limit, the helper skips offset rows and returns up to limit rows. Pagination applies even when count <= limit. An offset at or beyond the end of the array returns data: [].
Paginated responses include integer limit and offset values. count keeps the total supplied by the endpoint before pagination:
1 2 3 4 5 6 7 | |
The array is abbreviated in this example. Without a positive limit, offset is ignored and pagination metadata is omitted. Empty results with count: 0 also omit pagination metadata.
Streamed full exports and the activity table ignore both parameters. Endpoints reporting count: 0 do not slice. Publication HTML applies its own limit during retrieval and has no effective offset. The full person list uses the shared helper rather than streaming.
Filtering
Many endpoints support filtering of results, but parameter support and precedence are endpoint-specific. Sending an unsupported parameter does not automatically filter the response.
The preferred way to provide filters is through the json parameter containing a JSON-encoded MongoDB query.
Example:
1 | |
URL-encoded:
1 | |
With HTTP query parameters, bracket-notation filter values are usually strings. Prefer json when numbers, booleans, or MongoDB operators must retain their types. URL-encode JSON and regular expressions in actual requests. Filters and projections use the underlying stored fields, which can differ from rendered output labels.
Example filter:
1 2 3 4 | |
Supported filter fields depend on the endpoint and underlying data model.
Endpoint-specific documentation may define additional filtering options or restrictions.
Error Handling
Errors are returned as JSON objects.
Example:
1 2 3 4 5 6 | |
Common Error Responses
| Status | Error | Description |
|---|---|---|
400 |
WrongCall |
Invalid request or parameters |
403 |
PermissionDenied |
Missing or invalid API key |
404 |
DataNotFound |
Requested resource could not be found |
Applications consuming enveloped responses should check the JSON status before processing data. The shared helpers do not set the HTTP response status; local tests returned HTTP 200 even for JSON status values 400, 403, and 404. Unhandled database/parameter errors can instead produce non-JSON PHP output or an empty body, so check whether the body is valid JSON as well.
Endpoints
- Activities: compact records, HTML citations, activity table, spectrum, and duplicate detection.
- Persons: list, details, and unit memberships.
- Projects, proposals, and funding-number lookup.
- Conferences, events, and deadlines.
- Journals and full journal records.
- Teaching, infrastructures, and organizations.
- Search and aggregation, with separate pages for all six entity endpoints.
- Google Scholar and OpenAlex topics.
This documentation covers all 27 concrete GET endpoints declared with /api/ in routes/api/api.php. The POST enrichment route is outside this GET endpoint reference.