AccuraCite provides a synchronous REST API for external scripts and developers requiring immediate JSON responses. Easily verify existing citations or generate new literature recommendations programmatically.
Machine-readable spec: openapi.json (OpenAPI 3.1).
X-API-Key. Available on every plan, including Free.
Rate Limits per minute:
Note: Verifications and citation findings draw from one shared credit pool. Each successful verify request deducts 1 credit; each generate request deducts 4 credits per citation. See Pricing for your plan's total.
Note: a 429 from the per-minute rate limit includes a Retry-After header and a retry_after_seconds field telling you exactly how many seconds to wait. A 429 from hitting your plan's credit limit instead includes credits_reset_at, an ISO-8601 timestamp for when the pool refills.
Checks a citation against indexing databases to see if it's accurate, not found, or has mismatches. Accepts either a single citation or a small batch in one call, as raw text or already-structured bib-style fields. text/texts can be a formatted bibliographic citation or a bare URL — see the note on URL citations below.
Provide exactly one of the following four fields:
text (string) - A single raw academic citation string to verify, parsed via LLM extraction. Under 2,000 characters.texts (string[]) - A batch of up to 10 citation strings to verify in one call, each under 2,000 characters. Batch items are verified in parallel, so response time is close to that of a single citation, not multiplied by batch size.citation (object) - A single citation already broken into bib-style fields (title, author, year, doi, journal, ...) — skips the LLM parse entirely. Use this if you already have structured metadata, e.g. from your own .bib file, so you're not paying to have it extracted back out of a string you built it from in the first place.citations (object[]) - A batch of up to 10 citation objects, verified in parallel.citation / citations| Field | Aliases | Notes |
|---|---|---|
| title | — | Required. |
| author | authors | Free-text author string. |
| year | — | |
| doi | DOI | |
| url | — | |
| journal | container_title | |
| volume | — | |
| issue | number | |
| page | pages | |
| publisher | — | |
| type | bibtex_entry_type | e.g. article, book. |
| abstract | — |
All fields except title are optional. Each value is capped at 500 characters, and an unrecognized field name is rejected with a 400.
texts/citations request claims credit for the whole batch up front. If your remaining credit balance can't cover every citation in the batch, the entire request is rejected (429) and nothing is charged or processed — it never silently verifies a partial batch.
verified, but with a narrower guarantee: it confirms the page exists and matches the title/author you gave it, not that every other field (year, journal, volume, etc.) is independently correct, since there's no database record to cross-check those against. Links to recognized scholarly domains (doi.org, arxiv.org, PubMed, major publishers, etc.) are unaffected — those still go through the full database search like any other citation.
A text request returns a single object with the fields below. A texts request returns {"results": [...]} — an array of these same objects, one per citation, in the same order as your input.
| Field | Type | Description |
|---|---|---|
| verification_status | string | One of verified, mismatch, not_found, invalid_input (the submitted text doesn't look like a reference-list entry at all — e.g. a narrative sentence that just mentions a source rather than citing it — so nothing was sent to any database). |
| mismatches | string[] | Present only when mismatch. Any of: title, author, year, DOI, journal, volume, issue, page. |
| reason | string | null | Set for some not_found results (e.g. a dead URL); otherwise null. |
| note | string | null | Set when source is arXiv and every field in mismatches is one that can legitimately differ between a preprint and its eventual published version (year, DOI, volume, issue, page). The mismatch itself is still real — this just flags the likely reason, since arXiv only ever hosts preprints. Null otherwise. |
| source | string | null | Database that supplied citation: OpenAlex, Crossref, Semantic Scholar, PubMed, DBLP, arXiv, or Google Scholar. Publisher Metadata and URL Direct Check mean a URL was fetched directly instead — see the note on URL citations above. |
| retracted | boolean | Independent of verification_status — a citation can be a real, correctly-matched paper (verified) and still be retracted. Sourced from retraction metadata already published by OpenAlex, Crossref, and PubMed. false means none of the providers consulted flagged it, not a confirmed clean bill of health. |
| citation | object | null | title, author, doi, url, year, bibtex_entry_type, volume, issue, page, publisher, container_title, abstract. Null only if nothing at all was found. |
verification_status is not_found, citation may still be populated — it's the closest candidate match, not a confirmed one. Always branch on verification_status, never on whether citation is present.
Example: a real, matched paper (verified)
Example: a real, matched paper that's been retracted (verified + retracted)
Example: no confident match (not_found)
Example: cited the published version, matched to its arXiv preprint (mismatch + note)
Example: batch response (texts)
| Status | Cause |
|---|---|
| 400 | None, or more than one, of text / texts / citation / citations provided; a non-string item in texts; or, for citation/citations, a missing title, an unrecognized field name, a field value that isn't a string/number, or a field value over 500 characters. |
| 401 | Missing or invalid X-API-Key. |
| 413 | A text/texts citation exceeds 2,000 characters, or texts/citations exceeds 10 items. |
| 429 | Rate limit (60/min) or credit limit reached — for a batch (texts/citations), this means the whole batch, not just one item. See the note above for the Retry-After/credits_reset_at fields this returns. |
Read-only: returns how much of your plan's shared credit pool the API key's owner has used and has left. Costs no credits itself, so it's safe to poll freely — e.g. from an external admin dashboard. Reuses the same limit/usage lookups the account page shows, so the two can never disagree.
No request body — just the X-API-Key header. Rate limit: 30 requests per minute.
| Field | Type | Description |
|---|---|---|
| plan | string | The API key owner's current plan. |
| period | string | One of day, month, or pass (a 7-day pass) — which calendar window credits_used counts against. |
| credits_used | integer | Weighted total for the current period: each verify costs 1 credit, each generate costs 4. |
| credits_limit | integer | null | The plan's total pool for this period. null on unlimited plans — never Infinity, which isn't valid JSON. |
| credits_remaining | integer | null | credits_limit minus credits_used, floored at 0. null on unlimited plans. |
| credits_reset_at | string | null | ISO-8601 UTC timestamp for when this period's counter resets. null on unlimited plans. |
| verifications | integer | Raw verify-request count this period, unweighted. |
| generations | integer | Raw generate-request count this period, unweighted. |
Example: a Free-plan key with some usage
| Status | Cause |
|---|---|
| 401 | Missing or invalid X-API-Key. |
| 429 | Rate limit (30/min) exceeded. Includes a Retry-After header, same as the other endpoints. |
Finds real literature and academic papers to back up a specific scientific claim. A retracted paper is never returned, even if its abstract otherwise matches — it's treated the same as not finding a qualifying source at all.
text (string, required) - The scientific claim or statement you need backed up.limit (integer, optional) - The maximum number of citations to retrieve. Defaults to 1, must be between 1 and 10.citations (array) — up to limit real papers whose abstract supports the claim. Can be shorter than limit, or empty, if fewer qualifying papers were found — unused quota for any shortfall is refunded automatically. Each entry has the same fields as citation above (title, author, doi, url, year, bibtex_entry_type, volume, issue, page, publisher, container_title, abstract).
Prefer calling AccuraCite from Claude, Cursor, or another MCP client instead of writing HTTP requests yourself? accuracite-mcp wraps the same two endpoints above (verify_citation and find_citations) as MCP tools — same X-API-Key, same credit pool, same responses. See the announcement post for background.
Add this to your MCP client's config (e.g. Claude Desktop's claude_desktop_config.json):
Restart your client after saving the config. verify_citation and find_citations then show up as tools it can call.