LighterAPI reference
LighterAPI answers the read requests of api.crossref.org, with the same paths, parameters, and responses, over Crossref's March 2026 public data file.
Base URL
https://demo-crossref-lighterapi.knowledgefutures.org
Replace https://api.crossref.org with this URL in an existing request. No key or account. HTTPS only.
Quick start
# one work curl -s https://demo-crossref-lighterapi.knowledgefutures.org/works/10.1038/nature12373 # a member's journal articles from 2024, counted by year curl -s 'https://demo-crossref-lighterapi.knowledgefutures.org/works?filter=member:78,type:journal-article,from-pub-date:2024&facet=published:*&rows=0' # every work indexed on one day, 1,000 at a time curl -s 'https://demo-crossref-lighterapi.knowledgefutures.org/works?filter=from-index-date:2026-03-01,until-index-date:2026-03-01&cursor=*&rows=1000'
The console builds and sends requests from the browser.
Limits and access
| Limit | Value |
|---|---|
| Requests per visitor | 50 a second, bursts to 400. Over that: 429 with Retry-After: 1. |
rows | 0 to 1,000. Default 20. |
offset | 0 to 10,000. Use a cursor beyond. |
sample | Up to 100. |
| Facet values | Up to 1,000 per facet (* means 1,000). Default 20. |
| Methods | GET and HEAD. |
| Compression | gzip or zstd when the request sends Accept-Encoding. |
No mailto or polite pool: all visitors get the same limit. The parameter is accepted and ignored.
Routes
| Route | Returns | |
|---|---|---|
/works/{doi} | One work. DOI case-insensitive; https://doi.org/ prefix accepted. select applies. | Served |
/works/{doi}/agency | The registration agency: always Crossref. | Served |
/works | A list of works, with every list parameter below. | Served |
/members/{id}/works | /works with filter=member:{id}. | Served |
/prefixes/{prefix}/works | /works with filter=prefix:{prefix}. | Served |
/funders/{id}/works | /works with filter=funder:{id}. | Served |
/journals/{issn}/works | /works with filter=issn:{issn}. | Served |
/types/{id}/works | /works with filter=type:{id}. | Served |
/members, /journals, /funders, /prefixes/{p}, /types, /licenses | Metadata about members, journals, and funders. | Not yet |
Parameters
| Parameter | Meaning | |
|---|---|---|
filter | name:value pairs, comma-separated. Repeated names are ORed; different names are ANDed. A value may contain commas when the next piece has no colon. | Served |
facet | name:count, comma-separated. Counts are exact. | Served |
sort, order | Sort field; asc or desc (default desc). Works without the field sort last either way. | Served |
rows, offset | Page size and start. | Served |
cursor | * for the first page, then each response's next-cursor. | Served |
sample | Random works from the result. | Served |
select | Fields to return, comma-separated. | Served |
query, query.* | Text search. Returns 501. | Not yet |
mailto | Accepted, ignored. |
Filters
Value formats follow api.crossref.org. Identifiers are normalised the way Crossref normalises them.
| Filter | Value |
|---|---|
member | Member ID: 78, or http://id.crossref.org/member/78 |
prefix | DOI prefix: 10.1016 |
type, type-name | Type ID (journal-article) or label (Journal Article) |
issn, isbn | With or without hyphens |
orcid | Bare iD or https://orcid.org/… |
funder, award.funder | Funder Registry ID (100000001) or DOI (10.13039/100000001) |
award.number | Award number, case-insensitive |
doi | DOI |
container-title | Exact title |
license.url, license.version | License URL; vor, am, tdm, stm-asf, … |
full-text.type, .application, .version | Link content type, intended application, version |
ror-id | ROR ID or URL, from affiliations and institutions |
updates, update-type | DOI updated by the work; update type (retraction, correction, …) |
relation.type, relation.object | Relation type (is-preprint-of, …); related identifier |
archive, article-number, group-title, alternative-id, assertion, assertion-group, clinical-trial-number, content-domain | Exact values |
category-name | Accepted; matches nothing, as on api.crossref.org |
Not yet: license.delay, has-alias, has-prime-doi, from-/until-awarded-date, funder-doi-asserted-by, relation.object-type, relation.claimed-by, lte-/gte-award-amount, lte-/gte-citation, citation-id. They return 400 filter-not-available.
Date filters
from-X and until-X, with a value of YYYY, YYYY-MM, or YYYY-MM-DD. until includes the whole period named: until-pub-date:2020 runs to 31 December 2020.
| X | Field |
|---|---|
pub-date | Earliest of posted, print, online, and other publication dates |
print-pub-date, online-pub-date | Print or online publication date |
issued-date | Issued date |
created-date | First deposit |
deposit-date, update-date | Last deposit |
index-date | Last indexed |
posted-date, accepted-date, approved-date, event-start-date, event-end-date | Those dates |
Existence filters
true keeps works that have the field, false keeps works without it (t, 1, f, 0 also accepted).
has-abstracthas-affiliationhas-affiliation-ror-idhas-archivehas-assertionhas-authenticated-orcidhas-awardhas-clinical-trial-numberhas-content-domainhas-descriptionhas-domain-restrictionhas-eventhas-full-texthas-funderhas-funder-doihas-funder-ror-idhas-licensehas-orcidhas-referenceshas-relationhas-ror-idhas-updatehas-update-policyis-update
Facets
type-namepublishedpublisher-namecontainer-titleissnfunder-namefunder-doi
orcidlicenselink-applicationarchiveupdate-typerelation-typeassertion
assertion-groupjournal-volumejournal-issuecategory-namesourceror-id
Values sort by count, then key, both descending. value-count is the number of values returned. Not yet: affiliation.
Sorts
publishedpublished-printpublished-onlineissuedcreateddepositedupdatedindexedis-referenced-by-countreferences-countscorerelevance
score and relevance are constant without a text query. Not yet: citation.
Cursors
# first page GET /works?filter=member:78&cursor=*&rows=1000 # next page: pass message.next-cursor back GET /works?filter=member:78&cursor=djF8ZnVsbHwyNTV8MHw0MTc3OTQ&rows=1000
Without a sort, cursors run in creation order, ascending, as on api.crossref.org. With a sort, they follow it. Stop when items is empty. Cursors don't expire, but belong to one index build: after a rebuild, start again from *.
Select
Any top-level field of a work: DOI, title, author, container-title, published, type, member, funder, license, reference, is-referenced-by-count, and the rest of api.crossref.org's list. Unknown names return 400 select-field-not-available.
Envelope
{
"status": "ok",
"message-type": "work-list",
"message-version": "1.0.0",
"message": {
"facets": { "type-name": { "value-count": 2, "values": { "Journal Article": 812, "Chapter": 40 } } },
"total-results": 852,
"items": [ { "DOI": "10.1016/…", "title": ["…"], … } ],
"items-per-page": 20,
"query": { "start-index": 0, "search-terms": null },
"next-cursor": "…"
}
}
Single works: "message-type": "work", with the work as message.
Errors
| Status | When | Body |
|---|---|---|
400 | Unknown filter, facet, sort, or select field; bad date; rows, offset, or sample out of range; bad cursor | {"status":"failed","message-type":"validation-failure","message":[{"type","value","message"}]} |
404 | Unknown DOI or route | Resource not found. |
429 | Over the per-visitor limit | JSON, with Retry-After: 1 |
501 | Text queries | JSON, "message-type":"not-implemented" |
Headers
Server-Timing: app;dur=… | Milliseconds spent in the server for this request. |
Content-Encoding | gzip or zstd when requested and the body is over 1 KB. |
Access-Control-Allow-Origin: * | Callable from any web page. |
Differences from api.crossref.org
| Counts | total-results and facet counts are exact. |
| Order | Without a sort or cursor, items come in creation order (unspecified on api.crossref.org). |
| Ties | Works created in the same second keep the builder's order, not DOI order. |
| Freshness | A snapshot: works registered or changed after March 2026 aren't here. |
| Text search | Not yet. |
Data
Crossref public data file, March 2026 (10.13003/nggf-vt1j): 179,536,204 works. Records are served as the file has them, with the empty fields api.crossref.org adds to single works (title, container-title, subtitle, original-title, short-title, short-container-title, subject, relation).
Status endpoints
/healthz | ok when serving. |
/_info | Index build: works, build time, source. |
/_stats | Requests and latency by kind since the last reset; cache hit rates. |