AccuraCite API Documentation

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).

Authentication & Rate Limits

Authentication: All endpoints require an API key to be passed in the headers via X-API-Key. Available on every plan, including Free.

Rate Limits per minute:

  • Verification: 60 requests per minute
  • Generation: 30 requests per minute
  • Usage: 30 requests 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.

Verify Citations

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.

POST /api/v1/verify

Request Body

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.

Fields accepted in citation / citations

Field Aliases Notes
title—Required.
authorauthorsFree-text author string.
year—
doiDOI
url—
journalcontainer_title
volume—
issuenumber
pagepages
publisher—
typebibtex_entry_typee.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.

Batch credits are all-or-nothing: a 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.
URL citations are checked differently. If a citation is (or resolves to) a link to something that isn't in an academic database — software docs, a blog post, a company report, grey literature — AccuraCite fetches that page directly and confirms the title/author text actually appears on it, rather than matching it against a bibliographic record. This can still return 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.

Example: Using curl

bash
curl -X POST https://accuracite.com/api/v1/verify \ -H "Content-Type: application/json" \ -H "X-API-Key: YOUR_API_KEY_HERE" \ -d '{"text": "Vaswani, A., et al. (2017). Attention is all you need. Advances in neural information processing systems, 30."}'

Example: Using Python

python
import requests url = "https://accuracite.com/api/v1/verify" headers = { "X-API-Key": "YOUR_API_KEY_HERE", "Content-Type": "application/json" } payload = { "text": "Vaswani, A., et al. (2017). Attention is all you need." } response = requests.post(url, json=payload, headers=headers) print(response.json())

Example: Batch (using curl)

bash
curl -X POST https://accuracite.com/api/v1/verify \ -H "Content-Type: application/json" \ -H "X-API-Key: YOUR_API_KEY_HERE" \ -d '{"texts": [ "Vaswani, A., et al. (2017). Attention is all you need. Advances in neural information processing systems, 30.", "Kuhn, T. S. (1962). The Structure of Scientific Revolutions. University of Chicago Press." ]}'

Example: Structured fields, no LLM parse (using curl)

bash
curl -X POST https://accuracite.com/api/v1/verify \ -H "Content-Type: application/json" \ -H "X-API-Key: YOUR_API_KEY_HERE" \ -d '{"citation": { "title": "Attention is all you need", "author": "Vaswani, Ashish", "year": 2017, "journal": "Advances in Neural Information Processing Systems", "volume": "30" }}'

Example: Structured fields, batch (using curl)

bash
curl -X POST https://accuracite.com/api/v1/verify \ -H "Content-Type: application/json" \ -H "X-API-Key: YOUR_API_KEY_HERE" \ -d '{"citations": [ {"title": "Attention is all you need", "author": "Vaswani, Ashish", "year": 2017}, {"title": "The Structure of Scientific Revolutions", "author": "Kuhn, T. S.", "year": 1962, "publisher": "University of Chicago Press"} ]}'

Response

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_statusstringOne 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).
mismatchesstring[]Present only when mismatch. Any of: title, author, year, DOI, journal, volume, issue, page.
reasonstring | nullSet for some not_found results (e.g. a dead URL); otherwise null.
notestring | nullSet 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.
sourcestring | nullDatabase 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.
retractedbooleanIndependent 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.
citationobject | nulltitle, author, doi, url, year, bibtex_entry_type, volume, issue, page, publisher, container_title, abstract. Null only if nothing at all was found.
Note: when 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)

json
{ "verification_status": "verified", "mismatches": [], "reason": null, "note": null, "source": "Semantic Scholar", "retracted": false, "citation": { "title": "Attention is all you need", "author": "Vaswani A, Shazeer N, Parmar N, ...", "doi": "10.48550/arXiv.1706.03762", "url": "https://arxiv.org/abs/1706.03762", "year": "2017", "bibtex_entry_type": "article", "volume": null, "issue": null, "page": null, "publisher": null, "container_title": "Advances in Neural Information Processing Systems", "abstract": "The dominant sequence transduction models..." } }

Example: a real, matched paper that's been retracted (verified + retracted)

json
{ "verification_status": "verified", "mismatches": [], "reason": null, "note": null, "source": "OpenAlex", "retracted": true, "citation": { "title": "RETRACTED: Ileal-lymphoid-nodular hyperplasia, non-specific colitis, and pervasive developmental disorder in children", "doi": "10.1016/S0140-6736(97)11096-0", ... } }

Example: no confident match (not_found)

