Interface for programs (API)
ResearchRadar also hands its whole directory over machine-readable, as JSON. The addresses below return the same entries the website shows, and the filter words they know mean exactly what the filter buttons there mean. Which words an address knows is listed with it; there is no free-text search here.
This is meant for programs rather than readers: for the page of a research office, say, that shows the next psychology submission deadlines by itself.
Terms
- The data is public and free to use.
- Every directory entry names the page it comes from — in the field website, and where the programme has a call page of its own, in application_url as well. A find carries its address in the field url.
- The interface only reads. Only GET returns data; a writing method is refused.
- No key, no sign-up, no registration.
Base address
https://researchradar.at/api/v1
Every address below sits under this base. Answers are application/json in UTF-8.
Shape of an answer
Every answer has two parts: meta describes the answer itself, data is the list of entries.
{
"meta": {
"generated_at": "2026-08-02T06:20:11+02:00",
"count": 61,
"version": "1.84",
"source": "https://researchradar.at"
},
"data": [ … ]
}
meta.generated_at— When the answer was built, with its time zone.meta.count— How many entries are in data.meta.version— Version of the service that answered.meta.source— Public address of this service.meta.deprecated— Only on the two replaced addresses further down: a sentence naming the address that took their place.
The addresses
Several values are separated by a comma. A value that is not in the list is dropped without a word — the answer stays valid, the filter simply does not bite. A query word the address does not know is passed over the same way.
GET /api/v1/grants
The funding directory: every programme with its deadline, amount, target group, discipline and source.
With no parameters you get the whole directory except the discontinued programmes. Unlike the website, the interface does not narrow to Austria by itself.
Query parameters
stages=— The career stage a programme is open to.
Values:R1, R2, R3, R4, ORGstatus=— State of the deadline. Expired entries are in the answer even without this parameter — unlike the website, which hides them. Only the discontinued programmes are missing until they are asked for here or with discontinued=1. Careful: the field of the same name in the answer is a different thing — it says only active or discontinued. The deadline state is not a field; it is what this parameter filters on, and a caller who needs it works it out from deadline_dates and deadline_rolling.
Values:open, rolling, unclear, expired, discontinueddisciplines=— The discipline a programme is open to. Entries open to every subject come with every pick.
Values:psychology, communication, clinical_health, neuroscience, education, allcountries=— The country an applicant must be based in. Entries with no country condition, and EU-wide programmes, come with every pick.
Values:AT, DE, CHnew=— Only entries that entered the directory within that many weeks.
Values:1, 2, 4, 8discontinued=— The value 1 adds the discontinued programmes.
Values:1
Fields per entry
id, institution_id, name, name_en, description_de, description_en, website, application_url, amount_range, target_group_de, target_group_en, career_stages, deadline_info_de, deadline_info_en, deadline_dates, deadline_rolling, disciplines, eligibility_countries, discipline_note_de, discipline_note_en, tags, mobility, first_seen, source_checked, status, funding_category
Example
curl 'https://researchradar.at/api/v1/grants?disciplines=psychology&status=open,rolling'
Answer, abridged
{
"meta": { … },
"data": [
{
"id": "fwf-esprit",
"institution_id": "fwf",
"name": "ESPRIT-Programm",
"name_en": "ESPRIT Programme",
"website": "https://www.fwf.ac.at/foerdern/…/esprit",
"career_stages": ["R2"],
"deadline_rolling": true,
"deadline_dates": [],
"disciplines": ["all"],
"eligibility_countries": ["AT"],
"status": "active",
"funding_category": "research",
"source_checked": "2026-07-30",
…
}
]
}
GET /api/v1/conferences
The conference directory: events with their place, their dates and the deadline for submissions.
With no parameters you get every conference, the ones that are over included — the website hides those. They come sorted by the state of the submission deadline, in the order of the values below, then by that date, earliest first: the deadline, or the start of the event where there is none. In the buckets whose calls have closed that means oldest first.
Query parameters
disciplines=— The discipline of the conference. Entries open to every subject come with every pick.
Values:psychology, communication, clinical_health, neuroscience, education, allstatus=— State of the submission deadline, or of the event itself.
Values:cfp_open, cfp_unknown, cfp_closed, over
Fields per entry
id, source_id, organiser_id, name, name_en, website, event_start, event_end, city, country, cfp_deadline, registration_deadline, submission_type_de, submission_type_en, disciplines, discipline_note_de, discipline_note_en, first_seen, source_checked
Example
curl 'https://researchradar.at/api/v1/conferences?status=cfp_open'
Answer, abridged
{
"meta": { … },
"data": [
{
"id": "boep-avm-tagung-2026",
"organiser_id": "boep",
"name": "28. wissenschaftliche Tagung der AVM",
"website": "https://www.boep.or.at/veranstaltungen/…",
"event_start": "2026-10-22",
"event_end": "2026-10-25",
"city": "St. Georgen am Längsee",
"cfp_deadline": "2026-08-31",
"disciplines": ["psychology"],
…
}
]
}
GET /api/v1/organizations
Funders and conference organisers in one registry, each with the organization's whole record.
No parameters, and always complete. Every record carries at least the fields below — except name_en, which is there only where the organization has an English name. Some records carry extra fields whose name begins with an underscore; those are internal notes on where a statement came from.
Query parameters
This address takes no query parameters.
Fields per entry
id, name, name_en, short_name, type, country, website, description_de, description_en
Example
curl 'https://researchradar.at/api/v1/organizations'
Answer, abridged
{
"meta": { … },
"data": [
{
"id": "fwf",
"name": "FWF – Fonds zur Förderung der wissenschaftlichen Forschung",
"short_name": "FWF",
"type": "federal",
"country": "AT",
"website": "https://www.fwf.ac.at",
…
}
]
}
GET /api/v1/findings
What the daily check found new on the funders' own pages, newest first.
A find is a title with an address, not a directory entry — the directory itself is at /grants.
Query parameters
sources=— Only finds from these sources. The id is the one in the field source.
Most finds per answer: 100
Fields per entry
source, source_name, id, title, url, found_at
Example
curl 'https://researchradar.at/api/v1/findings?sources=fwf'
Answer, abridged
{
"meta": { … },
"data": [
{
"source": "fwf",
"source_name": "FWF",
"id": "esprit-2026",
"title": "ESPRIT – Ausschreibung 2026",
"url": "https://www.fwf.ac.at/…/esprit",
"found_at": "2026-07-31T06:17:04+02:00"
}
]
}
One worked case
The next psychology submission deadlines for a page of your own: programmes in psychology, entries open to every subject included, whose deadline is still ahead.
curl 'https://researchradar.at/api/v1/grants?disciplines=psychology&status=open'
/grants does not sort — the answer comes in the directory's own order. To get the next five, the calling program takes the earliest date in deadline_dates that has not passed and sorts on that.
Caching and embedding
Cache-Control: public, max-age=300— How long an answer may be cached, in seconds.ETag/If-None-Match— The answer carries a fingerprint of its content. Send it back on the next call and, if nothing has changed, you get 304 and no body. This is meant for callers outside a browser: in a browser, If-None-Match turns the call into a preflight this interface does not answer.Access-Control-Allow-Origin: *— A plain GET from a browser may read the interface from any page, and it may set Accept, Accept-Language and Content-Language while doing it. Only a header a browser does not send by itself — If-None-Match, for one — turns the call into a preflight, and that is not answered.
The limit
Requests are counted per calling address in a rolling window, across all the addresses of the interface together. Above that you get 429, with the header Retry-After giving the seconds until the next try.
- Requests per window and address:
200 - Window in minutes:
15
Errors
304— Unchanged since the fingerprint you sent.404— An unknown address under the base — as JSON, never as a web page.405— A writing method such as POST or DELETE. The header Allow names what this address allows.429— Too many requests.
HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8
{"error": "not found"}
Replaced addresses
Two addresses have been replaced by a newer one and still answer — an address once published is not taken away here. Their meta block carries the extra field deprecated with a sentence naming the new address.
GET /api/v1/institutions— Returns the same records as the new address.
Replaced by:/api/v1/organizationsGET /api/v1/conference-sources— Returns the organizations that run at least one conference in the directory.
Replaced by:/api/v1/organizations
Where the data comes from
Every field of every directory entry comes from the fetched page of its source — the funder's page for a programme, the organiser's for a conference. Where that page states nothing, the field stays empty. Grants and conferences also carry source_checked, when the fields were last compared against that page, and first_seen, when the entry entered the directory.