There are 5 John Smiths in your reference list. Which one wrote the paper you need?
ORCID solves this. Every researcher gets a unique ID (like 0000-0002-1825-0097), and you can look up their complete profile through a free API.
What ORCID Contains
- 18M+ researcher profiles worldwide
- Complete publication lists
- Institutional affiliations (past and present)
- Grants and funding received
- Education history
- Peer review activity
Quick Start
import requests
# Look up a researcher by ORCID ID
orcid_id = "0000-0002-1825-0097" # Josiah Carberry (test profile)
headers = {"Accept": "application/json"}
resp = requests.get(f"https://pub.orcid.org/v3.0/{orcid_id}", headers=headers)
data = resp.json()
name = data["person"]["name"]
print(f"Name: {name['given-names']['value']} {name['family-name']['value']}")
# Get works (publications)
works_resp = requests.get(f"https://pub.orcid.org/v3.0/{orcid_id}/works", headers=headers)
works = works_resp.json()
for group in works["group"][:5]:
summary = group["work-summary"][0]
title = summary["title"]["title"]["value"]
year = summary.get("publication-date", {}).get("year", {}).get("value", "N/A")
print(f" [{year}] {title}")
Search for Researchers
# Search by name
resp = requests.get("https://pub.orcid.org/v3.0/search/", headers=headers, params={
"q": 'family-name:Hinton AND given-names:Geoffrey',
"rows": 5
})
results = resp.json()
print(f"Found {results['num-found']} matches")
for r in results["result"][:5]:
orcid = r["orcid-identifier"]["path"]
print(f" ORCID: {orcid}")
Get Affiliations
orcid_id = "0000-0002-1825-0097"
resp = requests.get(f"https://pub.orcid.org/v3.0/{orcid_id}/employments", headers=headers)
data = resp.json()
for group in data.get("affiliation-group", []):
for summary in group["summaries"]:
emp = summary["employment-summary"]
org = emp["organization"]["name"]
role = emp.get("role-title", "N/A")
print(f" {org} — {role}")
Build a Researcher Profile Aggregator
def full_profile(orcid_id):
headers = {"Accept": "application/json"}
base = f"https://pub.orcid.org/v3.0/{orcid_id}"
# Get name
person = requests.get(base, headers=headers).json()["person"]
name = f"{person['name']['given-names']['value']} {person['name']['family-name']['value']}"
# Get works count
works = requests.get(f"{base}/works", headers=headers).json()
work_count = len(works.get("group", []))
# Get affiliations
emps = requests.get(f"{base}/employments", headers=headers).json()
orgs = [g["summaries"][0]["employment-summary"]["organization"]["name"]
for g in emps.get("affiliation-group", [])]
print(f"{name} ({orcid_id})")
print(f" Publications: {work_count}")
print(f" Affiliations: {', '.join(orgs[:3])}")
full_profile("0000-0002-1825-0097")
API Details
-
Base URL:
https://pub.orcid.org/v3.0/ - Auth: None needed for public data
- Rate limit: 24 requests/second
-
Endpoints:
/search,/{orcid}/works,/{orcid}/employments,/{orcid}/educations,/{orcid}/fundings
Pro Tips
- Use
Accept: application/jsonheader (default is XML) - Search syntax supports Boolean:
family-name:Smith AND affiliation-org-name:MIT - Combine with Crossref to get full paper metadata from ORCID publication lists
- The member API (free for institutions) gives more data
ORCID + OpenAlex + Crossref = disambiguate any researcher and get all their papers.
Do you use ORCID in your workflows? What research APIs would you like me to cover next?
More tools: GitHub\n\n---\n\n## More Free Research APIs\n\nThis is part of my series on free APIs for researchers and data scientists:\n\n- OpenAlex API — 250M+ Academic Works\n- CORE API — 260M+ Scientific Papers\n- Crossref API — DOI Metadata for 150M+ Papers\n- Unpaywall API — Find Free Paper Versions\n- Europe PMC — 40M+ Biomedical Papers\n- World Bank API — GDP & Economic Data\n- ORCID API — 18M+ Researcher Profiles\n- DBLP API — 6M+ CS Publications\n- NASA APIs — 20+ Free Space Data APIs\n- FRED API — 800K+ US Economic Time Series\n- All 30+ Research APIs Mapped\n\n*Tools: Academic Research Toolkit on GitHub*
Top comments (0)