API
DownloadPatent API
Download patent PDFs and turn office actions into citation lists from your own scripts and AI agents. The API uses the same account and the same credits as the website.
Authentication
Create an API key in Settings while signed in. The full key is shown once, when you create it; store it like a password. Send it in the Authorization header as a Bearer token on every request. We email you whenever a key is created. When you create a key you choose when it expires (one year by default, or never) and how much it may spend (a $50 monthly limit by default, or no limit); you can change both later in Settings. To rotate a key, create a new key, switch to it, then revoke the old one. Revoking takes effect on the next request.
Every account can create API keys, including free accounts. You can have up to 5 active keys and revoke any of them at any time. Each key may make 60 requests per minute. Every counted response carries the IETF RateLimit-Policy and RateLimit fields, for example RateLimit-Policy: "per-key";q=60;w=60 and RateLimit: "per-key";r=59;t=42 (59 requests left, the minute ends in 42 seconds), and the older X-RateLimit-Limit and X-RateLimit-Remaining headers with the same numbers.
Authorization: Bearer dpk_live_…Pricing and limits
API calls spend the same credits as the website, at the same prices. Your credits are your top-ups, which do not expire, plus any free credits (sign-up credits, which expire 30 days after they are granted, and promotional credits, which expire on the date given when they are granted); free credits are used first.
Patent PDFs: the first 50 per account each UTC day are free through the API (counted separately from the website's daily allowance); each one after that costs $0.005. At most 2,000 patent PDFs per account per UTC day go through POST /patent-pdfs; past that the API answers 429 daily_patent_cap_reached until the next UTC midnight, and other endpoints keep working.
From 2026-11-18, a free account gets 100 free patent PDFs a month. Monthly includes 3,000 patent PDFs a month, counting other-language versions, and 50 office actions. Past that, each patent is US$0.01. The website and the API share one allowance. Credits you have already bought keep their value.
Office action analysis: Citation list (mode quick) costs $0.15 per office action and Full-text citations (mode full) $0.25. On the Monthly plan, office actions sent through the API count toward the same 100 per subscription period as the website, and only those past 100 use credits. Credits are held when you create the job and charged when it finishes, whether or not you read the result; reading a result costs nothing. Files that fail to analyse are not charged. An office action's cited patent PDFs and its ZIP are included in its price: they use no free patent PDFs, cost nothing more and do not count toward the 2,000 a day. English counterparts cost $0.03 each the first time you download one (included on the Monthly plan); a counterpart PDF that does not name its own number is delivered free.
Endpoints
All paths are relative to https://downloadpatent.com/api/v1. Responses are JSON unless noted.
- POST /patent-pdfs
- Send a JSON body with the patent number in the number field and receive the PDF itself (application/pdf). Uses the same sources as the website and fetches each patent only once even when several requests ask for it at the same time. Write the number with or without spaces, commas, slashes or hyphens, in any case (US 9,876,543 B2 works); the X-Patent-Number response header gives the form we used. Application numbers (US 10/123,456, CN, TW, JP or PCT applications) are refused with reason application_number rather than looked up; send the publication or patent number, written without spaces if a JP number is refused (JP2022529962A).
- POST /oa-jobs
- Upload an office action as multipart form data: mode (quick or full) and file. Quick accepts up to 10 PDFs, full accepts 1; each file may be up to 25 MB and the whole request up to 28 MB, so send larger batches as several jobs. Optional: find_english=true to find and deliver an English counterpart for each non-English cited patent (default true on the Monthly plan while it has allowance left, false once used up and on other accounts; an explicit true past the allowance is charged), and deliver_files=false if you only want the citation list (default true). Returns 202 with the job. Send an Idempotency-Key header to make retries safe. Quick reads the search report attached to each office action; when there is none the result says searchReportFound false, so send it again with mode full.
- GET /oa-jobs/:id
- The job's status (queued, running, partial, done or failed) and the status of each uploaded file. Poll every few seconds until it is done, partial or failed.
- GET /oa-jobs/:id/result
- The citations found in each office action: patent numbers with their groups (substantive, background, PTO-892, IDS, examiner list) and English or Chinese family members, plus non-patent literature. The job was charged when it finished; reading costs nothing. With deliver_files, job.filesStatus is preparing for a little while after the job finishes; read the result again every 5 seconds until it is ready. Then each cited patent the website's download selects by default has pdfUrl (and englishPdfUrl when an English counterpart was found), and the job and each office action have zipUrl: the same files and cited-reference list as the website's ZIP. Download them with the same API key; they are kept 24 hours. Patents with pdfStatus not_included or failed can be fetched with POST /patent-pdfs.
- GET /oa-jobs/:id/archive, /results/:resultId/archive, /files/:fileId
- The URLs from the result: the job's ZIP (one office action's ZIP, or a ZIP of each office action's ZIP), one office action's ZIP, or one PDF. Same key, same account as the job. Cited patent PDFs are included in the office action. An English counterpart is charged on its first download, whichever URL it came through; downloading it again costs nothing. 409 files_not_ready while the files are being prepared.
- GET /balance
- Your spendable credits in micro-dollars (1,000,000 = $1); patentPdfs.freeRemaining, how many free patent PDFs you have left, and freeResetsAt, when that count starts over (freeRemainingToday is the same number and is deprecated); and on the Monthly plan monthlyOas: the office actions included this period, how many are used (website and API together) and when the period ends (null without a plan).
Examples
curl https://downloadpatent.com/api/v1/patent-pdfs \
-H "Authorization: Bearer $DOWNLOADPATENT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"number": "US10000000B2"}' \
-o US10000000B2.pdfcurl https://downloadpatent.com/api/v1/oa-jobs \
-H "Authorization: Bearer $DOWNLOADPATENT_API_KEY" \
-H "Idempotency-Key: matter-1234-oa-1" \
-F mode=quick \
-F [email protected]curl https://downloadpatent.com/api/v1/oa-jobs/$JOB_ID \
-H "Authorization: Bearer $DOWNLOADPATENT_API_KEY"
curl https://downloadpatent.com/api/v1/oa-jobs/$JOB_ID/result \
-H "Authorization: Bearer $DOWNLOADPATENT_API_KEY"Safe retries
Send the same Idempotency-Key (letters, digits, . _ : -, up to 128 characters) when you retry POST /oa-jobs. Within 24 hours the API returns the first job instead of creating and charging a second one. Reusing a key with different files is refused. If the first request was refused, for example for insufficient credits, you can retry with the same key after topping up.
Errors
Every error has the same shape: an error object with a code and a message, sometimes with extra fields such as retryAfterSeconds (see the example below). Act on the code; the message is for people.
{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after the indicated delay.",
"retryAfterSeconds": 12
}
}- 401 invalid_api_key
- The key is missing, malformed or revoked, or its account is no longer active.
- 401 key_disabled / key_expired
- The key's owner disabled it in Settings, or it passed its expiry date. A disabled key works again once enabled; an expired key does not, so create a new one.
- 403 api_not_available
- The API is not open to this account yet. Keys from other accounts are refused until DownloadPatent opens the API to everyone.
- 429 rate_limited / daily_patent_cap_reached
- rate_limited: this key used its requests for the minute, or this address sent too many invalid keys. daily_patent_cap_reached: the account's 2,000 patent PDFs through the API for today are used; other endpoints keep working. Wait for the Retry-After header's seconds (for the daily cap, until the next UTC midnight); when the key's own limit refused it, the RateLimit header's t carries the same number.
- 402 insufficient_credits
- Your credits do not cover the request. Top up and retry.
- 402 daily_free_limit_reached
- Your free patent PDFs are used up and your credits do not cover the next one.
- 403 terms_consent_required
- The updated Terms of Service must be accepted before new work can start. Sign in on the website and accept them; reading existing results and your balance keeps working.
- 402 key_spend_limit_reached
- This request would take the key past its own spending limit for the period. Raise the limit in Settings or wait for the reset time in the response.
- 400 invalid_request
- The request is malformed; the field and reason are included.
- 413 payload_too_large
- A file is over 25 MB or the whole request is over 28 MB. Send larger batches as several jobs.
- 404 not_found / patent_not_found
- No such job for this account, or no public PDF for that number.
- 405 method_not_allowed
- The endpoint exists but not for this HTTP method; the Allow header lists the one it accepts.
- 409 / 422 idempotency_in_progress / idempotency_conflict
- The first request with this key is still running, or the key was used with different files.
- 409 result_not_ready / files_not_ready
- The job has not finished, or its files are still being prepared. Keep polling.
- 451 region_unavailable
- DownloadPatent is not available in your region or for your account.
- 503 unavailable
- A temporary problem on our side or at a patent office. Retry later.
Versioning and deprecation
The version is part of the path. Within /v1 we only add fields, endpoints and error codes; anything incompatible gets a new version. Ignore fields you do not recognise. Every amount is an integer number of micro-dollars; before the API opened to all accounts, limitMicros and spentMicros in key_spend_limit_reached changed from strings to numbers.
Before we retire an endpoint, a field or a version, we announce it at least 90 days before it stops working. From the announcement on, its responses carry a Deprecation header (RFC 9745) with the date it was deprecated, a Sunset header (RFC 8594) with the date it stops working, and a Link header to the notice; this page names what replaces it, and we email the owners of keys that called it in the previous 90 days. Nothing is deprecated today.
Accuracy
Office actions are read with OCR and citations are extracted by rules, with AI used where the rules fall short. Either can be wrong: check every citation against the office action before relying on it. Citations recovered by AI carry source ai in the result.
OpenAPI description
A machine-readable description of these endpoints is available as OpenAPI 3.1, for code generators and AI agents.