# DPMA German Trademark Register Scraper: Bulk Search & Watchlist (`getascraper/dpma-trademark-register-scraper`) Actor

Bulk-search the DPMA German trademark register for multiple candidate marks in one run. Get status, Nice classes, opposition history, and full procedure timelines, plus a recurring watch mode reporting only new or changed marks. Built for IP clearance, not one mark at a time. From $0.00035/result.

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

## Pricing

from $0.26 / 1,000 trademark results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## ⚖️ DPMA Trademark Register Scraper: Bulk Clearance & Watch

<table width="100%"><tr><td style="padding:24px 28px;background:#EAF0F8;border:1px solid #C7D6EC;border-top:4px solid #1D4E89;border-radius:12px"><span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Clear a whole shortlist of brand names against the German trademark register in one run.</span><br><span style="font-size:15px;color:#57534E;line-height:1.6">Search DPMAregister for several candidate names at once, pull the full filing and opposition history for each match, and schedule repeat runs that report only new or changed marks.</span></td></tr></table>

<table width="100%"><tr><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D6EC;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1D4E89">🔍 Search many names at once</span><br><span style="font-size:12px;color:#57534E">One run checks your whole shortlist, not one name per run.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D6EC;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1D4E89">📄 Full procedure history</span><br><span style="font-size:12px;color:#57534E">Filing, opposition, renewal, and ownership-change events, not just a status label.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D6EC;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1D4E89">🔔 Watch mode</span><br><span style="font-size:12px;color:#57534E">Schedule it and only hear about marks that are new or changed.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D6EC;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1D4E89">🔑 No login needed</span><br><span style="font-size:12px;color:#57534E">No account, API key, or browser required to run it.</span></td></tr></table>

