ParseForge Scrapers

Unified Patent Court Scraper - UPC Cases & Parties

parseforge/unified-patent-court-scraper

BusinessAutomationDeveloper tools

Scrape the Unified Patent Court case registry: case number, action type, phase, division, parties, representatives, judges, patents. Export to CSV, Excel, JSON or XML.

Run this scraper See the API call
Total runs
39
Bookmarked
0
Last modified
2 days ago

This scraper was last updated on .

What does the Unified Patent Court Scraper - UPC Cases & Parties return?

ParseForge Banner

⚖️ Unified Patent Court Case Registry Scraper

🚀 Export Unified Patent Court cases in seconds. 612 infringement actions, 439 cases at the Munich Local Division and every other action type on the court's public register, with parties, representatives, judges and patents in suit on every row.

The Unified Patent Court opened on 1 June 2023 and now decides patent disputes across 18 participating EU states from a single bench. Its Registry publishes every case it accepts: who sued whom, at which division, in which language, under which European patents, and which judges sit on the panel. That register lives behind a search form that hands out 60 rows at a time and nothing at all through an ordinary HTTP request.

This Actor fills that form the way a lawyer would, walks the result pages, opens every case page behind them and returns one flat row per case, ready for CSV, Excel, JSON or XML.

📊 Coverage

What Measured on 2026-09-08
Action types 9, from Infringement to Revocation and Provisional measures
Court divisions 18, Court of Appeal plus central, local and regional divisions
Languages of proceedings 10
Case phases 5, Written through to Case Closed
Infringement actions on the register 612
Cases at the Munich Local Division 439
Rows per registry results page 60

👥 Who this is for

Audience What they get
Patent litigators A live list of new actions at the divisions they practise in, with the representatives on the record
In-house IP counsel An early warning when a competitor, a supplier or one of your own patents appears on the register
Litigation finance and insurance Volume, division and party data to size the UPC docket
Patent analytics vendors A structured feed of EP numbers actually in suit, joined to the case around them
Legal journalists The parties, the division and the panel behind every new filing
Academics A reproducible sample of the court's first years of practice

📋 What the Unified Patent Court Scraper does

  1. Opens the court's own case search at the Registry.
  2. Applies the filters you choose: action type, court division, party name, patent number, representative, phase, language, and the two date windows the form exposes.
  3. Walks the results table, 60 cases at a time.
  4. Opens each case page and reads the parties with their roles, the representatives, the panel of judges, the European patents in suit, the phase, the language and the list of filed documents.
  5. Pushes one flat row per case, deduplicated on the case page.

🎬 Full Demo

Coming soon.

📤 Output

Field Type What it holds
caseNumber string Registry case number, for example UPC-CFI-0003057/2026
caseUrl string The case page on the court's website
actionType string Infringement, Revocation, Appeal, Provisional measures and the rest of the court's list
casePhase string Written, Interim, Oral, Deliberation or Case Closed
courtDivision string The division hearing the case
dateOfReceipt string Date of formal receipt, ISO format
languageOfProceedings string The language the case runs in
partiesSummary string Claimants v defendants on one line
patentCount integer How many European patents are in suit
judgeCount integer How many judges sit on the panel
documentCount integer How many documents the registry lists for the case
claimants array Claimants, applicants or appellants
defendants array Defendants or respondents
otherParties array Proprietors and any other role on the record
representatives array Representatives on the record
judges array The panel
patents array EP number and title for every patent in suit
documents array The 20 most recent filed documents, with title, date and access flag
scrapedAt string When the row was collected
error string or null Only set on a row that reports a problem

Three real records from a run:

