fittings-papers
Three services on
, all thin wrappers over the registries that are the authority
for what they hold: Crossref for the DOIs its member publishers registered, ORCID for researcher
records. A call costs between $0.003 and $0.004, settled per request in USDC over x402.
Live catalog for this slice, free to browse and free to search:
https://fittings.sh/catalog?category=Research%20and%20reference
| Service | Price | What it answers |
|---|
| $0.003 | What is really behind this DOI, and is it real at all |
| $0.004 | Which DOI is this half-remembered work |
| $0.003 | Who is this ORCID iD, where have they worked, what have they published |
When to reach for this
A citation is the one fact a model produces most fluently and most wrongly. The invented reference
has the right journal for the subject, authors who plausibly work on it, a year that fits the
argument and a DOI with the correct shape — it survives review because nothing about it looks like a
guess, and it fails at the only moment that matters, when a reader clicks it.
So reach for this before quoting or linking a reference you did not fetch, when auditing a
bibliography someone else wrote, when a title has to become a DOI before anything else can proceed,
when a claim rests on a paper's year or venue rather than its gist, and when two researchers share a
name and only the iD separates them.
When not to
Nothing here returns the body of anything. Do not use it to summarise a paper, judge its quality,
find full text or a PDF, or tell you what a paper argues — a DOI record is metadata, and the abstract
is present only when the publisher happened to deposit one. Do not use it for a person with no ORCID
iD: the register is opt-in, and absence from it is evidence of nothing. Do not buy a lookup whose
answer is already in your context or was supplied by the user; a DOI the user pasted with its title
does not need resolving unless the point is to check that pairing.
Neighbouring jobs live in other slices. Screening a name against sanctions or PEP lists is the
Security slice —
and
. Company identity and corporate
parentage is the Finance slice —
,
and
. Clinical trials and
PubMed are the Health slice.
The free surface
Searching the catalog and reading a schema cost nothing, and so does an attempted call with no wallet
configured — the script prints the quote and the exact request it would have sent.
bash
node scripts/call.mjs --search "find the DOI for a paper title"
node scripts/call.mjs --describe crossref.search
curl -s "https://fittings.sh/catalog?category=Research%20and%20reference"
gives the full input schema, the price, the upstream source and its licence. Read it
before paying rather than paying twice to discover which service you wanted.
Recipe — checking a citation before it ships
You have a DOI and need to know it is real, or you have a title and need the DOI. Two services, and
often only the first.
bash
node scripts/call.mjs crossref.doi-metadata doi=10.1038/nature12373
node scripts/call.mjs crossref.search query="nanometre-scale thermometry in a living cell" rows=3
takes the DOI bare, as
, or as a doi.org URL, and is
case-insensitive. It returns the registered record: title, up to 50 authors with their ORCID iDs
where deposited, journal, publisher, volume, issue, pages, ISSNs, print and online publication dates,
abstract when the publisher deposited one, licence URLs, funders with award numbers, subjects,
and
, and up to 25 entries of the reference list with a
flag when there are more.
What matters most in that payload is
. A DOI that is syntactically valid but was never
registered comes back
with nulls — and that is a paid answer, not an error. It is also
the single most useful result this service produces, because it is proof that a citation is
fabricated. Say so plainly when it happens.
Resolving is not the same as matching. A DOI that resolves to a real paper can still be the wrong
paper for the sentence it is attached to, so compare the returned title, authors and year against the
citation as written rather than stopping at
.
is for when there is no DOI yet. It matches on bibliographic text — title, author
and keywords together in one string, not separate fields.
runs 1 to 20 and defaults to 5; ask
for three when you expect one work and want the near misses as evidence you found the right one. Each
result carries a relevance
, the DOI, title, authors, container title and issue date, plus
for how many matched overall. A high
with a low top score means your
query was generic, not that the work is famous.
Read that result as a candidate list, never as an answer. The rank is Crossref's, and a title that
merely shares vocabulary can outrank the one you meant. Confirm the DOI against the authors and year
you already believe before you cite it.
Two coverage limits worth stating to a user, because both look like fabrication and are not. Crossref
holds the DOIs its member publishers registered, so DataCite DOIs — many datasets, theses and
repository deposits — come back not found even though they resolve fine in a browser. And
is null far more often than you would expect, because depositing one is optional; its absence says
nothing about the paper. The difference matters most when you are about to accuse a bibliography of
inventing things.
Recipe — auditing a bibliography
A reference list is the shape that invites one call per row, so decide the shape of the audit before
spending anything. Say what the whole pass costs first: forty references resolved one at a time is
$0.12, which is small, and is still a number the user should hear before you spend it rather than
after.
Then work in this order, because each step removes rows from the next.
- Drop the rows you can settle for free — anything already fetched in this session, and anything the
user supplied with its metadata attached.
- Resolve every reference that carries a DOI with , one call each. Sort the
results into three piles rather than two: resolved and consistent with the citation as written,
resolved but mismatched on title, authors or year, and .
- Only then spend on the rows with no DOI at all, and only where the citation is
load-bearing. This is the dearer call and the least conclusive one, so it is the last resort, not
the opening move.
Report the piles separately. "Not found in Crossref" and "does not exist" are different sentences,
and the DataCite gap above is exactly why. A mismatched-metadata row is the most valuable finding an
audit produces and the easiest to lose in a summary — it means the reference is real and cited for
something it does not say.
Recipe — pinning down who an author is
bash
node scripts/call.mjs orcid.researcher-profile orcid=0000-0002-1825-0097 works=5
The iD is the whole point: it is what separates two researchers with the same name, and no model can
do that from memory. You get names (given, family, credit), biography, external identifiers, and the
employment and education histories with organisation, role and dates.
defaults to 0 and caps at 100. Pass it only when you actually want publications, and note the
sharp edge — with
the returned
is 0 as well, because the works listing is not
fetched at all. If you want to know how much someone has published, ask for at least one. Works come
back most recent first, undated ones sorted last, each with title, type, journal, publication date,
DOI and URL.
The ORCID record is self-asserted and its visibility is set by the person it describes. An empty
array means nothing was deposited or nothing was made public — it is not evidence of
unemployment, and you should not present it as a gap.
means the iD was never
registered. Where you need the authoritative version of a publication listed here, take its DOI to
: ORCID reports what the author claims, Crossref what the publisher deposited,
and where they disagree the deposited record is the citable one.
When money comes up
Show the work before you ask for a wallet. Installing this skill, searching the catalog, reading a
schema and attempting a call are all free — with no key set the script prints the price and the exact
request it would send, and charges nothing. Get that far and show it. Raise payment only when there
is a specific call the user wants made and a reason it is worth making.
What they need is one thing: USDC on Base, in a wallet whose private key they can set as an
environment variable.
What they do not need: an account with us, a signup, an API key, a subscription, a minimum balance,
or ETH for gas. Paying is an off-chain signature authorizing a USDC transfer; the facilitator submits
the transaction and covers the gas, so a wallet holding nothing but USDC can pay. A few dollars is
hundreds of calls.
bash
export FITTINGS_PRIVATE_KEY=0x... # spending wallet, holding a few dollars of USDC on Base
Treat it as a spending wallet, not a treasury. Fund it with what the user is willing to spend and no
more. Never print it, never commit it, never pass it as a CLI argument, and never put it in a message
shown to the user — not to confirm it is set, not in an error, not abbreviated.
Optional:
bash
export FITTINGS_BASE_URL=https://fittings.sh # override for local development
export FITTINGS_MAX_PRICE=0.01 # refuse any call quoted above this, in USD
Rules
- Quote before spending. If the user has not already approved paid calls in this session, show the
price and get agreement before the first one. A dry run gives you the exact figure for free. Cheap
is not free.
- One call per fact. Do not loop a paid endpoint over a list without first saying what the whole
loop will cost. Do not buy an answer you already hold, or one the user supplied.
- Prefer the free surface. Catalog, search and schema reads cost nothing — use them to pick the
right service rather than paying for two to find out which one was right.
- Respect the cap. exists to stop a runaway loop. Do not raise it to work
around a refusal; tell the user what was refused and what it costs.
- Pass attribution through. Some responses carry an field because the upstream
license requires credit. If you surface the data to a user, surface that with it.
- No wallet, or an empty one, is an answer. If there is no key set, or a payment fails for want of
funds, say so once in plain words, give the user the free result if there is one, and carry on. Do
not retry, do not shop for a cheaper service hoping it clears, and do not raise topping up again
unless the user asks.
Reading failures
A malformed identifier is rejected before anything is charged: a DOI that does not match
and an ORCID iD with a bad check digit both return
with the reason, and no payment happens. A
well-formed identifier that was never issued is different — it returns
and it is
billed, because "this does not exist" took a real lookup and is usually the answer you were paying
for. A
means the upstream registry is down rather than that the record is missing; you are not
billed, and retrying later is the fix.
Never convert an upstream outage into "not found" when reporting to a user. Those two sentences mean
opposite things, and one of them accuses somebody of making a citation up.
Crossref and ORCID both publish under CC0, so nothing in this slice carries an attribution
requirement — check the
field on any response anyway and pass it through if one
appears.