Scrapers

Dealroom European startups

Scrapes the filterable company list at app.europeanstartups.co via an anti-fingerprint browser with injected trial-account cookies. The surface is gated behind a premium trial; the operator must harvest fresh cookies from a logged-in browser session each run.

Updated today

Overview

At a glance
Worker
ultron-dealroom-european-startups
Runtime
Python, anti-fingerprint Firefox engine
Targets
app.europeanstartups.co filterable company list
Auth
Trial-account cookies (operator-supplied)
Defaults
100 companies per run, 3000 ms per scroll iteration
Proxy
Residential US (matches cookie origin)

Dealroom's European Startups database is the canonical source for European VC-funded company metadata: funding stage, total raised, growth stage, employee count, HQ location. The actor exists specifically to harvest filtered list views (e.g. "all Series A SaaS companies in Romania"), so the operator's filter selection in the trial UI defines the scope of each run.

Input schema

.actor/INPUT_SCHEMA.jsonjson
1{
2 "trialCookies": [
3 { "name": "session", "value": "...", "domain": ".europeanstartups.co" },
4 { "name": "csrftoken", "value": "...", "domain": ".europeanstartups.co" }
5 // ...all cookies from the logged-in session
6 ],
7 "listUrl": "https://app.europeanstartups.co/companies?status=active&stage=series_a",
8 "maxCompanies": 100, // 1 to 5000
9 "headless": true,
10 "proxyConfiguration": {
11 "useApifyProxy": true,
12 "apifyProxyGroups": ["RESIDENTIAL"],
13 "apifyProxyCountry": "US"
14 },
15 "requestDelayMs": 3000
16}

Trial cookies

How to harvest and rotate the session.

Warning
Trial accounts expire. The actor will run successfully against stale cookies for one or two pages and then start receiving redirects to the login form. Harvest cookies fresh per run; do not pin a single cookie set to a recurring schedule.
StepWhat to do
Log into app.europeanstartups.co with a trial accountFrom a clean profile or incognito session.
Open DevTools, Application, CookiesFilter to the europeanstartups.co domain.
Export the full cookie set as JSONEach entry needs name, value, domain. Path optional.
Paste into the actor input as trialCookiesTrigger the run within a few hours of harvest.
Rotate when the actor logs auth redirectsThe actor's run log surfaces a clear stale-session message.

Crawl flow

src/__main__.pypy
1# 1. Boot anti-fingerprint browser. Inject trialCookies via context.add_cookies().
2# 2. Navigate to listUrl. Wait for the list pane to render.
3# 3. Loop scroll iterations:
4# a. Scroll the list pane to the bottom.
5# b. Wait requestDelayMs + 50% jitter for new rows to lazy-load.
6# c. Read all rendered company rows. Dedupe by slug.
7# d. Stop when we have maxCompanies, or the list reports no more items,
8# or the row count plateaus for 3 iterations.
9# 4. For each scraped row, parse name, market, growthStage, funding,
10# valuation, hqLocation, employees. Push as kind="company".
11# 5. On any 302 to /login, abort the run with a clear stale-session error.

Output shape

dataset-row.jsonjson
1{
2 "kind": "company",
3 "source": "dealroom",
4 "slug": "linear-app",
5 "name": "Linear",
6 "market": "B2B SaaS",
7 "growthStage": "Late stage",
8 "funding": "Series C",
9 "totalRaisedUsd": 130000000,
10 "valuation": "1.25B USD (Mar 2024)",
11 "hqLocation": "San Francisco, US",
12 "employees": "100-250",
13 "founded": 2019,
14 "description": "Issue tracking for software teams...",
15 "scrapedAt": "2026-05-19T12:00:00Z"
16}

Webhook contract

actor.jsonjson
1{
2 "eventTypes": ["ACTOR.RUN.SUCCEEDED", "ACTOR.RUN.FAILED", "ACTOR.RUN.TIMED_OUT", "ACTOR.RUN.ABORTED"],
3 "requestUrl": "https://scraper-webhook.51ultron.com/apify",
4 "payload": { "actorName": "dealroom-european-startups", "source": "dealroom", "datasetId": "<id>" }
5}

File map

actors/dealroom-european-startups
.actor
actor.json
INPUT_SCHEMA.json
src
__main__.py
Dockerfile
requirements.txt
README.md