
Congress Stock Trades Scraper
scrape.ly/store/querystone/congress-trades-scraperNewsBusiness
3 monthly users

Scrape public Transfermarkt player profiles, club squads, and competition tables. Player facts, transfer history, squad lists, and league tables come back as one row per page.
Turn public Transfermarkt pages into structured football data: player profiles with transfer history, full club squads with market values and contracts, and competition tables. No login and no API key. Result fee: $0.0001 per page, which is $0.10 per 1,000 pages.
playerId and profileUrl, and table rows carry clubId and clubUrl.| Field | Key | Description |
|---|---|---|
| Start URLs | startUrls | Public Transfermarkt player, club squad, or competition pages. |
| Maximum pages | maxResults | Stop after this many dataset rows. Default 10. |
| Link depth | crawlDepth | 1 saves the start pages only. Higher values follow player, club, and competition links (1 to 5). |
| Pagination depth | pageDepth | 1 saves the first page of a paginated list. Higher values follow numbered pages. |
| Proxy configuration | proxyConfiguration | Datacenter by default. |
{
"startUrls": [
{ "url": "https://www.transfermarkt.com/fc-vaduz/kader/verein/163" }
],
"maxResults": 10,
"crawlDepth": 1,
"pageDepth": 1,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": ["DATACENTER"]
}
}
One row per page. The shape depends on type.
| Field | Description |
|---|---|
type, id, name, url, givenUrl | Page type (such as player or club), its id, name, and the URL |
players | On a club page: the squad with number, name, position, age, nationality, contract, market value, playerId, profileUrl |
clubs | On a competition page: the table rows with clubId and clubUrl |
| Profile facts | On a player page: date and place of birth, height, citizenship, position, foot, agent, current club, joined, contract expiry |
transfers | On a player page: season, date, left, joined, market value, and fee |
careerStats | Currently always empty |
Example player item (trimmed):
{
"givenUrl": "https://www.transfermarkt.com/john-smith/profil/spieler/1",
"url": "https://www.transfermarkt.com/john-smith/profil/spieler/1",
"id": "1",
"type": "player",
"name": "John Smith",
"Date of birth/Age": "01/01/1998 (28)",
"Place of birth": "Springfield",
"Height": "1,86 m",
"Citizenship": "Germany",
"Position": "Goalkeeper",
"Foot": "right",
"Current club": "FC Vaduz",
"Joined": "01/07/2024",
"Contract expires": "30/06/2029",
"transfers": [
{
"Season": "24/25",
"Date": "01/07/2024",
"Left": "Greuther Fürth",
"Joined": "FC Vaduz",
"MV": "€200.00k",
"Fee": "Free Transfer"
}
],
"careerStats": []
}
A club row holds the squad in players, for example { "#": "1", "Player": ["John Smith", "Goalkeeper"], "Age": "28", "Nat.": "Germany", "Contract": "30/06/2027", "Market value": "€400k", "playerId": "1" }.
$0.0001 per page saved ($0.10 per 1,000 pages). Platform usage is billed on top at standard rates: compute $0.30 per GB-hour and datacenter proxy $1 per GB. Because a page can hold a whole squad or table, the platform usage is usually larger than the page fee.
Worked example: scraping one club squad cost about $0.002 in total in our measured run, including the $0.0001 page fee, compute, proxy traffic, and storage.
The actor reads only public pages. Check Transfermarkt's terms of use and your local law, especially if you plan to republish data.
No login. Datacenter proxies are used by default and billed per GB.
As many as you set in Maximum pages. A squad or a league table is one row.
An unknown player URL returns a skeleton row with id 0, empty transfers, and empty career stats. Facts that a profile does not list are empty.
Yes. Use Schedules for recurring snapshots, or call the REST API and read the dataset in any format.
careerStats stays empty.€400k and 30/06/2029, not numbers or ISO dates.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayRequiredStart URLs
Public Transfermarkt pages. Player profiles, club squads, and competition tables work best. One dataset row is saved per page.
maxResultsintegerOptionaldefault 10Maximum pages
Stop after this many dataset rows. A squad or a league table is one row.
How far to follow links from the start pages. Pagination is separate from those links.
crawlDepthintegerOptionaldefault 1Link depth
1 saves the start pages only. Each extra level follows player, club, and competition links in the main table.
pageDepthintegerOptionaldefault 1Pagination depth
1 saves the first page of a paginated list. Higher values follow the numbered page links.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Proxy used for Transfermarkt pages and the site's public data feeds.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| type | string | |
| name | string | |
| id | string | |
| url | string | |
| givenUrl | string | |
| players | array | |
| clubs | array | |
| transfers | array | |
| careerStats | array | |
| data | array |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One scraped Transfermarkt page. | $0.0001 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('querystone/transfermarkt-scraper').call({
"startUrls": [
{
"url": "https://www.transfermarkt.com/fc-vaduz/kader/verein/163"
}
],
"maxResults": 10,
"crawlDepth": 1,
"pageDepth": 1,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run querystone/transfermarkt-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=querystone/transfermarkt-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Players from a club squad page with market values.
Data from a competition page.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.