Programmatic access to Future Science data and submission endpoints
The Future Science Public API provides free, read-only access to all published initiatives and contributions on the platform. No authentication is required. All responses are returned in JSON format.
All API endpoints are available under the following base path:
https://future-science.org/api/v1/public/No authentication is required. The public API is open to everyone. All endpoints are read-only.
List endpoints paginate with cursor (1-indexed page) and limit (max 100). The common page/pageSize aliases are also accepted. Walking every page returns the full collection. The response includes a meta object with pagination details.
| Parameter | Type | Description |
|---|---|---|
cursor | number | Page number, 1-indexed (alias: page). Starts at 1. |
limit | number | Number of items per page (1–100, default 10). Alias: pageSize. |
page | number | Alias for cursor — page number, 1-indexed (starts at 1). |
pageSize | number | Alias for limit — number of items per page (1–100, default 10). |
search | string | Search term to filter results by text content |
sort | string | Sort field and order (e.g. publishedAt:desc, id:desc, createdAt:asc) |
{
"meta": {
"pagination": {
"page": 1,
"pageSize": 10,
"total": 42,
"pageCount": 5,
"self": "https://future-science.org/api/v1/public/contributions?cursor=1&limit=10",
"first": "https://future-science.org/api/v1/public/contributions?cursor=1&limit=10",
"last": "https://future-science.org/api/v1/public/contributions?cursor=5&limit=10",
"next": "https://future-science.org/api/v1/public/contributions?cursor=2&limit=10",
"prev": null
}
}
}Each list response also includes absolute navigation links — self, first, last, next and prev (next/prev are null at the ends) — so you can walk the whole collection without building URLs by hand.
Pass ?include=content to contribution endpoints to inline each paper's manuscript as markdown under a content field, read directly from object storage. content is null when no manuscript file exists. Content pages are heavier, so limit defaults to 20 and is capped at 50, and these responses are never cached. File URLs (submittedFiles.file.url and cover.url) are returned as absolute URLs.
GET /api/v1/public/contributions/:id?include=content{
"data": {
"id": 10,
"documentId": "xyz789abc012",
"title": "Toward Open Peer Review",
"submittedFiles": {
"file": { "url": "https://future-science.org/strapi/uploads/paper.md" }
},
"content": "# Toward Open Peer Review\n\n..."
}
}The global GET /contributions endpoint can be narrowed to a single initiative using Strapi-style bracketed filter parameters. Filter by the initiative slug, documentId, or numeric id (only the $eq operator is supported):
GET /api/v1/public/contributions?filters[initiative][slug][$eq]=mirror
GET /api/v1/public/contributions?filters[initiative][documentId][$eq]=abc123def456
GET /api/v1/public/contributions?filters[initiative][id][$eq]=12The filter is applied server-side and reflected in the total and pageCount, and is preserved across the pagination links. A filter that matches nothing returns an empty data array with total 0 (a normal 200, not an error). The same initiative a contribution is filtered by is the one returned in its initiative field.
/api/v1/public/initiativesReturns a paginated list of all published initiatives with their metadata.
| Parameter | Type | Description |
|---|---|---|
cursor | number | Page number, 1-indexed (alias: page). Starts at 1. |
limit | number | Number of items per page (1–100, default 10). Alias: pageSize. |
page | number | Alias for cursor — page number, 1-indexed (starts at 1). |
pageSize | number | Alias for limit — number of items per page (1–100, default 10). |
search | string | Search term to filter results by text content |
sort | string | Sort field and order (e.g. publishedAt:desc, id:desc, createdAt:asc) |
{
"data": [
{
"id": 1,
"documentId": "abc123def456",
"title": "Archive of Academic Commentary",
"type": "Open Review Archive",
"presentation": "An open archive for...",
"logo": { "url": "/strapi/uploads/logo.png" },
"leadEditor": {
"firstName": "Jane",
"lastName": "Doe",
"institution": "University of Example"
},
"editorialBoard": [...],
"supportingDocuments": [...],
"publishedAt": "2025-06-15T10:30:00.000Z"
}
],
"meta": {
"pagination": {
"page": 1, "pageSize": 10,
"total": 8, "pageCount": 1
}
}
}/api/v1/public/initiatives/:idReturns a single published initiative by its document ID. Its contributions are not inlined on this response — enumerate them via the dedicated, paginated endpoint below.
| Parameter | Type | Description |
|---|---|---|
id | string | The document ID of the resource |
{
"data": {
"id": 1,
"documentId": "abc123def456",
"title": "Archive of Academic Commentary",
"type": "Open Review Archive",
"presentation": "An open archive for...",
"logo": { "url": "/strapi/uploads/logo.png" },
"leadEditor": {
"firstName": "Jane",
"lastName": "Doe",
"institution": "University of Example",
"links": [{ "url": "https://..." }]
},
"editorialBoard": [
{ "firstName": "John", "lastName": "Smith", ... }
],
"supportingDocuments": [...],
"institutionalPartners": [...],
"publishedAt": "2025-06-15T10:30:00.000Z"
}
}/api/v1/public/initiatives/:id/contributionsReturns a paginated list of a single initiative's published contributions. Walk every page to enumerate the full set.
| Parameter | Type | Description |
|---|---|---|
id | string | The document ID of the resource |
cursor | number | Page number, 1-indexed (alias: page). Starts at 1. |
limit | number | Number of items per page (1–100, default 10). Alias: pageSize. |
page | number | Alias for cursor — page number, 1-indexed (starts at 1). |
pageSize | number | Alias for limit — number of items per page (1–100, default 10). |
search | string | Search term to filter results by text content |
sort | string | Sort field and order (e.g. publishedAt:desc, id:desc, createdAt:asc) |
include | string | Set to content to inline each contribution's manuscript markdown (contribution endpoints only). When inlining content, limit defaults to 20 and is capped at 50. |
{
"data": [
{
"id": 10,
"documentId": "xyz789abc012",
"title": "Toward Open Peer Review",
"type": "Article",
"author": { "firstName": "Jane", "lastName": "Doe" },
"publishedAt": "2025-07-01T08:00:00.000Z"
}
],
"meta": {
"pagination": {
"page": 1, "pageSize": 10,
"total": 595, "pageCount": 60
}
}
}/api/v1/public/contributionsReturns a paginated list of all published contributions with their metadata.
| Parameter | Type | Description |
|---|---|---|
cursor | number | Page number, 1-indexed (alias: page). Starts at 1. |
limit | number | Number of items per page (1–100, default 10). Alias: pageSize. |
page | number | Alias for cursor — page number, 1-indexed (starts at 1). |
pageSize | number | Alias for limit — number of items per page (1–100, default 10). |
search | string | Search term to filter results by text content |
sort | string | Sort field and order (e.g. publishedAt:desc, id:desc, createdAt:asc) |
include | string | Set to content to inline each contribution's manuscript markdown (contribution endpoints only). When inlining content, limit defaults to 20 and is capped at 50. |
{
"data": [
{
"id": 10,
"documentId": "xyz789abc012",
"title": "Toward Open Peer Review",
"subtitle": "A comparative analysis",
"type": "Article",
"abstract": "This paper explores...",
"language": "English",
"author": { "firstName": "Jane", "lastName": "Doe" },
"keywords": [{ "keyword": "open access" }],
"publishedAt": "2025-07-01T08:00:00.000Z"
}
],
"meta": {
"pagination": {
"page": 1, "pageSize": 10,
"total": 42, "pageCount": 5
}
}
}/api/v1/public/contributions/:idReturns a single published contribution by its document ID, including full details such as authors, keywords, abstract, and files. Add ?include=content to inline the manuscript markdown.
| Parameter | Type | Description |
|---|---|---|
id | string | The document ID of the resource |
include | string | Set to content to inline each contribution's manuscript markdown (contribution endpoints only). When inlining content, limit defaults to 20 and is capped at 50. |
{
"data": {
"id": 10,
"documentId": "xyz789abc012",
"title": "Toward Open Peer Review",
"subtitle": "A comparative analysis",
"type": "Article",
"otherType": null,
"abstract": "This paper explores...",
"language": "English",
"author": {
"firstName": "Jane", "lastName": "Doe"
},
"keywords": [{ "keyword": "open access" }],
"submittedFiles": {
"file": { "url": "https://future-science.org/strapi/uploads/paper.md" },
"cover": { "url": "https://future-science.org/strapi/uploads/cover.png" }
},
"additionalMaterials": [...],
"selfArchive": true,
"isOriginal": true,
"publishedAt": "2025-07-01T08:00:00.000Z"
}
}/api/v1/public/initiatives/:id/exportReturns an initiative's published contributions with each manuscript inlined as markdown (always behaves as include=content). limit defaults to 20 and is capped at 50; paginate with the absolute next link to export the whole initiative. Responses are never cached.
| Parameter | Type | Description |
|---|---|---|
id | string | The document ID of the resource |
cursor | number | Page number, 1-indexed (alias: page). Starts at 1. |
limit | number | Number of items per page (1–100, default 10). Alias: pageSize. |
page | number | Alias for cursor — page number, 1-indexed (starts at 1). |
pageSize | number | Alias for limit — number of items per page (1–100, default 10). |
search | string | Search term to filter results by text content |
sort | string | Sort field and order (e.g. publishedAt:desc, id:desc, createdAt:asc) |
{
"data": [
{
"id": 10,
"documentId": "xyz789abc012",
"title": "Toward Open Peer Review",
"submittedFiles": {
"file": { "url": "https://future-science.org/strapi/uploads/paper.md" }
},
"content": "# Toward Open Peer Review\n\n..."
}
],
"meta": {
"pagination": {
"page": 1, "pageSize": 20,
"total": 595, "pageCount": 30,
"self": "https://future-science.org/api/v1/public/initiatives/abc/export?cursor=1&limit=20&include=content",
"next": "https://future-science.org/api/v1/public/initiatives/abc/export?cursor=2&limit=20&include=content",
"prev": null
}
}
}| Field | Description |
|---|---|
documentId | Unique document identifier |
title | Title of the initiative |
type | Type of initiative |
presentation | Description text of the initiative |
logo | Logo image object |
leadEditor | Lead editor details (name, institution, links) |
editorialBoard | List of editorial board members |
supportingDocuments | Attached supporting documents |
publishedAt | Publication timestamp |
| Field | Description |
|---|---|
documentId | Unique document identifier |
title | Title of the contribution |
subtitle | Subtitle (optional) |
type | Type of contribution |
otherType | Custom type label when type is "Other" |
abstract | Abstract text |
language | Language of the contribution |
author | List of authors (name, institution, email, links) |
keywords | List of keywords |
submittedFiles | Submitted files and cover |
additionalMaterials | Additional material links |
selfArchive | Self-archiving details (DOI, license, copyright, reference) |
isOriginal | Whether this is an original submission |
initiative | The initiative this contribution belongs to: an object with id, documentId, slug and title (null if none). When a contribution is linked to more than one initiative, a single representative is returned, matching the initiative filter. |
publishedAt | Publication timestamp |
Initiatives on Future Science are categorized into the following types:
Contributions submitted to initiatives can be of the following types:
GET /api/v1/public/initiatives?cursor=1&limit=2{
"data": [
{
"id": 1,
"documentId": "abc123def456",
"title": "Archive of Academic Commentary",
"type": "Open Review Archive",
"presentation": "An open archive for...",
"logo": { "url": "/uploads/logo.png" },
"leadEditor": {
"firstName": "Jane",
"lastName": "Doe",
"institution": "University of Example"
},
"editorialBoard": [...],
"publishedAt": "2025-06-15T10:30:00.000Z"
}
],
"meta": {
"pagination": {
"page": 1,
"pageSize": 2,
"total": 8,
"pageCount": 4
}
}
}When a resource is not found, the API returns a 404 status with an error message:
// 404 Not Found
{
"error": "Initiative not found"
}
// 404 Not Found
{
"error": "Contribution not found"
}The public API has no strict rate limits, but please use it responsibly. Excessive automated requests may be throttled.