PatentRef

Data version 20261027.2, as of 2026-10-27: the build these pages were checked against. API version 1.21.0.

Claim trees

PatentRef's addition to the grammar: the claim tree of one granted patent, read from its claims as published. Every part of a claim carries start and end offsets into the claim text, and flags note what the parser saw in the text and the data. A flag or a category describes the text as printed; nothing here is a legal conclusion.

Route
GET /api/v1/structure/claims/{patent_id}/ (the trailing slash is optional)
Key
X-Api-Key, as every data path; it counts toward the monthly allowance
Built
when it is asked for, by a deterministic parser (regular expressions and small state machines, no language model)
Versions
structure_version, data_version (X-Data-Version) and text_data_version (X-Text-Data-Version)
Machine-readable
the operation in openapi.json (operationId StructureClaims, schema ClaimTree)

Example

curl -s -H "X-Api-Key: $KEY" https://patentref.io/api/v1/structure/claims/10034028/
import os, requests

base_url = "https://patentref.io"
headers = {"X-Api-Key": os.environ["PATENTREF_KEY"]}
r = requests.get(base_url + "/api/v1/structure/claims/10034028/", headers=headers)
r.raise_for_status()
tree = r.json()
for c in tree["claims"]:
    print(c["number"], c["depends_on"], c["category"])
    for e in c["elements"]:
        assert c["text"][e["start"]:e["end"]] == e["text"]  # every offset points into the claim text

How the tree is read

The answer

FieldTypeNote
errorboolean
patent_idstring
patent_unit_idstringUS<patent_id>
structure_versionstringThe version of the tree's shape
generatorstringThe parser and its version
data_versionstringThe search file in service, the same as X-Data-Version
text_data_versionstringThe long-text file the claims came from, the same as X-Text-Data-Version
as_ofstring
kindstring: utility, design, plant, reissue
utility_likebooleanfalse for design and plant patents
claimslist of objects
relationslist of objectssrc, rel, dst: part_of, depends_on, references_claim, introduces_term, refers_to_term (a reference to its antecedent), has_flag
flagslist of objects

A claim

FieldTypeNote
claim_idstringUS<patent_id>-c<number>; a repeated number gets -s<sequence>
numberinteger
number_basisstring
sequenceintegerclaim_sequence, from 0
textstringThe claim text as published, untouched; every offset of this claim points into it
body_startintegerThe offset just after the number prefix ("1. "), 0 if there is none
independentboolean
depends_onlist of integerThe claim numbers this claim depends on
depends_on_basisstringtext, field, field_body_reference or none
depends_on_textlist of integer
depends_on_fieldlist of integer
dependent_fieldstringThe dependent column of the long text, as stored
referenceslist of integerClaims the text cites outside the preamble
categorystringmethod, apparatus, system, composition, crm, use, design, plant or other, from the preamble's words
category_basisstring
preamblenull or object
transitionnull or object
elementslist of objects
termslist of objects
claim_refslist of objects
flagslist of objects

Errors keep the upstream form, with X-Status-Reason and X-Status-Reason-Code; send Accept: application/problem+json for RFC 9457 problem details. The codes are on the keys, limits and errors page and at /docs/errors/NOT_FOUND.

Patent briefs

A brief of one granted patent that fits the number of tokens you give it: its identity and dates, its status record with its basis, each independent claim as its elements with their offsets in the claim text, each dependent claim on one line, and the claim term keys, in that order, cut where the budget ends. It is made from the claim tree when it is asked for; every quote in it is the claim text at its offsets.

Route
GET /api/v1/structure/brief/{patent_id}/?max_tokens= (300 to 32000, default 2000; the trailing slash is optional)
Key
X-Api-Key, as every data path; it counts toward the monthly allowance
Budget
tokens by the stated proxy ceil(utf8_bytes / 3), never over max_tokens
Machine-readable
the operation in openapi.json (operationId StructureBrief, schema PatentBrief)

Example

curl -s -H "X-Api-Key: $KEY" "https://patentref.io/api/v1/structure/brief/10034028/?max_tokens=1000"
import os, requests

base_url = "https://patentref.io"
headers = {"X-Api-Key": os.environ["PATENTREF_KEY"]}
r = requests.get(base_url + "/api/v1/structure/brief/10034028/", params={"max_tokens": 1000}, headers=headers)
r.raise_for_status()
brief = r.json()
print(brief["tokens"], "of", brief["max_tokens"], "tokens; left out:", brief["omitted"])
for c in brief["independent_claims"]:
    for e in c["elements"]:
        print(brief["page"] + "#" + e["anchor"], e["text"])  # a link to the element on the record page

How a brief is made

The answer

