{"criteria_id":"reference-resolution/v1","service":"reference-check","version":"1.0.0","what_is_checked":"Whether a submitted citation reference resolves in its register and whether the claimed fields match the register's record, field by field.","scope":"This service verifies that a submitted citation reference resolves in its register and whether the claimed fields match the register's record. It does not judge whether the cited work supports any claim made about it, and it does not grade the cited work.","retention":"Submitted reference content is processed in memory only and is never stored — not in KV, not in logs, not in the ledger. The payments ledger records only the payer, the time, the price, and the aggregate outcome (verdict, identifier type, register). Because nothing is kept, a paid retry re-sends the reference.","prices":{"precheck":"free — verdict line only, 100/day per caller wallet, rate-limited (5s minimum interval)","check":{"usd":0.01,"units":10000,"includes":"$0.01 buys one reference check of one submitted citation reference (PMID, DOI, or arXiv). — the full signed field-by-field report (verdict, per-field claimed vs register comparison, and the register record relied on), graded under the published criteria (GET /criteria). This service verifies that a submitted citation reference resolves in its register and whether the claimed fields match the register's record. It does not judge whether the cited work supports any claim made about it, and it does not grade the cited work.","per_item_line":"$0.01 buys one reference check of one submitted citation reference (PMID, DOI, or arXiv)."}},"input_contract":{"format":"JSON POST body { reference: { type?, id, claimed: { title, authors?, year? } }, caller }","claimed_title":"REQUIRED string","claimed_authors":"optional array of strings","claimed_year":"optional integer","caller":"Solana base58 wallet of the caller (required for the free pre-check; keys the free allowance). On the paid check the payer is read from the payment itself.","caps":{"max_body_bytes":16384},"type_inference_when_type_absent":"all-digits id -> pmid; ^10\\.\\d{4,9}/\\S+ -> doi; arXiv forms (YYMM.NNNNN with MM 01-12, optional vN; or old-style archive/YYMMNNN) -> arxiv","type_contradiction":"An explicit type contradicting the id's form -> 400, free, before any payment.","not_covered":"An unsupported type (isbn, issn, url, or anything else), an id matching no covered form, or a closed leg returns NOT COVERED: on /precheck HTTP 200 with verdict 'NOT COVERED'; on /check HTTP 422 returned BEFORE any payment verification, never consuming a payment.","id_normalization":{"doi":"strip https://doi.org/ / http://dx.doi.org/ / doi: prefixes, lowercase","arxiv":"strip 'arXiv:' prefix; version suffix (vN) is ignored for resolution — the register's current version is the referent","pmid":"digits only, kept as given (no leading-zero padding)"}},"registers":{"pmid":{"type":"pmid","register":"PubMed","adapter":"NCBI E-utilities esummary (db=pubmed)","leg_var":"PMID_LEG","request":"GET https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=<id>&retmode=json&tool=ExchangeRebel&email=research@exchangerebel.com"},"doi":{"type":"doi","register":"Crossref","adapter":"Crossref REST works","leg_var":"DOI_LEG","request":"GET https://api.crossref.org/works/<encodeURIComponent(doi)> with User-Agent ExchangeRebel/1.0 (mailto:research@exchangerebel.com)"},"arxiv":{"type":"arxiv","register":"arXiv","adapter":"arXiv API query (Atom)","leg_var":"ARXIV_LEG","request":"GET https://export.arxiv.org/api/query?id_list=<base-id> with a declared User-Agent"}},"leg_switches":{"vars":["PMID_LEG","DOI_LEG","ARXIV_LEG"],"default":"on","off_effect":"that register leg returns NOT COVERED with reason 'leg_closed'; each leg is independently closable (D1 rule)","fetch_timeout_ms":10000},"comparison":{"normalize_text":"normalizeText(s): NFKD -> strip combining marks -> lowercase -> remove all characters that are not letters, numbers or whitespace -> collapse whitespace -> trim.","title":{"always_compared":true,"method":"token sets A (claimed) vs B (register) over normalizeText; Jaccard = |A intersect B| / |A union B|","match":"Jaccard >= 0.85 OR (A is a subset of B AND |A|/|B| >= 0.60)","jaccard_threshold":0.85,"subset_register_fraction_min":0.6},"authors":{"compared_only_when_claimed_authors_present":true,"claimed_surname":"claimed string with a comma -> part before the comma; else the last whitespace token; then normalizeText (single token result)","register_surname":{"doi":"Crossref author.family","pmid":"NCBI author name -> first token","arxiv":"arXiv author name -> last token"},"match":"first-author surnames equal AND |claimed surnames found in the register surname multiset| / |claimed| >= 2/3 (claimed count 1 -> first-author equality alone)","found_fraction_min":0.6666666666666666},"year":{"compared_only_when_claimed":true,"match":"integer equality","register_year_precedence":{"doi":["published","issued","published-online","published-print","created"],"pmid":"first 4 characters of pubdate when numeric, fallback sortpubdate","arxiv":"published year"}},"verdicts":["RESOLVES-AND-MATCHES","RESOLVES-BUT-DIFFERS","DOES-NOT-RESOLVE","NOT COVERED"],"version_suffix":"arXiv version suffix (vN) is ignored for resolution; the register's current version is the referent."},"verdicts":{"RESOLVES-AND-MATCHES":"every compared field matches","RESOLVES-BUT-DIFFERS":"the record exists and at least one compared field differs; the report carries per-field { field, claimed, register, match } and the register record relied on","DOES-NOT-RESOLVE":"no register record for the identifier","NOT COVERED":"identifier type is outside the covered set, or its leg is closed"},"verdict_response_carries":["identifier (normalized)","type","register","retrieved_at (ISO, the check's as-of)","criteria_id","signature"],"kill_line":"Day-0 = first outside paid settle (house never counts); Day-0+60d report-only checkpoint; keep/park at Day-0+6mo; tripwires: refunds >5%/30d, free use >10x paid, a wrong verdict from undisclosed stale/partial data stops serving."}