# EUIPO Trademark Scraper - EU & TMview Marks, Owners, Classes (`scrapersdelight/euipo-trademark-scraper`) Actor

Scrape EU trade marks from EUIPO and 70+ offices via TMview: search by mark, owner, number, Nice class, status, type or filing date. Get status, dates, goods & services, owner and representative with address, image, oppositions. Past the 10,000-result cap. No login, no API key.

- **URL**: https://apify.com/scrapersdelight/euipo-trademark-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.80 / 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

### What does EUIPO Trademark Scraper do?

**EUIPO Trademark Scraper** exports trade marks from TMview, the search the EUIPO runs over the EU trade mark register and 70+ national and regional offices (WIPO Madrid, Benelux, Germany, France, Spain, Italy, the UK, the US, China and more). One row is one trade mark with its status, dates, Nice classes, goods & services wording, owner and representative with address, image and proceedings. Brand owners, IP firms, clearance and watch services and B2B researchers use it to search, monitor and export marks without copying pages by hand.

Also searched as: EUIPO trademark search, EUTM search, TMview scraper, EU trademark API, trademark watch.

- 🔎 **Search by mark, owner or number** - mark text with five match modes, owner/applicant names, application or registration numbers, TMview ids.
- 🎯 **TMview's own filters** - office, protected-in country, Nice class, status, mark type, Vienna code, filing and registration dates, open-to-opposition-now.
- 📄 **Full record on every row** - goods & services text, owner and representative with address (and e-mail/phone where the office publishes them), oppositions, renewals, seniority, priority, publications.
- 📚 **Past the 10,000-result cap** - one TMview search lists at most 10,000 marks; the actor splits the filing-date range and keeps going.
- ⚖️ **Clearance score** - give your own mark and classes; every row gets a similarity score, phonetic match, class overlap and a conflict band.
- 🔁 **Monitor mode** - only new marks and marks whose status or dates changed since the last run, plus an optional webhook.
- 🚫 **No login, no API key, no browser.**

### What data can you get from EUIPO and TMview?

| | | |
|---|---|---|
| 🆔 TMview id (ST13), office | 🏷️ Mark name, type, kind | 🚦 Status + the office's own status wording |
| 🔢 Application and registration numbers | 📅 Filing, registration, expiry dates | ⏳ Opposition period, open now, days left |
| 🗂️ Nice classes | 📝 Goods & services text (pick the language) | 🌍 Countries where the mark is protected |
| 🏢 Owner name, legal form, address, country | 👔 Representative name, address, country | ✉️ Representative e-mail, phone, website |
| 🖼️ Mark image + thumbnail | 🎨 Vienna codes with descriptions | 🌈 Colours claimed, mark description |
| ⚔️ Oppositions (opponent, earlier marks, grounds) | ❌ Cancellations, appeals | 🔄 Renewals, renewal-due flag |
| 📰 Bulletin publications | 🥇 Seniority and priority claims | 🔗 TMview and office record links |

