ClaimMark-A Prior Art Search API · version 1.4.0
ClaimMark-A Prior Art Search API
Ranked US patent prior art with a reproducible search record, a separate non-US list, and what other searches of the same invention cited.
Search US granted patents from 1836 onward and published applications from 2001 onward by text and claims or by a published number. Text of patents granted before 1976 is machine-read (OCR) and may contain errors; those results carry textSource: machine-read. Every search returns a search record: the request as run, the index level it ran against, and a result hash that the same request at the same index level reproduces.
Non-US (1.3.0): a search answer can carry nonUs, a separate list of European Patent Office publications (full text where the EPO data has it) and abstract-only records of other offices' patent families that have no US or EP member, found by semantic (meaning-based) retrieval only and ranked on its own with the same publication-date ceiling, never merged into results. The search reads each record's title, abstract, and independent claims (not the EP description); other offices' families with no English title or abstract are not found. Families already in results, and the query's own family, are not repeated. nonUs.status is unavailable when the non-US index did not answer in time; results are complete either way. nonUs is not paged (it has depth entries at most) and has its own record.
Family history (1.4.0): a number search's answer can carry familyHistory, what other searches of the same invention already cited: the search reports and examinations other offices recorded on the searched document's DOCDB patent family (European and international search reports, and national searches), the same for its recorded US parent applications' families, and the US examiners' and applicants' citations on those parents' and US family members' grants (the searched application's own examiner citations are in examinerCitations). Built from the EPO DOCDB worldwide bibliographic data. Each cited document is shown as its US family when the index holds one, else by its own number; only documents published before the search's ceiling are listed, ordered by the strongest search-report category (X, then Y, then the rest), then by the number of searches that cited it. It is a list of its own, never merged into results; familyHistory.status is unavailable when it did not answer in time, and results are complete either way. Not paged (depth entries at most); it has its own record.
Authenticate with an organization API key: Authorization: Bearer cmk_live_.... Keys are created by the organization owner in ClaimMark-A Prior Art Search (Organization > API keys); the secret is shown once.
Limits: calls per calendar month (UTC) by plan (Developer 250, Starter 10,000, Scale 100,000). Developer stops at its limit (429); Starter and Scale continue and count overage. Calls one key may have in flight: 1, 2, or 4. GET /usage is not counted. A failed call is not counted.
Every response to a valid key carries X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (epoch seconds), and X-RateLimit-Overage (paid plans); answers from the index carry X-ClaimMark-Index-Build; every response carries X-Request-Id. GET /usage takes no concurrency slot.
Terms of Service: after a Terms change, every call answers 403 TERMS_OF_SERVICE_NOT_ACCEPTED until the organization owner signs in to the app and accepts the current version (details.currentVersion). Document numbers go in request bodies, never in the address, so no request log records which documents you looked up; the earlier GET /documents/{id} and GET /documents/{id}/citations forms answer 410 API_ROUTE_MOVED. The API is for servers: browsers on other websites cannot call it.
Machine-read text (1.1.0, additive): documents whose text the index holds as machine-read OCR (US grants before 1976) carry textSource: machine-read; that text may contain errors. Their claimsSource says where the claims came from (none: no claims were found). When a stored abstract is empty, descriptionOpening gives the first ~300 characters of the description; it is not the abstract. Such documents can have no application number, no applicants, and no examiner citations (examinerRecorded / examinerCitations.recorded false).
Families (1.2.0, additive): a search may group results by DOCDB simple family, so an application, its continuations, and its divisionals that share their priorities are one result (a continuation-in-part with a new priority stays apart). Such a search's familyKey values read docdb:<DOCDB family id> (a document with no DOCDB family keeps its application number), its record.familyIndex names the family index it used, and its record.recipeHash differs from the application-number recipe, so calibrated labels are off for it until re-measured. Otherwise familyKey is the application number and record.familyIndex is absent, as in 1.1.0. Replay: a record reproduces only under the family rule it was made with; a record made before the switch to DOCDB families cannot be replayed after it. /documents returns each document's own application number as familyKey; it does not group documents into DOCDB families.
Base URL and authentication
https://app.claimmark.ai/api/search/v1Send the organization's key in every request: Authorization: Bearer cmk_live_.... The owner creates keys in the app under API keys (up to five per organization). A key works only on these endpoints, and a signed-in browser session never works on them.
Coverage: US granted patents from 1836 onward and published applications from 2001 onward, searched by keywords, CPC classification, and semantic (meaning-based) retrieval combined. Text of patents granted before 1976 is machine-read (OCR) and may contain errors; those results are labeled. No foreign documents, no US design patents, no US patents granted before 1836 apart from a few surviving earlier patents, and no non-patent literature. See exactly what's in the index.
Search by text and claims, or by a published number
POST/search
Request body (SearchRequest)
Either number, or text and/or claims.
| Field | Type | Description |
|---|---|---|
text | string | An abstract (max length 20000) |
claims | string[] | Independent claims (up to five are searched). (max 20 items) |
number | string | A US publication, patent, or application number: US 2019/0123456 A1, 10,123,456, 16/229,352. |
filters | object | |
depth | integer | Results ranked. (min 1, max 100, default 20) |
limit | integer | Results on this page. (min 1, max 50, default 20) |
offset | integer | offset + limit is at most 100. (min 0, default 0) |
| filters. | Type | Description |
|---|---|---|
cpc | string[] | CPC subclasses (H01Q) or main groups (H01Q21 |
publishedFrom | string | (date) |
publishedBefore | string | (date) |
recordTypes | "grant" | "application"[] |
Response 200 (SearchAnswer)
One page of ranked results and the search record.
| Field | Type | Description |
|---|---|---|
query | object | |
coverage | string | |
total | integer | |
offset | integer | |
limit | integer | |
results | Hit[] | |
examinerCitations | null | object | |
calibrationNote | string | null | |
record | SearchRecord | |
nonUs | NonUsSection | The separate non-US list (1.3.0). Absent when no non-US index is connected. |
familyHistory | FamilyHistorySection | What other searches of the same invention cited (1.4.0). Number searches only; absent when no family-history index is connected. |
Errors
400The request is malformed (code INVALID_SEARCH, with the field in details).401Missing, malformed, revoked, or unknown key (code API_KEY_INVALID).403The Terms of Service changed and the organization owner has not accepted the current version yet (code TERMS_OF_SERVICE_NOT_ACCEPTED, details.currentVersion). The call was not counted.404The number or document is not in the index (code PATENT_NOT_IN_INDEX).429Over the month's calls on Developer (API_ALLOWANCE_USED), over the key's concurrency (API_CONCURRENCY_LIMIT, details.reason key_limit), or the service is busy with other searches (API_CONCURRENCY_LIMIT, details.reason service_busy; retry after details.retryAfterSeconds); details.usage says when the month resets.503The index did not answer (SEARCH_INDEX_UNAVAILABLE); the call was not counted.
curl
curl https://app.claimmark.ai/api/search/v1/search \
-H "Authorization: Bearer $CLAIMMARK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "A threaded housing that secures fasteners.", "claims": ["A housing comprising threads."], "limit": 20}'Python
import os, requests
answer = requests.post(
"https://app.claimmark.ai/api/search/v1/search",
headers={"Authorization": f"Bearer {os.environ['CLAIMMARK_API_KEY']}"},
json={"number": "US 2019/0123456 A1", "depth": 100, "limit": 50},
timeout=60,
).json()
for hit in answer["results"]:
print(hit["rank"], hit["id"], hit["title"], hit.get("examinerCited"))
print(answer["record"]["resultHash"])One document
POST/documents
Request body (DocumentRequest)
| Field | Type | Description |
|---|---|---|
id * | string | A US publication or patent number in the index, such as US10123456B2. |
Response 200 (Document)
The document.
| Field | Type | Description |
|---|---|---|
id | string | |
familyKey | string | The document's own application number (not a DOCDB family). |
recordType | "grant" | "application" | |
kindCode | string | |
title | string | |
abstract | string | Empty when the index has no abstract (most grants before 1976). |
descriptionOpening | DescriptionOpening | The first ~300 characters of the description, present only when the stored abstract is empty. It is not the abstract; show it marked as from the description. |
textSource | "publisher" | "machine-read" | machine-read: the index holds the document as machine-read OCR text (US grants before 1976), which may contain errors. publisher: USPTO publisher text. |
claimsSource | "google" | "extracted" | "none" | null | Machine-read documents only (null otherwise): google (the claims as Google publishes them), extracted (taken from the end of the machine-read description), none (no claims were found). |
independentClaims | string[] | |
claims | string[] | |
applicants | string[] | |
applicationNumber | string | null | |
applicationDate | string | null | (date) |
publicationDate | string | null | (date) |
earliestPriorityDate | string | null | (date) |
cpc | string[] | |
mainCpc | string | null | |
url | string | (uri) |
Errors
400The request is malformed (code INVALID_SEARCH, with the field in details).401Missing, malformed, revoked, or unknown key (code API_KEY_INVALID).403The Terms of Service changed and the organization owner has not accepted the current version yet (code TERMS_OF_SERVICE_NOT_ACCEPTED, details.currentVersion). The call was not counted.404The number or document is not in the index (code PATENT_NOT_IN_INDEX).429Over the month's calls on Developer (API_ALLOWANCE_USED), over the key's concurrency (API_CONCURRENCY_LIMIT, details.reason key_limit), or the service is busy with other searches (API_CONCURRENCY_LIMIT, details.reason service_busy; retry after details.retryAfterSeconds); details.usage says when the month resets.503The index did not answer (SEARCH_INDEX_UNAVAILABLE); the call was not counted.
curl
curl https://app.claimmark.ai/api/search/v1/documents \
-H "Authorization: Bearer $CLAIMMARK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"id": "US10123456B2"}'Python
document = requests.post(
"https://app.claimmark.ai/api/search/v1/documents",
headers={"Authorization": f"Bearer {os.environ['CLAIMMARK_API_KEY']}"},
json={"id": "US10123456B2"},
timeout=30,
).json()
print(document["title"], document["independentClaims"][0])What a document cites, and what cites it
POST/citations
Request body (DocumentRequest)
| Field | Type | Description |
|---|---|---|
id * | string | A US publication or patent number in the index, such as US10123456B2. |
Response 200 (Citations)
Citations in both directions (citing documents capped at 100, with the total).
| Field | Type | Description |
|---|---|---|
id | string | |
cites | object | |
citedBy | object |
Errors
400The request is malformed (code INVALID_SEARCH, with the field in details).401Missing, malformed, revoked, or unknown key (code API_KEY_INVALID).403The Terms of Service changed and the organization owner has not accepted the current version yet (code TERMS_OF_SERVICE_NOT_ACCEPTED, details.currentVersion). The call was not counted.404The number or document is not in the index (code PATENT_NOT_IN_INDEX).429Over the month's calls on Developer (API_ALLOWANCE_USED), over the key's concurrency (API_CONCURRENCY_LIMIT, details.reason key_limit), or the service is busy with other searches (API_CONCURRENCY_LIMIT, details.reason service_busy; retry after details.retryAfterSeconds); details.usage says when the month resets.503The index did not answer (SEARCH_INDEX_UNAVAILABLE); the call was not counted.
curl
curl https://app.claimmark.ai/api/search/v1/citations \
-H "Authorization: Bearer $CLAIMMARK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"id": "US10123456B2"}'Python
citations = requests.post(
"https://app.claimmark.ai/api/search/v1/citations",
headers={"Authorization": f"Bearer {os.environ['CLAIMMARK_API_KEY']}"},
json={"id": "US10123456B2"},
timeout=30,
).json()
print(citations["cites"]["examiner"], citations["citedBy"]["total"])This month's calls and the plan's limits (not counted)
GET/usage
Response 200
Usage.
| Field | Type | Description |
|---|---|---|
usage | Usage |
Errors
401Missing, malformed, revoked, or unknown key (code API_KEY_INVALID).403The Terms of Service changed and the organization owner has not accepted the current version yet (code TERMS_OF_SERVICE_NOT_ACCEPTED, details.currentVersion). The call was not counted.
curl
curl https://app.claimmark.ai/api/search/v1/usage \
-H "Authorization: Bearer $CLAIMMARK_API_KEY"Python
usage = requests.get(
"https://app.claimmark.ai/api/search/v1/usage",
headers={"Authorization": f"Bearer {os.environ['CLAIMMARK_API_KEY']}"},
timeout=30,
).json()["usage"]
print(usage["used"], "of", usage["monthlyCalls"], "calls; resets", usage["resetsAt"])Objects
SearchRecord
| Field | Type | Description |
|---|---|---|
recordVersion | 1 | |
recipeHash | string | |
build | string | null | |
familyIndex | string | null | Present only when the search used DOCDB families (1.2.0): the family index build it read; part of what a replay must match. |
indexLineage | null | object | |
request | object | |
calibration | object | null | |
resultHash | string | SHA-256; the same request at the same index level reproduces it. |
timestamp | string | (date-time) |
Hit
| Field | Type | Description |
|---|---|---|
rank | integer | |
id | string | |
familyKey | string | The family this result stands for. docdb:<DOCDB simple family id> when the search used DOCDB families (see Families, 1.2.0), otherwise the application number. Opaque: compare it within one search; do not parse it. |
recordType | "grant" | "application" | |
kindCode | string | |
title | string | |
abstract | string | Empty when the index has no abstract (most grants before 1976). |
descriptionOpening | DescriptionOpening | The first ~300 characters of the description, present only when the stored abstract is empty. It is not the abstract; show it marked as from the description. |
textSource | "publisher" | "machine-read" | machine-read: the index holds the document as machine-read OCR text (US grants before 1976), which may contain errors. publisher: USPTO publisher text. |
claimsSource | "google" | "extracted" | "none" | null | Machine-read documents only (null otherwise): google (the claims as Google publishes them), extracted (taken from the end of the machine-read description), none (no claims were found). |
independentClaims | string[] | |
applicants | string[] | |
publicationDate | string | null | (date) |
earliestPriorityDate | string | null | (date) |
cpc | string[] | |
mainCpc | string | null | |
score | number | Fused reciprocal-rank score; comparable within one search only. |
examinerCited | boolean | Number searches only. |
calibration | object | Number searches only. The fraction of tuning-sample candidates in this score band that the examiner cited; a lower bound on relevance. |
url | string | (uri) |
QueryDocument
| Field | Type | Description |
|---|---|---|
id | string | |
familyKey | string | The family this result stands for. docdb:<DOCDB simple family id> when the search used DOCDB families (see Families, 1.2.0), otherwise the application number. Opaque: compare it within one search; do not parse it. |
title | string | |
recordType | "grant" | "application" | |
publicationDate | string | null | (date) |
earliestPriorityDate | string | null | (date) |
textSource | "publisher" | "machine-read" | machine-read: the index holds the document as machine-read OCR text (US grants before 1976), which may contain errors. publisher: USPTO publisher text. |
claimsSource | "google" | "extracted" | "none" | null | Machine-read documents only (null otherwise): google (the claims as Google publishes them), extracted (taken from the end of the machine-read description), none (no claims were found). |
abstractFound | boolean | False when the document has no stored abstract |
Usage
| Field | Type | Description |
|---|---|---|
plan | "developer" | "starter" | "scale" | |
monthlyCalls | integer | |
overage | boolean | |
concurrency | integer | |
month | string | |
used | integer | |
remaining | integer | |
overageCalls | integer | |
resetsAt | string | (date-time) |
Error
| Field | Type | Description |
|---|---|---|
error | string | |
code | string | |
details | object |