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_updated field in index_info for the latest refresh date
  • A renewal_date of 0001-01-01T00:00:00Z indicates no renewal date is recorded
  • Match scoring combines exact, phonetic, fuzzy, and full-text search signals
  • The class parameter requires zero-padded Nice classification numbers (e.g., 009 not 9)
  • The phonetic_codes and matched_codes fields use Soundex/Metaphone encoding for phonetic comparison
  • When tsdr_enriched is true, additional details from the USPTO TSDR system are included in tsdr_data
  • This data is sourced from the USPTO and may not reflect the most recent filings. This is not legal advice.