ORCID Scraper: Researcher Profiles & Affiliations
Pricing
from $0.74 / 1,000 researcher scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Share

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
| Field | What it holds |
|---|---|
orcid, url | The iD and the public profile link |
givenNames, familyName, creditName, otherNames | Preferred name, published name, and every alias the researcher has registered |
biography | Free-text bio when the researcher has made it public |
emails | Public email addresses. Almost always empty, because ORCID defaults emails to private |
researcherUrls | Named links: LinkedIn, Google Scholar, lab page, personal site |
keywords | Self-declared research keywords |
countries | Country codes from the researcher's registered addresses |
currentAffiliation | The open-ended employment, most recent first, which is what a profile page shows at the top |
employments, educations | Full history: organisation, department, role, start and end dates, city, region, country, ROR or Ringgold ID |
fundings, fundingCount | Grants and awards with funder, type, dates and grant number |
works, worksCount | Publications with title, type, publication date, DOI, journal and source. worksCount is the true total even when works is capped |
peerReviewCount | Number of reviews recorded against the record |
createdAt, lastModified | When the ORCID record was registered and last edited |
scrapedAt | Run 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[].doito 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
| Field | Type | Default | Notes |
|---|---|---|---|
orcidIds | array | [] | iDs as 0000-0000-0000-0000, or full https://orcid.org/. URLs. Both are normalised. |
searchQuery | string | none | Runs ORCID's public search and fetches every iD it returns. Combines with orcidIds, and the two sets are merged and de-duplicated. |
maxSearchResults | integer | 25 | Ceiling on iDs the search may contribute. Each costs one record request. |
includeAffiliations | boolean | true | Attach employments and educations. |
includeWorks | boolean | true | Attach works. This is what makes records large. |
includeFunding | boolean | true | Attach fundings. |
maxWorks | integer | 200 | Cap on attached works, newest first. worksCount still reports the real total. |
contactEmail | string | none | Goes 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:
| Query | Finds |
|---|---|
Hopper | Anything in the record matching "Hopper" |
family-name:Hopper AND given-names:Grace | A specific person by name |
affiliation-org-name:"ETH Zurich" | Everyone who lists that institution |
keyword:bioinformatics | Everyone with that self-declared keyword |
digital-object-ids:"10.1038/nature12373" | The authors who claimed a specific DOI |
ringgold-org-id:5468 | Everyone 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
409and an unknown iD404. Both are recorded inRUN_SUMMARY.failuresand 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.
worksCountis never capped. It counts the groups ORCID returned, so it stays honest even whenmaxWorkstrims 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.