DOAJ API search: query syntax and fields
Updated:
DOAJ API search runs on Elasticsearch and takes queries in Lucene syntax. The DOAJ documentation covers it briefly, and some behaviour you only discover by trial and error. This page collects everything you need to query articles and journals, with examples tested against the live API.
Endpoints and parameters
GET https://doaj.org/api/v4/search/articles/{query}?page=1&pageSize=100&sort=…
GET https://doaj.org/api/v4/search/journals/{query}?page=1&pageSize=100&sort=…
- The query goes in the path and is URL-encoded as a path segment.
pageSize— up to 100 records per page, 10 by default.- Only the first 1000 results of a query are reachable — the workaround is in How to export all of a journal’s articles from DOAJ.
- Searching needs no API key. The rate limit is 2 requests per second.
Syntax basics
| What you need | Example |
|---|---|
| Search all fields | metamaterial |
| Search one field | bibjson.title:"phase demodulator" |
| Boolean logic and parentheses | bibjson.keywords:"open access" OR bibjson.keywords:"open science" |
| Exclusion | issn:1810-3189 AND NOT _exists_:index.doi |
| Range | bibjson.year:[2022 TO 2024] |
| Field present / missing | _exists_:bibjson.abstract, NOT _exists_:bibjson.keywords |
| Exact match of the whole value | bibjson.journal.title.exact:"Journal of Physics" |
| All records | * |
Fields use dot notation, as in the record JSON: bibjson.author.name, bibjson.journal.volume. Without .exact the search matches words: bibjson.journal.title:"Journal of Science" also finds “Journal of Science and Technology”.
Short names
DOAJ accepts short names for common fields — but only for searching by value; .exact and _exists_ do not work with them.
| Articles | Journals |
|---|---|
title: abstract: doi: issn: publisher: | title: issn: publisher: license: username: |
You can search a DOI as is — DOAJ escapes the slash itself — but quoting it is safer: doi:"10.18469/1810-3189.2022.25.4.122-128".
Sorting
sort=created_date:desc — newest in DOAJ first
sort=last_updated:desc — recently updated
sort=title:asc — by title
sort=bibjson.year.exact:desc — by publication year
sort=issn:asc — journals by ISSN
To sort by year you must use bibjson.year.exact: sort=bibjson.year:desc returns an error.
What is not allowed
To protect the server, DOAJ rejects:
- wildcards
*and?inside terms (doi:10.18469*fails with “disallowed Lucene features”); - fuzzy
~and proximity searches; - regular expressions
/…/; - open-ended ranges:
created_date:[2026-01-01 TO *]fails; give both bounds.
Non-obvious pitfalls
| Pitfall | Do this instead |
|---|---|
_exists_:doi is always false — doi is a short name, not a field | _exists_:index.doi or bibjson.identifier.type:doi |
Pages are uploaded as bibjson.journal.start_page, but searching that field finds nothing | Search bibjson.start_page and bibjson.end_page |
index.country:RU and index.language:RU find nothing | index.* fields hold English names: index.country:"Russian Federation", index.language:Russian. Codes live in bibjson.journal.country, bibjson.language |
| Booleans and flags use different formats | bibjson.apc.has_apc:false, but index.has_apc:No |
| A journal is not found by its English title | The main title may be in the national language; the English one is in bibjson.alternative_title (journals) |
publisher: and license: often find nothing for journals | bibjson.publisher.name:… and index.license:"CC BY" |
_exists_:bibjson.author.orcid_id is true if at least one author has an ORCID | “Is any author missing an ORCID” cannot be queried — export the records and check them |
Useful queries
issn:1234-5678 AND bibjson.year:2024
issn:1234-5678 AND NOT _exists_:index.doi
bibjson.abstract:metamaterial AND bibjson.year:[2022 TO 2024]
bibjson.author.orcid_id:"https://orcid.org/0000-0002-1825-0097"
bibjson.link.url:"journal.example.org"
index.country:"Russian Federation" AND index.subject:Physics (journals)
bibjson.apc.has_apc:false AND index.language:Russian (journals)
The query builder has all 54 article fields and 83 journal fields with descriptions and examples — click to insert a condition.
Open an example query