The API
One JSON door. Reading needs no key; writing needs the registry key or a signed-in registrant.
Read (no key)
| Call | Gives |
|---|---|
GET https://registry.smartscholars.in/api.php?action=get&doi=… | the record: state, address, version, holder, the record itself, its sha256 |
GET https://registry.smartscholars.in/api.php?action=history&doi=… | the ledger of the DOI, oldest first, each entry with who, what changed, and the full record after it |
GET https://registry.smartscholars.in/api.php?action=resolve&doi=… | where it goes, without following |
GET https://registry.smartscholars.in/api.php?action=list&prefix=&state=&q=&limit=&offset= | the names held, page by page (limit ≤ 500) |
GET https://registry.smartscholars.in/api.php?action=prefixes · ?action=counts | the prefixes and their holders · the figures on the front page |
GET https://registry.smartscholars.in/api.php?action=search&q=&prefix=&year=&type=&state=&sort=&page=&per_page= | search across every record: a DOI name finds that name, other words must all occur in the record (titles, people, journal, ISSN, volume/issue/pages, year, type); sort newest · oldest · title · year; per_page ≤ 100; the answer carries the total, the page count and year/type facets |
GET https://registry.smartscholars.in/api.php?action=cite&doi=…&as=csl|bibtex|ris|apa | one citation as text (with its MIME type), or — without as — all four in one JSON answer |
The open doors beside the API: feed.php — Atom (or ?as=rss) of every change, ?prefix= for one prefix, ?kind=registered for new registrations only · bulk.php — the whole registry or one prefix as JSON Lines (?as=jsonl) or CSV (?as=csv), &since= for a mirror that keeps itself current · cite.php — the four citation forms on one page.
The resolver does the same by content negotiation on https://registry.smartscholars.in/resolve.php?doi=…: Accept: application/json gives the record, application/xml the Kernel Metadata Declaration, application/vnd.citationstyles.csl+json CSL-JSON, application/x-bibtex BibTeX, application/x-research-info-systems RIS, text/x-bibliography an APA reference — as doi.org does for every DOI.
Write (the key, or a signed-in registrant)
POST a JSON body with action in the address, the header X-Registry-Token carrying the key; a signed-in member of a registrant needs no key for its own prefixes.
| action | body | does |
|---|---|---|
| reserve | {"doi": "10.80000/my-name"} | takes a name the registrant chose (checked against the naming policy); no record yet |
| mint | {"prefix": "10.46243", "parts": {"year": 2026, "vol": 11, "issue": 1, "first": 1, "last": 9}} | a name from the prefix's suffix rule (its pattern, or opaque), reserved |
| register | {"doi": …, "url": …, "record": {…}} | the record (the format) and the address — refused in words when any rule is not met |
| update | {"doi": …, "record": {…}} | a new version; an identical record changes nothing |
| url | {"doi": …, "url": …} | the address alone |
| withdraw · restore | {"doi": …, "reason": …} · {"doi": …} | the tombstone, and the way back |
| import · import_prefix | {"doi": …} · {"prefix": …, "rows": 100} | read from Crossref into the registry (a prefix, page by page — the key or an admin) |
Answers: {"ok": true, …}, or {"ok": false, "error": "…", "errors": [ … ]} with 400 (not sound), 401 (no key), 403 (not your prefix), 404 (not held), 409 (already registered / taken).
