Skip to main content
OpenAlex’s author entity resolution is good but imperfect. A profile (A1234...) can be missing real works (the byline used a name variant the resolver didn’t link), and can also include works that belong to someone else (a different person with a similar byline got attached). This recipe finds both kinds of candidate so you can correct the profile.
This is a good task to hand to an LLM agent. The “find missing works” half powers the “Add works” dialog on author profiles in the OpenAlex web UI.
The technique uses raw_author_name.search, which matches the byline string on each work directly (rather than the resolved author.id). That lets you find works the resolver missed, and inspect the byline on each work currently attached to the profile.

Step 1: Get the profile’s display name

Fetch the author and pull display_name. That string is your query seed.
display_name_alternatives can also be used as extra seeds, but vet them first — the field is collected from upstream byline metadata and sometimes includes unrelated names (cross-author confusion the resolver hasn’t sorted out yet). Surname + given-token compatibility with the primary display_name is a reasonable filter.

Step 2: Generate byline variants

Normalize the seed (lowercase, strip diacritics, drop punctuation, split on whitespace) into tokens, then generate quoted phrase variants: For an author with middle tokens (e.g. Jane M Smith), also drop the middle tokens to generate "jane smith" / "smith jane" — otherwise the slop=0 form misses the no-middle-initial papers entirely.

Step 3: Find candidate additions (missing works)

Fire the variants as one OR’d raw_author_name.search value. Combine OR’d phrases with OR, not multiple filter clauses (those AND together). The OpenAlex web UI uses a 5-step “ladder” — start narrow, widen one step at a time, and stop as soon as meta.count clears a threshold (the dialog uses 100). Each rung trades precision for recall, so don’t widen further than you need to.
Two non-obvious query params worth knowing:
  • include_xpac=true — without this, the API silently drops XPAC works, about 22% of byline-match candidates.
  • type:!paratext — excludes issue covers, errata, and similar where bylines are conflated.
Once you have the results, drop the works already on the profile (where some authorship’s author.id is the target). Doing this client-side rather than via an authorships.author.id:!A1234 filter clause lets you surface duplicate attributions too — the same paper attached to a different J. Priem entity, which a curator usually wants to see. Then apply a byline-match gate: a work qualifies as an addition candidate only if at least one of its authorships’ raw_author_name matches the seed on surname AND (full first-given OR first-initial). Wider ladder steps ("j priem") match works whose byline reads “Richard J. Priem” — a different person sharing surname + first initial; the gate is what filters those out.

Step 4: Find candidate removals (wrongly-attributed works)

Fetch the works currently attached to the profile and run each one’s target authorship through the same gate. Misses are candidates for removal — the resolver attributed the paper to this profile but the byline doesn’t fit the seed.
For each returned work, pull the authorship whose author.id equals the target. If its raw_author_name doesn’t pass the surname + given-compat check, flag the work:
False-positive classes worth knowing before you remove anything: married/maiden-name changes, transliteration variants of non-Latin names (e.g. Chinese pinyin vs Wade-Giles), single-name authors, authors who publish under a pseudonym, and the occasional non-standard byline format (a byline written as "First, Last" with a stray comma flips wrong under the Last, First convention). A surname mismatch is a signal, not a verdict — always corroborate via ORCID, co-authors, or institution before removing.

Scoring candidates: what’s actually informative

The gate above keeps recall high in both directions; ranking the survivors by confidence is where the recipe earns its keep. The same signals apply to addition candidates (where the seed should match) and removal candidates (where it shouldn’t). A few perform very differently than they look — the notes below come from an internal 1,400-author gold-standard evaluation of OpenAlex’s resolver:
  • authorships[].author.orcid matching the target’s ORCID is essentially ground truth — but only ~30% of works in recent years carry a raw_orcid from the publisher, so this gates fewer candidates than expected. When present, take it.
  • Name rarity dominates everything else. The same surname-plus-given-initial match means very different things for “J. Smith” and for a rare name. If you have access to a name-frequency estimate, weight by it — a rare-name candidate with no other signals is far more likely to be correct than a common-name candidate with two weak signals.
  • First-initial-only matches are noisier than they look. In our overmerge analysis, ~17% of false-merges were “D. Sutcliffe” wrongly attributed to “David L. Sutcliffe” (or similar) — different people who share surname + first initial. Treat initial-only candidates as the weakest tier; require corroboration.
  • 3+ shared co-authors within the same name block is a high-confidence merge signal even without ORCID. Pairwise co-author overlap (1–2 shared) is much weaker.
  • CJK names are harder. Expect a higher false-positive rate on East Asian names — same-script collisions are common, and the byline-match gate above is a romanization match, which loses information. Lean harder on ORCID / institution / co-author signals for these.
  • Most legitimately-missing works live on tiny “splinter” entities (1–2 works each), not on other large profiles. Candidates currently attributed to an author.id with very few works are usually safe merges; candidates currently attributed to a large other profile deserve scrutiny.

Full Python script

additions are candidates to attach via the curation API; removals are candidates to detach. Both lists are candidates — score them with the signals above and route low-confidence cases through human review.