
Website Content Crawler
scrape.ly/store/querystone/website-content-crawlerAIDeveloper tools
1 monthly user

Scrape Google Scholar: papers from keyword searches with year, language and sort filters, "cited by" lists, and author profiles with citations, h-index, i10-index, citations per year, co-authors and articles. Clean JSON for research, bibliometrics and AI agents.
Export Google Scholar search results, "cited by" lists and author profiles as clean, structured data. Every paper row has the title, link, authors (with Scholar profile ids), venue, year, abstract snippet, citation count, versions and the free PDF link when Scholar has one. Author rows add citations, h-index, i10-index, citations per year, co-authors and articles. No login, no API key.
[PDF] / [HTML] link Scholar shows next to a result, with its host.author:"hinton" or source:nature work), or paste Scholar search links.JicYPdAAAAAJ or profile links) and Cited by ids (the clusterId of any paper row, or a "Cited by" link).| Field | What it does |
|---|---|
queries | Keywords or Scholar search links, one per line |
authors | Author ids or profile links; one profile row each |
citedBy | Cited-by ids or "Cited by" links; saves the citing papers |
maxResults | Papers per query or cited-by list (default 20, up to 1,000) |
yearFrom, yearTo | Publication year range |
sortBy | relevance or date (last year, newest first) |
resultLanguages | Paper languages, e.g. ["en", "de"] |
includeCitations, includePatents, reviewArticlesOnly | Result type filters |
maxArticlesPerAuthor | Articles inside each author row (default 20, 0 = none) |
articleSort | Author articles by citations, pubdate or title |
{
"queries": ["large language models"],
"citedBy": ["4731455256244956465"],
"authors": ["JicYPdAAAAAJ"],
"maxResults": 50,
"yearFrom": 2023
}
Paper rows (type: "paper"):
| Field | Description |
|---|---|
position | Rank in the search |
title, url | Paper title and link |
authors, authorsTruncated | Author names as Scholar shows them; true when Scholar cut the list |
authorProfiles | Authors with a Scholar profile: name, authorId, profileUrl |
publication, year, source | Venue, year and host domain |
snippet | Abstract snippet as plain text |
citedByCount, citedByUrl | Times cited and the cited-by link |
clusterId | Scholar's paper id; use it in Cited by |
versionsCount, versionsUrl, relatedUrl | All versions and related articles |
fullTextUrl, fullTextType, fullTextSource | Free PDF/HTML link, its type and host |
documentType | article, book, citation, pdf or html |
query, citedById, searchType, searchUrl | Where the row came from |
Author rows (type: "author"): authorId, name, affiliation, verifiedEmailDomain, homepage, interests, photoUrl, citationsAll, citationsRecent, hIndexAll, hIndexRecent, i10IndexAll, i10IndexRecent, recentSinceYear, citationsPerYear, publicAccess, coAuthors, articlesCount and articles (title, year, venue, authors, citedByCount, citesIds).
{
"type": "paper",
"searchType": "citedBy",
"citedById": "4731455256244956465",
"position": 2,
"resultId": "2LiXtEmo2fAJ",
"clusterId": "17355087673564838104",
"title": "ViT: Unlocking Test-Time Training in Vision",
"url": "https://openaccess.thecvf.com/content/CVPR2026/html/Han_ViT3_Unlocking_Test-Time_Training_in_Vision_CVPR_2026_paper.html",
"documentType": "article",
"authors": ["D Han", "Y Li", "T Li", "Z Cao", "Z Wang"],
"authorsTruncated": true,
"publication": "Proceedings of the …",
"year": 2026,
"source": "openaccess.thecvf.com",
"snippet": "Abstract Test-Time Training (TTT) has recently emerged as a promising direction for efficient sequence modeling. …",
"citedByCount": 21,
"versionsCount": 5,
"fullTextUrl": "https://openaccess.thecvf.com/content/CVPR2026/papers/Han_ViT3_Unlocking_Test-Time_Training_in_Vision_CVPR_2026_paper.pdf",
"fullTextType": "pdf",
"fullTextSource": "thecvf.com"
}
{
"type": "author",
"authorId": "AbCdEfGhIjKL",
"name": "Jane Example",
"affiliation": "Professor of Computer Science, Example University",
"verifiedEmailDomain": "example.edu",
"interests": ["machine learning", "computer vision"],
"citationsAll": 15230,
"citationsRecent": 9120,
"hIndexAll": 48,
"hIndexRecent": 39,
"i10IndexAll": 96,
"i10IndexRecent": 80,
"recentSinceYear": 2021,
"citationsPerYear": {"2024": 2100, "2025": 2480, "2026": 1900},
"coAuthors": [{"name": "John Sample", "authorId": "ZyXwVuTsRqPo", "affiliation": "Example Institute"}],
"articlesCount": 20,
"articles": [{"title": "An example paper", "year": 2019, "publication": "Example Journal 12 (3)", "citedByCount": 1830}]
}
Is it legal to scrape Google Scholar? The actor reads public pages that anyone can open without an account. Check Google's terms and the rules that apply to your use, especially for personal data such as author profiles.
Do I need a Google account, API key or proxy? No. The default proxy setting works; it uses datacenter IPs and switches to US residential IPs for pages Google throttles.
How many results can I get? Scholar lists at most 1,000 results per search, and for signed-out visitors it throttles deep pages hard: the first 20 to 50 results of a search come back reliably, deeper pages often do not. For larger sets, run several narrower searches in one run (for example the same query with different year ranges or extra keywords); each search's first pages load reliably.
Why is a field empty? Scholar does not show everything for every result: citation-only records have no link, many results have no free PDF, and venue names are often shortened ("Proceedings of the …") by Scholar itself.
Can I get full abstracts? Scholar shows a snippet of the abstract, which is what snippet contains. For full abstracts by DOI, pair this actor with an OpenAlex scraper.
Can I schedule it or call it from code or an AI agent? Yes: run it on a schedule, through the REST API, or as a tool through MCP. Inputs are plain strings and numbers and every row is flat JSON with clear field names.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
queriesarrayOptionalSearch queries
Keywords to search on Google Scholar, one per line. Scholar operators work (author:"lecun", source:nature, intitle:, "exact phrase"). You can also paste Google Scholar search links.
authorsarrayOptionalAuthor profiles
Google Scholar author ids (e.g. JicYPdAAAAAJ) or profile links (https://scholar.google.com/citations?user=JicYPdAAAAAJ). Each saves one profile row with citations, h-index, i10-index, citations per year, co-authors and articles.
citedByarrayOptionalCited by (papers citing these)
Cited-by ids (the cites= number in a "Cited by" link, or the clusterId field of a paper row) or full "Cited by" links. Saves the papers that cite each one.
maxResultsintegerOptionaldefault 20Maximum papers per search
Most papers to save for each query or cited-by list. Scholar shows at most 1,000 results per search. 0 means up to 1,000.
yearFromintegerOptionalPublished from (year)
Only papers published in or after this year.
yearTointegerOptionalPublished until (year)
Only papers published in or before this year.
sortByenumOptionaldefault "relevance"Sort by
Relevance (Scholar's default) or date (papers added in the last year, newest first).
resultLanguagesarrayOptionalPaper languages
Only papers in these languages, as two-letter codes (en, de, fr, es, zh-CN, ...). Empty means any language.
includeCitationsbooleanOptionaldefault trueInclude citation-only records
Keep [CITATION] entries that Scholar knows only from reference lists.
includePatentsbooleanOptionaldefault falseInclude patents
Also return patents in searches.
reviewArticlesOnlybooleanOptionaldefault falseReview articles only
Only review articles.
maxArticlesPerAuthorintegerOptionaldefault 20Articles per author profile
How many of the author's articles to include in the profile row. 0 saves the profile without articles. At most 5,000, because the articles are stored inside the profile row and one row must stay under the platform's 10 MB item size.
articleSortenumOptionaldefault "citations"Sort author articles by
languagestringOptionaldefault "en"Interface language
Google Scholar interface language (hl), e.g. en, de, fr. Affects labels such as venue names, not which papers are found.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter exits are the default; pages Google throttles on them are retried over US residential exits automatically.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| type | string | paper or author |
| searchType | string | null | query, citedBy or versions |
| query | string | null | Search query |
| citedById | string | null | Cited-by id this paper cites |
| position | number | null | Rank in the search |
| resultId | string | null | Scholar result id |
| clusterId | string | null | Scholar cluster id (use it in Cited by) |
| title | string | null | Paper title |
| url | string | null | Link to the paper |
| documentType | string | null | article, book, citation, pdf, html |
| authors | array | null | Author names as shown |
| authorProfiles | array | null | Authors with a Scholar profile |
| publication | string | null | Journal, conference or book |
| year | number | null | Publication year |
| source | string | null | Publisher or host domain |
| publicationSummary | string | null | Scholar's byline |
| snippet | string | null | Abstract snippet as plain text |
| citedByCount | number | null | Times cited |
| citedByUrl | string | null | Cited-by link |
| versionsCount | number | null | Number of versions |
| versionsUrl | string | null | All versions link |
| relatedUrl | string | null | Related articles link |
| fullTextUrl | string | null | Free PDF or HTML full text |
| fullTextType | string | null | pdf or html |
| fullTextSource | string | null | Full text host |
| searchUrl | string | null | Scholar page the row came from |
| authorId | string | null | Scholar author id |
| profileUrl | string | null | Scholar profile link |
| name | string | null | Author name |
| affiliation | string | null | Affiliation |
| organizationId | string | null | Scholar organization id |
| verifiedEmailDomain | string | null | Verified email domain |
| homepage | string | null | Homepage |
| interests | array | null | Research interests |
| photoUrl | string | null | Profile photo |
| citationsAll | number | null | Citations, all time |
| citationsRecent | number | null | Citations in the last 5 years |
| hIndexAll | number | null | h-index, all time |
| hIndexRecent | number | null | h-index, last 5 years |
| i10IndexAll | number | null | i10-index, all time |
| i10IndexRecent | number | null | i10-index, last 5 years |
| recentSinceYear | number | null | First year of the recent window |
| citationsPerYear | object | null | Citations per year |
| publicAccess | object | null | Public access mandate counts |
| coAuthors | array | null | Co-authors |
| articlesCount | number | null | Articles included |
| articles | array | null | Author's articles |
| scrapedAt | string | null | Scrape time (UTC) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Author profile | One saved Google Scholar author profile, including the requested articles. | $0.01 |
| Paper | One saved Google Scholar paper (search or cited-by result). | $0.001 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('querystone/google-scholar-scraper').call({
"queries": [
"large language models"
],
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run querystone/google-scholar-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=querystone/google-scholar-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Scholar search with year and language filters plus citations.
Search Google Scholar articles by keyword.
An author's articles, newest first.
Articles that cite a given paper.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.