[
  {
    "caseNumber": "UPC-CFI-0003057/2026",
    "caseUrl": "https://www.unifiedpatentcourt.org/en/node/184204",
    "actionType": "Infringement",
    "casePhase": "Written Phase",
    "courtDivision": "Copenhagen (DK) Local Division",
    "dateOfReceipt": "2026-08-24",
    "languageOfProceedings": "English",
    "partiesSummary": "Teradyne Robotics A/S (also trading under the registered name Universal Robots A/S) v JAKA Robotics GmbH",
    "patentCount": 3,
    "judgeCount": 3,
    "documentCount": 128,
    "claimants": ["Teradyne Robotics A/S (also trading under the registered name Universal Robots A/S)"],
    "defendants": ["JAKA Robotics GmbH"],
    "otherParties": ["Proprietor: Teradyne Robotics A/S (also trading under the registered name Universal Robots A/S)"],
    "representatives": ["Søren Christian Søborg ANDERSEN", "Bernd Fuhrmann"],
    "judges": ["Peter Agergaard", "Goda Ambrasaité-Balyniené", "Samuel Granata"],
    "patents": [
      { "patentNumber": "EP1996376", "patentTitle": "PROGRAMMABLE ROBOT AND USER INTERFACE" },
      { "patentNumber": "EP3045273", "patentTitle": "JOINT FOR A ROBOT" },
      { "patentNumber": "EP3530420", "patentTitle": "JOINT FOR A ROBOT" }
    ],
    "documents": [
      { "title": "Other Documents", "date": "2026-09-08", "access": "Not Public" },
      { "title": "Receipt", "date": "2026-08-31", "access": "Not Public" },
      { "title": "Statement of claim", "date": "2026-08-24", "access": "Not Public" }
    ],
    "scrapedAt": "2026-09-08T16:44:06.112Z",
    "error": null
  },
  {
    "caseNumber": "UPC-CFI-0002990/2026",
    "caseUrl": "https://www.unifiedpatentcourt.org/en/node/184156",
    "actionType": "Infringement",
    "casePhase": "Written Phase",
    "courtDivision": "Hamburg (DE) Local Division",
    "dateOfReceipt": "2026-08-19",
    "languageOfProceedings": "German",
    "partiesSummary": "VMware LLC v Deutsche Telekom AG, Telekom Deutschland GmbH",
    "patentCount": 1,
    "judgeCount": 3,
    "documentCount": 22,
    "claimants": ["VMware LLC"],
    "defendants": ["Deutsche Telekom AG", "Telekom Deutschland GmbH"],
    "otherParties": ["Proprietor: VMware LLC"],
    "representatives": ["Björn-Alexander BOCKELMANN", "Klaus HAFT"],
    "judges": ["Sabine Klepsch", "Stefan Schilling", "Peter Agergaard"],
    "patents": [
      { "patentNumber": "EP2748977", "patentTitle": "CHASSIS CONTROLLERS FOR CONVERTING UNIVERSAL FLOWS" }
    ],
    "documents": [
      { "title": "Service Receipt/Service Document", "date": "2026-09-02", "access": "Not Public" },
      { "title": "Receipt", "date": "2026-08-19", "access": "Not Public" },
      { "title": "Statement of claim", "date": "2026-08-19", "access": "Not Public" }
    ],
    "scrapedAt": "2026-09-08T16:44:06.588Z",
    "error": null
  },
  {
    "caseNumber": "UPC-CFI-0002931/2026",
    "caseUrl": "https://www.unifiedpatentcourt.org/en/node/184157",
    "actionType": "Infringement",
    "casePhase": "Written Phase",
    "courtDivision": "Hamburg (DE) Local Division",
    "dateOfReceipt": "2026-08-13",
    "languageOfProceedings": "German",
    "partiesSummary": "Avago Technologies International Sales Pte. Limited v Hyundai Motor Deutschland GmbH, HYUNDAI MOTOR COMPANY, Hyundai Motor Europe GmbH, Tiemeyer automobile GmbH & Co. KG, KIA Deutschland GmbH, KIA Corporation, Kia Europe GmbH, Autohaus Dinnebier GmbH",
    "patentCount": 1,
    "judgeCount": 3,
    "documentCount": 43,
    "claimants": ["Avago Technologies International Sales Pte. Limited"],
    "defendants": ["Hyundai Motor Deutschland GmbH", "HYUNDAI MOTOR COMPANY", "Hyundai Motor Europe GmbH", "Tiemeyer automobile GmbH & Co. KG", "KIA Deutschland GmbH", "KIA Corporation", "Kia Europe GmbH", "Autohaus Dinnebier GmbH"],
    "otherParties": [],
    "representatives": ["Hannes JACOBSEN"],
    "judges": ["Sabine Klepsch", "Stefan Schilling", "Thomas Adocker"],
    "patents": [
      { "patentNumber": "EP2575408", "patentTitle": "Single NFC device identity selection on a multiple-identity supported device" }
    ],
    "documents": [
      { "title": "Service Receipt/Service Document", "date": "2026-09-02", "access": "Not Public" },
      { "title": "Receipt", "date": "2026-08-17", "access": "Not Public" },
      { "title": "Statement of claim", "date": "2026-08-13", "access": "Not Public" }
    ],
    "scrapedAt": "2026-09-08T16:44:07.045Z",
    "error": null
  }
]

