# Google Scholar Scraper — Papers, Citations & Author Profiles (`khadinakbar/google-scholar-scraper`) Actor

Scrape Google Scholar across 6 modes: paper search, citation export (BibTeX/APA/MLA/Chicago), author profiles (h-index, i10-index), publication lists, citation history, and co-author networks. MCP-ready. Hybrid Camoufox + SerpApi managed/BYOK fallback for high reliability.

- **URL**: https://apify.com/khadinakbar/google-scholar-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Developer tools, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 result returneds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Google Scholar Scraper — Papers, Citations & Author Profiles

**Scrape [Google Scholar](https://scholar.google.com) at scale across six modes in one Actor** — paper search, citation-format export, author profiles, publication lists, citation history, and co-author networks. Built **MCP-ready** for AI agents and powered by a **hybrid Camoufox + SerpApi fallback** engine so your runs keep returning data even when Google Scholar throws a CAPTCHA. Try it with the default input (a search for *large language models*) and download results as **JSON, CSV, Excel, or HTML**.

Runs on the Apify platform — API access, scheduling, integrations, residential proxy rotation, and run monitoring all included.

### What does Google Scholar Scraper do?

Google Scholar has no official API and blocks scrapers aggressively. This Actor solves both problems. It extracts **structured bibliographic data** — titles, authors, publication venues, years, citation counts, PDF links, h-index, i10-index, citation histories, and co-author graphs — and returns one clean, flat JSON record per result. Pick a **mode** for the job:

| Mode | What you get |
|------|--------------|
| `search` | Papers matching a keyword query, with filters for year range, document type, patents, case law, and review-only |
| `cite` | Citation strings in **APA, MLA, Chicago, Harvard, Vancouver** plus **BibTeX, EndNote, RefMan, RefWorks** export links |
| `author_profile` | One author's metrics: affiliation, interests, h-index, i10-index, total & recent citations |
| `author_articles` | An author's full publication list, paginated and sortable |
| `author_citation` | An author's year-by-year citation history (great for tracking growth) |
| `author_co_authors` | An author's co-author network for mapping research communities |

### Why use this Google Scholar Scraper?

- **Reliability first.** Google Scholar's CAPTCHA wall breaks most scrapers (competitors sit at 84–98% success). This Actor tries a stealth Camoufox browser first, then transparently falls back to a managed SerpApi path — so you get data, not empty runs.
- **Bring your own key, pay less.** Supply your own SerpApi key (BYOK) and the reliable path runs at the standard per-result price with no managed-fallback premium.
- **Six tools in one.** No need to wire up four separate scrapers for search, citations, authors, and co-authors.
- **Agent-native.** Narrow inputs, flat structured JSON output, and clear cost signals make it a clean tool call for Claude, ChatGPT, or any MCP client.
- **Built for literature reviews, bibliometrics, and RAG.** Feed structured scholarly data straight into knowledge graphs, vector stores, or analytics notebooks.

### How to use Google Scholar Scraper

1. Open the **Input** tab.
2. Choose a **Mode** (defaults to paper search).
3. Fill the field that mode needs — `queries` for search, `resultIds` for cite, `authorIds` for the author modes.
4. (Optional) Set `maxResults`, a year range, or your own `serpApiKey`.
5. Click **Start** and watch results stream into the dataset.
6. Download as JSON, CSV, Excel, or HTML, or pull via the Apify API.

### Input

The only field you usually set is **Mode** plus its matching field. Example — search for recent transformer papers:

```json
{
  "mode": "search",
  "queries": ["transformer architecture"],
  "yearFrom": 2020,
  "maxResults": 50
}
````

Look up an author's profile:

```json
{ "mode": "author_profile", "authorIds": ["LSsXyncAAAAJ"] }
```

Export citation formats for a paper (needs a SerpApi key):

```json
{ "mode": "cite", "resultIds": ["TY8gM2sAAAAJ"], "serpApiKey": "your-key" }
```

### Output

Each result is one flat JSON record. A `search` paper looks like:

```json
{
  "mode": "search",
  "query": "transformer architecture",
  "position": 1,
  "title": "Attention is all you need",
  "resultId": "u-CT435A0vkJ",
  "link": "https://proceedings.neurips.cc/paper/2017/...",
  "snippet": "The dominant sequence transduction models...",
  "authors": [{ "name": "A Vaswani", "authorId": "...", "profileUrl": "..." }],
  "publicationInfo": "A Vaswani, N Shazeer… - Advances in neural…, 2017",
  "year": 2017,
  "citedByCount": 145203,
  "citedByLink": "https://scholar.google.com/scholar?cites=...",
  "versionsCount": 53,
  "pdfUrl": "https://proceedings.neurips.cc/...pdf",
  "pdfFormat": "PDF",
  "source": "serpapi",
  "scrapedAt": "2026-05-30T12:00:00.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data fields

| Field | Description |
|-------|-------------|
| `mode` | The operation that produced the record |
| `title` | Paper title |
| `authors` | Array of `{ name, authorId, profileUrl }` |
| `year` | Publication year |
| `citedByCount` | Number of citing papers |
| `publicationInfo` | Venue / journal / publisher summary |
| `link`, `pdfUrl` | Article URL and direct PDF link |
| `resultId` | Paper/cluster ID — feed into `cite` mode |
| `name`, `authorId`, `hIndex`, `i10Index`, `citationsTotal` | Author-mode fields |
| `citationsByYear` | Year-by-year citation history (author\_citation) |
| `coAuthorName`, `coAuthorId` | Co-author edges (author\_co\_authors) |
| `citations`, `exportLinks` | Citation strings + export links (cite) |
| `source` | `camoufox` (direct) or `serpapi` (fallback) |
| `scrapedAt` | ISO 8601 timestamp |

### How much does it cost to scrape Google Scholar?

This Actor uses **pay-per-event** pricing plus optional usage-based billing:

- **$0.00005** per actor start
- **$0.005** per result (paper, citation export, citation-history record, or co-author) — capped by your `maxResults`
- **$0.01** per author profile (`author_profile` mode only)

A 50-paper search costs about **$0.25**. The free Apify tier covers small jobs. Bring your own SerpApi key to avoid any managed-fallback overhead on large runs.

### Tips and advanced options

- **For big or time-sensitive jobs**, set `forceSerpApi: true` with a `serpApiKey` to skip the direct-scrape attempt and go straight to the reliable path.
- **Chain modes**: run `search`, grab `resultId` and `authors[].authorId` from the output, then feed those into `cite` and `author_profile`.
- **Filter tightly** with `yearFrom`/`yearTo`, `reviewArticlesOnly`, and `sortByDate` to keep result counts (and cost) down.
- **Residential proxies** are the default and strongly recommended — Google Scholar blocks datacenter IPs instantly.

### FAQ, disclaimer, and support

**Is scraping Google Scholar legal?** This Actor collects only publicly available bibliographic metadata for research, bibliometric, and indexing use. You are responsible for complying with Google's Terms of Service and applicable laws in your jurisdiction. Do not use it to violate copyright or republish protected content.

**Why do some runs use the SerpApi source?** Google Scholar serves CAPTCHAs to datacenter and residential traffic alike. When the direct Camoufox scrape is blocked, the Actor falls back to a managed SerpApi path so your run still returns data. Provide your own key for the cheapest reliable path.

**Found a bug or need a field added?** Open an issue on the Actor's **Issues** tab. Custom scraping solutions are available on request.

### Related actors

- [Google Patents Scraper](https://apify.com/khadinakbar/google-patents-scraper) — patents, citations & assignee/inventor portfolios for IP context alongside Scholar.
- [Goodreads Scraper](https://apify.com/khadinakbar/goodreads-all-in-one-scraper) — books, reviews & authors for non-academic bibliographic and biography work.
- [Google SERP Scraper](https://apify.com/khadinakbar/scrape-google-serp) — Google search results when you need broader web coverage beyond Scholar.
- [Google Trends Scraper](https://apify.com/khadinakbar/google-trends-scraper) — interest trends for research topics you find in Scholar.
- [SEC EDGAR Scraper](https://apify.com/khadinakbar/sec-edgar-all-in-one-scraper) — 10-K, 8-K & 13F filings to anchor academic findings against issuer disclosures.

# Actor input Schema

## `mode` (type: `string`):

Which Google Scholar operation to run. 'search' finds papers by keyword; 'cite' exports citation formats for a paper; 'author\_profile' returns one author's metrics; 'author\_articles' lists an author's publications; 'author\_citation' returns an author's year-by-year citation history; 'author\_co\_authors' returns an author's co-author network. Defaults to 'search'. Each mode reads different fields below.

## `queries` (type: `array`):

Keyword queries to run on Google Scholar, one search per entry (e.g. 'transformer architecture'). Supports Scholar operators like author:hinton or source:nature. Used only when mode is 'search'. NOT a Scholar URL and NOT an author ID — use 'authorIds' for author modes.

## `resultIds` (type: `array`):

Google Scholar result IDs (cluster IDs) to fetch citation-export formats for, one per entry. Get these from the 'resultId' field of a prior 'search' run (e.g. 'TY8gM2sAAAAJ'). Used only when mode is 'cite'. NOT a paper title or URL.

## `authorIds` (type: `array`):

Google Scholar author IDs to look up, one per entry (e.g. 'LSsXyncAAAAJ'). Find an ID in a Scholar profile URL (the 'user=' value) or in the 'authors\[].authorId' field of a 'search' run. Used by author\_profile, author\_articles, author\_citation, and author\_co\_authors. NOT an author name.

## `maxResults` (type: `integer`):

Maximum papers to return per search query or per author publication list, and your hard cost cap (you are never charged for more). Applies to 'search' and 'author\_articles'. Defaults to 100. Author-profile, citation-history, and cite modes ignore this (they return a single composite record per target).

## `yearFrom` (type: `integer`):

Earliest publication year to include in results (e.g. 2018). Applies only to mode 'search'. Leave empty for no lower bound. Pair with 'yearTo' for a closed range.

## `yearTo` (type: `integer`):

Latest publication year to include in results (e.g. 2024). Applies only to mode 'search'. Leave empty for no upper bound. Pair with 'yearFrom' for a closed range.

## `sortByDate` (type: `boolean`):

When true, sorts search results by newest first instead of by relevance. Applies only to mode 'search'. Defaults to false (relevance). Useful for tracking the latest publications on a topic.

## `includePatents` (type: `boolean`):

When true, includes patents in search results. Applies only to mode 'search'. Defaults to false (patents excluded). Mutually exclusive with 'includeCaseLaw' — case law takes priority if both are set.

## `includeCaseLaw` (type: `boolean`):

When true, searches US court case law instead of articles. Applies only to mode 'search'. Defaults to false. Overrides 'includePatents' when both are enabled.

## `reviewArticlesOnly` (type: `boolean`):

When true, restricts search results to review articles only. Applies only to mode 'search'. Defaults to false (all article types). Useful for systematic reviews and meta-analyses.

## `languageRestrict` (type: `string`):

Restrict search results to specific languages using Scholar 'lang\_xx' codes joined by '|' (e.g. 'lang\_en' or 'lang\_en|lang\_de'). Applies only to mode 'search'. Leave empty for all languages. This is different from 'resultsLanguage', which sets the Scholar interface language.

## `authorSort` (type: `string`):

Order for an author's publication list: 'relevance' (citation count, default), 'date' (newest first), or 'title' (alphabetical). Applies only to mode 'author\_articles'. Other modes ignore this field.

## `resultsLanguage` (type: `string`):

Two-letter language code for the Google Scholar interface and result display (e.g. 'en', 'de', 'es'). Applies to all modes. Defaults to 'en'. To filter results BY language instead, use 'languageRestrict'.

## `forceSerpApi` (type: `boolean`):

When true, skips the Camoufox direct scrape and goes straight to the SerpApi path (fastest, most reliable). Requires a SerpApi key (managed or BYOK). Defaults to false (try direct scrape first, fall back automatically). Turn on for time-sensitive or large jobs.

## `serpApiKey` (type: `string`):

Optional: your own SerpApi key to power the reliable fallback at the standard per-result price (you pay SerpApi directly for the upstream calls). Leave empty to use our managed fallback automatically when the direct scrape is blocked. Get a key at serpapi.com. Stored as a secret and never logged.

## `maxRetries` (type: `integer`):

How many times to retry a blocked direct-scrape request before falling back to SerpApi. Applies to the Camoufox path only. Defaults to 3. Higher values cost more compute for little gain on captcha-heavy targets.

## `proxyConfiguration` (type: `object`):

Proxy settings for the direct-scrape path. Residential proxies are strongly recommended — Google Scholar blocks datacenter IPs almost immediately. Defaults to Apify residential proxies. The SerpApi fallback path does not use this.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "large language models"
  ],
  "maxResults": 50,
  "sortByDate": false,
  "includePatents": false,
  "includeCaseLaw": false,
  "reviewArticlesOnly": false,
  "authorSort": "relevance",
  "resultsLanguage": "en",
  "forceSerpApi": false,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `usage` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "large language models"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/google-scholar-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": ["large language models"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/google-scholar-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "large language models"
  ],
  "maxResults": 50
}' |
apify call khadinakbar/google-scholar-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=khadinakbar/google-scholar-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Scholar Scraper — Papers, Citations & Author Profiles",
        "description": "Scrape Google Scholar across 6 modes: paper search, citation export (BibTeX/APA/MLA/Chicago), author profiles (h-index, i10-index), publication lists, citation history, and co-author networks. MCP-ready. Hybrid Camoufox + SerpApi managed/BYOK fallback for high reliability.",
        "version": "0.1",
        "x-build-id": "29VNxA2Zri7HvPNg1"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/khadinakbar~google-scholar-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-khadinakbar-google-scholar-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/khadinakbar~google-scholar-scraper/runs": {
            "post": {
                "operationId": "runs-sync-khadinakbar-google-scholar-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/khadinakbar~google-scholar-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-khadinakbar-google-scholar-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "cite",
                            "author_profile",
                            "author_articles",
                            "author_citation",
                            "author_co_authors"
                        ],
                        "type": "string",
                        "description": "Which Google Scholar operation to run. 'search' finds papers by keyword; 'cite' exports citation formats for a paper; 'author_profile' returns one author's metrics; 'author_articles' lists an author's publications; 'author_citation' returns an author's year-by-year citation history; 'author_co_authors' returns an author's co-author network. Defaults to 'search'. Each mode reads different fields below.",
                        "default": "search"
                    },
                    "queries": {
                        "title": "Search queries (mode: search)",
                        "type": "array",
                        "description": "Keyword queries to run on Google Scholar, one search per entry (e.g. 'transformer architecture'). Supports Scholar operators like author:hinton or source:nature. Used only when mode is 'search'. NOT a Scholar URL and NOT an author ID — use 'authorIds' for author modes.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "resultIds": {
                        "title": "Paper IDs (mode: cite)",
                        "type": "array",
                        "description": "Google Scholar result IDs (cluster IDs) to fetch citation-export formats for, one per entry. Get these from the 'resultId' field of a prior 'search' run (e.g. 'TY8gM2sAAAAJ'). Used only when mode is 'cite'. NOT a paper title or URL.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "authorIds": {
                        "title": "Author IDs (author modes)",
                        "type": "array",
                        "description": "Google Scholar author IDs to look up, one per entry (e.g. 'LSsXyncAAAAJ'). Find an ID in a Scholar profile URL (the 'user=' value) or in the 'authors[].authorId' field of a 'search' run. Used by author_profile, author_articles, author_citation, and author_co_authors. NOT an author name.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max results per query/author",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum papers to return per search query or per author publication list, and your hard cost cap (you are never charged for more). Applies to 'search' and 'author_articles'. Defaults to 100. Author-profile, citation-history, and cite modes ignore this (they return a single composite record per target).",
                        "default": 100
                    },
                    "yearFrom": {
                        "title": "Published after (year)",
                        "minimum": 1500,
                        "maximum": 2100,
                        "type": "integer",
                        "description": "Earliest publication year to include in results (e.g. 2018). Applies only to mode 'search'. Leave empty for no lower bound. Pair with 'yearTo' for a closed range."
                    },
                    "yearTo": {
                        "title": "Published before (year)",
                        "minimum": 1500,
                        "maximum": 2100,
                        "type": "integer",
                        "description": "Latest publication year to include in results (e.g. 2024). Applies only to mode 'search'. Leave empty for no upper bound. Pair with 'yearFrom' for a closed range."
                    },
                    "sortByDate": {
                        "title": "Sort by date (mode: search)",
                        "type": "boolean",
                        "description": "When true, sorts search results by newest first instead of by relevance. Applies only to mode 'search'. Defaults to false (relevance). Useful for tracking the latest publications on a topic.",
                        "default": false
                    },
                    "includePatents": {
                        "title": "Include patents",
                        "type": "boolean",
                        "description": "When true, includes patents in search results. Applies only to mode 'search'. Defaults to false (patents excluded). Mutually exclusive with 'includeCaseLaw' — case law takes priority if both are set.",
                        "default": false
                    },
                    "includeCaseLaw": {
                        "title": "Search case law",
                        "type": "boolean",
                        "description": "When true, searches US court case law instead of articles. Applies only to mode 'search'. Defaults to false. Overrides 'includePatents' when both are enabled.",
                        "default": false
                    },
                    "reviewArticlesOnly": {
                        "title": "Review articles only",
                        "type": "boolean",
                        "description": "When true, restricts search results to review articles only. Applies only to mode 'search'. Defaults to false (all article types). Useful for systematic reviews and meta-analyses.",
                        "default": false
                    },
                    "languageRestrict": {
                        "title": "Restrict result languages (mode: search)",
                        "type": "string",
                        "description": "Restrict search results to specific languages using Scholar 'lang_xx' codes joined by '|' (e.g. 'lang_en' or 'lang_en|lang_de'). Applies only to mode 'search'. Leave empty for all languages. This is different from 'resultsLanguage', which sets the Scholar interface language."
                    },
                    "authorSort": {
                        "title": "Author article sort (mode: author_articles)",
                        "enum": [
                            "relevance",
                            "date",
                            "title"
                        ],
                        "type": "string",
                        "description": "Order for an author's publication list: 'relevance' (citation count, default), 'date' (newest first), or 'title' (alphabetical). Applies only to mode 'author_articles'. Other modes ignore this field.",
                        "default": "relevance"
                    },
                    "resultsLanguage": {
                        "title": "Interface language",
                        "enum": [
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "pt",
                            "ja",
                            "ko",
                            "zh-CN",
                            "zh-TW",
                            "ru",
                            "ar",
                            "hi",
                            "tr",
                            "pl",
                            "nl"
                        ],
                        "type": "string",
                        "description": "Two-letter language code for the Google Scholar interface and result display (e.g. 'en', 'de', 'es'). Applies to all modes. Defaults to 'en'. To filter results BY language instead, use 'languageRestrict'.",
                        "default": "en"
                    },
                    "forceSerpApi": {
                        "title": "Force SerpApi path",
                        "type": "boolean",
                        "description": "When true, skips the Camoufox direct scrape and goes straight to the SerpApi path (fastest, most reliable). Requires a SerpApi key (managed or BYOK). Defaults to false (try direct scrape first, fall back automatically). Turn on for time-sensitive or large jobs.",
                        "default": false
                    },
                    "serpApiKey": {
                        "title": "SerpApi key (BYOK, optional)",
                        "type": "string",
                        "description": "Optional: your own SerpApi key to power the reliable fallback at the standard per-result price (you pay SerpApi directly for the upstream calls). Leave empty to use our managed fallback automatically when the direct scrape is blocked. Get a key at serpapi.com. Stored as a secret and never logged."
                    },
                    "maxRetries": {
                        "title": "Max retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many times to retry a blocked direct-scrape request before falling back to SerpApi. Applies to the Camoufox path only. Defaults to 3. Higher values cost more compute for little gain on captcha-heavy targets.",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings for the direct-scrape path. Residential proxies are strongly recommended — Google Scholar blocks datacenter IPs almost immediately. Defaults to Apify residential proxies. The SerpApi fallback path does not use this.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
