Resolve, format, export, and verify academic citations (DOI, PMID, PMCID, ISBN, ISSN, arXiv, ADS, WHO IRIS) — plus retraction and open-access checks.
Resolve a scholarly identifier (DOI/PMID/PMCID/ISBN/ISSN/arXiv/ADS/WHO IRIS) to structured CSL JSON metadata.
# resolveIdentifier
Resolves a single bibliographic identifier to canonical CSL JSON metadata via the Scholar Sidekick resolver chain (Crossref → PubMed → DataCite → arXiv → ADS → ISBN → WHO IRIS, with deterministic fallback order).
## When to use
- The user provides a single DOI, PMID, PMCID, ISBN, ISSN, arXiv ID, ADS bibcode, or WHO IRIS URL and wants the underlying metadata.
- An agent needs structured fields (author list, title, container, year, identifiers) before formatting or exporting.
## Inputs
- `identifier` (string, required) — DOI like `10.1038/nphys1170`, PMID like `34812345`, ISBN, etc. Detection is automatic.
## Outputs
CSL JSON with at least `title`, `author[]`, `issued`, `container-title`, `DOI`/`PMID`/`PMCID`/`URL` (depending on source). Errors return `{ ok: false, code, error }`.
## Underlying surfaces
- **REST**: `POST /api/format` with `text: "<identifier>"` and `output: "json"` returns the resolved item alongside the formatted string.
- **MCP tool**: `resolveIdentifier` in [`scholar-sidekick-mcp`](https://github.com/mlava/scholar-sidekick-mcp).
## Example
```bash
curl -sS -X POST "https://scholar-sidekick.com/api/format" \
-H "Content-Type: application/json" \
-d '{"text":"10.1038/nphys1170","style":"vancouver","output":"text"}'
```
## See also
- `formatCitation` for rendering, `verifyCitation` for fabrication detection.
- [`/llms.txt`](https://scholar-sidekick.com/llms.txt) for the full service description.Resolve scholarly identifiers (DOI, PMID, PMCID, ISBN, arXiv, ISSN, ADS bibcode, WHO IRIS URL) into formatted citations (10,000+ CSL styles) and bibliography exports (BibTeX, RIS, EndNote, CSV…), and check retraction, open-access, and citation-fabrication status. Calls a documented REST API over plain HTTP — no install, no API key needed for the free tier.
# Scholar Sidekick (REST API) — Citations, Retraction & Open-Access
Turn a scholarly identifier into a formatted citation, a bibliography file, or an
integrity check (retraction / open-access / fabrication), via a documented REST API.
**No API key and no install required** — plain HTTPS calls over `curl`. An optional
RapidAPI key only raises rate limits.
> Prefer the bundled `scholar-sidekick` MCP server instead if it is connected — same
> capabilities as native tool calls. This skill is the zero-setup path that works in any
> agent that can run `curl`, and needs no `RAPIDAPI_KEY`.
## When to Use
- The user has an identifier (DOI, PMID, PMCID, ISBN, arXiv, ISSN, ADS bibcode, WHO IRIS URL) and wants metadata, a formatted citation, or a bibliography file.
- "Cite this in APA/Vancouver/Chicago…", "give me a BibTeX/RIS file", "export these refs".
- "Has this been retracted?", "is this open access?", "is this citation real / did you make it up?"
- Do NOT use to *search* for papers by topic — that's discovery. This assumes you already have an identifier.
## Surfaces — call the API, never scrape the UI
The site is built for agents. The contract lives at:
- https://scholar-sidekick.com/llms.txt (index of agent surfaces)
- https://scholar-sidekick.com/AGENTS.md (REST + MCP guide)
- https://scholar-sidekick.com/openapi/openapi.yml (OpenAPI 3.1)
Always call the JSON REST API below. Do not drive the website form.
## Authentication & limits
Calls to `scholar-sidekick.com/api/*` work **anonymously — there is no first-party API
key** — at a rate-limited free tier (~40 format / 10 export requests per window), which
is plenty for normal, human-driven agent use. For higher limits, Scholar Sidekick is
offered on RapidAPI: subscribe at
https://rapidapi.com/scholar-sidekick-scholar-sidekick-api/api/scholar-sidekick and call
it through the RapidAPI gateway with your `X-RapidAPI-Key`. Use the anonymous
`scholar-sidekick.com` endpoints by default; move to RapidAPI only for volume.
## Quick Reference
Base URL: `https://scholar-sidekick.com`
| Need | Endpoint | Body |
|------|----------|------|
| Format a citation | `POST /api/format` | `{text, style, output}` |
| Export a bibliography file | `POST /api/export` | `{text, format}` |
| Retraction / correction / EoC check | `POST /api/retraction-check` | `{id}` |
| Open-access status + best legal URL | `POST /api/oa-check` | `{id}` |
| Verify a claimed citation (fabrication) | `POST /api/verify` | `{claimed: {title, doi}}` |
| Service health | `GET /api/health` | — |
## Procedure
### Format a citation
```bash
curl -sS -X POST "https://scholar-sidekick.com/api/format" \
-H "Content-Type: application/json" \
-d '{"text": "10.1038/nphys1170", "style": "vancouver", "output": "text"}'
```
- `text`: one identifier, or several newline-separated for a batch. Pass verbatim — `PMID:`, `arXiv:`, ISBN hyphens, and `https://doi.org/…` are all tolerated.
- `style`: `vancouver` (default), `ama`, `apa`, `ieee`, `cse`, or any CSL style ID (`chicago-author-date`, `harvard-cite-them-right`, `modern-language-association`, `nature`, `bmj`, `the-lancet`, …).
- `output`: `text` or `json`.
Response: `{ "ok": true, "items": [{ "formatted": "…" }], "text": "…" }`.
### Export a bibliography file
```bash
curl -sS -X POST "https://scholar-sidekick.com/api/export" \
-H "Content-Type: application/json" \
-d '{"text": "10.1038/nphys1170\nPMID:30049270", "format": "bibtex"}' \
-o refs.bib
```
- `format`: `bibtex`, `ris`, `csl-json`, `endnote-xml`, `refworks`, `nbib`, `rdf`, `csv`, `txt`.
### Check retraction
```bash
curl -sS -X POST "https://scholar-sidekick.com/api/retraction-check" \
-H "Content-Type: application/json" \
-d '{"id": "10.1016/S0140-6736(97)11096-0"}'
```
Returns `{ ok, doi, result: { isRetracted, hasCorrections, hasConcern, notices[], title } }`
(Crossref + Retraction Watch). One identifier per call — field is **`id`**. When the work has
no DOI (e.g. a book), `result` is `null` and `reason` explains why (`no_doi` / `timeout` / `upstream`).
### Check open access
```bash
curl -sS -X POST "https://scholar-sidekick.com/api/oa-check" \
-H "Content-Type: application/json" \
-d '{"id": "10.1371/journal.pone.0173664"}'
```
Returns `{ ok, doi, result: { isOa, oaStatus, bestLocation: {url, hostType, license, version}, locations[] } }`
(Unpaywall). One identifier per call — field is **`id`**.
### Verify a claimed citation (catch fabrication)
```bash
curl -sS -X POST "https://scholar-sidekick.com/api/verify" \
-H "Content-Type: application/json" \
-d '{"claimed": {"title": "The title exactly as cited", "doi": "10.xxxx/xxxxx"}}'
```
Citation fields go inside a **`claimed`** object: `title` (required) plus an identifier
(`doi`, `pmid`, … — recommended) and optional `authors` / `year` / `container`. Returns
`{ ok, verdict, confidence, matched }`, verdict ∈ `matched` / `mismatch` / `ambiguous` /
`not_found`:
- `matched` — the claim agrees with the record at the identifier.
- `mismatch` — the identifier resolves but the title doesn't: the dominant AI-fabrication
pattern (real DOI + invented title; Topaz et al., Lancet 2026).
- `ambiguous` — the identifier resolves to one paper but the claimed title matches a *different*
real paper (a wrong-identifier error, not a fabrication).
- `not_found` — neither identifier nor title resolves anywhere.
Use this for "is this citation real?", not a plain format/resolve.
## Pitfalls
- Never scrape the web UI — the JSON API is faster and stable.
- Pass identifiers verbatim; don't strip prefixes.
- Body fields differ per endpoint: `format`/`export` use `text`; `retraction-check`/`oa-check` use `id` (one identifier per call); `verify` wraps fields in `claimed`. Don't mix them up.
- ISBNs have no DOI, so retraction/OA return a "no DOI" result for books.
- Don't fabricate a fallback: if a call fails or returns `ok:false`, report that — never invent a citation, retraction status, OA verdict, or a "matched" verdict.
## Verification
- `curl -sS https://scholar-sidekick.com/api/health` returns `{ "ok": true, … }`.
- A good `/api/format` response has `items[].formatted` non-empty.
## Optional: bundled MCP server (power users)
This plugin also ships the `scholar-sidekick` MCP server (tools: `resolveIdentifier`,
`formatCitation`, `exportCitation`, `checkRetraction`, `checkOpenAccess`, `verifyCitation`).
That path requires a RapidAPI key, so the REST calls above are the zero-setup default:
```bash
npx -y scholar-sidekick-mcp@latest # needs RAPIDAPI_KEY in env
```Verify whether a claimed citation matches the actual paper at its identifier (detects the real-DOI/fake-title fabrication pattern common in LLM hallucinations).
# verifyCitation
Cross-checks a _claimed_ citation (title, plus optional authors/year/container and one identifier) against the metadata resolved from that identifier. Catches the dominant fabrication pattern documented by Topaz et al. (Lancet, 2026): a real, resolvable DOI paired with an invented title and authors.
`resolveIdentifier` alone never catches this — it returns whatever the registry has for the identifier. `verifyCitation` is the only tool that compares the _claim_ against _reality_.
## When to use
- A user pastes a citation from an LLM transcript and asks "is this real?"
- An agent is auditing references in a manuscript draft for hallucinations.
- A reviewer wants to flag suspected fabricated citations before submission.
## Inputs
Wrap the citation fields inside a `claimed` object (one citation per call):
- `claimed` (object, required):
- `title` (string, required) — the title exactly as cited.
- one identifier — `doi`, `pmid`, `pmcid`, `isbn`, `arxiv`, `issn`, `ads`, or `whoIrisUrl`.
- `authors` (array, optional) — `[{ "family": "...", "given": "..." }]`; sharpens the verdict.
- `year` (number, optional); `container` (string, optional — the journal or book title).
- `options` (object, optional) — e.g. `{ "bypassCache": true }`.
## Outputs
```json
{
"ok": true,
"verdict": "matched" | "mismatch" | "not_found" | "ambiguous",
"confidence": "high" | "medium" | "low",
"matched": { "...": "the resolved CSL item, when one was found" }
}
```
- `matched` — the claim agrees with the record at the identifier.
- `mismatch` — the identifier resolves but the title does not (the fabrication pattern; flag it clearly).
- `ambiguous` — the identifier resolves to one paper but the claimed title matches a _different_ real paper (a wrong-identifier error, not a fabrication).
- `not_found` — neither identifier nor title resolves anywhere.
Every produced verdict returns `200 OK` — the verdict _is_ the answer, not a failure. 4xx/5xx are reserved for protocol errors.
## Underlying surfaces
- **REST**: `POST /api/verify` with `{ "claimed": { … } }`. One citation per call.
- **Web UI**: [`/tools/citation-verifier`](https://scholar-sidekick.com/tools/citation-verifier).
- **MCP tool**: `verifyCitation` in `scholar-sidekick-mcp` v0.7.0+.
## Example
```bash
curl -sS -X POST "https://scholar-sidekick.com/api/verify" \
-H "Content-Type: application/json" \
-d '{"claimed":{"title":"The title exactly as cited","doi":"10.1038/nphys1170","authors":[{"family":"Verlinde"}],"year":2011}}'
```
## See also
- `checkRetraction` for retraction status (different concern — fake vs. retracted).
- [`/citation-integrity`](https://scholar-sidekick.com/citation-integrity) for the broader trust surface.Check whether a scholarly work is openly accessible and return the best legal free URL, license, and version (via Unpaywall).
# checkOpenAccess
Resolves an identifier to a DOI, then looks up its open-access status via Unpaywall. Returns the best legal full-text location (preferring publisher copies, then repository copies), the licence, and the version (preprint, accepted, or published).
## When to use
- A user asks "is there a free copy?" or "where can I read this without a paywall?"
- An agent is preparing a reading list and wants to surface freely-readable links.
- A library or syllabus tool wants to filter recommendations by accessibility.
## Inputs
- `id` (string, required) — one identifier per call: DOI, PMID, PMCID, arXiv ID, ISBN, or ADS bibcode. Pass it verbatim. Items with no DOI return a "no DOI" result.
## Outputs
```json
{
"ok": true,
"doi": "10.1371/journal.pone.0173664",
"result": {
"isOa": true,
"oaStatus": "gold" | "green" | "hybrid" | "bronze" | "closed",
"title": "...",
"bestLocation": {
"url": "https://...",
"hostType": "publisher" | "repository",
"license": "cc-by" | null,
"version": "publishedVersion" | "acceptedVersion" | "submittedVersion" | null
},
"locations": [{ "url": "https://...", "hostType": "...", "license": null, "version": null }]
}
}
```
- `resolvedFrom` (`{ type, value }`) is present only when the input was not already a DOI.
- When no DOI can be found, `result` is `null` and `reason` is one of `no_doi` / `timeout` / `upstream`.
## Underlying surfaces
- **REST**: `POST /api/oa-check` with `{ "id": "…" }`.
- **Web UI**: [`/tools/open-access-checker`](https://scholar-sidekick.com/tools/open-access-checker).
- **MCP tool**: `checkOpenAccess`.
## Example
```bash
curl -sS -X POST "https://scholar-sidekick.com/api/oa-check" \
-H "Content-Type: application/json" \
-d '{"id":"10.1371/journal.pone.0173664"}'
```
## See also
- `resolveIdentifier` for full metadata.
- `checkRetraction` for retraction-awareness on the same identifier.Check whether a scholarly work has been retracted, corrected, or had an expression of concern raised (via Crossref + Retraction Watch).
# checkRetraction
Looks up the live retraction status of an identifier against Crossref's update relationships and the Retraction Watch database. The route resolves any supported identifier to a DOI first, then checks it. Returns retraction / correction / expression-of-concern flags plus the notice records.
## When to use
- A user asks "is this paper still valid?" or "has this been retracted?"
- An agent is about to cite a paper in a clinical, legal, or academic context where retraction-awareness matters.
- A reviewer wants to flag retracted references in a manuscript.
## Inputs
- `id` (string, required) — one identifier per call: DOI, PMID, PMCID, arXiv ID, or ADS bibcode. Pass it verbatim (`PMID:` and similar prefixes are tolerated). Books/ISBNs have no DOI, so they return a "no DOI" result.
## Outputs
```json
{
"ok": true,
"doi": "10.1016/s0140-6736(97)11096-0",
"resolvedFrom": { "type": "pmid", "value": "9500320" },
"result": {
"isRetracted": true,
"hasCorrections": false,
"hasConcern": false,
"notices": [
{
"type": "retraction",
"label": "Retraction",
"doi": "...",
"date": "1998-03-06",
"source": "crossref"
}
],
"title": "..."
}
}
```
- `resolvedFrom` is present only when the input was not already a DOI.
- When no DOI can be found, `result` is `null` and `reason` is one of `no_doi` / `timeout` / `upstream`.
## Underlying surfaces
- **REST**: `POST /api/retraction-check` with `{ "id": "…" }`.
- **Web UI**: [`/tools/retraction-checker`](https://scholar-sidekick.com/tools/retraction-checker).
- **MCP tool**: `checkRetraction`.
## Example
```bash
curl -sS -X POST "https://scholar-sidekick.com/api/retraction-check" \
-H "Content-Type: application/json" \
-d '{"id":"10.1016/s0140-6736(97)11096-0"}'
```
## See also
- `verifyCitation` for fabrication detection (different concern — fake vs. retracted).
- `checkOpenAccess` for legal-copy lookup.Export resolved citations to a reference-manager file format (RIS, BibTeX, CSL JSON, EndNote XML, RefWorks, NBIB, Zotero RDF, CSV, or plain text).
# exportCitation
Resolves identifiers and serialises the resulting items to a bibliography file. Targets reference managers (Zotero, Mendeley, EndNote, RefWorks) and LaTeX workflows (BibTeX/Overleaf).
## When to use
- The user wants to import citations into Zotero, Mendeley, EndNote, or a LaTeX project.
- An agent needs a `.ris`, `.bib`, or `.json` artifact to attach to a draft.
## Inputs
- `text` (string) OR `items` (CSL-JSON[]) — Input identifiers or pre-resolved items.
- `format` (string, required) — `ris`, `bibtex`, `csl-json`, `endnote-xml`, `refworks`, `nbib`, `rdf`, `csv`, or `txt`.
- `style` (string, optional) — Only used when `format=txt` (selects the formatter style).
## Outputs
Plain-text body in the requested format with appropriate `Content-Type` and `Content-Disposition: attachment; filename=...` headers.
## Underlying surfaces
- **REST**: `POST /api/export`.
- **MCP tool**: `exportCitation`.
## Example
```bash
curl -sS -X POST "https://scholar-sidekick.com/api/export" \
-H "Content-Type: application/json" \
-d '{"text":"10.1038/nphys1170\n9780306406157","format":"ris"}' \
-o citations.ris
```
## See also
- `formatCitation` for inline-rendered references.
- [`/docs.md#post-apiexport`](https://scholar-sidekick.com/docs.md) for full format reference.Format one or more scholarly identifiers as citations in a chosen style (Vancouver, AMA, APA, IEEE, CSE, or any CSL style ID).
# formatCitation
Takes a free-text block of identifiers (one per line, mixed types OK) and returns formatted citations in the requested style. Five builtins ship as plain-text formatters; any other style routes through citeproc-js with a CSL stylesheet.
## When to use
- The user pastes a list of DOIs/PMIDs/ISBNs and wants Vancouver/APA/IEEE/etc. references.
- An agent needs to render a bibliography for a draft manuscript.
## Inputs
- `text` (string, required) — One identifier per line, or free text containing identifiers.
- `style` (string, optional) — Builtin: `vancouver` (default), `ama`, `apa`, `ieee`, `cse`. Or any CSL style ID (e.g. `nature`, `lancet`, `chicago-author-date`).
- `locale` (string, optional) — CSL locale, e.g. `en-US`, `en-GB`.
- `output` (string, optional) — `"text"` (default) or `"html"`.
- `footnotes` (boolean, optional) — Render HTML output as footnotes.
## Outputs
`{ ok: true, items: [{ ok, formatted, _source }, ...] }`. Mixed success — per-item ok flag lets the agent surface partial failures.
## Underlying surfaces
- **REST**: `POST /api/format` (or `/api/format/stream` for NDJSON streaming).
- **MCP tool**: `formatCitation`.
## Example
```bash
curl -sS -X POST "https://scholar-sidekick.com/api/format" \
-H "Content-Type: application/json" \
-d '{"text":"10.1038/nphys1170\n34812345","style":"apa","output":"text"}'
```
## See also
- `exportCitation` for file-format bibliographies (RIS, BibTeX, etc.).
- [`/docs.md`](https://scholar-sidekick.com/docs.md) for full API reference.