json
{ "verification_status": "not_found", "mismatches": [], "reason": null, "note": null, "source": "OpenAlex", "retracted": false, "citation": { "title": "A closest-match paper title, unrelated to what you sent", ... } }

Example: cited the published version, matched to its arXiv preprint (mismatch + note)

json
{ "verification_status": "mismatch", "mismatches": ["year", "DOI"], "reason": null, "note": "Matched record is an arXiv preprint. If the citation refers to a later published version of this paper, its year, DOI, volume, issue, or page range can legitimately differ from the preprint's.", "source": "arXiv", "retracted": false, "citation": { "title": "Deep learning in neural networks: An overview", "doi": "10.48550/arXiv.1404.7828", "year": "2014", ... } }

Example: batch response (texts)

json
{ "results": [ { "verification_status": "verified", "mismatches": [], "reason": null, "note": null, "source": "Crossref", "retracted": false, "citation": { "title": "Attention is all you need", ... } }, { "verification_status": "verified", "mismatches": [], "reason": null, "note": null, "source": "OpenAlex", "retracted": false, "citation": { "title": "The Structure of Scientific Revolutions", ... } } ] }

Errors

Status Cause
400None, 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.
401Missing or invalid X-API-Key.
413A text/texts citation exceeds 2,000 characters, or texts/citations exceeds 10 items.
429Rate 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.

Check Your Credit Usage

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.

GET /api/v1/usage

No request body — just the X-API-Key header. Rate limit: 30 requests per minute.

Example: Using curl

bash
curl https://accuracite.com/api/v1/usage \ -H "X-API-Key: YOUR_API_KEY_HERE"

Example: Using Python

python
import requests url = "https://accuracite.com/api/v1/usage" headers = {"X-API-Key": "YOUR_API_KEY_HERE"} response = requests.get(url, headers=headers) print(response.json())

Response

Field Type Description
planstringThe API key owner's current plan.
periodstringOne of day, month, or pass (a 7-day pass) — which calendar window credits_used counts against.
credits_usedintegerWeighted total for the current period: each verify costs 1 credit, each generate costs 4.
credits_limitinteger | nullThe plan's total pool for this period. null on unlimited plans — never Infinity, which isn't valid JSON.
credits_remaininginteger | nullcredits_limit minus credits_used, floored at 0. null on unlimited plans.
credits_reset_atstring | nullISO-8601 UTC timestamp for when this period's counter resets. null on unlimited plans.
verificationsintegerRaw verify-request count this period, unweighted.
generationsintegerRaw generate-request count this period, unweighted.

Example: a Free-plan key with some usage

json
{ "plan": "free", "period": "month", "credits_used": 12, "credits_limit": 50, "credits_remaining": 38, "credits_reset_at": "2026-11-01T00:00:00Z", "verifications": 12, "generations": 0 }

Errors

Status Cause
401Missing or invalid X-API-Key.
429Rate limit (30/min) exceeded. Includes a Retry-After header, same as the other endpoints.

Find Citations

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.

POST /api/v1/generate

Request Body

  • 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.

Example: Using curl

bash
curl -X POST https://accuracite.com/api/v1/generate \ -H "Content-Type: application/json" \ -H "X-API-Key: YOUR_API_KEY_HERE" \ -d '{ "text": "Transformer architectures rely heavily on self-attention mechanisms", "limit": 2 }'

Example: Using Python

python
import requests url = "https://accuracite.com/api/v1/generate" headers = { "X-API-Key": "YOUR_API_KEY_HERE", "Content-Type": "application/json" } payload = { "text": "Transformer architectures rely heavily on self-attention mechanisms", "limit": 2 } response = requests.post(url, json=payload, headers=headers) print(response.json())

Response

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).

json
{ "citations": [ { "title": "Attention is all you need", "author": "Vaswani A, Shazeer N, Parmar N, ...", "doi": "10.48550/arXiv.1706.03762", "url": "https://arxiv.org/abs/1706.03762", "year": "2017", "bibtex_entry_type": "article", "volume": null, "issue": null, "page": null, "publisher": null, "container_title": "Advances in Neural Information Processing Systems", "abstract": "The dominant sequence transduction models..." } ] }

MCP Server

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):

json
{ "mcpServers": { "accuracite": { "command": "npx", "args": ["-y", "accuracite-mcp"], "env": { "ACCURACITE_API_KEY": "your-api-key-here" } } } }

Restart your client after saving the config. verify_citation and find_citations then show up as tools it can call.