DPMA Trademark Register Scraper searches [register.dpma.de](https://register.dpma.de), the official online register of the German Patent and Trade Mark Office (Deutsches Patent- und Markenamt), for one or more candidate marks at a time. Clearing a shortlist of names before filing, checking whether a proposed brand is already taken before entering the German market, or keeping a running watch on new filings near your own mark all start the same way: a search against DPMA's own data, not a third-party aggregator.

### 🎯 What this Actor does

IP law firms and trademark attorneys use it to run brand clearance on several candidate names in a single pass instead of one lookup at a time. Trademark-watch and brand-protection teams use the recurring watch mode to get told only when a genuinely new or changed filing shows up near a mark they track. Companies doing Germany market-entry due diligence use it to confirm a proposed name is not already registered before committing to it.

Every field is genuine: when DPMA's own register does not publish a value for a mark, that field is left out rather than filled in with a placeholder.

### 🚀 How to use it

<table width="100%"><tr><td style="padding:16px 14px;width:33%;background:#EAF0F8;border:1px solid #C7D6EC;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1D4E89;letter-spacing:1px">STEP 1</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">List your candidate names</span><br><span style="font-size:12px;color:#57534E">Add one name or a whole shortlist, or turn on watch mode for an ongoing list.</span></td><td style="padding:16px 14px;width:33%;background:#EAF0F8;border:1px solid #C7D6EC;border-left:none;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1D4E89;letter-spacing:1px">STEP 2</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Run it</span><br><span style="font-size:12px;color:#57534E">Start the Actor directly, or trigger it from an Apify schedule for recurring checks.</span></td><td style="padding:16px 14px;width:33%;background:#EAF0F8;border:1px solid #C7D6EC;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1D4E89;letter-spacing:1px">STEP 3</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Export or connect</span><br><span style="font-size:12px;color:#57534E">Download the dataset, or turn on full detail records for the complete filing history.</span></td></tr></table>

### 🧩 Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| Search terms | array of strings | No | Mark names, applicant names, or registration numbers to search for. Add several to clear a whole shortlist in one run. |
| Register scope | enum | No | German marks only (DE), or also include EU and international marks that designate Germany. |
| Status filter (contains match) | array of strings | No | Only keep marks whose status text contains one of these snippets, for example "eingetragen" for registered marks. |
| Max results per search term | integer | No | How many matching marks to return per search term. |
| Fetch full detail record | boolean | No | Fetch each mark's own register page for dates, Nice classes, goods and services, applicant, representative, opposition window, and full procedure history. |
| Nice classes filter | string | No | Comma-separated Nice classes to keep, for example "9, 25, 42". Only applies when full detail records are on. |
| Recurring watch mode | boolean | No | Only return marks that are new or changed since the last run with the same watch state name. |
| Watch state name | string | No | Name for this run's saved watch state. Use a different name per independent watchlist. |
| Proxy configuration | object | No | Apify proxy settings. Datacenter is the default and works fine for this target. |

### 📊 Data table

| Field | Type | Description |
| --- | --- | --- |
| `searchTerm` | string | The search term that produced this match. |
| `registerNumber` | string | The mark's file or registration number. |
| `database` | string | Which register the mark is held in: DE (German national), EM (EU), or IR (international). |
| `markText` | string | The mark's word element, when it has one. |
| `status` | string | Current register status, in DPMA's own wording. |
| `detailUrl` | string | Link to the mark's own page on DPMAregister. |
| `scrapedAt` | string | When this row was captured. |
| `changeType` | string | `NEW` or `UPDATED`, present only in recurring watch mode. |
| `detail.applicationDate` / `registrationDate` / `publicationOfRegistrationDate` | string | Key lifecycle dates, present when full detail records are on. |
| `detail.niceClasses` | array | Nice classification classes, present when full detail records are on. |
| `detail.goodsServices` | string | The goods and services text for the mark, present when full detail records are on. |
| `detail.owner` | string | The registered owner (Inhaber), present when full detail records are on. |
| `detail.representativeAddress` | string | Representative or service address, present when full detail records are on. |
| `detail.oppositionPeriodStart` / `oppositionPeriodEnd` | string | The opposition window for the mark, present when full detail records are on. |
| `detail.procedureHistory` | array | Every filing, opposition, renewal, and ownership-change event for the mark, present when full detail records are on. |

### 💰 Pricing

This Actor uses pay per event pricing. Empty runs cost nothing, and there are no subscriptions. Free plan runs are limited to 25 results, 3 runs per day, and a short wait between runs.

### ⭐ Enjoying DPMA Trademark Register Scraper?

<table width="100%" style="display:table;width:100%"><tr><td style="padding:20px 24px 14px;background:#EAF0F8;border:1px solid #C7D6EC;border-left:5px solid #1D4E89;border-radius:10px 10px 0 0"><span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br><span style="font-size:17px;font-weight:800;color:#1C1917">If this saved you a manual DPMA lookup, a quick rating helps other IP and legal teams find it.</span><br><span style="font-size:14px;color:#57534E">Your feedback tells us which fields to add next.</span></td></tr><tr><td style="padding:0;background:#1D4E89;border:1px solid #C7D6EC;border-top:none;border-radius:0 0 10px 10px;text-align:center"><a href="https://apify.com/getascraper/dpma-trademark-register-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a></td></tr></table>

### ❓ FAQ

#### Is this affiliated with the DPMA?

No. This is an independent tool that reads the register data the DPMA already publishes publicly at register.dpma.de. It is not affiliated with or operated on behalf of the German Patent and Trade Mark Office.

#### Can I check several brand names in one run?

Yes. Add as many search terms as you want and the Actor checks each one against the register in the same run.

#### Does this only cover German marks?

By default, yes: the register scope is set to German national marks only. Switch the register scope to include EU and international marks that DPMA's own register shows as designating Germany.

#### Can I get alerted only when a new mark appears?

Yes. Turn on recurring watch mode, give it a watch state name, and pair it with an Apify schedule. Each run then returns only marks that are new or have changed since the last run with that same name.

#### Do I need a DPMA account or API key?

No. The Actor reads the register the same way a public visitor would, no account, API key, or browser required.

### 🔗 Other actors

- [Wyoming Business Search Scraper: Filings, Agent & Monitor](https://apify.com/getascraper/wyoming-business-registry-scraper) ⇗ - Search a US state business registry with a matching watch mode.
- [Japan Company Scraper: 4.5M+ gBizINFO Records](https://apify.com/getascraper/gbizinfo-japan-company-scraper) ⇗ - Look up Japanese company records from the official gBizINFO registry.
- [China Recall Scraper: 中国缺陷产品召回](https://apify.com/getascraper/china-samr-product-recall-scraper) ⇗ - Monitor a Chinese government register for newly published recall notices.
- [VAS Sheffield Jobs Scraper: Charity Vacancies & Monitor](https://apify.com/getascraper/vas-sheffield-jobs-scraper) ⇗ - Another example of the same only-new-since-last-run watch pattern, applied to a job board.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/dpma-trademark-register-scraper/changelog.md

# Actor input Schema

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

One or more mark names, applicant/owner names, or registration numbers to search for. Put several candidate brand names here to run a bulk clearance check in a single run instead of one Actor run per name, the main gap versus the two DPMA-specific competitor Actors, which only accept one query per run.

## `registerScope` (type: `string`):

German marks only (DE) covers national DPMA registrations, the actor's core focus. All also includes EU-unitary and international Madrid-system marks that DPMA's own register shows as designating Germany, useful for a fuller clearance picture but noisier for a pure German-register lookup.

## `statusFilter` (type: `array`):

Only return marks whose register status text contains one of these snippets (case-insensitive), for example "eingetragen" for registered marks or "gel" to catch cancelled ones. Leave empty to return every status. DPMA's real status strings are German phrases like "Marke eingetragen", "Marke eingetragen/Schutz bewilligt", and "Marke gelöscht/Schutz erloschen", confirmed live, so a strict dropdown would risk silently excluding a real status this actor has not seen yet. Applied directly against the register's own status column, so this filter adds no extra requests.

## `maxResultsPerTerm` (type: `integer`):

Maximum number of matching marks to return for each search term. Keep this modest for clearance checks, where you mainly need to know if close matches exist, not every historical filing.

## `fetchDetails` (type: `boolean`):

Fetch each mark's full register page for the deep fields the results list does not include: Nice classes, goods and services text, applicant and representative address, opposition-period dates, seniority, and the complete procedure history (filing, opposition, renewal, assignment events). Adds one extra request per result, so it is off by default. This is the actor's other main differentiator: the two broader EU/TMview-based competitors only expose current status and an opposition window, not the full DPMA procedure history.

## `niceClasses` (type: `string`):

Only keep marks registered in these Nice classification classes, for example "9, 25, 42". Only takes effect when "Fetch full detail record" is also enabled above, since the class list is a detail-page field, not part of the cheap results list. Leave blank to skip this filter.

## `watchMode` (type: `boolean`):

Turn this into a monitor: instead of returning every match on every run, the actor remembers what it saw last time (per search term, in a named state store) and only returns marks that are new or have changed since the previous run with the same watch state name. Pair with an Apify schedule for ongoing brand-clearance or portfolio monitoring, the recurring-use case neither DPMA-specific competitor Actor offers today.

## `watchStateName` (type: `string`):

Name for this run's saved watch state, only used when recurring watch mode is on. Use a different name for each independent watchlist (for example one per client or brand) so their histories do not overwrite each other.

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

DPMAregister returned plain HTTP 200 responses with no anti-bot challenge during live testing, so Apify's datacenter proxy group is the default. Only switch to residential if you start seeing blocked or empty responses.

## Actor input object example

```json
{
  "searchTerms": [
    "BMW"
  ],
  "registerScope": "DE",
  "statusFilter": [],
  "maxResultsPerTerm": 10,
  "fetchDetails": false,
  "niceClasses": "",
  "watchMode": false,
  "watchStateName": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `trademarks` (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": [
        "BMW"
    ],
    "registerScope": "DE",
    "statusFilter": [],
    "maxResultsPerTerm": 10,
    "fetchDetails": false,
    "niceClasses": "",
    "watchMode": false,
    "watchStateName": "default",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/dpma-trademark-register-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": ["BMW"],
    "registerScope": "DE",
    "statusFilter": [],
    "maxResultsPerTerm": 10,
    "fetchDetails": False,
    "niceClasses": "",
    "watchMode": False,
    "watchStateName": "default",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/dpma-trademark-register-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": [
    "BMW"
  ],
  "registerScope": "DE",
  "statusFilter": [],
  "maxResultsPerTerm": 10,
  "fetchDetails": false,
  "niceClasses": "",
  "watchMode": false,
  "watchStateName": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/dpma-trademark-register-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/dpma-trademark-register-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/Zo3ZuxOsoy53wKDsm/builds/sMb6YbZYQBQH3aNzt/openapi.json
