The trust signals on /engineering-principles and /.well-known/sources.json are self-declared. This page is the receipts: copy-paste curl commands you can run against the live API to verify the determinism, provenance, edge-case, and citation-fabrication detection claims independently - including replaying the sealed 1,395-entry validation set (section 7). No signup required.
Examples below use 10.1038/nphys1170 as a canonical DOI. Substitute any DOI you control. All commands hit the public anonymous tier.
Run the same request twice. The response body should be byte-identical, and the x-scholar-transform-version header should match. Pin this value in your tests; if it changes, treat it as a signal to re-baseline expected output rather than a regression.
A=$(curl -sS -X POST https://scholar-sidekick.com/api/format \
-H "Content-Type: application/json" \
-d '{"text":"10.1038/nphys1170","style":"vancouver","output":"text"}')
B=$(curl -sS -X POST https://scholar-sidekick.com/api/format \
-H "Content-Type: application/json" \
-d '{"text":"10.1038/nphys1170","style":"vancouver","output":"text"}')
diff <(printf '%s' "$A") <(printf '%s' "$B") && echo "OK: identical"Expected: OK: identical - both calls returned byte-identical responses. The Vancouver citation itself is captured in $A / $B (non-empty); print one with printf '%s\n' "$A".
The same identifier produces the same citation whether formatted alone or inside a batch. Batch processing must not silently differ from single processing.
SINGLE=$(curl -sS -X POST https://scholar-sidekick.com/api/format \
-H "Content-Type: application/json" \
-d '{"text":"10.1038/nphys1170","style":"vancouver","output":"json"}' | jq -r '.text')
BATCH=$(curl -sS -X POST https://scholar-sidekick.com/api/format \
-H "Content-Type: application/json" \
-d '{"lines":["10.1038/nphys1170","PMID:30049270"],"style":"vancouver","output":"json"}' | jq -r '.text' | head -n1)
diff <(printf '%s' "$SINGLE") <(printf '%s' "$BATCH") && echo "OK: identical"Expected: OK: identical- the DOI's citation is the same whether formatted alone or as the first entry of a batch. (The /api/format response carries the formatted citations in the top-level .text field, newline-joined; items carry metadata only - there is no items[].formatted.)
Every successful response carries a fixed set of provenance headers. Use curl -i to print them and confirm they exist with the documented values.
curl -sS -i -X POST https://scholar-sidekick.com/api/format \
-H "Content-Type: application/json" \
-d '{"text":"10.1038/nphys1170","style":"vancouver","output":"text"}' \
| grep -iE '^(x-request-id|x-scholar-cache|x-scholar-formatter|x-scholar-style-used|x-scholar-transform-version):'Expected headers (always present on 2xx /api/format):
x-request-id - UUID for request correlationx-scholar-cache - hit:<key>, miss:<key>, or bypass:<reason>x-scholar-transform-version - date-stamped tag for the active normalisation, formatting, and resolver chainConditional headers (present only when relevant): x-scholar-formatter, x-scholar-style-used, x-csl-warning, x-csl-alias, x-csl-dependent, x-csl-fetch-style-id.
Failure modes follow the contract documented at /engineering-principles. Each curl below should return the documented status code and envelope.
curl -sS -w '\nHTTP %{http_code}\n' -X POST https://scholar-sidekick.com/api/format \
-H "Content-Type: application/json" \
-d '{"style":"vancouver"}'Expected: HTTP 400 with body { "ok": false, "error": "Missing 'lines' (array) or 'text' (string) in body.", "code": "VALIDATION_ERROR" }. A missing/empty text / lines, a malformed style, or an unknown output value all return VALIDATION_ERROR.
curl -sS -w '\nHTTP %{http_code}\n' -X POST https://scholar-sidekick.com/api/format \
-H "Content-Type: application/json" \
-d '{"text":"10.9999/this-doi-does-not-exist","style":"vancouver"}'Expected: HTTP 404 with body { "ok": false, "error": "No records found for the supplied identifiers.", "code": "NOT_FOUND" }. A well-formed but unregistered (or fabricated) identifier is a clean 404 - not a 200 with empty output.
curl -sS -w '\nHTTP %{http_code}\n' -X POST https://scholar-sidekick.com/api/format \
-H "Content-Type: application/json" \
-d '{"text":"this-is-not-a-doi-or-anything","style":"vancouver","output":"json"}'Expected: HTTP 200 with itemsOut: 0 and text: "". Text with no detectable identifier is a valid request that simply resolves nothing.
The fallback order per identifier type is published at /.well-known/sources.json and validates against sources.schema.json. Reordering or substituting resolvers is treated as a transform-version change.
curl -sS https://scholar-sidekick.com/.well-known/sources.json | jq '.resolvers'
curl -sS https://scholar-sidekick.com/.well-known/sources.json | jq -r '.transform_version'
curl -sS -o /dev/null -D - -X POST https://scholar-sidekick.com/api/format \
-H "Content-Type: application/json" \
-d '{"text":"10.1038/nphys1170"}' | grep -i x-scholar-transform-versionExpected: the transform_version in sources.json matches the value in the x-scholar-transform-version response header.
The full API surface, schemas, and error semantics are published at the canonical discovery path; the AI-plugin manifest points to the same spec:
curl -sS https://scholar-sidekick.com/.well-known/openapi.yaml | sed -n '1,40p' curl -sS https://scholar-sidekick.com/.well-known/ai-plugin.json | jq .
The verifier at /api/verify cross-checks a claimed citation against the paper that actually sits at its identifier. It catches the dominant AI-fabrication pattern documented by Topaz et al. (2026): a real DOI carrying an invented title. Every produced verdict returns 200 - the verdict is the answer, not a failure mode. Verdicts are matched, mismatch, not_found, or ambiguous; each carries a confidence of high / medium / low. All commands hit the public anonymous tier.
mismatchcurl -sS -X POST https://scholar-sidekick.com/api/verify \
-H "Content-Type: application/json" \
-d '{"claimed":{"doi":"10.1038/nphys1170","title":"A deep-learning framework for room-temperature superconductivity in cuprate marine sediments"}}' \
| jq '{verdict, confidence, resolved_title: .matched.title}'Expected: verdict: "mismatch". The identifier resolves cleanly, but the claimed title does not match the resolved record - .matched.title shows the real paper at that DOI, so you can see exactly what was substituted.
matchedcurl -sS -X POST https://scholar-sidekick.com/api/verify \
-H "Content-Type: application/json" \
-d '{"claimed":{"doi":"10.1038/nphys1170","title":"Measured measurement"}}' \
| jq '{verdict, confidence}'Expected: verdict: "matched". Measured measurement is the real title the previous call resolved at this DOI, so this command runs as-is.
curl -sS -i -X POST https://scholar-sidekick.com/api/verify \
-H "Content-Type: application/json" \
-d '{"claimed":{"doi":"10.1038/nphys1170","title":"An invented title"}}' \
| grep -iE '^(x-scholar-verify-version|x-scholar-verify-verdict|x-scholar-verify-confidence):'x-scholar-verify-version - date-stamped tag for the verdict semantics; pin it like x-scholar-transform-versionx-scholar-verify-verdict / x-scholar-verify-confidence - the verdict and its confidence, surfaced as headers for log-scraping without parsing the bodyThe published precision/recall numbers cite an immutable, sealed validation set. Fetch it and replay it against the live API - clean citations should verify as matched, fabrications should be flagged. The set is ordered clean-first, so the snippet samples both arms explicitly (8 clean + 12 fabricated); it hits the anonymous, rate-limited tier with a short sleep between calls, so run the full 1,395 in batches or with an API key.
FIX=https://scholar-sidekick.com/citation-integrity/validation-set-v4-blind.json
curl -sS "$FIX" | jq -c '
([.entries[] | select(.arm=="clean")][:8])
+ ([.entries[] | select(.arm=="fabrication")][:12])
| .[] | {claimed, arm}' \
| while read -r row; do
claimed=$(printf '%s' "$row" | jq -c .claimed)
arm=$(printf '%s' "$row" | jq -r .arm)
got=$(curl -sS -X POST https://scholar-sidekick.com/api/verify \
-H "Content-Type: application/json" -d "{\"claimed\":$claimed}" | jq -r .verdict)
if [ "$arm" = "clean" ]; then
[ "$got" = "matched" ] && echo "OK clean" || echo "FLAG clean got=$got"
else
[ "$got" != "matched" ] && echo "OK caught($got)" || echo "MISS fabrication"
fi
sleep 0.3
done | sort | uniq -cExpected on this sample: 8 OK clean and 12 OK caught(mismatch). On the full set the headline figures are 150 / 150 = 100% recall on the dominant fabrication patterns (Wilson 95% CI lower bound ~97.6%) and a 0.8% high-confidence false-accusation rate (Wilson 95% CI 0.4-1.4%). The exact ground-truth scoring rules and the full run live at /citation-integrity; the fixture is sealed, so the numbers reproduce against the version they cite. The optional Stage-3 LLM screen (options.screen_with_llm) is gated to authenticated / paid callers - the verdicts above are the deterministic pre-LLM result available anonymously.
Any verification check that produces unexpected output is a contract violation. Report it via the Contact link in the site footer, including the request ID (x-request-id) from the offending response, the exact input, and the observed output. Reproducibility is promised; failure to keep that promise is a bug.
The peer-reviewed work that motivates the citation-fabrication detection surface this site exposes is Topaz M, Roguin N, Gupta P, Zhang Z, Peltonen L-M. Fabricated citations: an audit across 2·5 million biomedical papers. The Lancet. 2026;407(10541):1779–1781 (doi:10.1016/S0140-6736(26)00603-3). The CITADEL pipeline described in that paper is the methodological anchor; Scholar Sidekick’s verifier is a real-time, pre-submission, API-shaped analogue. See /citation-integrity for the longer explainer and /tools/citation-verifier for the working implementation.
transform_version / verify_version bumps, tagged by impact, so you can detect drift and re-baseline pinned output