### How to scrape EU trade marks with EUIPO Trademark Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) - the free plan includes monthly credit.
2. Open **EUIPO Trademark Scraper** and type one or more mark texts (or owner names, or numbers).
3. Keep **Offices** on `EM` for EU trade marks, add other offices, or empty it for all of TMview.
4. Add any filters: Nice classes, status, mark type, dates, open to opposition.
5. Click **Start** and wait for the run to finish.
6. Download the marks as JSON, CSV, Excel or HTML, or read them through the API.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to search** | | |
| `searchQueries` | array | Mark text, one search each, e.g. `"nike"`. Prefilled. |
| `matchMode` | select | `contains` (default), `exact`, `beginsWith`, `word`, `fuzzy`. |
| `applicantNames` | array | Owner names. Alone: each owner's portfolio. With mark text: only marks of these owners. |
| `applicationNumbers`, `registrationNumbers` | array | Look marks up by number, in the offices you chose. |
| `st13Ids` | array | TMview ids or TMview detail URLs, e.g. `EM500000008871915`. |
| **🎯 Filters** (applied by TMview) | | |
| `offices` | array | Office codes. Default `["EM"]` (EU trade marks); empty = all offices. |
| `territories` | array | Protected in these countries, whichever office granted the mark. |
| `niceClasses` | array | Classes 1-45. |
| `statuses` | array | `Registered`, `Filed`, `Expired`, `Ended`. |
| `markTypes` | array | `Word`, `Figurative`, `3-D`, `Sound`, `Colour`, `Position`, `Pattern`, `Motion`, ... |
| `viennaCodes` | array | Image codes, e.g. `27.05.01`. |
| `applicationDateFrom`, `applicationDateTo`, `filedInLastDays` | string / integer | Filing-date window; `filedInLastDays` moves with each scheduled run. |
| `registrationDateFrom`, `registrationDateTo` | string | Registration-date window. |
| `currentlyOpposable` | boolean | Only marks whose opposition period runs today. |
| `sortBy` | select | `relevance` (default), `newest`, `oldest`, `name`. |
| **➕ Extra data** | | |
| `includeDetails` | boolean | Full record per mark. Default on, same price. |
| `goodsServicesLanguage` | string | Language of the goods & services text. Default `en`. |
| `includeEuipoRecord` | boolean | EU marks: renewal status, basis, fast track and filing method from EUIPO's own record. |
| `referenceMark`, `referenceNiceClasses` | string / array | Your mark and classes for the clearance score. |
| **🔁 Monitoring** | | |
| `monitorMode`, `monitorKey` | boolean / string | Only new or changed marks since the last run of this search. |
| `notifyWebhookUrl` | string | POSTs the new marks (JSON with a `text` line for Slack/Discord) at the end of the run. |
| **📦 Output** | | |
| `maxResults` | integer | Marks per run. Default 100, prefill 10; 0 = no limit. |
| `maxResultsPerSearch` | integer | Cap per mark text or owner. 0 = none. |
| `compact` | boolean | Flat core fields only, for spreadsheets and AI tools. |
| **⚙️ Advanced** | | |
| `maxConcurrency` | integer | Full records read at once (1-10, default 6). |
| `proxyConfiguration` | object | Not needed. Your own proxy URLs are tried first if you add them. |

#### Input JSON

```json
{
  "searchQueries": ["nike"],
  "offices": ["EM"],
  "niceClasses": ["25"],
  "statuses": ["Registered", "Filed"],
  "maxResults": 100
}
```

#### Pick the match mode before anything else

`contains` finds the text anywhere in a mark (252 EU marks for "nike", including SYMPHONIKER). `word` keeps whole words (84), `beginsWith` the start of the mark (105), `exact` the whole mark (37). `fuzzy` adds near spellings (2,558) and suits clearance searches together with `referenceMark`.

#### Watch new filings with a schedule

Leave the mark text empty, set `offices` to `["EM"]`, `filedInLastDays` to `7`, `sortBy` to `newest`, add Nice classes, and switch on `monitorMode`. Each scheduled run delivers only marks it has not delivered before (and marks whose status, registration or expiry date changed).

#### Use owner names for portfolios

`applicantNames: ["Nike Innovate"]` with `offices: ["EM"]` returns the owner's 425 EU marks. TMview matches owner names loosely, so check `applicantName` on the rows when two companies share a word.

### ⬆️ Output

One item per trade mark. A real row from a test run (EU mark, excerpt):

```json
{
  "st13": "EM500000014688791",
  "markName": "APPLE PENCIL",
  "office": "EM",
  "markType": "Word",
  "status": "Registered",
  "applicationNumber": "014688791",
  "applicationDate": "2015-10-19",
  "registrationDate": "2016-02-26",
  "expiryDate": "2035-10-19",
  "niceClasses": [9],
  "goodsServicesText": "9: Input devices for computers and handheld mobile digital electronic devices.",
  "applicantName": "Apple Inc.",
  "applicantCountry": "US",
  "applicantAddress": "One Apple Park Way",
  "applicantCity": "Cupertino",
  "representativeName": "Shoosmiths Europe LLP",
  "representativeCountry": "BE",
  "representativeEmail": "brusselstm@shoosmiths.com",
  "representativePhone": "+32478191990",
  "oppositionCount": 0,
  "lifecycleStage": "registered",
  "daysUntilExpiry": 3289,
  "tmviewUrl": "https://www.tmdn.org/tmview/#/tmview/detail/EM500000014688791"
}
```

The full row also carries `applicants[]` and `representatives[]` (every party with address, legal form and contacts), `goodsAndServices[]` per class, `oppositions[]`, `cancellations[]`, `appeals[]`, `renewals[]`, `publications[]`, `seniorities[]`, `priorities[]`, `viennaCodes[]`, `protectionTerritories[]`, `imageUrl`, `thumbnailUrl` and `officeRecordUrl`.

#### Fields and measured fill

