API

What is this?

Everything in the RC3 Research Database can be read by other programs as JSON. If you’re building a chatbot, a federated search tool, or anything else that needs the catalogue, this page is your reference. No login or API key is required.

The fastest way to start: hit https://database.rc3research.org/api/export/all.json. That returns the whole catalogue in one response. Cache it on your end and query it however you like. For more targeted reads, use the search endpoint described below.

House rules

  • Up to 60 requests per minute, per IP. Going faster gets you a 429 response with a retry hint. Cache responses on your end.
  • Tell us who you are. Send a descriptive User-Agent header (for example, MyOrgChatbot/1.0 (contact@myorg.org)) so we can reach you if something goes wrong on our end.
  • This is best-effort, not a paid service. Endpoints may change with reasonable notice. If your project needs guaranteed uptime, support, or a private managed integration, get in touch.

Response shape

Every response uses the same wrapper: a success flag plus either data (on 2xx) or error (on 4xx/5xx).

// success
{ "success": true, "data": { /* endpoint-specific payload */ } }

// error
{ "success": false, "error": { "message": "...", "field": "..." } }

Endpoints

GET/api/research-db

Search, filter and paginate research entries

Returns a page of research entries together with the available filter options and pagination info. All query parameters are optional. Fields that are empty for a given entry are simply left out of the response (rather than returned as null).

Parameters

NameTypeRequiredDescription
pageintegeroptionalPage number, starting at 1.e.g. 2
limitintegeroptionalItems per page. Defaults to 20.e.g. 50
searchQuerystringoptionalFree-text search across title, organization, abstract, keywords, partners and most other text fields.e.g. climate
sortBypublicationYear | titleoptionalField to sort by. Defaults to publicationYear.e.g. title
sortOrderasc | descoptionalSort direction. Defaults to desc.e.g. asc
researchFocus[]string (repeatable)optionalFilter by research focus. Repeat to include several. Use the exact values from /api/reference-data.e.g. Climate and Environment
projectLeadOrganization[]string (repeatable)optionalFilter by lead organization name.e.g. Canadian Red Cross
geographicScope[]Global | Regional | Country-leveloptionalFilter by scope.e.g. Country-level
countries[]string (repeatable)optionalFilter by country (only meaningful when geographicScope is Country-level).e.g. Kenya
regions[]Africa | Americas | Asia Pacific | Europe | MENAoptionalFilter by IFRC region (only meaningful when geographicScope is Regional).e.g. Africa
documentType[]string (repeatable)optionalFilter by document type.e.g. Research Paper
language[]string (repeatable)optionalFilter by language. Multiple values match any.e.g. English
yearMinintegeroptionalEarliest publication year (inclusive).e.g. 2020
yearMaxintegeroptionalLatest publication year (inclusive).e.g. 2026

Try it

curl https://database.rc3research.org/api/research-db?searchQuery=climate&researchFocus[]=Climate%20and%20Environment&limit=10

Response

projects: the page of entries. filters: the values currently usable in each filter. pagination: page/limit/total counts.

{
  "success": true,
  "data": {
    "projects": [
      {
        "id": "35410a3f-df02-4ae5-8b26-b0422a4715d3",
        "title": "Challenges and facilitators for the implementation of safe and dignified burials during Ebola...",
        "primaryResearchFocus": "Health and Wellbeing",
        "projectLeadOrganization": "Canadian Red Cross",
        "geographicScope": "Global",
        "countries": [],
        "publicationYear": 2026,
        "link": "https://example.org/paper.pdf",
        "typeOfDocument": "Research Paper",
        "language": ["English"],
        "allPartners": []
      }
    ],
    "filters": {
      "researchFocus": ["Climate and Environment", "Disasters and Crises", "..."],
      "documentTypes": ["Research Report", "Research Brief", "..."],
      "regions": ["Africa", "Americas", "Asia Pacific", "Europe", "MENA"],
      "...": "..."
    },
    "pagination": { "page": 1, "limit": 20, "total": 514, "totalPages": 26 }
  }
}
GET/api/research-db/{id}

Fetch a single research entry by ID

Parameters

NameTypeRequiredDescription
iduuid (path)requiredThe entry ID, as returned by /api/research-db.e.g. 35410a3f-df02-4ae5-8b26-b0422a4715d3

Try it

curl https://database.rc3research.org/api/research-db/35410a3f-df02-4ae5-8b26-b0422a4715d3

Response

