# Domain Dispute Decisions Scraper (`parseforge/domain-dispute-decisions-scraper`) Actor

Scrape UDRP and domain dispute decisions from FORUM and the Czech Arbitration Court: parties, disputed domains, panelists, outcomes, registrars and the full decision text, filtered by brand, domain, panelist or legal issue.

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

## Pricing

from $4.45 / 1,000 decisions

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?

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

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### UDRP Decisions Scraper - National Arbitration Forum & ADR.eu

**Every domain name dispute decided by FORUM and the Czech Arbitration Court, in one schema.** 44,269 cases at FORUM going back to February 2000 across 82,204 disputed domains, about 6,200 UDRP cases and 1,600 `.eu` ADR cases at the Czech court. Parties, domains, panelists, registrars, outcomes and the full text of the decision. No login, no browser, no proxy. Export to CSV, JSON, Excel, or XML.

WIPO decides roughly 60% of UDRP cases. This Actor covers the rest: FORUM (formerly the National Arbitration Forum) handles most US filings, and the Czech Arbitration Court runs both a UDRP docket and the sole `.eu` ADR docket. Both publish to anonymous visitors through the same interfaces their own sites call.

| Who uses it | What they use dispute decisions for |
|---|---|
| Trademark and domain lawyers | Precedent search by issue, panelist, registrar and outcome before filing |
| Brand protection teams | Every case naming their brand, their competitors, or a repeat cybersquatter |
| Domain investors | Which panelists deny complaints, and the cases where the panel found reverse domain name hijacking |
| Legal analytics and academics | A structured corpus with the reasoning sections separated out |
| Registrars and registries | Which of their names show up in disputes and how those cases end |

### What it does

Three row shapes across the two providers:

- ⚖️ **Decisions** (default): one row per case. Provider, case number, policy, case name, every disputed domain with its TLD, complainant and respondent with their domiciles, the panelist, the outcome in the provider's own words **and normalised to who won**, the decision and filing dates, the proceeding language, the URS stage, and the link to the published decision.
- 👤 **Panelists**: the Czech Arbitration Court's arbitrator directory with country, the languages they hear cases in and a link to each CV.
- 🌐 **Disputed domains**: the court's register of every domain name that has ever been in a dispute, with the state of that dispute.

And four blocks you can switch on, all read out of the published decision itself:

- 📄 **Parsed decision:** the registrar, the panelists and the panel size, the relief sought and the relief ordered, the outcome per domain, the default and dissent flags, the **reverse domain name hijacking** finding, and the reasoning split into its sections (findings, discussion, bad faith, rights, legitimate interests, principal reasons).
- 📅 **Case timeline:** filing date, response deadline, response received date, the date the panel signed, and the days from filing to decision.
- 🧑‍⚖️ **Party representatives:** counsel and law firm for each side.
- 📝 **Full decision text:** the whole decision as plain text with a word count, 2,000 to 6,000 words a case.

#### Search by what the panel actually decided

FORUM indexes every decision against its own taxonomy of legal issues. Forty of those tags are exposed as a filter, so you can pull **only** the cases where the panel dealt with phishing, typosquatting, pay per click parking, a gripe site, a parody, a former employee, a celebrity name, a privacy or proxy registration, a pattern of cybersquatting, a domain registered before the trademark, or a finding of reverse domain name hijacking. No other public interface lets you slice UDRP case law that way.

Every decision row contains: `source`, `provider`, `caseNumber`, `caseId`, `policy`, `caseName`, `domains`, `primaryDomain`, `domainCount`, `tlds`, `complainant`, `complainantDomicile`, `respondent`, `respondentDomicile`, `panelist`, `outcome`, `outcomeNormalised`, `decisionDate`, `submissionDate`, `publishedAt`, `language`, `ursStage`, `decisionUrl`, `caseUrl` and `scrapedAt`. With every block switched on a row carries up to 62 fields.

### What you can do with dispute data

**Watch a brand.**

`complainantContains` pulls every case a company has brought across both providers, with the domains, the outcomes and the counsel who filed them.

**Find the precedent.**

`legalIssues` plus `outcomes` gives you, for example, every case in which a panel found reverse domain name hijacking, or every phishing case that ended in a transfer.

**Profile a panelist.**

`panelistContains` returns their whole docket, and the outcome column shows how often they deny.

**Track a registrar.**

Switch on the parsed decision and the registrar appears on every FORUM row, so you can count which registrars carry the disputed names.

**Check a domain.**

`domainContains` searches the disputed name itself, and the disputed-domain mode gives you the court's whole register to join against your own portfolio.

### Why choose this scraper

