DEV Community

Alex Spinov
Alex Spinov

Posted on

ORCID Has a Free API — Look Up Any Researcher's Publications, Affiliations, and Grants

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}")
Enter fullscreen mode Exit fullscreen mode

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}")
Enter fullscreen mode Exit fullscreen mode

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}")
Enter fullscreen mode Exit fullscreen mode

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")
Enter fullscreen mode Exit fullscreen mode

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

  1. Use Accept: application/json header (default is XML)
  2. Search syntax supports Boolean: family-name:Smith AND affiliation-org-name:MIT
  3. Combine with Crossref to get full paper metadata from ORCID publication lists
  4. 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)