WIPO UDRP Decisions Scraper
parseforge/wipo-arbitration-decisions-scraper
Developer toolsOther
Scrapes WIPO UDRP domain name arbitration decisions by case year and number range. Returns each decision as a flat row with full text, parties, disputed domain, panel members, and outcome.
- Total users
- 2
- Monthly active
- 0
- Total runs
- 170
- Bookmarked
- 0
- Rating
- Not rated yet
- Last modified
- 5 days ago
Overview
WIPO UDRP Decisions Scraper
Scrape WIPO UDRP domain name arbitration decisions by case year and number range, with the complete decision text of every ruling. Each row carries the parties, disputed domains, panelist, date and outcome from the case record, plus the full text and direct URL of the published decision document. Export to CSV, JSON, Excel, or XML.
WIPO's UDRP decisions are public but spread across thousands of individual case pages, each linking to a separate decision document, with no bulk download. This actor walks the case numbers of a year, reads every case page, follows the link to the ruling, and returns the whole decision as text in one consistent row. A full year is about 5,300 cases.
| Who uses it | What they scrape WIPO for |
|---|---|
| IP attorneys | Researching how a panelist has reasoned about bad faith before filing a UDRP complaint. |
| Domain investors | Reading how panels ruled on comparable domain names to assess reverse domain name hijacking risk. |
| Legal academics | Building a full-text corpus of UDRP decisions for empirical analysis of trademark law. |
| Brand protection managers | Tracking decisions naming a competitor as complainant to understand their enforcement posture. |
What it does
- ๐ Full decision text. The complete ruling, extracted from the decision document WIPO publishes for each case: PDF for 2023 onwards, HTML for earlier years. Returned in the language of the proceeding.
- ๐ Direct document URL. The resolved link to the PDF or HTML decision, so you can cite or archive the original.
- ๐ Case record fields. Disputed domains, complainant, respondent, panelist, decision date and outcome as listed on the WIPO case page.
- ๐ Year walk or case list. Walk a year from any case number, or hand it an explicit list of case IDs.
- ๐ก๏ธ Built for long runs. Cases that WIPO temporarily fails to serve are retried and, if still unreachable, recorded as error rows you can re-fetch. Progress survives a platform migration, so a resumed run continues where it stopped instead of starting over.
What you can do with WIPO data
โ๏ธ Prepare a UDRP complaint. An IP attorney pulls every 2024 decision by a specific panelist and searches the full text for how they weigh prior use of a mark.
๐ Analyze decision trends. A legal researcher collects five years of rulings and measures grant rates by industry, complainant type and panel composition.
๐ก๏ธ Defend against a UDRP claim. A domain investor scrapes decisions involving their portfolio's keywords and reads the reasoning that found legitimate interest.
๐ข Monitor competitor enforcement. A brand protection manager pulls the quarter's decisions naming a competitor as complainant and reads which arguments succeeded.
Output
One row per case. Fields in the order they appear:
| Field | Type | What it holds |
|---|---|---|
caseId |
string | WIPO case number, for example D2024-0560 |
domainNames |
string[] | Disputed domain name(s) |
complainant |
string | Complainant as listed on the case page |
respondent |
string | Respondent as listed on the case page |
panelist |
string | Panelist name(s) |
decisionDate |
string | Decision date as shown by WIPO, DD-MM-YYYY |
decision |
string | Outcome: Transfer, Complaint denied, Cancellation, Terminated |
decisionUrl |
string | Direct URL of the decision document. Null when WIPO never published one. |
decisionFormat |
string | pdf or html |
decisionStatus |
string | ok, not_published, failed, or skipped (see below) |
decisionError |
string | Why decisionStatus is failed, otherwise null |
decisionPages |
integer | Page count of the PDF, null for HTML decisions |
decisionText |
string | The complete decision text |
decisionTextUrl |
string | WIPO's stable redirect link for the decision |
sourceUrl |
string | The case page the row was read from |
scrapedAt |
string | ISO-8601 UTC timestamp |
error |
string | Set only on rows whose case page could not be loaded |
decisionStatus tells you what happened to the document:
ok: the text was extracted. Most rows.not_published: the case has a record but no decision document. These are cases that were terminated, withdrawn or settled before a panel ruled. Theirdecisionfield usually readsTerminated. Roughly one case in six in 2024.failed: the document exists but could not be fetched or parsed after five attempts.decisionErrorsays why. Re-fetch these with thecaseIdsinput.skipped: you turnedincludeDecisionTextoff.
A real row, trimmed:
{
"caseId": "D2024-0560",
"domainNames": ["resourcex.com"],
"complainant": "Hannes Schmutterer Schmutterer & Partner Information Technology GmbH",
"respondent": "Ross McIntosh",
"panelist": "Maier, Steven A.",
"decisionDate": "28-03-2024",
"decision": "Complaint denied",
"decisionUrl": "https://www.wipo.int/amc/en/domains/decisions/pdf/2024/d2024-0560.pdf",
"decisionFormat": "pdf",
"decisionStatus": "ok",
"decisionError": null,
"decisionPages": 5,
"decisionText": "ARBITRATION\nAND\nMEDIATION CENTER\nADMINISTRATIVE PANEL DECISION\nHannes Schmutterer Schmutterer & Partner Information Technology GmbH v.\nRoss McIntosh\nCase No. D2024-0560\n1. The Parties\n ... 2,047 words ... \n8. Decision\nFor the foregoing reasons, the Complaint is denied.\n/Steven A. Maier/\nSteven A. Maier\nSole Panelist\nDate: March 28, 2024",
"decisionTextUrl": "https://www.wipo.int/amc/en/domains/search/text.jsp?case=D2024-0560",
"sourceUrl": "https://www.wipo.int/amc/en/domains/search/case.jsp?case=D2024-0560",
"scrapedAt": "2026-08-21T15:21:04.118Z",
"error": null
}
A 2024 decision PDF runs four to seven pages and about 13,000 characters of text.
Why choose this scraper
| What you get | |
|---|---|
| The ruling itself | The full decision text, not the case summary. Searchable and citable. |
| Every format WIPO uses | PDF decisions from 2023 onwards and both HTML layouts WIPO used before, in the language of the proceeding. |
| Honest about gaps | A case without a published decision is labelled not_published, not silently dropped and not returned empty. |
| Survives a long run | Retries with backoff, a pause when WIPO throttles, error rows you can re-fetch, and progress that resumes after a platform migration. |
| Rows in order | Cases are fetched in parallel and written in case-number order. |
How it compares
| WIPO UDRP Decisions Scraper | Build it in-house | By hand | |
|---|---|---|---|
| Setup | Run it now, zero config | Days of engineering | None, but minutes per case |
| Decision text | Extracted from PDF and HTML | You write the parsers | Copy and paste from 5,000 PDFs |
| When WIPO changes | Maintained for you | You fix it | You re-learn the page |
| Retries, throttling, resume | Built in | Your problem | Not applicable |
| Output | Fixed JSON schema, CSV/Excel export | Whatever you build | A folder of PDFs |
Configure the run
Pick a year and a start case number, or list the cases you want. The Input tab lists every parameter.
One case, the quickest way to see the output:
{
"caseIds": ["D2024-0560"]
}
A full year with decision text:
{
"year": "2024",
"startCase": 1,
"maxItems": 10000,
"includeDecisionText": true,
"concurrency": 4
}
The actor stops on its own at the end of the year, after twenty consecutive case numbers with no record. Set maxItems above the year's size and let it run out.
Before a full-year run: check the run's cost limit
A full year is over five thousand paid results. Apify stops any run that reaches the Maximum cost per run set in its run options, and the default is whatever is left of your monthly limit. Set it above what a full year costs at the per-result price shown on the Pricing tab, or the run ends part-way with the message "aborted because it reached its maximum cost". If that happens, raise the limit and resurrect the run: progress is saved, and it continues from the case where it stopped without re-delivering or re-charging anything.
How long a full year takes
Each case needs one request for the case page and one for the decision document, which is a PDF of 100 to 200 KB for recent years. At the default concurrency of 4 the actor delivers roughly 100 to 180 rows per minute, so a full year of about 5,300 cases with text takes on the order of an hour. Set the run timeout to at least two hours so a slow patch at WIPO cannot end it early. Metadata only (includeDecisionText: false) is several times faster.
When WIPO pushes back
WIPO serves individual pages with a gateway timeout now and then, for a few minutes at a time. The actor retries each one five times over half a minute. A case that still fails is parked and retried once more at the end of the run, after the burst has passed, and only then recorded as an error row if it is still unreachable. Failures never count toward the end of the year, so a wobbly hour at WIPO cannot cut a run short.
WIPO also throttles a single address after roughly a hundred cases with their documents. That is why Apify Proxy is on by default: requests spread across addresses, each worker keeps its own session, and a throttled session is rotated away. If you turn the proxy off, the actor still copes: every worker pauses for a minute when WIPO refuses it, and the run summary says how often that happened.
Re-fetching the rows that failed
Filter your dataset for rows with an error field or decisionStatus: "failed", collect their caseId values, and run again with only those:
{
"caseIds": ["D2024-0563", "D2024-1290"]
}
Free users
Free-plan runs return up to 10 results as a preview. Upgrade your Apify plan to collect up to 1,000,000 results per run.
Run it
- Create a free Apify account with $5 in credit.
- Open the WIPO UDRP Decisions Scraper.
- Set your inputs, then click Start.
- Export the results as CSV, Excel, JSON, or XML from the Dataset tab.
Run it programmatically through the Apify API (run-sync-get-dataset-items) or the ApifyClient for JavaScript and Python.
Use with AI agents (MCP)
Give an AI agent live access to WIPO through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/wipo-arbitration-decisions-scraper"
Then prompt it in plain language to run the scraper and read back the results.
Troubleshooting
A row has decisionStatus: "not_published" and no text.
That case has no decision document on WIPO's site. It was terminated, withdrawn or settled before a panel ruled; its decision field usually says so. There is nothing to fetch.
A row has decisionStatus: "failed".
The document exists but could not be fetched or parsed after five attempts. decisionError carries the reason, almost always a gateway timeout at WIPO. Re-run those cases with the caseIds input.
A row has an error field and nothing else.
WIPO did not serve that case page after five attempts. Re-run it with caseIds. These rows are not charged.
The run stopped before reaching my maxItems.
The actor stops at the end of the year: twenty consecutive case numbers with no record. 2024 ends at D2024-5360. If you started at 1 with a maximum of 10,000, stopping around 5,360 is the actor finishing, not failing.
The log says WIPO throttled the run.
WIPO refused requests from the run's address for a while, and the actor paused. This only happens with Apify Proxy turned off. Turn it back on, or lower concurrency.
I need decisions from a year range, not one year.
Run the actor once per year and merge the datasets, or chain runs with an Apify task.
FAQ
| Question | Answer |
|---|---|
| Does this actor require a WIPO account or API key? | No. It reads the public WIPO case pages and decision documents. No registration, API key or authentication is needed. |
| What is a WIPO UDRP decision? | A ruling under the Uniform Domain Name Dispute Resolution Policy, issued by a WIPO-appointed panel, on whether a domain name was registered and used in bad faith and should be transferred or cancelled. |
| How are WIPO case IDs formatted? | D{year}-{number}, for example D2024-0001. The actor builds these from the year and start number you give, or takes them as a list. |
| Where does the decision text come from? | From the decision document WIPO links on each case page. Since 2023 that is a PDF; earlier years are HTML pages. The actor downloads it and extracts the text. |
| In which language is the text? | The language of the proceeding as WIPO published it: mostly English, also Spanish, French, Italian, German and others. |
| Why do some cases have no decision text? | Cases that end without a panel ruling have a case record but no decision document. The row says not_published. In 2024 about one case in six is like that. |
| Can I scrape decisions from multiple years in one run? | One run covers one year, or any list of case IDs across years. To walk several years, run once per year and merge. |
| What happens if a case number does not exist? | It is skipped. Twenty consecutive missing numbers end the run, which is how the actor detects the end of a year. |
| Can I filter by complainant, respondent or domain name? | The actor collects the range or list you specify. Filter afterwards in your dataset tool or the exported file. The full text is there to search. |
| How many decisions can I scrape in one run? | Up to 1,000,000. WIPO publishes roughly 4,000 to 5,400 UDRP decisions per year, so a full year fits in one run. |
| Is this actor suitable for WIPO cases outside the UDRP system? | It is built for UDRP cases with D-prefix IDs. Other WIPO case types use different numbering and are not supported. |
| What export formats are supported? | CSV, JSON, Excel, or XML from the dataset tab after the run completes. |
Related actors
- google-search-scraper: find domain names discussed across the web, then pull the full decisions here.
Browse the full ParseForge collection 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 the World Intellectual Property Organization. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.
Input
| Field | Type | What it does | Default |
|---|---|---|---|
| maxItems | integer | How many arbitration decisions to collect per run. Free users: limited to 10 items (preview). Paid users: optional, max 1,000,000. | 10 |
| year | string | Four-digit year of the WIPO case ID (e.g. 2024). Cases are numbered D{year}-NNNN. A year holds up to about 5,500 cases. | 2024 |
| startCase | integer | Starting case number within the year (default 1). Use it to split a large year across several runs or to resume where a previous run stopped. | 1 |
| caseIds | array | Hydrate exactly these cases and ignore year and start case number. Use it to look up a handful of cases, or to re-fetch the rows that failed in a large run. Format D2024-0560. | [] |
| includeDecisionText | boolean | Download each decision document (PDF for 2023 onwards, HTML for earlier years) and return its complete text in decisionText, plus the document URL in decisionUrl. Turn off for a metadata-only run that is several times faster. | true |
| concurrency | integer | How many cases are fetched at the same time. 4 is a safe default for WIPO; 8 is the maximum. Lower it if you see failed rows. | 4 |
| proxyConfiguration | object | On by default, and worth keeping on for anything beyond a few hundred cases. WIPO throttles a single address after roughly a hundred cases with their documents; through Apify Proxy each worker keeps its own session and a throttled one is rotated away. Turn it off only for small lookups. | {"useApifyProxy":true} |
Pricing
from $19.00 per 1,000 results
| Charged for | What it is | Price each |
|---|---|---|
| result | Single result in the default dataset. | $0.019 to $0.021 |
Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.
API
One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.
curl -X POST "https://api.apify.com/v2/acts/parseforge~wipo-arbitration-decisions-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"helloWorld": 123
}' Examples
Input that runs as-is.
{
"helloWorld": 123
} Reviews
No reviews yet. Be the first.
Issues
We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.
Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.
