Skip to content

scholarcore

A shared vocabulary for academic data. scholarcore defines the common nouns of academic work (Person, Researcher, Paper, Award, Opportunity, Organization) as Pydantic models keyed on canonical identifiers, so independent systems can agree on the shape of a person or a grant without sharing a database, an API, or a UI.

Use it when two systems need to describe the same researcher, publication, or grant and then join those records later. Each system stores its own data and extends the models with its own fields; the shared identifier is what makes the records line up.

Terminal window
pip install -e ./scholarcore # from a checkout
pip install -e "./scholarcore[test]" # + pytest and jsonschema

The only dependency is pydantic>=2.6. requires-python is >=3.12.

EntityCanonical identifierModule
Person / Researcherridscholarcore.person
Papernormalized DOI, or PMIDscholarcore.biblio
Awardapplication_idscholarcore.funding
Opportunityopportunity_numberscholarcore.funding
Organizationnonescholarcore.org
Affiliationnonescholarcore.affil

Each entity also has a lightweight pointer type (PersonRef, PaperRef, AwardRef, OpportunityRef) holding the join key plus a cached name or title, so one record can reference another without embedding it.

scholarcore/__init__.py imports every submodule eagerly, so import scholarcore.funding pulls in the whole package, not only Award and Opportunity. Importing from the submodule directly saves only a name lookup, not an import cost.

from scholarcore import Award, AwardStatus, PersonRef
award = Award(
application_id="1R01GM123456",
title="Chromatin accessibility across cell types",
funder="NIH",
activity_code="R01",
pi=PersonRef(rid="0000-0002-1825-0097", name="Josiah Carberry"),
status="active",
)
print(award.pi.rid) # 0000-0002-1825-0097
print(award.status) # AwardStatus.active

Another system holding the same award stores its own fields alongside application_id, and the two records join on that value.

  • Canonical identifiers: what identifies each entity, how values are normalized, and when to mint a local researcher id.
  • Extend the models: add your own fields to a core model, and read records written by a system you do not control.
  • Model reference: every field of every model, the enum vocabularies, and the generated JSON Schemas.

Person carries identity and contact fields; Researcher adds training, career, and field of study. For the full researcher profile (expertise, publications, privacy tiers, provenance), see the researcher-profiles SDK.

MIT.