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,402-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 recall and false-accusation numbers cite an immutable, sealed validation set. Fetch it and replay it against the live API. The snippet below samples across strata rather than taking the first rows of each arm - deliberately, because the file is ordered clean-DOI-first, and sampling in file order would only ever exercise our two easiest cells (clean DOIs, which false-flag at 0.33%, and real-DOI-fake-title, which we catch 35/35). That would make the kit look better than the product is. This sample includes the two cells we publish as weak - ISBN and near-miss titles - so you can watch them fail. It takes 20 rows across 10 strata, the first N per stratum in file order, so it is deterministic: you should get the same rows we did. It hits the anonymous, rate-limited tier with a short sleep between calls, so run the full 1,402 in batches or with an API key.
FIX=https://scholar-sidekick.com/citation-integrity/validation-set-v5-blind.json
curl -sS "$FIX" | jq -c '
def take($s; $n): [.entries[] | select(.stratum==$s)][:$n];
take("clean:doi";3) + take("clean:isbn";2)
+ take("clean:pmid";1) + take("clean:whoiris";1)
+ take("fab:real-doi-fake-title";3) + take("fab:wrong-doi";2)
+ take("fab:real-doi-wrong-authors";2) + take("fab:pmid-doi-split";2)
+ take("fab:real-doi-near-miss-title";3) + take("fab:near-miss-one-letter-long";1)
| .[] | {claimed, arm, stratum}' \
| while read -r row; do
claimed=$(printf '%s' "$row" | jq -c .claimed)
arm=$(printf '%s' "$row" | jq -r .arm)
st=$(printf '%s' "$row" | jq -r .stratum)
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 ($st) got=$got"
else
[ "$got" != "matched" ] && echo "OK caught($got)" || echo "MISS fabrication ($st)"
fi
sleep 0.3
done | sort | uniq -cExpected on this sample (observed 2026-08-06 against the live anonymous tier, all HTTP 200): 7 OK clean, 10 OK caught - six mismatch and four ambiguous - and 3 MISS fabrication. The three misses are the point of sampling this way: two are fab:real-doi-near-miss-title and one is fab:near-miss-one-letter-long. Both are cells we publish as weak - near-miss titles are caught 10/35 on the full set, and the one-letter long-surname shape is a pre-registered expected failure (a single character is arithmetically invisible from five characters up). The one near-miss title this sample does catch comes back mismatch at low confidence while both misses come back matched at high confidence - which is exactly the calibration problem we describe at /citation-integrity. A sample that returned a clean sweep would be hiding it. The full-set figures are 87.3% fabrication recall and a 0.87% high-confidence false-accusation rate (Wilson 95% CI 0.47-1.59%), measured once on 2026-08-02. The superseded v4 holdout stays published as validation-set-v4-blind.json if you want to replay the before-measurement. The exact ground-truth scoring rules and both runs 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