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.

GET/search

ParameterDescription
qRequired. The mark to look for, 2 to 120 characters, in Latin or Persian script.
classesOptional. Nice classes, comma separated (e.g. 9,35). Marks in these classes are listed first and flagged same_class.
matchsimilar (default): identical, sound-alike, containing and similar marks. contains: marks containing the query. exact: identical marks only.
page, per_pagePaging. 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

FieldMeaning
scoreSimilarity from 0 to 100.
matchWhy it matched: identical, phonetic (sounds alike, also across scripts), contains, similar (close spelling) or shared word.
same_classtrue when the mark covers one of the requested classes; null when no classes were sent.
mark, mark_altThe mark in Latin script when recorded, otherwise in Persian; mark_alt is the other spelling, when there is one.
statusRegistered when a registration number is on record, otherwise Filed.
publication_dateDate the mark was first published in the official gazette.
renewal_dateRenewal date on record, when there is one.
madridtrue for international registrations designating Iran under the Madrid system.
truncatedtrue 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

StatuserrorMeaning
400query_too_shortq has fewer than 2 letters or digits.
401invalid_api_keyKey missing, wrong or disabled.
404not_foundNo such mark, image or path.
429rate_limitedToo many requests this minute. Retry after the Retry-After seconds.
429quota_exceededMonthly quota used up. It resets on the 1st of the month.
500server_errorTemporary 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.