ORCID Scraper: Researcher Profiles & Affiliations avatar

ORCID Scraper: Researcher Profiles & Affiliations

Pricing

from $0.74 / 1,000 researcher scrapeds

Go to Apify Store
ORCID Scraper: Researcher Profiles & Affiliations

ORCID Scraper: Researcher Profiles & Affiliations

Scrape public ORCID records: name, biography, employment and education history, funding, peer reviews and the full works list with DOIs. Search by name or fetch by iD.

Pricing

from $0.74 / 1,000 researcher scrapeds

Rating

0.0

(0)

Developer

Arman Hossain

Arman Hossain

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Share

ORCID Scraper: Public researcher records by iD or search, names, affiliations, funding, works and DOIs

Turns an ORCID iD, or a name search, into a structured researcher record: names and aliases, biography, keywords, employment and education history with ROR-identified organisations, funding awards with grant numbers, peer-review counts and the full works list with DOIs.

ORCID is the scholarly world's identity registry, and its public API is designed to be read by machines. This Actor reads it directly, so there is no browser, no proxy, no member credentials and no OAuth token. Five full records arrive with works, affiliations and funding attached.

Agent skill: SKILL.md

https://api.apify.com/v2/key-value-stores/t7YoTxpZEJOWvw4Ug/records/orcid-researcher-scraper.md

What you get

FieldWhat it holds
orcid, urlThe iD and the public profile link
givenNames, familyName, creditName, otherNamesPreferred name, published name, and every alias the researcher has registered
biographyFree-text bio when the researcher has made it public
emailsPublic email addresses. Almost always empty, because ORCID defaults emails to private
researcherUrlsNamed links: LinkedIn, Google Scholar, lab page, personal site
keywordsSelf-declared research keywords
countriesCountry codes from the researcher's registered addresses
currentAffiliationThe open-ended employment, most recent first, which is what a profile page shows at the top
employments, educationsFull history: organisation, department, role, start and end dates, city, region, country, ROR or Ringgold ID
fundings, fundingCountGrants and awards with funder, type, dates and grant number
works, worksCountPublications with title, type, publication date, DOI, journal and source. worksCount is the true total even when works is capped
peerReviewCountNumber of reviews recorded against the record
createdAt, lastModifiedWhen the ORCID record was registered and last edited
scrapedAtRun timestamp

RUN_SUMMARY in the key-value store holds per-run counts, how many iDs came from search, the filters you used, and any iD that failed.

Use cases

  • Credential verification at scale. Check a claimed affiliation against the researcher's own registry entry.
  • Expert finding. Search by keyword and institution, then rank by works count and recency.
  • Affiliation mapping. Build an institution-to-researcher graph using ROR identifiers rather than fuzzy name strings.
  • RAG and knowledge bases. Clean, permissively reusable scholarly identity metadata with DOI-level joins.
  • Bibliometrics. Join works[].doi to Crossref, OpenAlex or Europe PMC for citation data ORCID does not carry.

Quick start

One researcher, everything:

{
"orcidIds": ["0000-0002-1825-0097"],
"contactEmail": "you@example.com"
}

Several iDs, identity only, small and fast:

{
"orcidIds": ["0000-0002-1825-0097", "https://orcid.org/0000-0001-5109-3700"],
"includeWorks": false,
"includeFunding": false,
"contactEmail": "you@example.com"
}

Discover researchers by institution and topic, then fetch them in full:

{
"searchQuery": "affiliation-org-name:\"ETH Zurich\" AND keyword:genomics",
"maxSearchResults": 100,
"maxWorks": 50,
"contactEmail": "you@example.com"
}

Input

FieldTypeDefaultNotes
orcidIdsarray[]iDs as 0000-0000-0000-0000, or full https://orcid.org/. URLs. Both are normalised.
searchQuerystringnoneRuns ORCID's public search and fetches every iD it returns. Combines with orcidIds, and the two sets are merged and de-duplicated.
maxSearchResultsinteger25Ceiling on iDs the search may contribute. Each costs one record request.
includeAffiliationsbooleantrueAttach employments and educations.
includeWorksbooleantrueAttach works. This is what makes records large.
includeFundingbooleantrueAttach fundings.
maxWorksinteger200Cap on attached works, newest first. worksCount still reports the real total.
contactEmailstringnoneGoes into the User-Agent. Optional but recommended.

Supply orcidIds, searchQuery, or both. With neither, the run fails immediately with a message saying so.

Output example

