# Trademark Search — USPTO, EUIPO, WIPO & Selected TMview Offices (`zinin/trademark-multiregistry`) Actor

Search a brand name across selected TMview office codes such as USPTO, EUIPO and WIPO/Madrid — registration status, Nice classes, applicant and filing dates from the official TMview feed. No API key or login; Apify Proxy is required on the platform.

- **URL**: https://apify.com/zinin/trademark-multiregistry.md
- **Developed by:** [Tim Zinin](https://apify.com/zinin) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Trademark Search — USPTO, EUIPO, WIPO & Selected TMview Offices

Check whether a brand name is already trademarked, and where. This Actor searches the TMview offices you select — for example USPTO, EUIPO, WIPO/Madrid, UKIPO, DPMA, Rospatent and TÜRKPATENT — pulling registration status, Nice classification, applicant and filing dates from the official EUIPO/TMDN aggregator. It does not claim a fixed worldwide office count: TMview participation changes, and this Actor queries only the office codes supplied in the run.

### What you get

- **One name, selected offices, one call.** Pass a brand name once and get matching trademark records across the TMview office codes you select — no separate lookup per country registry. Each query returns up to `maxResultsPerQuery` records (default 20, max 100 per query); `totalResults` on every row tells you how many the registry actually has, so you can see when there's more than you asked for. A single run can return up to 500 billable trademark rows in total — with more queries than that allows at the requested `maxResultsPerQuery`, the per-query cap is automatically lowered so every brand you listed still gets checked.
- **Real registry data, not a guess.** Status (registered / pending / ended), Nice classes, applicant name(s), application and registration numbers, filing date, and — when the office provides one in TMview's feed — a direct link back to its own record.
- **Contains or exact match.** Search loosely (any mark containing the name) or restrict to exact name matches only.
- **Honest about zero results and cut-short scans.** A brand with no trademark hits in the offices you picked still comes back as a clear, free row — not silence and not an error. And if the source cuts a scan short mid-way (a page erroring out, or hitting the run's page-count safety cap), every row from that query is marked `partial: true` with a `partialReason` — a shortened result never gets passed off as the full picture.
- Runs on Apify: schedule it, monitor it, call it from the API or the MCP server, export to JSON/CSV/Excel, or push results straight into your own pipeline.

### How to run it

1. Click **Try for free** — no card needed on the free plan.
2. Paste brand names into **Brand / trademark names**, one per line — e.g. `nike`.
3. Pick which **Trademark offices** to search (defaults to USPTO, EUIPO and WIPO/Madrid).
4. Hit **Start** and read the results from the dataset (UI, API or webhook).

### Pricing

Pay-per-event: **$0.005 per run start + $0.01 per trademark found**. No monthly seat, no minimum.

A query with zero trademark hits is still returned — clearly marked, with the total the registry reports — and is **not** charged for. You pay only for actual trademark records delivered. Ballpark: 5 brand names averaging ~20 matches each is ~100 rows, about **$1.005** total.

### Input

| Field | Required | What it does |
|---|---|---|
| `queries` | yes | Brand/trademark names to search, one per entry. Up to 20 per run. |
| `offices` | no | TMview office codes to search — e.g. `US` (USPTO), `EM` (EUIPO), `WO` (WIPO/Madrid), `GB` (UKIPO), `DE` (DPMA), `RU` (Rospatent), `TR` (TÜRKPATENT). Defaults to `["US","EM","WO"]`. Up to 15 per run. |
| `maxResultsPerQuery` | no | Upper bound on trademark records returned per brand name, 1–100 (default 20). |
| `exactMatch` | no | `true` restricts to exact name matches; `false` (default) also returns marks containing the query. |
| `maxConcurrency` | no | How many brand names to search in parallel, 1–2 (default 2) — kept low to respect the source's rate limits. |
| `proxyConfiguration` | no | Apify Proxy settings — leave the default (`useApifyProxy: true`) on. TMview blocks connections from the Apify platform's own IP range; routing through Apify Proxy is what makes this Actor work at all when run on the platform. Uses your account's own proxy allowance. |

```json
{
    "queries": ["nike"],
    "offices": ["US", "EM", "WO"]
}
```

### Output

One dataset row per trademark found, up to `maxResultsPerQuery` per brand name — not necessarily every trademark the office has on file, see `totalResults` below. This is a real row from a real run (search: `nike`, offices `US`/`EM`/`WO`):

```json
{
    "query": "nike",
    "st13": "EM500000006655302",
    "name": "NIKE",
    "office": "EM",
    "status": "Ended",
    "niceClasses": [21],
    "applicants": ["Navipol sp. z o.o."],
    "applicationNumber": "006655302",
    "registrationNumber": "006655302",
    "applicationDate": "2008-02-08T12:00:00.000Z",
    "type": "Word",
    "protection": ["FR", "DE", "IT", "ES", "NL", "PL"],
    "officeUrl": "http://euipo.europa.eu/trademark/data/EM500000006655302",
    "found": true,
    "totalResults": 845,
    "partial": false,
    "partialReason": null,
    "checkedAt": "2026-07-28T18:41:27.584Z"
}
```

| Field | What it means |
|---|---|
| `query` | The brand name you searched for |
| `found` | `true` for a trademark row; `false` for a no-match, source-error or malformed-record row |
| `st13` | TMview's unique record ID (ST.13 standard) |
| `name` | The trademark's registered name |
| `office` | Which office holds this record (office code, e.g. `US`, `EM`, `WO`) |
| `status` | Registration status as reported by the office (e.g. `Registered`, `Pending`, `Ended`) |
| `niceClasses` | Nice Classification class number(s) the mark is registered under |
| `applicants` | Applicant/owner name(s) on file |
| `applicationNumber` / `registrationNumber` | The office's own filing and registration numbers |
| `applicationDate` | Date the application was filed |
| `type` | Mark type (e.g. `Word`, `Figurative`) |
| `protection` | Territories/countries this registration covers (relevant for regional systems like EUIPO or WIPO/Madrid) |
| `officeUrl` | Direct link to the office's own record, for legal verification — `null` when TMview's feed doesn't carry one for this record |
| `totalResults` | How many trademarks TMview reports for this query across the offices you selected — compare against how many rows you actually got |
| `partial` | `true` when this query's scan was cut short (a page failing partway through, the source unexpectedly returning an empty page while claiming more results exist, or hitting the run's page-count safety cap) before covering `totalResults` — `false` means what you got is everything the scan reached |
| `partialReason` | Why the scan was cut short, when `partial` is `true` (e.g. `"pagination stopped at page 2: http 503"` or `"source returned empty page 1 of 3"`) |
| `error` | Set when this row is a source failure or a malformed record instead of a trademark hit |
| `checkedAt` | When this Actor ran the search |

A brand with no hits in the offices you picked comes back as one free row: `{"query": "...", "found": false, "error": null, "totalResults": 0, "partial": false}`. If the registry answers with a hollow/malformed record (rare, but observed from the source), that also comes back as its own free row: `{"query": "...", "found": false, "error": "source returned malformed record", ...}` — it is never billed as a delivered trademark. And if the run's charge budget runs out before every query is checked, one final free row marks the cutoff: `{"query": null, "found": false, "error": "budget exhausted", "summary": "..."}` — raise the run's budget limit to get the remaining queries checked.

#### Related tools

Related tools for adjacent workflows in compliance and public procurement.

| Actor | What it does |
|---|---|
| [Company Registry Enricher](https://apify.com/zinin/company-registry-enricher) | Pair it in the compliance and public procurement workflow: Turn a company name, LEI or UK company number into an official registry card: legal name, status,... |
| [Litigation Check — Company Litigation History Screener](https://apify.com/zinin/litigation-check) | Pair it in the compliance and public procurement workflow: Screen a counterparty for litigation history across US federal PACER dockets, UK case law and Poland's... |
| [Counterparty Risk Rollup — Sanctions, Courts, Registry, Hiring](https://apify.com/zinin/counterparty-risk-rollup) | Pair it in the compliance and public procurement workflow: One call, one row per counterparty: sanctions screening (OFAC + EU), legal-entity registry (GLEIF),... |
| [Gov Tender Radar](https://apify.com/zinin/gov-tender-radar) | Pair it in the compliance and public procurement workflow: Search EU public-sector tenders (TED Europa) by keyword or CPV code, optionally filtered by buyer country |
| [Sanctions Screening API](https://apify.com/zinin/sanctions-screening) | Pair it in the compliance and public procurement workflow: Screen names against the live OFAC SDN and EU consolidated sanctions lists |

### FAQ

**Does it need an API key or login?** No — TMview's search API answers a plain request, no registration required.

**How current is the data?** Live at request time — the same feed TMview's own search UI reads from.

**Is this a substitute for a legal trademark clearance search?** No. It surfaces what TMview's aggregation currently shows and links to the office's own record for verification — for a legal opinion on registrability or infringement risk, consult a trademark attorney and the office's primary record directly.

**What this is NOT.** It does not file trademark applications, does not monitor for new filings over time (see our other IP-monitoring Actors below), and does not cover offices TMview itself doesn't aggregate.

Found a wrong result, or need a check we don't run? Open an issue on this Actor's page.

***

Built by [zinin](https://apify.com/zinin). Questions? Telegram [@timzinin](https://t.me/timzinin).

# Actor input Schema

## `queries` (type: `array`):

Brand or trademark names to search for, one per entry. Each name is checked across every selected office in a single call. Up to 20 per run.

## `offices` (type: `array`):

TMview office codes to search, e.g. US (USPTO), EM (EUIPO), WO (WIPO/Madrid), GB (UKIPO), DE (DPMA), RU (Rospatent), TR (TÜRKPATENT). TMview participation can change; this Actor queries only the codes you select, up to 15 per run.

## `maxResultsPerQuery` (type: `integer`):

Upper bound on how many trademark records to return for each brand name.

## `exactMatch` (type: `boolean`):

On: only trademarks whose name exactly matches the query. Off (default): trademarks containing the query are returned too.

## `maxConcurrency` (type: `integer`):

How many brand names to search in parallel. Kept low (max 2) to respect the source's rate limits.

## `proxyConfiguration` (type: `object`):

TMview (www.tmdn.org) drops connections from the Apify platform's own IP range (verified live: a request from the platform gets a connect timeout, the identical request from anywhere else gets a normal HTTP 200). Apify Proxy routes around this — leave the default on.

## Actor input object example

```json
{
  "queries": [
    "nike"
  ],
  "offices": [
    "US",
    "EM",
    "WO"
  ],
  "maxResultsPerQuery": 10,
  "exactMatch": false,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

API URL for the default dataset items produced by this run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "nike"
    ],
    "offices": [
        "US",
        "EM",
        "WO"
    ],
    "maxResultsPerQuery": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/trademark-multiregistry").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": ["nike"],
    "offices": [
        "US",
        "EM",
        "WO",
    ],
    "maxResultsPerQuery": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("zinin/trademark-multiregistry").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "nike"
  ],
  "offices": [
    "US",
    "EM",
    "WO"
  ],
  "maxResultsPerQuery": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call zinin/trademark-multiregistry --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=zinin/trademark-multiregistry",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vHij68eWZQ5QAa0gF/builds/SPRWYZZxAko7ACAXh/openapi.json