⭐ Why choose this Actor

  • The case page, not just the results table. The registry's own table gives you six columns. Every row here also carries the panel, the representatives, the EP numbers in suit, the phase and the language, because the Actor opens the case page behind each result.
  • It gets in. The court sits behind an edge check that answers a plain HTTP request with a 403 on every path, robots.txt included. This Actor drives a real browser, waits the check out, and trades a rejected exit address for a fresh one instead of giving up.
  • The court's own filter set. Every knob on the registry search form is an input here, with the court's own option lists rather than invented ones.
  • Honest columns. Filed documents are listed as "Not Public" by the registry itself, so this Actor reports that flag rather than pretending a download link exists.
  • No literal nulls. Missing values come back as Not Disclosed or N/A, so a spreadsheet never breaks on an empty cell.

🥊 How it compares

Approach What you get
The registry search by hand Six columns, 60 rows a page, and a case page to open one at a time
A generic HTML scraper A 403 on every request, including robots.txt
A commercial patent litigation database Broad coverage behind a licence and an annual contract
This Actor The full case record, filtered the court's way, exported to CSV, Excel, JSON or XML

🚀 How to use

  1. Create a free Apify account and claim the $5 starting credit: console.apify.com/sign-up.
  2. Open the Actor and pick an action type, for example Infringement, or a court division.
  3. Add any further filter you want: a party name, a patent number, a representative, a phase, a language or a date window.
  4. Set how many cases you want back.
  5. Run it, then download the dataset as CSV, Excel, JSON or XML, or read it straight from the API.

Already have case pages? Paste them into the case URL field and the search form is skipped entirely.

💼 Business use cases

  • Competitor watch. Filter by party name and see the moment a competitor files or is sued at the UPC.
  • Portfolio watch. Filter by patent number and find out whether one of your EP rights is in suit.
  • Division strategy. Compare volumes across Munich, Hamburg, Mannheim, Paris, The Hague and the rest before choosing where to file.
  • Panel research. Collect the judges who sit on the actions in your technical field.
  • Representative benchmarking. Rank firms by how often they appear on the record.
  • Business development. Spot the companies newly exposed to a UPC action and reach the right general counsel first.
  • Market sizing. Count actions per type and per year to size the court's docket.

🤖 Automating

Put the Actor on a schedule and let it run every morning. Point a webhook at the finished run and a new filing lands in Slack, a Google Sheet or your case management system before the first coffee. Combine two schedules, one by division and one by party name, and you have a watch list that maintains itself.

🌍 Beyond business use cases

  • Track how quickly the court moves cases from the Written Phase to a decision.
  • Measure how the language of proceedings splits between English and German.
  • Study which technical fields reach the new court first.
  • Build teaching material from a real, current European docket.
  • Feed a research dataset on cross border patent enforcement in the EU.

💬 Ask an AI assistant

Point your assistant at the dataset and ask it plainly:

  • "Which divisions took the most infringement actions this quarter?"
  • "List every case where an EP number appears in more than one action."
  • "Which representatives appear opposite each other most often?"
  • "Summarise the parties in the cases filed at Hamburg in the last month."

❓ Frequently Asked Questions

Does UPC here mean barcodes? No. UPC is the Unified Patent Court, the European patent court that opened on 1 June 2023. This Actor has nothing to do with Universal Product Codes.

Which website does it read? The court's own public case register at unifiedpatentcourt.org, under Registry, Cases. The address unified-patent-court.org redirects to the same site.

Is the data public? Yes. Everything this Actor returns is on pages the court publishes to anyone with a browser.

Can it download the filed documents? No. The registry marks the documents on a case page as "Not Public", so the Actor reports the title, the date and that access flag and nothing more.

Why is a browser needed? The court's site is behind an edge check that answers a plain HTTP request with a 403 on every path. A real browser is the only way through.

How long does a run take? Getting the first browser through the edge check took 16 to 24 seconds on the addresses that were accepted, and some addresses are not accepted at all, so the Actor swaps them. After that, pages come back in under five seconds each.

How many cases can I get in one run? The registry serves 60 cases per results page and pages through the whole result set, so the ceiling is the size of your filtered result set. Infringement alone was 612 cases when this was measured.

Can I search the whole register at once? Not with an empty form. The registry answers a filterless search with "We found no results", so pick at least one action type or one division.

Can I filter by more than one action type? Yes. Each type you tick runs one more registry search, and the results are combined into one dataset.

Do I need a proxy? The Apify datacenter proxy is on by default because it was the configuration that cleared the edge check most reliably. You can turn it off or switch it in the input.