{
"orcid": "0000-0001-5109-3700",
"url": "https://orcid.org/0000-0001-5109-3700",
"givenNames": "Laurel",
"familyName": "Haak",
"creditName": "Laurel L Haak",
"otherNames": ["L Haak", "Laure Haak", "ローレル・ハーク"],
"biography": "Laurel (Laure) L. Haak (she/they) is an entrepreneur, strategist, researcher, and author.",
"emails": [],
"researcherUrls": [
{ "name": "LinkedIn", "url": "https://www.linkedin.com/in/laurellhaak/" },
{ "name": "Google Scholar", "url": "https://scholar.google.com/citations?hl=en&user=fFjR4DoAAAAJ" }
],
"keywords": ["persistent identifiers", "research policy", "multi stakeholder governance"],
"countries": ["US"],
"currentAffiliation": "Ronin Institute for Independent Scholarship 2.0",
"employments": [
{
"type": "employment",
"organization": "Ronin Institute for Independent Scholarship 2.0",
"department": null,
"roleTitle": "Research Scholar",
"startDate": "2025-11",
"endDate": null,
"city": "Sacramento",
"region": "California",
"country": "US",
"organizationId": "https://ror.org/000xkb537",
"organizationIdSource": "ROR",
"url": null
}
],
"educations": [
{
"type": "education",
"organization": "Stanford University School of Medicine",
"department": "Neurosciences",
"roleTitle": "PhD",
"startDate": null,
"endDate": "1997",
"city": "Stanford",
"region": "California",
"country": "US",
"organizationId": null,
"organizationIdSource": null,
"url": null
}
],
"fundings": [
{
"title": "ADVANCE Leadership Award: Women in Science and Engineering",
"type": "grant",
"organization": "National Science Foundation - Directorate for Education and Human Resources",
"country": "US",
"startDate": "2006-04-01",
"endDate": "2007-03-31",
"grantNumber": "0536999",
"url": null
}
],
"fundingCount": 4,
"works": [
{
"title": "FIELD DAY - Open Research Infrastructure for Education Research with Digital Games",
"subtitle": null,
"type": "report",
"publicationDate": "2025-11-14",
"journalTitle": null,
"doi": "10.17613/BMHWG-WXZ66",
"url": "https://works.hcommons.org/doi/10.17613/bmhwg-wxz66",
"putCode": 222309679,
"source": "Laurel L Haak"
}
],
"worksCount": 227,
"peerReviewCount": 2,
"createdAt": "2012-09-28T17:19:08.336Z",
"lastModified": "2026-07-30T19:09:40.855Z",
"scrapedAt": "2026-08-06T12:00:00.000Z"
}

Dates from ORCID are frequently partial: a bare 1997, or 2025-11 with no day. They are passed through as written rather than padded to a fake full date.

Search syntax

searchQuery goes straight to ORCID's public search index, which speaks Solr syntax. Plain words search the whole record, and field prefixes narrow it:

QueryFinds
HopperAnything in the record matching "Hopper"
family-name:Hopper AND given-names:GraceA specific person by name
affiliation-org-name:"ETH Zurich"Everyone who lists that institution
keyword:bioinformaticsEveryone with that self-declared keyword
digital-object-ids:"10.1038/nature12373"The authors who claimed a specific DOI
ringgold-org-id:5468Everyone at an organisation by its Ringgold ID

Quote multi-word values. A malformed query is reported as a syntax error rather than being retried into a timeout.

API example

curl -X POST "https://api.apify.com/v2/acts/arman-bd~orcid-researcher-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"orcidIds": ["0000-0002-1825-0097"],
"maxWorks": 25,
"contactEmail": "you@example.com"
}'

JavaScript example

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('arman-bd/orcid-researcher-scraper').call({
searchQuery: 'affiliation-org-name:"ETH Zurich" AND keyword:genomics',
maxSearchResults: 50,
maxWorks: 20,
contactEmail: 'you@example.com',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const r of items) {
console.log(`${r.givenNames} ${r.familyName} - ${r.currentAffiliation} - ${r.worksCount} works`);
}

Limits and behaviour

  • Every request carries Accept: application/json. ORCID's v3.0 API defaults to XML, and without that header you get a document that looks nothing like this.
  • One bad iD won't kill the run. A deactivated record answers 409 and an unknown iD 404. Both are recorded in RUN_SUMMARY.failures and the run continues, so the Actor only errors out if every iD fails.
  • Works are sorted newest first before truncation. ORCID returns them in its own display order, so capping without sorting would keep an arbitrary slice.
  • worksCount is never capped. It counts the groups ORCID returned, so it stays honest even when maxWorks trims the list to 20.
  • Grouped works are collapsed. One publication claimed by Crossref, Scopus and the researcher is one group and one row, the preferred summary. DOIs are read from the group's shared external IDs first.
  • Requests are spaced 200 ms apart, with three retries on 429 and 5xx.
  • Public data only. Everything here is what the researcher chose to publish. Private and trusted-party-only fields are never returned by this API and are not visible to this Actor.

FAQ

Do I need an ORCID member API key? No. You supply no credentials.

Why is emails empty? Because ORCID defaults email visibility to private, and most researchers leave it that way. When somebody has made theirs public it appears here.

Can I search by DOI? Yes. Put digital-object-ids:"10.1038/nature12373" in searchQuery and you get the ORCID iDs of everyone who has claimed that paper.

How many researchers can I fetch in one run? There is no hard cap. Records are fetched sequentially at roughly four a second, so a thousand takes about five minutes. The default timeout is 30 minutes.

Does it include citation counts? No. ORCID records identity and claimed works, not citations. Join on works[].doi against Crossref or OpenAlex for that.

Is scraping ORCID allowed? Yes. The public API exists for this, ORCID publishes its data under CC0, and this Actor identifies itself in the User-Agent as their documentation asks.