GET /v1/trademark/search
Trademark Search
Search the entire USPTO trademark database (~14M records). Find trademarks by mark text, owner name, goods/services description, or upcoming renewals. Results include full-text, phonetic, and fuzzy matching with detailed match scoring.
Endpoints
| Endpoint | Description |
|---|---|
GET /v1/trademark/search |
Search trademarks by mark text |
GET /v1/trademark/search/description |
Search by goods/services description |
GET /v1/trademark/search/owner |
Search by owner name |
GET /v1/trademark/search/expiring |
Find trademarks with upcoming renewals |
GET /v1/trademark/search/status |
Trademark index health check |
Parameters
Search by Mark
GET https://api.robotdomainsearch.com/v1/trademark/search
| Parameter | Type | Required | Description |
|---|---|---|---|
q |
string | Yes | Trademark text to search for (e.g., apple) |
limit |
integer | No | Maximum results to return (default: 10) |
offset |
integer | No | Number of results to skip for pagination |
class |
string | No | Filter by Nice classification number (zero-padded, e.g., 009 not 9) |
Search by Description
GET https://api.robotdomainsearch.com/v1/trademark/search/description
| Parameter | Type | Required | Description |
|---|---|---|---|
q |
string | Yes | Goods/services description to search for (e.g., software) |
limit |
integer | No | Maximum results to return (default: 10) |
offset |
integer | No | Number of results to skip for pagination |
Search by Owner
GET https://api.robotdomainsearch.com/v1/trademark/search/owner
| Parameter | Type | Required | Description |
|---|---|---|---|
q |
string | Yes | Owner name to search for (e.g., google) |
limit |
integer | No | Maximum results to return (default: 10) |
offset |
integer | No | Number of results to skip for pagination |
Expiring Trademarks
GET https://api.robotdomainsearch.com/v1/trademark/search/expiring
| Parameter | Type | Required | Description |
|---|---|---|---|
days |
integer | Yes | Number of days ahead to search for expiring trademarks |
limit |
integer | No | Maximum results to return (default: 10) |
offset |
integer | No | Number of results to skip for pagination |
Index Status
GET https://api.robotdomainsearch.com/v1/trademark/search/status
No parameters required. Returns the current health and status of the trademark index.
Request
Search by mark text
curl "https://api.robotdomainsearch.com/v1/trademark/search?q=apple&limit=2"
Search by goods/services description
curl "https://api.robotdomainsearch.com/v1/trademark/search/description?q=software&limit=1"
Search by owner name
curl "https://api.robotdomainsearch.com/v1/trademark/search/owner?q=google&limit=1"
Find expiring trademarks
curl "https://api.robotdomainsearch.com/v1/trademark/search/expiring?days=30&limit=1"
Check index status
curl "https://api.robotdomainsearch.com/v1/trademark/search/status"
Response
Search by Mark
{
"results": [
{
"serial_number": "72368372",
"mark_text": "APPLE",
"status_code": "900",
"filing_date": "1970-08-18T00:00:00Z",
"registration_date": "1972-02-22T00:00:00Z",
"renewal_date": "0001-01-01T00:00:00Z",
"owner_name": "MANN'S BAIT MANUFACTURING CO., INC.",
"goods_services": "FISHING LURES",
"class_numbers": ["028"],
"match_score": 1,
"match_details": {
"exact_match": true,
"phonetic_match": true,
"fuzzy_distance": 0,
"jaro_winkler": 1,
"prefix_match": true,
"phonetic_codes": "APL",
"matched_codes": "APL",
"bleve_score": 0.9296381258870355
},
"tsdr_enriched": false
},
{
"serial_number": "72425692",
"mark_text": "APPLE",
"status_code": "710",
"filing_date": "1972-05-26T00:00:00Z",
"registration_date": "1973-06-26T00:00:00Z",
"renewal_date": "0001-01-01T00:00:00Z",
"owner_name": "JOHN MIDDLETON CO.",
"goods_services": "SMOKING TOBACCO",
"class_numbers": ["034"],
"match_score": 1,
"match_details": {
"exact_match": true,
"phonetic_match": true,
"fuzzy_distance": 0,
"jaro_winkler": 1,
"prefix_match": true,
"phonetic_codes": "APL",
"matched_codes": "APL",
"bleve_score": 0.9296381258870355
},
"tsdr_enriched": false
}
],
"total": 6,
"limit": 2,
"offset": 0,
"query": "apple",
"took_ms": 6086,
"index_info": {
"total_documents": 13931255,
"last_updated": "2026-03-16T01:51:07Z"
},
"disclaimer": "This data is sourced from the USPTO and may not reflect the most recent filings. Not legal advice."
}
Search by Description
{
"results": [
{
"serial_number": "77943993",
"mark_text": "TWAIN CERTIFIED",
"status_code": "800",
"filing_date": "2010-02-24T00:00:00Z",
"registration_date": "2011-06-07T00:00:00Z",
"renewal_date": "0001-01-01T00:00:00Z",
"owner_name": "TWAIN Working Group",
"goods_services": "Software",
"class_numbers": ["A"],
"match_score": 1,
"match_details": {
"exact_match": false,
"phonetic_match": false,
"fuzzy_distance": 0,
"jaro_winkler": 0,
"prefix_match": false,
"bleve_score": 0.2965025984223124
},
"tsdr_enriched": false
}
],
"total": 3,
"limit": 1,
"offset": 0,
"query": "software",
"took_ms": 1443,
"index_info": {
"total_documents": 13931255,
"last_updated": "2026-03-16T01:51:07Z"
},
"disclaimer": "This data is sourced from the USPTO and may not reflect the most recent filings. Not legal advice."
}
Search by Owner
{
"results": [
{
"serial_number": "74487400",
"mark_text": "DOUBLECLICK",
"status_code": "800",
"filing_date": "1994-02-07T00:00:00Z",
"registration_date": "1995-09-12T00:00:00Z",
"renewal_date": "0001-01-01T00:00:00Z",
"owner_name": "GOOGLE LLC",
"goods_services": "advertising agency services",
"class_numbers": ["035"],
"match_score": 1,
"match_details": {
"exact_match": false,
"phonetic_match": false,
"fuzzy_distance": 0,
"jaro_winkler": 0,
"prefix_match": false,
"bleve_score": 1.793308868266384
},
"tsdr_enriched": false
}
],
"total": 3,
"limit": 1,
"offset": 0,
"query": "google",
"took_ms": 132,
"index_info": {
"total_documents": 13931255,
"last_updated": "2026-03-16T01:51:07Z"
},
"disclaimer": "This data is sourced from the USPTO and may not reflect the most recent filings. Not legal advice."
}
Expiring Trademarks
{
"results": [
{
"serial_number": "73482428",
"mark_text": "DRAKKAR NOIR",
"status_code": "800",
"filing_date": "1984-05-29T00:00:00Z",
"registration_date": "1986-03-18T00:00:00Z",
"renewal_date": "2026-03-18T00:00:00Z",
"owner_name": "L'OREAL",
"goods_services": "AFTER SHAVE [, SHAVING CREAM, SOAP ] AND EAU DE TOILETTE",
"class_numbers": ["003"],
"match_score": 0.098,
"match_details": {
"exact_match": false,
"phonetic_match": false,
"fuzzy_distance": 0,
"jaro_winkler": 0,
"prefix_match": false,
"bleve_score": 0.098
},
"tsdr_enriched": false
}
],
"total": 3,
"limit": 1,
"offset": 0,
"query": "",
"took_ms": 118,
"index_info": {
"total_documents": 13931255,
"last_updated": "2026-03-16T01:51:07Z"
},
"disclaimer": "This data is sourced from the USPTO and may not reflect the most recent filings. Not legal advice."
}
Response Fields
Top-Level Fields
| Field | Type | Description |
|---|---|---|
results |
array | Array of trademark result objects |
total |
integer | Total number of matching results |
limit |
integer | Maximum results returned per request |
offset |
integer | Number of results skipped (for pagination) |
query |
string | The search query that was executed |
took_ms |
integer | Query execution time in milliseconds |
index_info |
object | Information about the trademark index |
disclaimer |
string | Legal disclaimer about data source |
Result Fields
| Field | Type | Description |
|---|---|---|
serial_number |
string | USPTO serial number for the trademark application |
mark_text |
string | The registered trademark text |
status_code |
string | USPTO status code (see Status Codes table below) |
filing_date |
string | ISO 8601 date when the application was filed |
registration_date |
string | ISO 8601 date when the trademark was registered |
renewal_date |
string | ISO 8601 date of next renewal (0001-01-01T00:00:00Z if not applicable) |
owner_name |
string | Name of the trademark owner |
goods_services |
string | Description of goods/services covered by the trademark |
class_numbers |
array | Nice classification numbers for the trademark |
match_score |
number | Overall relevance score (0.0–1.0) |
match_details |
object | Detailed matching information |
tsdr_enriched |
boolean | Whether the result has been enriched with TSDR data |
tsdr_data |
object | TSDR enrichment data (only present when tsdr_enriched is true) |
Match Details Fields
| Field | Type | Description |
|---|---|---|
exact_match |
boolean | true if the query exactly matches the mark text |
phonetic_match |
boolean | true if the query phonetically matches the mark |
fuzzy_distance |
integer | Edit distance between query and mark (0 = exact) |
jaro_winkler |
number | Jaro-Winkler similarity score (0.0–1.0) |
prefix_match |
boolean | true if the mark starts with the query |
phonetic_codes |
string | Phonetic encoding of the query (when available) |
matched_codes |
string | Phonetic encoding of the matched mark (when available) |
bleve_score |
number | Raw search engine relevance score |
TSDR Data Fields
When tsdr_enriched is true, the result includes a tsdr_data object with additional details from the USPTO TSDR system:
| Field | Type | Description |
|---|---|---|
current_status |
string | Current status description from TSDR |
current_owner |
string | Current owner name from TSDR |
last_updated |
string | Date the TSDR data was last updated (YYYY-MM-DD) |
prosecution_history_summary |
string | Summary of prosecution history |
attorney_of_record |
string | Attorney of record for the trademark |
live_dead |
string | Whether the trademark is LIVE or DEAD |
tsdr_url |
string | Direct link to the USPTO TSDR page for this trademark |
goods_services_classes |
array | Nice classification codes from TSDR |
Index Info Fields
| Field | Type | Description |
|---|---|---|
total_documents |
integer | Total number of trademarks in the index |
last_updated |
string | ISO 8601 date when the index was last updated |
USPTO Status Codes
| Code | Description |
|---|---|
602 |
Abandoned — failure to respond or late response |
604 |
Abandoned — after examiner action |
606 |
Abandoned — after publication |
700 |
Registered — active |
702 |
Section 8 & 15 — accepted and acknowledged |
710 |
Cancelled |
800 |
Registered and renewed |
900 |
Expired |
Index Status
The status endpoint returns the health and metadata of the trademark search index.
curl "https://api.robotdomainsearch.com/v1/trademark/search/status"
{
"available": true,
"total_documents": 13931255,
"index_size_bytes": 30125729415,
"last_updated": "2026-03-16T01:51:07Z"
}
Status Response Fields
| Field | Type | Description |
|---|---|---|
available |
boolean | true if the trademark index is operational |
total_documents |
integer | Total number of trademarks in the index |
index_size_bytes |
integer | Size of the index in bytes |
last_updated |
string | ISO 8601 date when the index was last updated |
Errors
| Code | Error | Description |
|---|---|---|
| 400 | missing_parameter |
Required parameter q or days is missing |
| 405 | method_not_allowed |
Only GET method is allowed |
| 429 | rate_limited |
Rate limit exceeded |
| 500 | internal_error |
An unexpected error occurred |
| 503 | service_unavailable |
Trademark search index is not available |
Code Examples
curl
# Search by mark text
curl "https://api.robotdomainsearch.com/v1/trademark/search?q=apple&limit=2"
# Search by goods/services description
curl "https://api.robotdomainsearch.com/v1/trademark/search/description?q=software&limit=5"
# Search by owner name
curl "https://api.robotdomainsearch.com/v1/trademark/search/owner?q=google&limit=5"
# Find trademarks expiring in the next 30 days
curl "https://api.robotdomainsearch.com/v1/trademark/search/expiring?days=30&limit=10"
# Check index status
curl "https://api.robotdomainsearch.com/v1/trademark/search/status"
Python
import requests
# Search by mark text
response = requests.get(
"https://api.robotdomainsearch.com/v1/trademark/search",
params={"q": "apple", "limit": 5}
)
data = response.json()
print(f"Found {data['total']} results for '{data['query']}'")
print(f"Search took {data['took_ms']}ms")
for result in data["results"]:
print(f"\n{result['mark_text']} (Serial: {result['serial_number']})")
print(f" Owner: {result['owner_name']}")
print(f" Status: {result['status_code']}")
print(f" Goods/Services: {result['goods_services']}")
print(f" Classes: {', '.join(result['class_numbers'])}")
print(f" Match Score: {result['match_score']}")
# Search by owner
owner_response = requests.get(
"https://api.robotdomainsearch.com/v1/trademark/search/owner",
params={"q": "google", "limit": 5}
)
owner_data = owner_response.json()
for result in owner_data["results"]:
print(f"{result['mark_text']} — {result['owner_name']}")
JavaScript
// Search by mark text
const response = await fetch(
"https://api.robotdomainsearch.com/v1/trademark/search?q=apple&limit=5"
);
const data = await response.json();
console.log(`Found ${data.total} results for '${data.query}'`);
console.log(`Search took ${data.took_ms}ms`);
data.results.forEach(result => {
console.log(`\n${result.mark_text} (Serial: ${result.serial_number})`);
console.log(` Owner: ${result.owner_name}`);
console.log(` Status: ${result.status_code}`);
console.log(` Goods/Services: ${result.goods_services}`);
console.log(` Classes: ${result.class_numbers.join(", ")}`);
console.log(` Match Score: ${result.match_score}`);
});
// Find expiring trademarks
const expiringResponse = await fetch(
"https://api.robotdomainsearch.com/v1/trademark/search/expiring?days=30&limit=10"
);
const expiringData = await expiringResponse.json();
expiringData.results.forEach(result => {
console.log(`${result.mark_text} — Renewal: ${result.renewal_date}`);
});
Go
resp, err := http.Get("https://api.robotdomainsearch.com/v1/trademark/search?q=apple&limit=5")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
var data struct {
Results []struct {
SerialNumber string `json:"serial_number"`
MarkText string `json:"mark_text"`
StatusCode string `json:"status_code"`
FilingDate string `json:"filing_date"`
OwnerName string `json:"owner_name"`
GoodsServices string `json:"goods_services"`
ClassNumbers []string `json:"class_numbers"`
MatchScore float64 `json:"match_score"`
MatchDetails struct {
ExactMatch bool `json:"exact_match"`
PhoneticMatch bool `json:"phonetic_match"`
JaroWinkler float64 `json:"jaro_winkler"`
BleveScore float64 `json:"bleve_score"`
} `json:"match_details"`
} `json:"results"`
Total int `json:"total"`
Limit int `json:"limit"`
Offset int `json:"offset"`
Query string `json:"query"`
TookMs int `json:"took_ms"`
}
if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
log.Fatal(err)
}
fmt.Printf("Found %d results for '%s' (%dms)\n", data.Total, data.Query, data.TookMs)
for _, r := range data.Results {
fmt.Printf("%s (Serial: %s) — %s\n", r.MarkText, r.SerialNumber, r.OwnerName)
fmt.Printf(" Status: %s | Classes: %s\n", r.StatusCode, strings.Join(r.ClassNumbers, ", "))
fmt.Printf(" Match Score: %.2f (Exact: %t, Phonetic: %t)\n",
r.MatchScore, r.MatchDetails.ExactMatch, r.MatchDetails.PhoneticMatch)
}
Notes
- The trademark index contains approximately 14 million records sourced from the USPTO
- Index data is updated periodically — check the
last_updatedfield inindex_infofor the latest refresh date - A
renewal_dateof0001-01-01T00:00:00Zindicates no renewal date is recorded - Match scoring combines exact, phonetic, fuzzy, and full-text search signals
- The
classparameter requires zero-padded Nice classification numbers (e.g.,009not9) - The
phonetic_codesandmatched_codesfields use Soundex/Metaphone encoding for phonetic comparison - When
tsdr_enrichedistrue, additional details from the USPTO TSDR system are included intsdr_data - This data is sourced from the USPTO and may not reflect the most recent filings. This is not legal advice.
📄 Raw markdown: /docs/api/trademark.md