What happens on a free account? You get a 10 case preview per run. A paid account can ask for up to 1,000,000.

Are the rows deduplicated? Yes, on the case page address, so a case that turns up in two searches is delivered once.

Which export formats are supported? CSV, Excel, JSON, XML, plus the Apify API and integrations.

What if the court changes its form? The parser reads the court's own field names rather than the visible labels, so a reworded label does not empty a column. If the structure changes, tell us through the contact form below.

🔌 Integrate with any app

Every run is available through the Apify API, so the dataset drops straight into Zapier, Make, n8n, Google Sheets, Airtable, Slack, Power BI, or your own service. Webhooks fire when a run finishes, so nothing needs polling.

🧰 Recommended Actors

💡 Pro Tip: browse the rest of the collection at apify.com/parseforge and chain two Actors into one workflow.

🆘 Need Help? Open our contact form


This Actor is not affiliated with, endorsed by or connected to the Unified Patent Court. It collects only publicly available data from the court's public case register and is provided for research and informational purposes.

What input does the Unified Patent Court Scraper - UPC Cases & Parties accept?

FieldTypeWhat it doesDefault
caseUrls array Unified Patent Court case pages, for example https://www.unifiedpatentcourt.org/en/node/184204. Leave empty to use the registry search instead. not set
actionTypeIds array The registry's own action list. Each type you tick runs one registry search, so two types means two searches. Leave empty to search every type at once. ["450"]
courtDivisionIds array Court of Appeal, central divisions, local divisions and the Nordic Baltic regional division. Each division you tick runs one more registry search. not set
maxItems integer How many cases to deliver. Free users get a 10 case preview per run; paid users can ask for up to 1,000,000. The registry itself serves 60 cases per results page. 10
caseNumber string A full or partial case number, for example UPC-CFI-0003057/2026 or UPC_CoA_1/2024. not set
patentNumber string The European patent or application number a case is about, for example EP1996376. not set
patentName string The title of the patent, matched the way the registry matches it. not set
partyName string A claimant, defendant, applicant, respondent or proprietor on the record, for example Nokia. not set
partyTypeId string (6 options) Restrict the party name match to one role on the case. not set
casePhaseId string (5 options) Where the case stands in the procedure. not set
languageId string (10 options) The language the case is conducted in. not set
representative string The name of a representative on the record, for example Fuhrmann. not set
documentName string Matches the title of a document filed in the case, for example Statement of claim. not set
filedAfter string Date of formal receipt, as YYYY-MM-DD. The registry field is a real date input, so 01/06/2023 is silently discarded and 2023-06-01 works. not set
filedBefore string Date of formal receipt, as YYYY-MM-DD. not set
decidedAfter string Date of an order or decision in the case, as YYYY-MM-DD. not set
decidedBefore string Date of an order or decision in the case, as YYYY-MM-DD. not set
maxBrowsers integer The most browsers a run may open. The court's edge lets some exit addresses through and holds others, so a run trades a spent address for a fresh one up to this ceiling. Six launches were needed on one measured run. 12
challengeWaitSecs integer How long one address gets to clear the court's edge check before the run swaps it. Measured at 16 to 24 seconds when it clears at all, so a longer wait mostly buys idle time. 40
proxyConfiguration object The court's edge answers a direct container address far less often than a rotating one, so the Apify datacenter pool is on by default and every third browser reaches for a residential address instead. Measured 2026-09-08. {"useApifyProxy":true}

How much does the Unified Patent Court Scraper - UPC Cases & Parties cost?

from $4.53 per 1,000 results

Charged forWhat it isPrice each
result Single result in the default dataset. $0.00453 to $0.005

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

How do I call the Unified Patent Court Scraper - UPC Cases & Parties API?

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST · run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~unified-patent-court-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "actionTypeIds": [
      "450"
    ],
    "maxItems": 10,
    "maxBrowsers": 12,
    "challengeWaitSecs": 40,
    "proxyConfiguration": {
      "useApifyProxy": true
    }
  }'

What example inputs can I use?

Use these inputs to see how a run is configured.

input.json
{
  "actionTypeIds": [
    "450"
  ],
  "maxItems": 10,
  "maxBrowsers": 12,
  "challengeWaitSecs": 40,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}

What do users say about the Unified Patent Court Scraper - UPC Cases & Parties?

No reviews yet. Be the first.

How do I report an issue with the Unified Patent Court Scraper - UPC Cases & Parties?

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.

What related scrapers can I use?

Run Unified Patent Court Scraper - UPC Cases & Parties on Apify All scrapers