Google Patents Search Scraper
Search Google Patents and export one row per patent: number, title, assignee, inventor, dates, grant status and links. Filter by office and date. No API key.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
queries,maxItems,inventor(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00185 per patent = $1.85 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Patent scraped | One patent returned. Queries that match nothing, and pages that fail, are never charged. | $0.00185 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
queries | Keywords, quoted phrases or a CPC classification code. Each term is searched separately, one row per patent. Quoted phrases work ("solid state battery"), and so does a classification code on its own (H01M10/0525). Up to 20 terms per run. | array |
maxItems | Total rows across every search in the run. The budget is split evenly between your searches, so four terms and 400 rows gives you 100 of each. Google hands over at most 1,000 results for any single search, whatever the match count says. Keep this low while you are testing, you pay per row. | integer |
inventor | An inventor's name, as it appears on the patent. Works on its own or alongside search terms. Leave empty to search everyone. | string |
assignee | The company or institution the patent is assigned to. Works on its own or alongside search terms. Leave empty to search everyone. | string |
countries | Restrict results to these offices. Two-letter codes: US, EP (European Patent Office), WO (WIPO/PCT), CN, JP, KR, DE, GB, FR, CA, AU, IN and about forty more. Leave empty for every office. | array |
status | Granted patents only, pending applications only, or both. | string |
patentType | Utility patents, design patents, or both. | string |
language | Restrict to patents filed in one language. Leave empty for all languages. | string |
dateType | Patents carry several dates and they can be years apart. Priority is when the idea was first claimed anywhere, filing is when this application was lodged, publication is when it became public. | string |
dateFrom | Earliest date to include, as 2020-01-01. A year on its own (2020) means 1 January of that year. Leave empty for no lower bound. | string |
dateTo | Latest date to include, as 2024-12-31. Leave empty for no upper bound. | string |
onlyLitigated | Return only patents Google has a court record for. Useful when you are looking at enforcement rather than coverage. | boolean |
sortBy | Relevance is Google's own ranking. Newest and oldest sort by date instead, which changes which 1,000 results you get on a broad search. | string |
searchUrls | Build the search on patents.google.com until the results look right, then paste the address bar here. The URL's own filters are used exactly as they are, and the fields above are ignored for it. Up to 20 per run. | array |
proxyUrls | Leave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port. | array |
What you get
A structured dataset — each result includes fields like:
querypublicationNumbertitleassigneeinventorpriorityDatefilingDatepublicationDategrantDateisGrantedlegalStatuspatentUrlpdfUrlsnippetExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Google Patents Search Scraper: patent search results as rows, no API key
Search Google Patents the way you would on the site, by keyword, quoted phrase, classification code, inventor, assignee, office, language, grant status or date range, and get one row per patent: publication number, title, assignee, first inventor, all four dates, grant status, legal status, and links to the page and the PDF.
The part to read before buying: these are search results, not patent documents. You get what the results list carries plus an abstract snippet. No claims, no full description, no citation list, no family tree, no downloaded PDF, only the link to each one. And Google hands over at most 1,000 results for any single search, whatever match count it reports. If either of those is a problem, this is the wrong tool.
| Input | Search terms, an inventor or assignee, or a pasted Google Patents search URL |
| Output | One row per patent |
| Ceiling | 5,000 rows per run, and 1,000 results per search |
| Account needed | None, and no Google API key |
| Price | $1.85 per 1,000 patents, flat on every plan |
🔍 What Google Patents Search Scraper does
It runs the same search grammar the website gives you, pages the results, and writes one row per patent.
Search on terms alone, on an inventor or assignee alone, or both together. A classification code works as a term: put H01M10/0525 in queries. The filters for office, language, status, type, litigation and dates apply to every search in the run.
If a search is fiddly, build it on patents.google.com until the results look right and paste the address bar into searchUrls. It runs exactly as written.
Two things happen before a row reaches you. It is checked against the filters you asked for and dropped, uncharged, if it does not match. And a publication number already seen in the run is skipped, so a patent matching two terms arrives once.
📥 What you give it
{
"queries": ["solid state battery", "lithium metal anode"],
"countries": ["US", "EP"],
"status": "GRANT",
"dateType": "priority",
"dateFrom": "2020-01-01",
"maxItems": 200
}
| Field | Default | What it is |
|---|---|---|
queries | box starts at solid state battery | Keywords, quoted phrases or a classification code. Up to 20, each searched separately. |
maxItems | box starts at 100 | Total rows for the run, up to 5,000, split evenly between your searches. |
inventor | empty | An inventor's name as it appears on the patent. Works on its own. |
assignee | empty | The company or institution it was assigned to. Also works on its own. |
countries | none | Two-letter office codes: US, EP, WO, CN, JP and 47 more. Empty means every office. |
status | both | Granted patents only, pending applications only, or both. |
patentType | both | Utility patents, design patents, or both. |
language | any | The filing language, one of sixteen in the dropdown. |
dateType | priority | Which date the range applies to. Priority, filing and publication can be years apart on one patent. |
dateFrom, dateTo | none | Written as 2020-01-01. A bare year means 1 January. Either can be left empty. |
onlyLitigated | off | Only patents Google holds a court record for. |
sortBy | relevance | Relevance, newest first or oldest first. On a broad search this decides which 1,000 results you get. |
searchUrls | none | A patents.google.com address, up to 20. Its own filters are used, and the fields above are ignored for it. |
proxyUrls | none | Optional. Your own servers, used exactly as given. |
Unrecognised filter values are dropped, not refused. An office code outside the 52 it knows, or a date it cannot read, is simply left out, and the search then runs wider than you meant. UK is not a code, GB is. Dates want 2020-01-01, 2020-01 or 2020.
A pasted searchUrls query is not re-checked, because its filters were not built here. Its rows arrive as Google returned them.
📤 What you get back
A real row from a recent run, with the long text trimmed:
{
"ok": true,
"recordType": "patent",
"query": "solid state battery",
"publicationNumber": "US11942620B2",
"title": "Solid state battery with uniformly distributed electrolyte, and methods of ...",
"assignee": "GM Global Technology Operations LLC",
"inventor": "Yong Lu",
"priorityDate": "2020-12-07",
"filingDate": "2021-12-06",
"publicationDate": "2024-03-26",
"grantDate": "2024-03-26",
"isGranted": true,
"legalStatus": "ACTIVE",
"patentUrl": "https://patents.google.com/patent/US11942620B2/en",
"pdfUrl": "https://patentimages.storage.googleapis.com/f8/02/22/a9e3950cab3340/US11942620.pdf",
"snippet": "In the instances of solid-state batteries, which include solid-state electrolyte layers disposed between solid-state electrodes, the solid-state electrolyte layer physically separates the solid-state electrodes ...",
"thumbnailUrl": "https://patentimages.storage.googleapis.com/90/b8/0e/ed6c106ab89ebf/US11942620-20240326-D00000.png",
"figureCount": 12,
"resultRank": 0,
"resultPage": 0,
"totalResultsEstimate": 98504,
"scrapedAt": "2026-09-21T02:09:51.306Z"
}
| Field | What it is |
|---|---|
publicationNumber | The full number with its kind code. Stable, and the right key for deduping across runs. |
assignee | The owner at publication. It is not updated when a patent is later sold, so read it as who filed it. |
inventor | The first named inventor only. The results list does not carry the rest. |
priorityDate | When the idea was first claimed anywhere in the family, usually the earliest of the four dates. |
isGranted | True when a grant date exists. The quick way to split grants from pending applications. |
legalStatus | ACTIVE when some member of the family is still in force, otherwise NOT_ACTIVE, and null when Google publishes none. Family level, and not legal advice. |
snippet | An extract Google picks around your search term. Not the whole abstract. |
pdfUrl | The original document, or null where none is published. |
figureCount | How many drawings the results list mentions. Often 0 on foreign-language records. |
totalResultsEstimate | Google's own match count, copied through untouched. It wobbles, and adding a filter can push it up. Use it for scale, never as a population count. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Charged |
|---|---|---|
| A patent | _sample and _diagnostic both absent | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
Filter on _sample and _diagnostic, not on recordType. The free sample row also carries recordType: "patent", so a filter on that alone keeps it.
| Code | What it means |
|---|---|
NO_RESULTS | That search matched nothing, or it hit the 1,000-result wall. details says which, and totalResultsEstimate comes with it. |
BAD_INPUT | Google rejected the search, or a pasted URL was not a Google Patents search. Check the dates and the filter values. |
NETWORK | Google could not be reached, or would not answer that search. |
TIME_BUDGET | The run hit its time limit before this search ran. Everything already delivered is complete. |
PROXY_INPUT_ADJUSTED | A network setting in your input was not usable, so the run used its own. |
CHARGE_ERROR | A charge could not be recorded. The run stops handing over rows rather than continuing quietly. |
▶️ How to run it
1. Open Google Patents Search Scraper and click Try for free. 2. Put your terms into Search terms, deleting the example. Or fill in Inventor or Assignee and leave the terms empty. 3. Narrow it with Patent offices, Grant status and a date range, and check Which date to filter on is the one you mean. 4. Set Maximum patents. Start at 20 while you see whether the search is right. Then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$1.85 per 1,000 patents. Flat on every Apify plan, no volume tiers.
One row is one patent. Sample rows, diagnostic rows, the notice telling you a search hit the 1,000-result wall, duplicates already returned earlier in the run, and rows dropped for not matching your filters are all free. A search that matches nothing costs nothing.
💡 What people use it for
- Prior-art sweeps before filing: run the idea three or four ways and read one deduped shortlist.
- Watching what a competitor's R&D is filing. Set
assignee, sort newest first, schedule it weekly
and diff on publication number.
- Mapping a technology area by classification code, then counting filings per year off the dates.
- Due diligence before an acquisition: everything a company has filed, with grant and legal status,
in one table.
- Finding who actually works in a field by pulling a few hundred rows and grouping by inventor.
🚧 What it does not do
- Search results only. No claims, no description, no citations, no family tree and no downloaded
PDF. Every row carries the link, and you open it for the rest.
- 1,000 results per search, whatever the match count says. Split by year, office, assignee or
grant status to reach past it. A search that hits the wall gets a free notice row saying so.
- The snippet is an extract, chosen by Google around your search term, not the full abstract.
- Only the first named inventor is in the results list, so that is all a row can carry.
legalStatusis a family-level summary.ACTIVEmeans in force somewhere, not everywhere, and
it is not a legal opinion.
- Foreign-language titles and abstracts are Google's machine translations, and inventor and
assignee names stay in the original script.
- Sorting changes which 1,000 you see on a broad search, and there is no paging past them.
- Design patents carry sparse metadata, often no assignee and no snippet, because that is what
the source publishes.
🧭 Which research scraper do you need?
| If you want | Use |
|---|---|
| Patents matching a search, as rows | This one |
| Preprints and papers on the same topic | arXiv Scraper |
| Published research metadata by DOI | Crossref Scraper |
| Company filings rather than patents | SEC EDGAR Scraper |
| Web results for the same terms | Google Search Results Scraper |
❓ Questions people ask
Do I need a Google account or an API key? No. Nothing to sign up for and no quota.
Can I search by CPC classification code? Yes, put it in queries like any other term, for example H01M10/0525. It is not a separate field because Google Patents does not treat it as one.
I asked for 5,000 rows on one term and got 1,000. Why? That is Google's ceiling for a single search and it applies to everyone. You will have a free notice row saying so. Split the search by year, office or assignee.
Why does my date range look like it did nothing? Usually the wrong dateType: priority, filing and publication dates on one patent can be years apart. The other cause is a date format the run could not read, which drops that bound.
Can I paste a search I already built on the website? Yes. Put the address bar into searchUrls. Its filters are used as they are, which is the easiest way to run something complicated.
Is this legal? Patent records are public documents and Google Patents is a public index. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the search you ran and the run ID. The errorCode and details on the diagnostic row usually name the problem on their own.