Structured Esports Match Schedule & Tournament Scraper avatar

Structured Esports Match Schedule & Tournament Scraper

Under maintenance

Pricing

$10.00 / 1,000 structured esports match records

Go to Apify Store
Structured Esports Match Schedule & Tournament Scraper

Structured Esports Match Schedule & Tournament Scraper

Under maintenance

Extract high-confidence Valorant, LoL, CS2, and Dota 2 match rows from public schedule pages that expose explicit structured data attributes.

Pricing

$10.00 / 1,000 structured esports match records

Rating

0.0

(0)

Developer

Blake Panter

Blake Panter

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 days ago

Last modified

Share

Extract auditable Valorant, LoL, CS2, and Dota 2 match rows from compatible public schedule pages. Every paid result includes teams, match time, tournament context, source evidence, and a deduplication key.

Compatibility requirement: This is not a universal esports-site scraper. A match row must be server-rendered and expose explicit data-team-a, data-team-b, data-match-time, and data-game attributes inside a supported match container.

Will my page work?

A compatible row looks like this:

<article
data-esports-match="true"
data-team-a="G2 Esports"
data-team-b="Paper Rex"
data-match-time="2026-07-05T18:00:00Z"
data-game="Valorant"
data-event="Example Masters"
data-stage="Semifinal"
data-status="scheduled"
>
G2 Esports versus Paper Rex
</article>

The container must have either data-esports-match="true" or data-match, plus all four required team, time, and game attributes. data-game must identify one of the supported games:

  • Valorant
  • League of Legends or LoL
  • Counter-Strike or CS2
  • Dota 2

data-event, data-stage, and data-status are optional. If data-event is absent, the Actor derives tournament context from page metadata, the first heading, the page title, or the hostname.

Generic tables, bracket markup, .match elements, and text such as “A vs B” are not enough. JavaScript-only rows added after page load are not supported. Test a target with a small run before scheduling production work.

Buyer workflows

Use qualified rows for:

  • Publisher-owned schedule syndication and tournament pages
  • CMS or spreadsheet exports for editorial teams
  • QA feeds that verify structured schedule markup
  • Community calendars, match alerts, and downstream data pipelines

Quick start

  1. Confirm that the public page uses the HTML contract above.
  2. Add one or more pages to startUrls.
  3. Run the Actor and export the dataset as JSON, CSV, or another Apify-supported format.
{
"startUrls": [
{ "url": "https://example.com/esports/schedule" }
],
"maxItems": 25,
"requestTimeoutSecs": 30
}

startUrls is required and accepts 1–25 credential-free public HTTP(S) pages. maxItems is bounded from 1–500; requestTimeoutSecs is bounded from 5–120 seconds.

Output

{
"game": "Valorant",
"eventName": "Example Masters",
"teamA": "G2 Esports",
"teamB": "Paper Rex",
"matchTime": "2026-07-05T18:00:00Z",
"stage": "Semifinal",
"status": "scheduled",
"confidence": "high",
"evidenceSnippet": "G2 Esports versus Paper Rex",
"sourceUrl": "https://example.com/esports/schedule",
"detectedAt": "2026-08-26T12:00:00.000Z",
"dedupeKey": "example-masters|g2-esports|paper-rex|2026-07-05t18-00-00z"
}

The example documents the schema; it does not assert a current match. evidenceSnippet and sourceUrl make each record auditable, while detectedAt records extraction time and dedupeKey supports downstream deduplication.

A row is emitted only when it contains two distinct plausible teams, a recognized game, a valid explicit time value, tournament context, and source evidence. Match times may be a parseable date/time or the explicit values today, tomorrow, or live.

Pricing

The Actor costs $0.01 per qualified match row. Unsupported pages, navigation elements, generic versus text, and other rejected candidates are not emitted or charged. maxItems and your Apify pay-per-event charge limit bound paid output.

Limits and safety

  • Only credential-free public HTTP(S) URLs on standard ports are accepted.
  • Loopback, private, link-local, reserved, local-name, and unsafe redirect destinations are rejected.
  • Responses above 500 KB are rejected rather than partially parsed.
  • Pages must return server-rendered compatible HTML; the Actor does not execute page JavaScript.
  • Arbitrary bracket extraction and universal compatibility with esports websites are not supported.

API, schedules, webhooks, and MCP

Start a run with the Apify API using the same input:

curl -X POST \
"https://api.apify.com/v2/acts/nintendo424~gaming-esports-schedule-extractor/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://example.com/esports/schedule"}],"maxItems":25}'

For recurring feeds, create an Apify schedule for this Actor. Attach a webhook to run-success events to notify your calendar, CMS, or automation endpoint, then read the run's default dataset. In an Apify MCP client, run nintendo424/gaming-esports-schedule-extractor with the same startUrls, maxItems, and optional requestTimeoutSecs input—compatibility requirements remain unchanged across interfaces.

Local verification

npm ci
npm run lint
npm test
npm run typecheck
npx --yes apify-cli validate-schema

Production uses Node.js 24, npm 12.0.2, a committed npm lockfile, and Oxc (oxlint).