ScrapingCat Scholar API

A Google Scholar data service with a SerpApi-shaped JSON contract: organic search, author profiles, citation exports, profile search, deterministic paper resolution, and durable bulk batches. Base URL: https://scrapingcat.boyinzhiheng.com

Authentication

Every /v1 route requires an API key sent in the X-API-Key request header. Keys in the query string are rejected: a request carrying an api_key query parameter fails with 400 regardless of its value.

curl -H "X-API-Key: $SCAT_API_KEY" \
  "https://scrapingcat.boyinzhiheng.com/v1/search?engine=google_scholar&q=deep+learning"

General query rules: keys may not be duplicated, unknown keys are rejected, and output (when supplied) must be json.

Errors & status codes

Every error response uses one fixed shape. request_id is unique per request — include it when reporting a problem.

{
  "error": {
    "code": "rate_limited",
    "message": "Request rate limit exceeded",
    "retryable": true
  },
  "request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
StatusCodeRetryableMeaning
400invalid_parametersnoRequest parameters failed validation
401unauthorizednoInvalid or missing API key
404author_not_found, search_not_found, citation_not_found, profiles_not_found, route_not_found, …noThe requested entity does not exist
409conflictnoRequest conflicts with current state (e.g. Idempotency-Key reuse with different content)
410expirednoResource is past its retention window
413request_too_largenoUpload or body exceeds the size limit
429rate_limited, ip_budget_exhaustedyesCapacity is temporarily unavailable; honor Retry-After when present
502upstream_error, scholar_fetch_failed, soft_blocked, parse_erroryesGoogle Scholar did not return a usable response
503service_unavailable, provider_unavailable, global_circuit_openyesService or upstream capacity is temporarily unavailable
507insufficient_storageyesResult storage capacity is unavailable

One search endpoint, four engines. The engine parameter selects the target and determines which other parameters are valid.

engine=google_scholar — organic search

Requires at least one of q, cites, or cluster. cluster is exclusive with q and cites.

ParameterTypeDefaultNotes
qstringSearch query, up to 2048 chars
citesdigitsCited-by search for a result's citation cluster
clusterdigitsAll versions of one clustered result
as_ylo / as_yhiintYear range filter
scisbd0 | 1 | 20Sort by date (1: abstracts, 2: everything)
hlstringenInterface language
lrstringLanguage restriction, e.g. lang_en|lang_fr
startint ≥ 00Result offset for pagination
num1–2010Results per page
as_sdtstring0,5Search type / patents-and-citations control
safeactive | offSafe-search toggle
filter0 | 11Similar/omitted-result filtering
as_vis0 | 10Exclude citations from results
as_rr0 | 10Review articles only
curl -H "X-API-Key: $SCAT_API_KEY" \
  "https://scrapingcat.boyinzhiheng.com/v1/search?engine=google_scholar&q=attention+is+all+you+need&num=10"

The response mirrors the SerpApi Google Scholar shape: search_metadata, search_parameters, search_information, organic_results[] (with result_id, title, link, publication_info, inline_links.cited_by, …) and pagination when more pages exist.

engine=google_scholar_author — author profile

ParameterTypeDefaultNotes
author_idstringrequiredThe Scholar author identifier, e.g. qc6CJjYAAAAJ
hlstringenInterface language
view_opview_citation | list_colleaguesSwitch to a single citation view or the co-author list
citation_idstringRequired with view_op=view_citation; must belong to author_id
sortcitations | title | pubdatecitationsArticle ordering
startint ≥ 00Article offset
num1–10020Articles per page
curl -H "X-API-Key: $SCAT_API_KEY" \
  "https://scrapingcat.boyinzhiheng.com/v1/search?engine=google_scholar_author&author_id=qc6CJjYAAAAJ&num=100"

engine=google_scholar_cite — citation export

q is a result_id taken from an organic search response. Returns the formatted citation styles (MLA, APA, Chicago, Harvard, Vancouver) and export links (BibTeX, EndNote, RefMan, RefWorks).

curl -H "X-API-Key: $SCAT_API_KEY" \
  "https://scrapingcat.boyinzhiheng.com/v1/search?engine=google_scholar_cite&q=KlAl5vgvd-8J"

engine=google_scholar_profiles — profile search

Searches author profiles by name via mauthors. Pagination uses opaque continuation tokens: pass either after_author or before_author (mutually exclusive) from a previous response. This surface is best-effort and may return a retryable upstream error under load.

curl -H "X-API-Key: $SCAT_API_KEY" \
  "https://scrapingcat.boyinzhiheng.com/v1/search?engine=google_scholar_profiles&mauthors=Geoffrey+Hinton"

GET /v1/papers/resolve

Deterministic paper lookup against Google Scholar. Supply exactly one selector:

SelectorExample
doi10.1038/nature14539
pmid26017442
arxiv_id1706.03762
titleDeep learning
curl -H "X-API-Key: $SCAT_API_KEY" \
  "https://scrapingcat.boyinzhiheng.com/v1/papers/resolve?doi=10.1038/nature14539"

The response reports an explicit match_statusexact, probable, ambiguous, or not_found — together with the matched result (identifiers, title, link, citation counts) and the candidates that were considered, so callers can apply their own acceptance policy.

Durable batches

Batches process thousands of authors or papers asynchronously with durable state: batch metadata, per-item progress, retries, pause/resume, and crash-safe result archives all survive service restarts. Submit inputs, poll status, then download a compressed NDJSON archive of one terminal record per canonical input.

Batch endpoints

MethodPathPurpose
POST/v1/batches/authorsCreate an inline author batch (JSON body)
POST/v1/batches/authors/uploadStream a TXT (one author_id per line) or JSONL upload
POST/v1/batches/papersCreate an inline paper batch (JSON body)
GET/v1/batches/{batch_id}Aggregate status, counters, and timing
GET/v1/batches/{batch_id}/itemsCursor-paginated item projection; optional state/error filters
POST/v1/batches/{batch_id}/pauseRequest a durable pause
POST/v1/batches/{batch_id}/resumeResume a paused batch
GET/v1/batches/{batch_id}/results.ndjson.gzDownload the terminal result archive (gzip NDJSON)
curl -X POST -H "X-API-Key: $SCAT_API_KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: my-batch-2026-07-17" \
  -d '{"items":[{"author_id":"qc6CJjYAAAAJ"},{"author_id":"JicYPdAAAAAJ"}],"options":{"hl":"en"}}' \
  "https://scrapingcat.boyinzhiheng.com/v1/batches/authors"
curl -H "X-API-Key: $SCAT_API_KEY" \
  -o results.ndjson.gz \
  "https://scrapingcat.boyinzhiheng.com/v1/batches/b_01J.../results.ndjson.gz"

Each archive line is one JSON record with the item's original input_index, canonical input, terminal state, and either the full result document or a fixed error classification.

Batch & item states

ingesting → queued → running → completed | completed_with_errors | failed
                       │
                       └→ pausing → paused → queued  (on resume)

Item states: pending, running, retry_wait, succeeded, not_found, failed. A missing entity (e.g. an unknown author_id) terminates as not_found, not failed.

Limits & retention

LimitValue
Inline batch size (authors or papers)1 – 10,000 items
Author uploadup to 500,000 records / 32 MiB
Items page size1 – 1,000
Search page size (num)1 – 20
Author page size (num)1 – 100
Result archive retention7 days after the batch reaches a terminal state
Batch metadata retention30 days
Requests beyond current upstream capacity return retryable 429/503 errors rather than queueing silently — back off and retry with the Retry-After hint when present.

Health & readiness

EndpointAuthPurpose
GET /healthnoneService identity and liveness: {"service":"scrapingcat", "version":..., "status":"ok"}
GET /readynoneReadiness: storage write probes, disk admission, and scheduler health; 200 when ready, 503 otherwise. Never contacts Google.