Iran Trademark Search API
Search published Iranian trademark records by name. Each result is scored for similarity, including look-alike and sound-alike spellings across Latin and Persian script.
Authentication
Every request carries your API key in a header. Keep it on your server; don't put it in browser or app code.
X-API-Key: tm_your_key_here
Authorization: Bearer tm_your_key_here also works. Base URL: https://API-DOMAIN/v1. All responses are JSON in UTF-8.
Search
GET/search
| Parameter | Description |
|---|---|
q | Required. The mark to look for, 2 to 120 characters, in Latin or Persian script. |
classes | Optional. Nice classes, comma separated (e.g. 9,35). Marks in these classes are listed first and flagged same_class. |
match | similar (default): identical, sound-alike, containing and similar marks. contains: marks containing the query. exact: identical marks only. |
page, per_page | Paging. per_page defaults to 20, maximum 50. |
Example
curl -H "X-API-Key: $KEY" "https://API-DOMAIN/v1/search?q=saman&classes=30&per_page=2"
{
"query": "saman",
"classes": [30],
"match": "similar",
"total": 2,
"page": 1,
"per_page": 2,
"truncated": false,
"results": [
{
"id": "1",
"mark": "SAMAN",
"mark_alt": "سامان",
"classes": [30, 35],
"application_number": "…",
"registration_number": "…",
"publication_date": "2019-06-01",
"owner": "…",
"filing_date": "2019-04-01",
"registration_date": "2019-09-01",
"renewal_date": "2029-04-01",
"status": "Registered",
"madrid": false,
"has_image": false,
"score": 100,
"match": "identical",
"same_class": true
}
]
}
Result fields
| Field | Meaning |
|---|---|
score | Similarity from 0 to 100. |
match | Why it matched: identical, phonetic (sounds alike, also across scripts), contains, similar (close spelling) or shared word. |
same_class | true when the mark covers one of the requested classes; null when no classes were sent. |
mark, mark_alt | The mark in Latin script when recorded, otherwise in Persian; mark_alt is the other spelling, when there is one. |
status | Registered when a registration number is on record, otherwise Filed. |
publication_date | Date the mark was first published in the official gazette. |
renewal_date | Renewal date on record, when there is one. |
madrid | true for international registrations designating Iran under the Madrid system. |
truncated | true when the query was very broad and only the closest candidates were scored. Make the query more specific. |
Fields with no value on record are null. Dates are given as stored in the records.
Marks
GET/marks/{id}: one mark, with the same fields as a search result (without the scoring fields), plus goods: a list of {"class", "en", "fa"} with the goods and services for each class.
GET/marks/{id}/image: the logo image when has_image is true.
Usage
GET/usage: your requests this calendar month and your limits. Calls to /usage are not counted.
{"plan": "standard", "month": "2026-10", "requests": 1240, "monthly_quota": 10000, "rate_limit_per_minute": 60}
GET/health: returns {"ok": true}, no key needed.
Errors and limits
| Status | error | Meaning |
|---|---|---|
| 400 | query_too_short | q has fewer than 2 letters or digits. |
| 401 | invalid_api_key | Key missing, wrong or disabled. |
| 404 | not_found | No such mark, image or path. |
| 429 | rate_limited | Too many requests this minute. Retry after the Retry-After seconds. |
| 429 | quota_exceeded | Monthly quota used up. It resets on the 1st of the month. |
| 500 | server_error | Temporary problem. Retry later. |
Each search, mark and image request counts once toward your quota.
About the data
Results come from a database of Iranian trademark records compiled from official publications. It may not include the latest filings or status changes. Use the results to screen names, not as a substitute for an official register search or legal advice.