On success, the entry is wrapped under data.document. Returns 404 if the ID is unknown.

{
  "success": true,
  "data": {
    "document": {
      "id": "35410a3f-df02-4ae5-8b26-b0422a4715d3",
      "title": "Challenges and facilitators for the implementation of safe and dignified burials during Ebola...",
      "primaryResearchFocus": "Health and Wellbeing",
      "projectLeadOrganization": "Canadian Red Cross",
      "geographicScope": "Global",
      "...": "..."
    }
  }
}
GET/api/export/all.json

Bulk export of every published entry

Returns the entire catalogue in a single response. Best path for chatbots, federated search and offline indexing — fetch once, cache locally, query on your end. The response is cached at the edge for one hour, so repeated calls within that window are free.

Try it

curl https://database.rc3research.org/api/export/all.json

Response

data.dataAsOf is the most recent updatedAt across the catalogue (so it stays accurate even if the response is served from cache). data.count is the entry count. data.entries is the full list, same shape as a single document.

{
  "success": true,
  "data": {
    "dataAsOf": "2026-05-10T11:30:00.000Z",
    "count": 514,
    "entries": [
      { "id": "35410a3f-...", "title": "...", "primaryResearchFocus": "...", "...": "..." }
    ]
  }
}
  • Cached for one hour at the CDN edge.
  • Total payload is small (~500 entries, well under 1 MB).
GET/api/reference-data

Controlled vocabularies (research focus, document types, organizations, countries, languages)

Returns the canonical lists used to populate filters and submission forms. Useful when you want to mirror the same taxonomy in your tool, or to validate a submission payload before sending it.

Try it

curl https://database.rc3research.org/api/reference-data

Response

researchFocus, documentTypes, organizations, countries (each tagged with their IFRC region) and languages (with isOfficial flag).

{
  "success": true,
  "data": {
    "researchFocus": [
      { "id": 1, "name": "Climate and Environment", "sortOrder": 0 }
    ],
    "documentTypes": [
      { "id": 1, "name": "Research Paper", "sortOrder": 0 }
    ],
    "organizations": [
      {
        "id": 1,
        "name": "Canadian Red Cross",
        "category": "RC Society",
        "url": null,
        "country": null
      }
    ],
    "countries": [
      { "id": 1, "name": "Kenya", "region": "Africa", "sortOrder": 0 }
    ],
    "languages": [
      { "id": 1, "name": "English", "isOfficial": true }
    ]
  }
}
GET/api/keywords

Distinct keywords used across the catalogue

Returns a sorted, de-duplicated list of every keyword present on any published entry. Useful for autocomplete or tag-cloud UIs.

Try it

curl https://database.rc3research.org/api/keywords

Response

A sorted array of strings.

{
  "success": true,
  "data": ["1.5°C warming", "AED training", "AGREE II", "Anticipatory action", "..."]
}
POST/api/submissions

Submit a new research entry for review

Used by the public submission form on this site. Submissions land in a moderation queue; the coordination team reviews and publishes them.

Request body (application/json)

{
  "submitterName":              "string (required)",
  "submitterEmail":             "string (required, valid email)",
  "submitterOrganization":      "string (optional)",
  "submitterNotes":             "string (optional)",
  "title":                      "string (required)",
  "primaryResearchFocus":       "string (required, value from /api/reference-data)",
  "additionalResearchFocus":    "string (optional)",
  "keywords":                   "string (required, max 3, comma- or semicolon-separated)",
  "projectLeadOrganization":    "string (required)",
  "geographicScope":            "Global | Regional | Country-level (required)",
  "regions":                    "string (required if geographicScope=Regional, comma-separated)",
  "countries":                  "string[] (required if geographicScope=Country-level)",
  "publicationYear":            "integer (required, 1900-current)",
  "link":                       "string (required, valid URL)",
  "typeOfDocument":             "string (required, value from /api/reference-data)",
  "language":                   "string[] (required, at least one)",
  "allPartners":                "string[] (optional)",
  "abstract":                   "string (required)"
}

Response

201 Created with a submission summary on success. 400 Bad Request with a field-level error message on validation failure.

{
  "success": true,
  "data": { "id": "...", "status": "pending", "submittedAt": "2026-05-10T11:30:00.000Z" },
  "message": "Submission created successfully. You will be notified once it is reviewed."
}
  • No authentication required.
  • Counted against the per-IP rate limit.

Questions or problems?

If something is broken, ambiguous, or you’d like a feature, email [email protected].