# TMview Trademark Search & Watch (`trev0n/tmview-scraper`) Actor

Search 140M+ trade marks from the EUIPO, WIPO, USPTO and ~80 national offices via TMview: name, owner, Nice classes, status, dates, goods & services, oppositions. Watch mode alerts you to new conflicting filings and their opposition deadline.

- **URL**: https://apify.com/trev0n/tmview-scraper.md
- **Developed by:** [Paweł](https://apify.com/trev0n) (community)
- **Categories:** Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 trade marks

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ™️ TMview Trademark Search & Watch

🎯 **Search 140+ million trade marks from the EUIPO, WIPO, USPTO and ~80 national offices in one run, and get alerted the moment someone files a mark that looks like yours.**

Get each mark's name, office, application and registration numbers, status, type, Nice classes, owner, filing, registration and expiry dates, opposition window and image. Optionally add the full goods and services wording, applicants, representatives, oppositions and publications. Covers the EU trade mark, international (Madrid) registrations, the United States, the UK, every EU member state, China, Japan, Korea, Brazil, Mexico, India, Australia, Canada and many more.

### 🚀 What Does It Do?

This scraper searches TMview, the trade mark database run by the EU Intellectual Property Office together with ~80 national and regional offices. You get **structured, ready-to-use data** without clicking through search pages. Type a brand name or pick your filters, and hit Start.

💡 **Three ways to use it:**

1. **🔍 Clearance search**: check a name against every register before you launch a brand, with exact, contains, word or fuzzy matching.
2. **👀 Trade mark watch**: schedule it daily or weekly with Watch mode. Each run returns only the **new or changed** marks, such as a fresh conflicting filing, a status change, a registration or a renewal. Alerts can go to Slack, Discord, Telegram or any webhook, and each alert includes the opposition deadline.
3. **📋 Portfolio and market monitoring**: pull every mark an owner holds (e.g. `Apple Inc.`), or every new filing in a class and office. For example, all EU clothing filings (class 25) from the last 30 days.

### 👥 Who Is This For?

| 🏢 Use Case | 💬 How It Helps |
| --- | --- |
| ⚖️ **IP law firms & trade mark attorneys** | Run watch services for clients across 80 offices and catch conflicting filings while the opposition window is still open |
| 🏷️ **Brand owners** | Get a weekly alert when someone files a look-alike of your brand in your classes |
| 🚀 **Founders & naming agencies** | Clear a new product name against the EU, US, UK and international registers in minutes |
| 📊 **Market & competitive intelligence** | Track which companies file what, where and in which product classes, and spot launches before they happen |
| 🤝 **IP service providers & lead generators** | Find every new applicant in a class or country and offer renewal, opposition or enforcement services |
| 🧠 **Data & AI teams** | Build trade mark datasets for brand-similarity models, analytics and compliance tools |

### ✨ Features

- 🌍 **~80 offices in one search**: EUIPO, WIPO, USPTO, UKIPO, DPMA, INPI, the Polish, Spanish and Italian offices, China, Japan, Korea, Brazil, India and more
- 🔤 **Six ways to match a name**: contains, whole word, begins with, ends with, exact, and fuzzy for similar spellings (adidas ↔ adidaz)
- 🎛️ **Precise filters**: office, Nice class, status, mark type, owner, filing and registration dates, and "open to opposition right now"
- 👀 **Watch mode**: returns only marks that are new or changed since the last run, so daily monitoring stays cheap
- ⏰ **Opposition deadlines**: every mark shows its opposition window and whether you can still oppose today
- 🔔 **Instant alerts**: Slack, Discord, Telegram or your own webhook
- 📄 **Full details on demand**: goods and services wording, applicants with country and city, representatives, oppositions with the earlier mark, publications, priorities and the link to the office's own record
- 🖼️ **Mark images**: image and thumbnail links for figurative and combined marks
- 🔓 **Beyond the 10 000 limit**: big searches are split automatically by office, filing date and class, so you get all of them
- 🔗 **Paste TMview links**: trade mark pages or whole search-result pages work as input
- ⚡ **Fast & Scalable**: from a single clearance check to tens of thousands of marks per run
- 🧹 **Deduplication**: each mark appears once, along with the names that matched it
- 📤 **Export Anywhere**: download results as JSON, CSV or Excel, or push them to Google Sheets, Zapier, Make or your CRM

### 🎛️ Filters & Options

| Option | What It Does |
| --- | --- |
| 🔍 **Trade mark names** | One search per name; leave empty to search by filters alone |
| 🔤 **How names match** | Contains, Word, Begins with, Ends with, Exact or Fuzzy |
| 🌍 **Trade mark offices** | Choose any of the ~80 registers (EM = EU, WO = international); empty = all |
| 🗂️ **Nice classes** | Only marks covering these classes (1–45), e.g. 25 clothing, 9 software |
| 🚦 **Status** | Active, filed, registered, inactive, ended or expired |
| 🎨 **Mark type** | Word, figurative, combined, 3-D, colour, sound, position and more |
| 🏢 **Applicant / owner** | A whole portfolio in one run |
| 📅 **Filed from / until** | Filing date range, or a window such as `30 days` |
| 📅 **Registered from / until** | Registration date range |
| ⚔️ **Only marks open to opposition** | Applications you can still oppose today |
| ↕️ **Order** | Newest filings first, oldest, relevance or name |
| 🔗 **TMview links** | Trade mark pages or search-result pages from TMview |
| 🔢 **Max marks per search** | Limit per search; 0 = all of them |
| 📄 **Include full details** | Add goods and services, applicants, representatives, oppositions and more |
| 👀 **Watch mode** | Return only new or changed marks on each run |
| 🔔 **Alerts** | Webhook, Slack, Discord or Telegram |
| 🧰 **Compact output** | Only the key fields |

### 📦 What You Get (Output Fields)

Every trade mark includes:

#### Mark

| Field | Example |
| --- | --- |
| st13 | `EM500000019432151` |
| trademarkName | `COSMOSIS` |
| markType | `Word` |
| status | `Filed` |
| niceClasses | `[3]` |
| imageUrl | `https://www.tmdn.org/tmview/api/trademark/image/EM500000019437404` |
| thumbnailUrl | `https://www.tmdn.org/tmview/api/trademark/thumbnail/EM500000019437404` |
| url | `https://www.tmdn.org/tmview/#/tmview/detail/EM500000019432151` |

#### Register

| Field | Example |
| --- | --- |
| office | `EM` |
| officeName | `European Union (EUIPO)` |
| applicationNumber | `019432151` |
| registrationNumber | `019432151` |
| protectedTerritories | `["DE", "FR", "PL", "IT", "ES"]` |
| officeRecordUrl | `https://euipo.europa.eu/eSearch/#details/trademarks/019432151` |

#### Dates & opposition

| Field | Example |
| --- | --- |
| applicationDate | `2026-10-06` |
| registrationDate | `2027-02-14` |
| expiryDate | `2036-10-06` |
| oppositionPeriodStart | `2026-10-27` |
| oppositionPeriodEnd | `2027-01-27` |
| inOppositionPeriod | `true` |

#### Owner

| Field | Example |
| --- | --- |
| applicantNames | `["FLVIDO FRAGRANCES L.L.C"]` |
| applicants | `[{"name": "FLVIDO FRAGRANCES L.L.C", "country": "AE", "city": "Dubai"}]` |
| representatives | `[{"name": "Abion AB", "country": "SE", "city": "Göteborg"}]` |

#### Full details (optional)

| Field | Example |
| --- | --- |
| goodsAndServices | `[{"niceClass": 3, "terms": "Perfumes; fragrances; toiletries; …"}]` |
| markKind | `Individual` |
| statusDate | `2026-10-06` |
| oppositions | `[{"status": "Withdrawn", "earlierMark": "KOSMOS", "opponents": ["Franckh-Kosmos Verlags-GmbH"]}]` |
| publications | `[{"id": "2026/198", "section": "A.1", "date": "2026-10-27"}]` |
| events | `[{"date": "2026-10-06", "description": "New application entered"}]` |

#### Watch mode

| Field | Example |
| --- | --- |
| changeType | `NEW` |
| firstSeenAt | `2026-10-19T06:00:00.000Z` |
| matchedSearches | `["cosmos"]` |

### 📊 Example Output

```json
{
    "st13": "EM500000019432151",
    "trademarkName": "COSMOSIS",
    "office": "EM",
    "officeName": "European Union (EUIPO)",
    "applicationNumber": "019432151",
    "registrationNumber": null,
    "status": "Filed",
    "markType": "Word",
    "niceClasses": [3],
    "applicantNames": ["FLVIDO FRAGRANCES L.L.C"],
    "applicationDate": "2026-10-06",
    "registrationDate": null,
    "expiryDate": null,
    "oppositionPeriodStart": null,
    "oppositionPeriodEnd": null,
    "oppositionDeadline": null,
    "protectedTerritories": ["DE", "BE", "FI", "PT", "FR", "PL", "IT", "ES", "AT", "NL"],
    "seniorityClaimed": null,
    "imageUrl": null,
    "thumbnailUrl": null,
    "url": "https://www.tmdn.org/tmview/#/tmview/detail/EM500000019432151",
    "officeRecordUrl": "https://euipo.europa.eu/eSearch/#details/trademarks/019432151",
    "inOppositionPeriod": null,
    "matchedSearches": ["cosmos"],
    "markKind": "Individual",
    "statusDate": "2026-10-06",
    "applicationLanguage": "en",
    "secondLanguage": "it",
    "goodsAndServices": [
        {
            "niceClass": 3,
            "terms": "Perfumes; fragrances; toiletries; natural oils for perfumes and scents; eau de parfum; aftershave lotions."
        }
    ],
    "goodsAndServicesLanguage": "EN",
    "applicants": [
        {
            "name": "FLVIDO FRAGRANCES L.L.C",
            "isLegalEntity": true,
            "legalForm": "Legal Entity",
            "country": "AE",
            "city": "Dubai",
            "address": "Office F17-2, Al Ghurair Real Estate Building, Al Muteena, Deira",
            "postcode": null,
            "state": null
        }
    ],
    "representatives": [
        { "name": "Abion AB", "isLegalEntity": true, "legalForm": "Legal Person", "country": "SE", "city": "Göteborg" }
    ],
    "oppositions": [],
    "publications": [],
    "events": [],
    "officeDataUpdatedAt": "2026-10-19",
    "detailScraped": true,
    "scrapedAt": "2026-10-19T10:55:16.950Z"
}
```

### 📋 Dataset Views

The Apify Console gives you **3 ready-made table views** to quickly browse your results:

| View | What It Shows |
| --- | --- |
| 📊 **Trade marks** | Image, name, office, status, type, classes, owner, key dates, opposition deadline and link |
| 📄 **Details** | Numbers, status date, goods and services, applicants, representatives, oppositions and office link |
| 👀 **Watch changes** | What changed (NEW / UPDATED), when it was first seen and which of your names it matched |

### ❓ FAQ

**🤔 How do I set up a trade mark watch?**
Add your brand names, choose **Fuzzy** matching, pick the offices and Nice classes you care about, and turn on **Watch mode**. Then schedule the task weekly. The first run saves today's picture, and every later run returns only new filings or changes. Each one comes with its opposition deadline.

**🤔 Which countries are covered?**
About 80 registers: the EU trade mark (EUIPO), international Madrid registrations (WIPO), every EU member state, the UK, Switzerland, Norway, the United States, Canada, Mexico, Brazil, Argentina, China, Japan, South Korea, India, Australia, New Zealand, Türkiye and many more.

**🤔 Can I get more than 10 000 marks?**
Yes. Set **Max marks per search** to 0 and big searches are split automatically by office, filing date and class, so nothing is cut off.

**🤔 Can I find marks that look like mine but are spelled differently?**
Yes. **Fuzzy** matching finds similar spellings, and **Contains** finds your name inside longer marks.

**🤔 Can I export the data?**
Yes. Export as JSON, CSV, Excel, XML, HTML or RSS, or push the data directly to Google Sheets, Zapier, Make or any webhook/API endpoint.

**🤔 How often should I run this?**
For a watch, weekly is the usual rhythm, because opposition periods last one to three months. Daily works too. You can schedule automatic runs on Apify with a few clicks.

**🤔 Does it work with proxies?**
No proxy is needed: the scraper keeps a polite pace that the register accepts, and switches to Apify Proxy on its own if requests ever get refused.

### 🛠️ Need Custom Filters or Features?

**I'm happy to customize this scraper for your specific needs!** 🤝

Whether you need:

- 🎯 Additional filters (Vienna figurative codes, designated territories, image similarity, specific goods and services terms)
- 📊 Extra data fields or custom output formats, such as watch reports ready to send to clients
- 🔄 Integration with your CRM, docketing system, Google Sheets or database
- ⏰ Scheduled watches with automatic deduplication and client-ready alerts
- 🌐 Scraping design registers (DesignView) or other IP databases alongside TMview

👉 **Don't hesitate to reach out via private message.** I respond quickly and I'm always open to building exactly what you need. No request is too small or too specific!

### ⚖️ Legal & Ethical Use

This scraper collects **only publicly available register information** from TMview. It does not log in or bypass any access control. For applicants who are private individuals, it keeps only the name, country and city, never the street address. TMview is not an official register and its information has no legal effect, so always confirm critical decisions with the office's own record. Please use the data responsibly and in compliance with applicable laws.

# Actor input Schema

## `searchTerms` (type: `array`):

Names to search for, one search each (e.g. <code>nike</code>, <code>coca cola</code>). Leave empty to search by the filters alone — for example every new EU filing in class 25 this month.

## `matchMode` (type: `string`):

<b>Contains</b> finds the name anywhere in the mark, <b>Word</b> as a whole word, <b>Exact</b> only identical marks, <b>Fuzzy</b> similar spellings (adidas ↔ adidaz) — the one to use for a trade mark watch.

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

Registers to search. Empty = all ~80 offices. <b>EM</b> is the EU trade mark (EUIPO), <b>WO</b> the international (Madrid) registrations.

## `niceClasses` (type: `array`):

Only marks covering at least one of these classes (1–45), e.g. <code>25</code> clothing, <code>9</code> software and electronics, <code>35</code> retail and advertising.

## `statuses` (type: `array`):

Only marks in these states. Empty = any.

## `markTypes` (type: `array`):

Only marks of these kinds. Empty = any.

## `applicantNames` (type: `array`):

Only marks filed by these owners, e.g. <code>Apple Inc.</code> — a whole portfolio in one run.

## `applicationDateFrom` (type: `string`):

Application date from: <code>YYYY-MM-DD</code> or a window such as <code>30 days</code>, <code>6 months</code>.

## `applicationDateTo` (type: `string`):

Application date until (<code>YYYY-MM-DD</code>).

## `registrationDateFrom` (type: `string`):

Registration date from (<code>YYYY-MM-DD</code> or a window).

## `registrationDateTo` (type: `string`):

Registration date until (<code>YYYY-MM-DD</code>).

## `onlyOpposable` (type: `boolean`):

Only applications whose opposition period is running now — the ones you can still oppose.

## `sortBy` (type: `string`):

Order of the results (and which ones come first when a limit applies).

## `startUrls` (type: `array`):

Trade mark pages (<code>https://www.tmdn.org/tmview/#/tmview/detail/EM500000018858936</code>) or search-result pages copied from TMview.

## `maxResultsPerSearch` (type: `integer`):

Stop each search after this many marks. 0 = all of them (searches over 10 000 marks are split automatically).

## `includeDetails` (type: `boolean`):

Also read each mark's page: goods and services wording, applicants with country and city, representatives, oppositions, publications, expiry and office link. Charged as an extra event per mark.

## `splitLargeSearches` (type: `boolean`):

TMview returns at most 10 000 marks per search. When on, bigger searches are split by office, filing date and class so you get all of them.

## `incrementalMode` (type: `boolean`):

Remember what earlier runs found and emit only marks that are new or changed (status, owner, registration, renewal). Schedule it daily or weekly for a trade mark watch.

## `stateKey` (type: `string`):

Name of the watch memory. Leave empty to derive it from the search; set it to keep one memory while you tweak filters.

## `emitUnchanged` (type: `boolean`):

In watch mode, output every mark, tagged NEW / UPDATED / UNCHANGED.

## `emitExpired` (type: `boolean`):

In watch mode, output marks found before but not in this run (e.g. no longer matching a status filter).

## `webhookUrl` (type: `string`):

POST the new and changed marks to this URL as JSON.

## `telegramBotToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel to post to.

## `discordWebhookUrl` (type: `string`):

Post alerts to a Discord channel.

## `slackWebhookUrl` (type: `string`):

Post alerts to a Slack channel.

## `notifyOnlyChanges` (type: `boolean`):

Skip the alert when the run found nothing new.

## `notificationLimit` (type: `integer`):

How many marks one alert lists.

## `includeRunSummary` (type: `boolean`):

Include the counts in the webhook payload.

## `compact` (type: `boolean`):

Only the key fields (name, office, status, classes, owner, dates, link). Details are not read in this mode.

## `excludeEmptyFields` (type: `boolean`):

Leave out fields with no value.

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

How many searches run side by side. Requests stay at a polite pace either way, which TMview needs.

## `proxyFallback` (type: `boolean`):

If TMview starts refusing requests, continue the run through Apify Proxy.

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

Not needed — runs work best without a proxy. Only turn it on if your runs get refused.

## Actor input object example

```json
{
  "searchTerms": [
    "cosmos"
  ],
  "matchMode": "contains",
  "offices": [
    "EM",
    "WO"
  ],
  "onlyOpposable": false,
  "sortBy": "newest",
  "maxResultsPerSearch": 100,
  "includeDetails": false,
  "splitLargeSearches": true,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notifyOnlyChanges": true,
  "notificationLimit": 10,
  "includeRunSummary": true,
  "compact": false,
  "excludeEmptyFields": false,
  "maxConcurrency": 3,
  "proxyFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `details` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# 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 = {
    "searchTerms": [
        "cosmos"
    ],
    "offices": [
        "EM",
        "WO"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("trev0n/tmview-scraper").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 = {
    "searchTerms": ["cosmos"],
    "offices": [
        "EM",
        "WO",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("trev0n/tmview-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "cosmos"
  ],
  "offices": [
    "EM",
    "WO"
  ]
}' |
apify call trev0n/tmview-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,trev0n/tmview-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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