FieldTypeNote
errorboolean
patent_idstring
structure_versionstringThe claim tree's shape version the brief is read from
generatorstringThe claim parser and its version
data_versionstringThe search file in service, the same as X-Data-Version
text_data_versionstringThe long-text file the claims came from, the same as X-Text-Data-Version
as_ofstring
max_tokensintegerThe budget asked for
tokensintegerThis answer's own size by the stated proxy; never over max_tokens
tokenizerstringThe stated proxy: the UTF-8 bytes of the JSON body as sent, divided by 3, rounded up
truncatedbooleantrue when the budget left anything out
omittedobjectHow many of each the budget left out
pagestringThe record page of this data version; page + "#" + an anchor opens that claim or element
identitynull or objectThe patent's record: its PatentsView fields and the claim counts
statusnull or objectThe status record GET /api/v1/lapse/status/{patent_id}/ answers, without its links; null when no status catalog is in service
independent_claimslist of objects
dependent_claimslist of objects
component_keyslist of objectsThe term keys of the terms the claims introduce, each with the claims that introduce it, ordered by the first claim that introduces it, independent claims first

An independent claim in a brief

FieldTypeNote
numberinteger
anchorstringIts anchor on the record page: c<n> for claim n (c<n>-s<claim_sequence> when a number repeats in the data), c<n>-e<k>-<start>-<end> for element k of claim n with its offsets in the claim text; page + "#" + anchor opens it there
categorystringmethod, apparatus, system, composition, crm, use, design, plant or other, read from the preamble's words
preamblenull or objectThe words before the transition, or null
transitionnull or objectThe transition (comprising, consisting of, wherein and the like), or null
element_countintegerHow many elements the claim has
elementslist of objects

A dependent claim in a brief

FieldTypeNote
numberinteger
anchorstringIts anchor on the record page: c<n> for claim n (c<n>-s<claim_sequence> when a number repeats in the data), c<n>-e<k>-<start>-<end> for element k of claim n with its offsets in the claim text; page + "#" + anchor opens it there
depends_onlist of integerThe claim numbers it depends on
cutbooleanPresent when the line stops before the claim's end: after at most 240 characters, at a space
startinteger
endinteger
textstringThe claim text from start to end, as published

Triage table

Up to 500 patents in one answer: each patent's expiry and fee status with the basis, where each component sits in its claims, and each independent claim as a list of its parts, every quote with its offsets in the claim text. The page /triage/ draws the table with your key and keeps your have and lacks marks in your browser; an example table needs no key.

Route
POST /api/v1/structure/triage/ (a JSON body), or GET with the same fields as parameters
Key
X-Api-Key, as every data path; one request toward the monthly allowance, whatever the number of patents
Built
when it is asked for, by the claim tree's parser (no language model, nothing stored)
Machine-readable
the operations in openapi.json (operationId StructureTriage and StructureTriagePost, schema TriageTable)
curl -s -H "X-Api-Key: $KEY" -H "Content-Type: application/json" -d '{"patents": "11773614 11649651 8696821 9051750", "components": "drive motor, brush"}' https://patentref.io/api/v1/structure/triage/
curl -s -H "X-Api-Key: $KEY" -H "Content-Type: application/json" -d '{"search": "\"pool cleaner\" brush", "limit": 50, "output": "csv"}' https://patentref.io/api/v1/structure/triage/ -o table.csv

How the table is read

The answer

FieldTypeNote
errorboolean
data_versionstringThe search file in service, the same as X-Data-Version
text_data_versionstringThe long-text file the claims came from, the same as X-Text-Data-Version
as_ofstring
structure_versionstringThe claim tree's shape version the parts come from
generatorstringThe claim parser and its version
inputobjectHow the request was read. A list: kind list, patents_read, repeated (numbers given twice), unread (up to 20 pieces that are not patent numbers) and unread_count. A search: kind search, search, terms, limit, found, more (more patents match than the limit) and complete (false when the search stopped at its time limit). Both: unread_components.
componentslist of objectsThe table's components, in column order
positionslist of string: every_independent, some_independent, only_dependent, absent
completebooleanfalse when the table reached its time limit before every row
time_limit_secondsnumber
status_availablebooleanfalse when the status engine could not be read; every status is then null
countsobject
quotesintegerThe quotes in the answer, each checked against the claim text
export_columnslist of stringThe columns of the CSV export, in order
patentslist of objects

A row

FieldTypeNote
rowintegerIts place in the list or the search
patent_idstring
titlestring
patent_datestring
permalinkstringThe patent's record page, https://patentref.io/p/<patent_id>?v=<data_version>
foundbooleanfalse when the data in service has no patent with this number
builtbooleantrue when its claims were read; cells, components and claim_parts are empty otherwise
notenull or string: not_in_data, no_claim_text, work_cap, offset_check, time_limitWhy a row has no cells: not_in_data, no_claim_text (granted after the long-text file's last grant date), work_cap (over 1,000 claim rows or 1,000,000 characters), offset_check (a span that did not hold), time_limit (the table stopped before this row; send it again)
statusnull or object
claimsnull or object
cellslist of objectsOne per component of the table, in its order
componentsnull or objectThe keys of the terms the patent's own claims introduce, by position
claim_partslist of objects

A cell

FieldTypeNote
keystringThe component's key
positionstring: every_independent, some_independent, only_dependent, absent
matchnull or string: exact, partialexact: a claim term has the same key; partial: one key ends with the other as whole words; null when absent
claim_keyslist of stringThe claim terms' keys it matched, exact first (at most 3)
independent_claimslist of integerThe independent claims that mention it
dependent_claimslist of integerThe dependent claims that mention it
quotenull or object