WIPO API: Search trademarks
Search WIPO Global Brand Database trademarks by brand name, registering office, status and Nice class in relevance order. Status follows the registering office's reported status; missing record details are null.
Unofficial. Not affiliated with or endorsed by WIPO.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Status optional
status Record status: active includes registered and pending; inactive includes expired and ended. For example active.
active (default)
One of
any,active,inactive.- Country optional
country Registering office as a country name or two-letter code, such as Japan, EU, or WIPO. Leave blank for all offices.
(default)
- Brand Name, required
brand_name Brand name to search, for example Nutella.
Nutella
- Max Results optional
max_results Maximum records to return, such as 25.
3
Whole number from 1 to 100. Default
25.- Product Class optional
product_class Nice class number or product words, such as 25 or clothing.
(default)
Input as JSON
{ "brand_name": "Nutella", "max_results": 3}Output
{ "trademarks": [ { "owner": "FERRERO S.p.A.", "office": "New Zealand", "status": "Registered", "classes": [ "30 — Coffee, tea, bread and confectionery" ], "mark_text": "nutella ; nutella", "expiry_date": "2034-03-26", "branddb_link": "https://branddb.wipo.int/en/similarname/brand/NZ501993000225926" , "owner_country": "Italy", "mark_image_link": null, "application_date": "1993-03-26", "registration_date": "1996-03-26", "application_number": "225926", "registration_number": "225926" }, { "owner": "FERRERO S.P.A.", "office": "Brazil", "status": "Registered", "classes": [], "mark_text": "NUTELLA", "expiry_date": "2025-11-28", "branddb_link": "https://branddb.wipo.int/en/similarname/brand/BR500000817073566" , "owner_country": "Italy", "mark_image_link": null, "application_date": "1993-02-09", "registration_date": "1995-11-28", "application_number": "817073566", "registration_number": "817073566" }, { "owner": "ش. فيريرو اس بي ايه", "office": "UAE", "status": "Registered", "classes": [ "43 — Food and drink services" ], "mark_text": "NUTELLA", "expiry_date": "2033-06-20", "branddb_link": "https://branddb.wipo.int/en/similarname/brand/AE502013000193695" , "owner_country": "Italy", "mark_image_link": null, "application_date": "2013-06-20", "registration_date": "2014-07-16", "application_number": "AE/193695" , "registration_number": "193695" } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"branddb.wipo.int/search_trademarks","input":{"brand_name":"Nutella","max_results":3}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "branddb.wipo.int/search_trademarks" , "input": { "brand_name": "Nutella", "max_results": 3 }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "branddb.wipo.int/search_trademarks" , "input": { "brand_name": "Nutella", "max_results": 3 } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run branddb.wipo.int/search_trademarks# with {"brand_name":"Nutella","max_results":3}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "brand_name" ], "properties": { "status": { "enum": [ "any", "active", "inactive" ], "type": "string", "default": "active", "description": "Record status: active includes registered and pending; inactive includes expired and ended. For example active." }, "country": { "type": "string", "default": "", "description": "Registering office as a country name or two-letter code, such as Japan, EU, or WIPO. Leave blank for all offices." }, "brand_name": { "type": "string", "description": "Brand name to search, for example Nutella." }, "max_results": { "type": "integer", "default": 25, "maximum": 100, "minimum": 1, "description": "Maximum records to return, such as 25." }, "product_class": { "type": "string", "default": "", "description": "Nice class number or product words, such as 25 or clothing." } }}Output schema
{ "type": "object", "required": [ "trademarks" ], "properties": { "trademarks": { "type": "array", "items": { "type": "object", "required": [ "mark_text", "owner", "owner_country", "office", "status", "classes", "application_date", "registration_date", "expiry_date", "mark_image_link", "branddb_link", "application_number", "registration_number" ], "properties": { "owner": { "type": [ "string", "null" ] }, "office": { "type": [ "string", "null" ] }, "status": { "type": [ "string", "null" ] }, "classes": { "type": "array", "items": { "type": "string" } }, "mark_text": { "type": [ "string", "null" ] }, "expiry_date": { "type": [ "string", "null" ] }, "branddb_link": { "type": [ "string", "null" ] }, "owner_country": { "type": [ "string", "null" ] }, "mark_image_link": { "type": [ "string", "null" ] }, "application_date": { "type": [ "string", "null" ] }, "registration_date": { "type": [ "string", "null" ] }, "application_number": { "type": [ "string", "null" ] }, "registration_number": { "type": [ "string", "null" ] } }, "additionalProperties": false } } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
branddb.wipo.int/search_trademarks- Returns
- mark text, owner, owner country, office, status, Nice classes, application/registration/expiry dates, image, record link, numbers
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method branddb.wipo.int/search_trademarks with the inputs above.
Ask your agent
- Look up active trademark registrations for the brand name "Lumora" in Nice class 3 cosmetics and show who owns each one
- Check the WIPO Global Brand Database for any expired or lapsed marks called "Vantaggio" filed in the EU
- I'm thinking of naming my clothing line "Kestrel Peak" — are there existing trademarks for that name in class 25 anywhere in the world?
- Pull up to 50 trademark records for "Sakura Bloom" registered with the Japanese office, any status, with filing and expiry dates
- On wipo.int, find pending or registered international marks for "NovaPay" covering financial services, and include the record links
See more
Finds US trademark filings matching a brand name, optionally limited to likely goods or service classes. Exact marks come first, similar marks follow; not a legal clearance opinion.
uspto.gov/search_trademarksGets the current status and prosecution history of one U.S. trademark by name, serial number or registration number. For a name, it picks the newest live matching mark (or the one matching the owner) and lists the other matches.
uspto.gov/get_trademark_statusFinds Google Patents about an invention. Optional filters: inventor, assignee, country, filing date and publication stage. Legal status is the site's estimate.
patents.google.com/search_patentsGets one public patent or published application by number, title, or Google Patents link, with claims, citations, family and classifications.
patents.google.com/get_patentSearches the UK Companies House register by company name and returns each company's status, type, incorporation date and registered office address, in result order.
find-and-update.company-information.service.gov.uk/search_companiesFinds Vivino wines matching a wine name (optionally with the winery and a vintage year), in Vivino relevance order, with ratings, vintage, origin, bottle photo and the US price when shown.
vivino.com/search_winesSearches Open Food Facts packaged foods by name, optionally filtered by diet, country where sold and brand, ordered by popularity (most scanned first).
openfoodfacts.org/search_productsFinds U.S. consumer product recalls matching a product type or brand, newest first, with hazards, remedies, incidents, sale details and photos when published.
cpsc.gov/search_recalls