Google Patents Scraper - Search & Full Records
Pricing
Pay per event
Google Patents Scraper - Search & Full Records
Search the Google Patents index by keyword, assignee, inventor, country, date window and grant status, or read patents in full: every inventor, the four dates kept apart, classifications, claim count and how many later patents cite it.
Pricing
Pay per event
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Search the Google Patents index the way the site itself does, or read patents in full: every inventor, all four dates kept apart, classifications, claim count and how many later patents cite the thing.
No API key, no browser, no login.
Two modes
Search walks the index and returns a row per hit, a hundred results per request. Filter by keyword, assignee, inventor, country, date window, grant status, document type, and sort by relevance or by date.
Detail takes publication numbers you already have and returns the full record for each.
Tick Read each result in full and search runs into detail automatically, which is how you get from a keyword to complete records without pasting numbers by hand.
Four dates, and they are not the same date
A patent carries four, they all read as "the date", and most tools flatten them into one:
| priority | filing | publication | grant | |
|---|---|---|---|---|
| US6285999B1 (PageRank) | 1997-01-10 | 1998-01-09 | 2001-09-04 | 2001-09-04 |
| EP1000000A1 | 1998-11-12 | 1999-11-08 | 2000-05-17 | none |
| US20250259144A1 | 2024-02-08 | 2024-06-04 | 2025-08-14 | none |
A year between priority and filing is normal, and priority is the one that
decides who was first. grant_date stays empty on anything that was never
granted. Filling it from the publication date would turn every pending
application in your export into a granted patent, silently.
Every inventor, not the first one
The search index publishes one inventor per patent. That is a real limit of that endpoint, not a choice, and it is why the two modes return different fields:
| search row | read in full | |
|---|---|---|
| inventor | Ali Kanso | Ali Kanso, Muhammed Fatih Bulut, Jinho Hwang, Shripad Nadgowda |
Both are on the row and they are named differently, inventor and inventors,
so nothing has to be guessed from context.
Counts that are actually counts
cited_by is uncapped. The PageRank patent returns 1,658 later patents
citing it. That is the field that tells you a patent matters, so it had to be a
real number rather than a page of results.
Similar documents is not published. It stops at about 25 on every patent, including the one with 1,658 citations, so it is a page size wearing a count's clothes.
Claim counts come from Google's own heading. Counting claim elements returns 20 on one patent office's markup and 0 on another's. Google prints the number itself, so that is what gets used: 20, 11, 29, 3 across the four offices in the test set.
Classifications have their parents removed. Codes arrive as a chain, G then G01 then G01S then G01S7/48. Counted raw that is 47 classifications for a patent that has 15.
Patent citations and non-patent citations are separate columns. The papers and books an examiner cited are a different thing from the patents cited, and adding them together is how you get a number that matches nobody else's.
What you get
| field | search | in full |
|---|---|---|
publication_number, title, url | yes | yes |
snippet (the matched passage) | yes | — |
inventor, assignee (first of each) | yes | yes |
priority_date, filing_date, publication_date, grant_date | yes | yes |
figure_count, pdf_url | yes | yes |
abstract, status | — | yes |
inventors, assignees (complete) | — | yes |
application_number, claims_count | — | yes |
cpc_codes, cpc_count | — | yes |
patent_citations, non_patent_citations, cited_by | — | yes |
status is Google's: Active, Pending, Expired - Lifetime,
Expired - Fee Related.
Input
{ "query": "machine learning", "max_results": 100 }
Everything a company has filed since 2024, granted only, newest first:
{"query": "neural network","assignee": "Google LLC","after": "priority:20240101","status": "GRANT","sort": "new","max_results": 200}
An inventor's whole output, read in full:
{ "inventor": "Joseph Marron", "follow_details": true }
Specific patents:
{ "mode": "detail", "publication_numbers": ["US10000000B2", "EP1000000A1"] }
Publication numbers accept full Google Patents URLs too, so a list pasted out of a browser works without cleaning it up first.
About the assignee filter
Google matches corporate families, not exact strings. Searching
Google LLC also returns X Development LLC and the same company's filings
under its Japanese-script name. That is usually what you want from a competitor
sweep and occasionally a surprise, so the assignee Google recorded is on every
row and you can filter afterwards on what actually came back.
Google also attaches its own caveat to assignee data, that the listed assignees may be inaccurate and it has performed no legal analysis. That caveat travels with the field. This Actor reports what Google publishes.
Pricing
Pay per event.
| event | price |
|---|---|
| Run start | $0,002 |
| Patent found (search row) | $0,002 |
| Patent read in full | $0,005 |
A search row and a full record cost very different amounts to produce: one request returns a hundred search rows, one request returns one full record. Charging them the same would either make a large search absurd or sell full records below cost.
A 100-patent search bills $0,202. The same search reading every result in
full bills $0,502. Ten patents read in full bills $0,052.
max_results is a hard ceiling, so a run cannot cost more than you decided in
advance. A patent whose page could not be read bills as a search row, not as
a full record, because you did not get one.
Limits, stated plainly
- Search rows carry one inventor and one assignee. That is what the index
publishes. Turn on
follow_detailsfor the complete lists. - The result total is an estimate. Google reports 119,420 for a bare query
and 120,421 for the same query restricted to one country. A restriction
cannot widen a result set, so the number is reported as
estimatedTotalResultsand never as a total. The rows themselves are real and were checked against the filters that produced them. - Volume is throttled. Sustained reading gets an HTTP 503 refusal. Requests
are retried and the summary reports
requestsThrottledso a short run is explainable rather than mysterious. A throttled request is never reported as a patent that does not exist. - Not every field exists on every patent. Design patents carry no
classifications, Chinese patents in the test set carried no cited references,
applications carry no grant date. Those come back empty rather than filled in
from something nearby, and any field that resolved on no row at all is
named in the run summary under
fieldsThatDidNotResolve. - Abstracts and claim counts, not full claim text. The record is the
metadata layer. The
pdf_urlon each row is the document itself.
Output
Rows go to the default dataset. The run summary and any errors go to the
default key-value store as summary and errors. The summary carries the
mode, rows returned, search and detail request counts, retries, throttles, and
the list of fields that never resolved, so a run can be judged without reading
the rows.