|  | What you get |
|---|---|
| **The 40% WIPO does not decide** | FORUM and the Czech Arbitration Court, the two providers missing from every WIPO dataset |
| **One schema across providers** | Both houses' vocabularies folded onto a single outcome axis, so the rows are comparable |
| **Forty legal issue filters** | FORUM's own case index, exposed as a filter rather than as a field |
| **The reasoning, not just the result** | Findings, discussion, bad faith and rights sections separated out per case |
| **Twelve policies** | UDRP, USDRP, URS, CDRP, STOP, ERDRP, RDRP, `.usRS`, TDRP and the `.eu` ADR rules |
| **Back to February 2000** | The full FORUM archive, not a recent window |
| **No key, no proxy, no browser** | Both providers answer anonymous plain HTTP, which is why this costs $5 per 1,000 |

### How it compares

Our [WIPO UDRP Decisions Scraper](https://apify.com/parseforge/wipo-arbitration-decisions-scraper?fpr=vmoqkp) covers the other side of the same market. Run both and you have the whole UDRP record.

| Feature | ParseForge FORUM & CAC | ParseForge WIPO | Other actors |
|---|---|---|---|
| FORUM decisions | Yes | No | No |
| Czech Arbitration Court UDRP | Yes | No | No |
| `.eu` ADR decisions | Yes | No | No |
| WIPO decisions | No | Yes | No |
| Legal issue filters | 40 | No | No |
| Full decision text | Yes | Yes | No |
| Registrar per case | Yes | Yes | No |
| Price per case | $0.005 | $0.021 | Not sold |

### What a decision looks like

```json
{
  "source": "FORUM",
  "provider": "FORUM (formerly the National Arbitration Forum)",
  "caseNumber": "2235578",
  "policy": "UDRP",
  "caseName": "Carol Cole Company, Inc. v. Weijie Xu",
  "domains": ["nuface.xyz"],
  "primaryDomain": "nuface.xyz",
  "domainCount": 1,
  "tlds": ["xyz"],
  "complainant": "Carol Cole Company, Inc.",
  "complainantDomicile": "Vista CA US",
  "respondent": "Weijie Xu",
  "respondentDomicile": "Huaian, Jiangsu II CN",
  "panelist": "Steven M. Levy",
  "outcome": "Claim Denied",
  "outcomeNormalised": "Respondent won",
  "decisionDate": "2026-08-27",
  "submissionDate": "2026-07-28",
  "decisionUrl": "https://www.adrforum.com/DomainDecisions/2235578.htm",
  "registrar": "Dominet (HK) Limited.",
  "panelSize": "Single-member",
  "relief": "Denied",
  "orderMade": "Remains with Respondent",
  "reverseDomainNameHijacking": "Not raised",
  "findings": "- Complainant owns trademark rights to the NUFACE mark and the <nuface.xyz> domain name is identical to the mark; - Complainant has not established that Respondent lacks rights or legitimate interests in the disputed domain name where the only use shown by the record is a general offer to sell the domain name..."
}
```

### Configure the run

Run it with no input for the last twelve months across all three dockets.

The last year, all providers:

```json
{ "maxItems": 500 }
```

Every case a brand has brought, with the reasoning and the counsel:

```json
{
  "complainantContains": "Google",
  "dateFrom": "2015-01-01",
  "includeParsedDecision": true,
  "includeRepresentatives": true,
  "maxItems": 500
}
```

Reverse domain name hijacking findings at FORUM:

```json
{
  "sources": ["forum"],
  "legalIssues": ["reverseDomainNameHijackingFound"],
  "dateFrom": "2020-01-01",
  "includeParsedDecision": true,
  "maxItems": 300
}
```

Phishing cases that ended in a transfer, with the full text:

```json
{
  "fullTextSearch": "phishing",
  "outcomes": ["Complainant won"],
  "includeDecisionText": true,
  "maxItems": 200
}
```

One panelist's whole docket:

```json
{ "panelistContains": "Neil Anthony Brown", "dateFrom": "2010-01-01", "maxItems": 1000 }
```

### Pricing

Pay-per-event. **$5 per 1,000 decisions**, plus $0.02 per run start and $0.004 per docket request. The four blocks are off by default and are billed only when the document actually carried what they read.

| Event | Price | When |
|---|---|---|
| `decision-row` | $0.005 | Every case written |
| `panelist-row` | $0.004 | Every panelist written |
| `domain-row` | $0.002 | Every disputed domain written |
| `search-request` | $0.004 | Each FORUM search or grid page, never more than the rows written |
| `decision-document` | $0.005 | The published decision was opened |
| `parsed-decision` | $0.004 | The registrar, panel and reasoning came out of it |
| `case-timeline` | $0.003 | The procedural dates came out of it |
| `party-representatives` | $0.003 | Counsel or a law firm was named |
| `decision-text` | $0.003 | The full text was attached |

| Run | Approximate cost |
|---|---|
| Last 12 months, 400 cases, metadata only | $2.02 |
| 400 cases with the parsed decision, timeline and counsel | $8.02 |
| 1,000 cases with everything including full text | $23.02 |
| One brand's 40 cases with the reasoning | $0.80 |

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 rows as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to pull a whole docket.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [UDRP & Domain Dispute Decisions Scraper](https://apify.com/parseforge/domain-dispute-decisions-scraper?fpr=vmoqkp).
3. Pick the providers, the date range and any filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab, or schedule it weekly to catch new decisions.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent the UDRP record through the Model Context Protocol:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/domain-dispute-decisions-scraper"
```

Then ask: *"Which panelists have found reverse domain name hijacking in the last two years?"*, *"Show me every UDRP case brought against a .shop domain in 2026"* or *"How often does a respondent who files a response actually win?"*

### Troubleshooting

**Why did an empty run return nothing?**

FORUM's search matches nothing without a date window, so a run with no dates is defined as the last twelve months. Set `dateFrom` to go further back; the archive starts on 4 February 2000.

**Why is the panelist blank on FORUM rows?**

FORUM's case index does not carry it. Switch on the parsed decision and the panelist, the panel size and the registrar are read out of the decision itself.

**Why is the registrar `N/A` on Czech Arbitration Court rows?**

The court does not name the registrar in its published decisions. FORUM does.

**Why does a legal issue filter return a case whose text never mentions the issue?**

The filter uses FORUM's own index of its decisions, which is occasionally broader than the text. The `reverseDomainNameHijacking` field reports what the decision actually says, so use the filter to narrow and the field to confirm.

**Why do the Czech Arbitration Court rows have no submission date?**

Its grid does not publish one. Switch on the case timeline and the filing timestamp is read from the decision page.

**Why are there fewer `.eu` rows than UDRP rows?**

The `.eu` docket is smaller: about 1,600 decisions in total against roughly 6,200 on the court's UDRP docket and 44,269 at FORUM. With several providers selected the run splits its row budget between them and hands back whatever a provider does not use.

### FAQ

| Question | Answer |
|---|---|
| Where does the data come from? | The public search API behind adrforum.com and the public decision grids at udrp.adr.eu and eu.adr.eu. |
| Do I need an API key or a login? | No. Both providers answer anonymously. |
| How far back does it go? | FORUM to 4 February 2000. The Czech Arbitration Court's dockets start later. |
| Does it include WIPO? | No. WIPO is a separate provider; use our WIPO UDRP Decisions Scraper for that side. |
| Which policies are covered? | UDRP, USDRP, URS, CDRP, STOP, ERDRP, RDRP, `.usRS`, TDRP and the `.eu` ADR rules. |
| Can I get the full text of a decision? | Yes, switch on the full decision text, or take just the reasoning sections with the parsed decision. |
| Are pending cases included? | Yes, and they carry `N/A` for the decision date. Switch on "only decided cases" to drop them. |
| How fast is it? | 400 cases with the parsed decision, timeline and counsel took 21 seconds on the platform. |
| How many rows per run? | Free plan: 10. Paid: as many as the filters match, up to 50,000. |
| Is this an official FORUM or ADR.eu product? | No. It is unofficial and reads only publicly available decisions. |

### Related actors

- [WIPO UDRP Decisions Scraper](https://apify.com/parseforge/wipo-arbitration-decisions-scraper?fpr=vmoqkp): the other 60% of the UDRP record.
- [RDAP Domain Lookup Scraper](https://apify.com/parseforge/rdap-domain-lookup-scraper?fpr=vmoqkp): registration data for the domains a case names.
- [IP Australia Trademarks Scraper](https://apify.com/parseforge/ip-australia-trademarks-scraper?fpr=vmoqkp): the trademark rights a complainant relies on.
- [FINRA Arbitration Awards Scraper](https://apify.com/parseforge/finra-arbitration-awards-scraper?fpr=vmoqkp): securities arbitration awards with the damages parsed out.
- [ICSID Investor-State Arbitration Scraper](https://apify.com/parseforge/icsid-arbitration-cases-scraper?fpr=vmoqkp): investment treaty cases, parties and tribunals.

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by FORUM, the Czech Arbitration Court, ICANN, EURid or WIPO. It reads only publicly available decisions. Nothing here is legal advice.

# Actor input Schema

## `outputMode` (type: `string`):

Decisions is one row per case. Panelists is the Czech Arbitration Court's panelist directory. Domains is the court's list of every domain name that has been disputed.

## `sources` (type: `array`):

FORUM handles most US filings. The Czech Arbitration Court runs both a UDRP docket and the .eu ADR docket. Leave empty for all three.

## `maxItems` (type: `integer`):

Stop after this many rows. Free plans are capped at 10.

## `dateFrom` (type: `string`):

Earliest decision date. Defaults to twelve months ago; FORUM's search needs a window and returns nothing without one.

## `dateTo` (type: `string`):

Latest decision date. Defaults to today.

## `filedFrom` (type: `string`):

Earliest date the complaint was submitted.

## `filedTo` (type: `string`):

Latest date the complaint was submitted.

## `fullTextSearch` (type: `string`):

Search the body of the decisions, not just the case metadata. Both providers support it.

## `caseNumber` (type: `string`):

FORUM claim number (2225233) or CAC case number (CAC-UDRP-108881).

## `caseNameContains` (type: `string`):

The case caption, usually "Complainant v. Respondent".

## `domainContains` (type: `string`):

Matches any disputed domain in the case.

## `tlds` (type: `array`):

Keep only cases with a domain under one of these, for example com, eu, us, shop.

## `complainantContains` (type: `string`):

The brand owner bringing the case.

## `respondentContains` (type: `string`):

The domain holder defending the case.

## `complainantDomicileContains` (type: `string`):

FORUM only. Matches the city, state or country as filed.

## `respondentDomicileContains` (type: `string`):

FORUM only.

## `panelistContains` (type: `string`):

The arbitrator who decided the case.

## `policies` (type: `array`):

UDRP is the global policy. USDRP covers .us, CDRP covers .ca, URS is the rapid suspension track, ADR.eu covers .eu. Leave empty for all.

## `outcomes` (type: `array`):

Both providers use their own words for the result; this filters on the normalised outcome.

## `legalIssues` (type: `array`):

FORUM tags every decision against its own issue taxonomy. Pick one or more to keep only the cases where the panel dealt with them. Ignored for the Czech Arbitration Court, which has no equivalent index.

## `responseType` (type: `string`):

FORUM only.

## `language` (type: `string`):

The .eu ADR docket records the language of the proceeding; it also filters the panelist directory by language spoken.

## `panelistCountry` (type: `string`):

Panelists mode only.

## `onlyMultiDomainCases` (type: `boolean`):

Keep only complaints that covered two or more domain names.

## `onlyDecidedCases` (type: `boolean`):

Drop pending and suspended filings that have no decision date yet.

## `includeParsedDecision` (type: `boolean`):

Opens each decision document and adds the registrar, the panelists, the relief ordered, the reverse domain name hijacking finding and the reasoning sections. Slower and billed per document.

## `includeCaseTimeline` (type: `boolean`):

Filing date, response deadline, response received date and days from filing to decision.

## `includeRepresentatives` (type: `boolean`):

Counsel and law firm for each side, where the decision names them.

## `includeDecisionText` (type: `boolean`):

The whole decision as plain text. Large: a decision runs 2,000 to 6,000 words.

## Actor input object example

```json
{
  "outputMode": "decisions",
  "sources": [
    "forum",
    "cac-udrp",
    "cac-adreu"
  ],
  "maxItems": 100,
  "dateFrom": "2026-01-01",
  "dateTo": "2026-08-27",
  "filedFrom": "2026-01-01",
  "filedTo": "2026-08-27",
  "fullTextSearch": "phishing",
  "caseNumber": "CAC-UDRP-108881",
  "caseNameContains": "Nike",
  "domainContains": "bank",
  "tlds": [
    "com",
    "shop"
  ],
  "complainantContains": "Google",
  "complainantDomicileContains": "France",
  "respondentDomicileContains": "China",
  "panelistContains": "Neil Anthony Brown",
  "responseType": "Any",
  "language": "English",
  "panelistCountry": "Italy",
  "onlyMultiDomainCases": false,
  "onlyDecidedCases": false,
  "includeParsedDecision": false,
  "includeCaseTimeline": false,
  "includeRepresentatives": false,
  "includeDecisionText": false
}
```

# Actor output Schema

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

No description

## `rows` (type: `string`):

No description

## `csv` (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 = {
    "outputMode": "decisions",
    "sources": [
        "forum",
        "cac-udrp",
        "cac-adreu"
    ],
    "maxItems": 100,
    "responseType": "Any"
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/domain-dispute-decisions-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 = {
    "outputMode": "decisions",
    "sources": [
        "forum",
        "cac-udrp",
        "cac-adreu",
    ],
    "maxItems": 100,
    "responseType": "Any",
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/domain-dispute-decisions-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 '{
  "outputMode": "decisions",
  "sources": [
    "forum",
    "cac-udrp",
    "cac-adreu"
  ],
  "maxItems": 100,
  "responseType": "Any"
}' |
apify call parseforge/domain-dispute-decisions-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/domain-dispute-decisions-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/3ymF3sgmhEZ53xMPd/builds/HaVYReLFQySJKPMwD/openapi.json