Measured on our own test runs on 2026-10-16/17: **A** = 100 EU marks for "apple"; **B** = 100 marks for "apple" across 10 offices (EM, WO, BX, DE, FR, ES, IT, GB, US, CN); **C** = 915 EU marks filed 1-10 September 2026 with their full record (from a 1,000-mark run; almost all still pending).

| Field | Meaning | A | B | C |
|---|---|---|---|---|
| `markName`, `status`, `applicationNumber`, `applicationDate`, `niceClasses` | Core identity | 100% | 99-100% | 97-100% |
| `statusDetail` | The office's own status wording | 100% | 81% | 100% |
| `registrationNumber` / `registrationDate` / `expiryDate` | Registration data (not yet on pending marks) | 94% / 86% / 86% | 91% / 86% / 73% | 0% (pending) |
| `oppositionPeriodEnd` | End of the opposition window | 96% | 13% | 72% |
| `goodsServicesText` | Goods & services wording | 100% | 99% | 100% |
| `applicantName` / `applicantAddress` / `applicantCountry` | Owner | 100% / 83% / 83% | 100% / 81% / 37% | 100% / 100% / 100% |
| `representativeName` / `representativeAddress` | Representative | 90% / 90% | 71% / 16% | 80% / 80% |
| `representativeEmail` / `representativePhone` / `representativeWebsite` | Representative contacts, as published | 45% / 44% / 39% | 2% / 2% / 2% | 26% / 25% / 6% |
| `imageUrl` | Mark image (figurative marks) | 27% | 73% | 41% |
| `publications` / `oppositions` / `renewals` | Proceedings | 98% / 26% / 58% | 64% / 1% / 11% | 72% / 0% / 0% |
| `protectionTerritories` | Where the mark is protected | 100% | 100% | 100% |

Owner e-mail and phone are rare: TMview carries them for a few offices only (3 of 283 records across 27 offices in our test set, from India and Mexico; none of them EU marks). Mark descriptions, colours claimed, disclaimers, seniority and priority claims appear where the office records them.

### Use cases

- ⚖️ **Trade mark clearance** - search a proposed name with `fuzzy`, your classes and `referenceMark`, then review the `high` and `medium` conflict bands first.
- 👀 **Watch services** - a weekly monitor on new EU filings in your client's classes, with `currentlyOpposable` to catch marks you can still oppose.
- 🏢 **Portfolio audits** - an owner's marks with expiry dates and `renewalDueSoon` for renewal planning.
- 🧑‍💼 **IP firm business development** - new filings with the owner and their representative (or the lack of one).
- 📈 **Market research** - filing volumes by class, owner country or office over a date range.
- 🤝 **Due diligence** - a target company's marks, oppositions and cancellations before a deal.

### How much does it cost to scrape EUIPO trade marks?

Pay per result, no start fee: **$0.0018 per trade mark** ($1.80 per 1,000), full record included. You pay only for marks saved to your dataset; an empty search costs nothing.

| Run | Marks | Cost |
|---|---|---|
| Demo (prefill) | 10 | $0.018 |
| Typical search | 100 | $0.18 |
| Deep pull | 1,000 | $1.80 |
| Every EU filing of one quarter | ~37,000 | ~$67 |

Apify's free plan monthly credit ($5) covers about 2,700 marks.

### Integrations, API, scheduling & MCP

