Search is the primary HTTP method. Send a GET with query parameters, or a
POST with a JSON body when the query is long.
Endpoint
GET /v1/trademarks/search
POST /v1/trademarks/searchBoth methods share the same query object. GET puts fields on the query
string. POST sends them as JSON with Content-Type: application/json.
Query fields
| Field | Type | Required | Description |
|---|---|---|---|
q |
string | one of q, serialNumber, owner |
Mark text or free-text query |
serialNumber |
string | one of | USPTO serial number, digits only |
owner |
string | one of | Owner / applicant name |
status |
string | no | live, dead, or all (default live) |
limit |
integer | no | Page size, 1–50 (default 10) |
offset |
integer | no | Pagination offset (default 0) |
Exactly one of q, serialNumber, or owner must be present.
Examples
curl -sS "https://freetrademarkapi.com/v1/trademarks/search?q=markavo&limit=5"curl -sS https://freetrademarkapi.com/v1/trademarks/search \
-H "Content-Type: application/json" \
-d '{"q":"markavo","status":"live","limit":5}'curl -sS "https://freetrademarkapi.com/v1/trademarks/search?serialNumber=88888888"Response
Successful responses are JSON:
{
"object": "list",
"query": { "q": "markavo", "status": "live", "limit": 5, "offset": 0 },
"count": 1,
"hasMore": false,
"data": [
{
"object": "trademark",
"serialNumber": "88888888",
"markIdentification": "MARKAVO",
"status": "live",
"statusLabel": "Registered",
"owner": "Example Owner, LLC",
"filingDate": "2020-01-15",
"classes": ["045"]
}
]
}Field notes
markIdentificationis the literal mark as recorded, not a normalized search key. Compare withqusing your own rules.statusis collapsed toliveordeadfor filtering. UsestatusLabelwhen you need the USPTO wording.classesare Nice Classification numbers as strings, zero-padded to three digits when the source provides them.
Continue to Errors for non-2xx bodies.