- **Schedules** - run a search daily or weekly from the Schedules tab; pair it with monitor mode and `filedInLastDays`.
- **Webhooks** - Apify's run webhooks, or `notifyWebhookUrl` for a Slack/Discord-ready list of the new marks.
- **Make, Zapier, n8n, Google Sheets, Slack** - through Apify's integrations.
- **API** - start runs and read results with the [Python](https://docs.apify.com/api/client/python) or [JavaScript](https://docs.apify.com/api/client/js) client.
- **MCP** - add the actor to Claude, Cursor or another MCP client from the actor's MCP tab.

### More register and company scrapers

- 🇺🇸 [USPTO Trademark Scraper](https://apify.com/topapi/uspto-trademark-scraper) - US trade marks with TSDR details and a new-filings monitor.
- 🇫🇷 [Sirene French Company Scraper](https://apify.com/scrapersdelight/sirene-company-scraper) - SIREN, NAF code and directors for French owners.
- 🇬🇧 [UK New Company Leads - Companies House](https://apify.com/scrapersdelight/companies-house-incorporations-scraper) - new UK companies every day.
- 🇳🇱 [Dutch KvK & BTW Website Scraper](https://apify.com/scrapersdelight/nl-kvk-website-contact-scraper) - Dutch company data and contacts.
- 🇳🇴 [Norway Company Contacts Scraper](https://apify.com/scrapersdelight/brreg-enhetsregisteret-contacts-scraper) - Brreg companies with contacts.

See [all our scrapers](https://apify.com/scrapersdelight).

### Limits & empty runs

- One TMview search lists up to 10,000 marks. Above that the actor reads filing-date windows of under 10,000 each (37,317 EU marks filed in Q1 2025 = 5 windows; a 10,500-mark test returned 10,500 unique marks). Marks with no filing date cannot be reached that way; RUN_SUMMARY counts them.
- Some offices publish no detail record in TMview (Italy's answered an error on every mark in our test): those rows keep the search fields and say `detailsFetched: false`.
- If TMview refuses the direct connection, the run moves to a proxy on its own. On the residential proxy each full record is read up to its recordals block (`detailsPartial: true`: renewals, cancellations, appeals are then `null`, and goods & services come in the filing language).
- An empty search (TMview lists 0 marks) ends with a clear message and costs nothing. RUN_SUMMARY keeps marks not found, records without detail and unreachable requests apart.

### ❓ FAQ

#### How much does EUIPO Trademark Scraper cost?

$0.0018 per trade mark with the full record, no start fee. 1,000 marks cost $1.80.

#### How many trade marks can EUIPO Trademark Scraper return?

As many as TMview lists for the search. Past TMview's 10,000-result cap the actor splits the filing-date range, so a whole quarter of EU filings is one run.

#### Does EUIPO Trademark Scraper cover national offices, not only EU trade marks?

Yes. Empty the `offices` list for all 70+ TMview offices, or list the codes you want (WO, BX, DE, FR, ES, IT, GB, US, CN...). `territories` finds marks protected in a country whichever office granted them.

#### Can EUIPO Trademark Scraper watch for new trade mark filings?

Yes. Schedule it with `filedInLastDays` and `monitorMode`; each run delivers only new marks and marks whose status or dates changed, and `notifyWebhookUrl` can post them to Slack or Discord.

#### How does the clearance score in EUIPO Trademark Scraper work?

Give `referenceMark` (and optionally `referenceNiceClasses`). Each row gets `similarityScore` (letters, words, sound and containment), `phoneticMatch`, `classOverlap` and a `conflictBand`. It is a screening aid to sort a result list, not an examiner's opinion.

#### Does EUIPO Trademark Scraper give the owner's contact details?

It gives what the office publishes: owner name, legal form and address on most records, and the representative's address, e-mail, phone and website where listed (44-45% of EU marks in our "apple" test had a representative e-mail and phone).

#### Do I need an EUIPO account or API key for EUIPO Trademark Scraper?

No. It reads TMview's public search with no login and no key.

#### Can I use EUIPO Trademark Scraper with the Apify API or an MCP server?

Yes - start runs through the API clients, schedules or integrations, or connect the actor to an MCP client from its MCP tab.

#### Why did my EUIPO Trademark Scraper run return no results?

TMview lists no marks for that search and filters (check `offices`: the default is EU trade marks only). The status message and RUN_SUMMARY say so, and nothing is charged.

#### Your feedback

Found a bug or missing a field? Open an issue on the Issues tab and we will look at it.

# Actor input Schema

## `searchQueries` (type: `array`):

Words of the mark, one search each, e.g. "nike", "blue ocean". Leave empty to search by owner, number or filters only.

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

How the mark text is matched. Contains is the widest, Exact the narrowest; Fuzzy also finds near spellings for clearance checks.

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

Owner or applicant names, e.g. "Nike Innovate". Alone: one search per owner (their portfolio). With mark text: keeps only marks of these owners.

## `applicationNumbers` (type: `array`):

Look marks up by application number, e.g. "018000000" (EU) - searched in the offices below.

## `registrationNumbers` (type: `array`):

Look marks up by registration number, e.g. "006655302".

## `st13Ids` (type: `array`):

TMview's own mark ids or detail URLs, e.g. "EM500000008871915" or https://www.tmdn.org/tmview/#/tmview/detail/EM500000008871915.

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

Two-letter office codes: EM = EUIPO (EU trade marks), WO = WIPO Madrid, BX = Benelux, plus national offices such as DE, FR, ES, IT, GB, US, CH, CN. Empty = all 70+ offices.

## `territories` (type: `array`):

Keep marks in force in these countries (two-letter codes), whichever office granted them - e.g. DE catches German, EU and Madrid marks covering Germany.

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

Goods & services classes 1-45, e.g. 25 (clothing), 9 (software), 35 (retail). A mark matches when it covers any of them.

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

TMview's status groups. Empty = all. Registered + Filed are the live marks.

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

Kind of mark, e.g. word marks only. Empty = all.

## `viennaCodes` (type: `array`):

Image classification codes of figurative marks, e.g. 03.01.08 (lions) or 27.05.01 (stylised letters).

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

Application (filing) date from, YYYY-MM-DD, e.g. 2026-01-01.

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

Application (filing) date to, YYYY-MM-DD (inclusive).

## `filedInLastDays` (type: `integer`):

Only marks filed in the last N days, counted from each run - pairs with a daily or weekly schedule. 0 = off.

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

Registration date from, YYYY-MM-DD.

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

Registration date to, YYYY-MM-DD (inclusive).

## `currentlyOpposable` (type: `boolean`):

Only marks whose opposition period is running today - the window to oppose a competitor's filing.

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

Order of the results. Newest first suits monitors.

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

Read each mark's full record: goods & services text, owner and representative with address (and e-mail/phone where the office publishes them), oppositions, renewals, seniority, priority, publications. Same price per row.

## `goodsServicesLanguage` (type: `string`):

Two-letter language for the goods & services wording, e.g. en, de, fr. EU marks carry all 23 EU languages; otherwise English, then the filing language.

## `includeEuipoRecord` (type: `boolean`):

For EU trade marks also read EUIPO's own eSearch record: renewal status, basis, fast-track flag and filing method. One extra request per EU mark.

## `referenceMark` (type: `string`):

A mark you want to clear, e.g. "NIKO". Every row gets a similarity score, phonetic match, class overlap and a conflict band (high / medium / low / none).

## `referenceNiceClasses` (type: `array`):

Classes you intend to use your mark in, e.g. 25, 35. Rows in other classes score lower.

## `monitorMode` (type: `boolean`):

Deliver only marks this search has not delivered before, plus marks whose status, registration or expiry date changed (changeType says which). Unchanged marks are skipped and not charged.

## `monitorKey` (type: `string`):

Optional name for the monitor's memory, e.g. "competitor-filings". Empty = one memory per distinct search.

## `notifyWebhookUrl` (type: `string`):

Optional. At the end of a run with results, POSTs JSON {text, runId, marks\[]} (first 100 marks) - Slack and Discord incoming webhooks read the text.

## `maxResults` (type: `integer`):

Most marks to deliver in the run. One TMview search lists up to 10,000; above that the actor splits the filing-date range to go further. 0 = no limit.

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

Cap for each mark text / owner search. 0 = no per-search cap.

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

Flat core fields only (no nested owner, representative and proceedings lists) - for spreadsheets and AI tools.

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

Full records read at once.

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

TMview answers a direct connection, so none is needed. If TMview refuses the connection the actor moves on its own to Apify's datacenter and then residential proxy. Your own proxy URLs are tried first.

## Actor input object example

```json
{
  "searchQueries": [
    "nike"
  ],
  "matchMode": "contains",
  "offices": [
    "EM"
  ],
  "currentlyOpposable": false,
  "sortBy": "relevance",
  "includeDetails": true,
  "goodsServicesLanguage": "en",
  "includeEuipoRecord": false,
  "monitorMode": false,
  "maxResults": 10,
  "maxResultsPerSearch": 0,
  "compact": false,
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One item per trade mark: office, status, dates, Nice classes, goods & services, owner and representative, image, oppositions and links.

## `summary` (type: `string`):

Per-search TMview totals, marks delivered / duplicate / unchanged, full records read, lookups not found, date windows and the network route used.

# 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 = {
    "searchQueries": [
        "nike"
    ],
    "offices": [
        "EM"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/euipo-trademark-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 = {
    "searchQueries": ["nike"],
    "offices": ["EM"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/euipo-trademark-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 '{
  "searchQueries": [
    "nike"
  ],
  "offices": [
    "EM"
  ],
  "maxResults": 10
}' |
apify call scrapersdelight/euipo-trademark-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/euipo-trademark-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/9RCz0GX7CdgWatQWI/builds/qNeNRq0qCcSa2m9Vj/openapi.json
