๐ŸŽพ Flashscore Tennis Scores API avatar

๐ŸŽพ Flashscore Tennis Scores API

Pricing

from $0.84 / 1,000 tennis match delivereds

Go to Apify Store
๐ŸŽพ Flashscore Tennis Scores API

๐ŸŽพ Flashscore Tennis Scores API

Scrape Flashscore tennis fixtures, live score states, and results into clean JSON snapshots or NEW, UPDATED, and RESULT events with stable IDs and resume.

Pricing

from $0.84 / 1,000 tennis match delivereds

Rating

0.0

(0)

Developer

KazKN

KazKN

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Share

Flashscore Tennis API & Scores Scraper โ€” Stable Match Changes

Scrape Flashscore tennis fixtures, live score states, and results into clean JSON. Export a point-in-time snapshot or receive only deterministic NEW, UPDATED, and RESULT changes for dashboards, alerts, databases, and AI workflows.

Flashscore tennis scores exported as SNAPSHOT, NEW, UPDATED, and RESULT events with stable IDs

Click the hero to configure the private Actor.

Current status: the private fixture workflow is verified, and the private cloud live run returned 20 validated Flashscore rows with zero duplicates and a persisted checkpoint. This is one bounded run, not proof of continuous real-time coverage or long-term reliability. The benchmark-anchored per-result Pricing is described below. Public release is not active.

Choose the tennis feed you need

Your intentOutcome presetConcrete result
Export the matches visible in the selected scope now.snapshotOne deduplicated row per current match state.
Receive only changes since the previous successful run.deltaNEW, UPDATED, and RESULT rows; unchanged matches produce no row.

Use it as a tennis data API

  • Tennis scores API workflow โ€” call the Actor through the Apify API and receive normalized JSON instead of parsing Flashscore pages yourself.
  • Fixtures and results export โ€” select today or a bounded day offset, then filter by status, tour, tournament, or Flashscore tournament URL.
  • Match change monitoring โ€” reuse one monitorId and the delta preset to suppress unchanged states while preserving stable matchId and eventId values.

Is this an official Flashscore API?

No. It is an independent, point-in-time extraction from public Flashscore tennis pages, delivered through the Apify API. It does not provide an official Flashscore endpoint or a continuous socket feed.

Can I use it as a tennis scores API?

Yes, for scheduled snapshots, fixtures, results, and bounded change checks. Each run produces a Dataset that can be retrieved through the Apify API; complete match coverage and continuous real-time streaming are not claimed.

Configure the input

The form is split into four short sections. The defaults run a bounded delta feed for today's matches; change only the scope you need.

1๏ธโƒฃ Choose your result

  • preset โ€” use snapshot for every current match in scope, or delta for changes since the saved checkpoint.

2๏ธโƒฃ Name the saved feed

  • monitorId โ€” reuse the same 3โ€“64 character name on later delta runs. Use another name for an independent feed or workflow.

3๏ธโƒฃ Choose the matches

InputWhat it controlsDefault / limit
dayOffsetsDays relative to UTC today; rows without a source date remain included with matchDate: null.["0"]; -7 through 7
matchStatusesAll, scheduled, live, or finished matches.["all"]
toursATP, WTA, ITF, or Challenger labels found on the selected pages.No filter
tournamentsCase-insensitive tournament-name filters such as Wimbledon.No filter; maximum 25
startUrlsOptional HTTPS Flashscore tennis tournament pages; leave empty to use the main Flashscore tennis URL.Default page; maximum 10

4๏ธโƒฃ Set the result limit

  • maxItems โ€” maximum normalized Dataset rows for the whole run. The default is 100; the hard maximum is 1,000.
KazKN ยท Monitoring & intelligence suite ย ย โ€ขย ย Tennis changes, social signals, and resale intelligence
Flashscore Tennis Scores API logoย Tennis Scores
โžค You are here
Snapshots and stable match changes.
X Mentions Delta Monitor logoย X Monitor
New, deduplicated X mentions.
Vinted Smart Scraper logoย Vinted Smart
Compare markets, listings, and sellers.
Vestiaire Collective Smart Scraper logoย Vestiaire
Research luxury listings and sellers.

Copy to your AI assistant

Actor reference: kazkn/tennis-match-delta-feed.

Copy the complete prompt below with the code-block copy button:

Help me use the private Apify Actor kazkn/tennis-match-delta-feed as a Flashscore tennis scores API.
Outcome: return only tennis match changes with stable IDs, using a bounded input of today, all match statuses, and at most 100 Dataset rows.
Use this Python pattern:
from os import environ
from apify_client import ApifyClient
token = environ["APIFY_API_TOKEN"]
client = ApifyClient(token)
run = client.actor("kazkn/tennis-match-delta-feed").call(run_input={
"preset": "delta",
"monitorId": "my-tennis-feed",
"dayOffsets": ["0"],
"matchStatuses": ["all"],
"tours": [],
"tournaments": [],
"startUrls": [],
"maxItems": 100,
})
dataset_id = run["defaultDatasetId"]
items = list(client.dataset(dataset_id).iterate_items())
Summarize NEW, UPDATED, and RESULT rows. Preserve eventId, matchId, stateHash, matchStatus, tournamentName, player names, score fields, and sourceUrl so my system can upsert safely.
Actor build specification: https://docs.apify.com/platform/actors/development/actor-definition/actor-json
Create or manage the token: https://console.apify.com/settings/integrations
Read the token only from the APIFY_API_TOKEN environment variable. Do not ask me to paste, reveal, log, or share it.

Never paste or share the real token in a prompt, chat, source file, screenshot, or support message.

Runnable API pattern

: "${APIFY_API_TOKEN:?Set APIFY_API_TOKEN in your shell environment}"
RUN_RESPONSE="$(curl -fsS --request POST \
"https://api.apify.com/v2/acts/kazkn~tennis-match-delta-feed/runs?waitForFinish=120" \
--header "Authorization: Bearer ${APIFY_API_TOKEN}" \
--header "Content-Type: application/json" \
--data '{"preset":"delta","monitorId":"my-tennis-feed","dayOffsets":["0"],"matchStatuses":["all"],"tours":[],"tournaments":[],"startUrls":[],"maxItems":100}')"
DATASET_ID="$(jq -r '.data.defaultDatasetId' <<<"${RUN_RESPONSE}")"
test -n "${DATASET_ID}" && test "${DATASET_ID}" != "null"
curl -fsS \
"https://api.apify.com/v2/datasets/${DATASET_ID}/items?clean=true&format=json" \
--header "Authorization: Bearer ${APIFY_API_TOKEN}"

What this Actor reads

Live source: Flashscore only. User-supplied and final page URLs are restricted to HTTPS on flashscore.com and its subdomains. During browser rendering, the egress allowlist additionally permits only Flashscore's observed internal feed host global.flashscore.ninja; it is never accepted as a user startUrl. A deterministic fixture source is used only for private tests and the bounded canary.

SourceCurrent behavior
https://www.flashscore.com/tennis/Default target when no tournament URL is supplied.
Flashscore tournament URLsOptional startUrls; every URL is host-validated before the request.
JSON source envelopesThe adapter accepts arrays or the keys matches, events, or data, then validates every match.
Other websitesThe Actor does not scrape ATP, WTA, ITF, Tennis Explorer, SofaScore, or ESPN. Tour names are filters, not additional source websites.

The normal Flashscore HTML page is rendered in a bounded browser because its initial HTML shell does not contain the match rows. All third-party browser requests are blocked, and the Actor does not replay the signed internal feed. Bot challenges, redirects, malformed responses, one-byte responses, more than 32 captured JSON responses, more than 20 MiB of captured JSON in total, more than 10 rendered pages, a live collection deadline above 150 seconds, and source batches above 1,000 records fail closed. In one bounded private cloud run, the private cloud live run returned 20 validated Flashscore rows with zero duplicates and a persisted checkpoint. That single observation does not certify continuous availability, completeness, or long-term reliability.

How it works

  1. Read โ€” fetch and render the default Flashscore tennis URL or supplied tournament URLs after input, host, egress, timeout, size, page-count, and billing preflight checks.
  2. Normalize โ€” validate players, status, tournament, score, sets, and source URLs; preserve only source-provided match dates, merge overlapping day pages, and convert field ordering into a stable schema.
  3. Compare โ€” load the Actor-isolated checkpoint for monitorId, calculate matchId and stateHash, and suppress unchanged matches.
  4. Deliver โ€” write SNAPSHOT, NEW, UPDATED, or RESULT rows to the run Dataset with a deterministic eventId.
  5. Checkpoint โ€” after Dataset delivery, save the delivered match state in the named Key-Value Store so the next delta run continues from the correct state.

A per-feed single-flight lease rejects overlapping runs. If a crash occurs between Dataset delivery and checkpoint persistence, the same deterministic eventId can be replayed; downstream systems should upsert on eventId.

Delta semantics

EventMeaning
SNAPSHOTCurrent normalized match state; does not advance the delta checkpoint.
NEWThe match was not present in the saved feed state.
UPDATEDStatus, score, sets, or other normalized match fields changed.
RESULTA changed match state is observed as FINISHED; later finished-state corrections can also produce RESULT.

Stable identifiers:

  • matchId identifies a match from the source ID, or a bounded deterministic fallback when the source ID is absent.
  • stateHash identifies the normalized state of that match.
  • eventId identifies the exact matchId + event type + state combination.

Dataset output

Every row follows KAZKN_TENNIS_MATCH_DELTA_V1. Important fields include:

  • identity: eventType, eventId, matchId, identityQuality, sourceMatchId;
  • match: matchDate, matchStatus, matchType, players, tournament, round, and surface;
  • score: sets won, set scores, current server, current game score, winner, and result type;
  • change metadata: previousStateHash, stateHash, changedFields, and observedAt.

Field excerpt from the verified private fixture:

Only representative fields are shown below. Every actual Dataset row contains all fields required by KAZKN_TENNIS_MATCH_DELTA_V1.

{
"schemaVersion": "KAZKN_TENNIS_MATCH_DELTA_V1",
"recordType": "tennis_match_event",
"eventType": "NEW",
"eventId": "484ce922f7f63385489df73b4dd7bbaeaae3458846b95793944e7c60c2edf7bc",
"matchId": "5c43b811696c37eaf1ac7fc5b7609334685877637ba5f8b534bb8b94d5e79512",
"sourceName": "fixture",
"sourceMatchId": "match-1001",
"matchStatus": "SCHEDULED",
"tournamentName": "Example Open",
"previousStateHash": null,
"stateHash": "5270dc3c1535a832130b8010508d6a28a42f18666bcd40529a556b59c4240662",
"changedFields": []
}

Field excerpt from the deterministic score-change sequence:

{
"schemaVersion": "KAZKN_TENNIS_MATCH_DELTA_V1",
"recordType": "tennis_match_event",
"eventType": "UPDATED",
"eventId": "849b43dfd882ac0265be1646e0b5ad0f0297a957b92a1d67835d247a4d468af0",
"matchId": "5c43b811696c37eaf1ac7fc5b7609334685877637ba5f8b534bb8b94d5e79512",
"sourceName": "fixture",
"sourceMatchId": "match-1001",
"matchStatus": "LIVE",
"tournamentName": "Example Open",
"changedFields": [
"currentGameScoreAway",
"currentGameScoreHome",
"currentServer",
"matchStatus",
"sets",
"setsWonAway",
"setsWonHome"
],
"observedAt": "2026-08-09T17:00:32.000Z"
}

Verified private runtime vs. not yet verified

Verified private runtime evidenceNot yet verified
Input, Dataset, output, and storage schemasMulti-run live reliability and complete match coverage
Stable IDs, deduplication, delta events, checkpoint, and overlap lockContinuous real-time streaming
Local one-day rendered Flashscore extraction with singles, doubles, sets, tie-breaks, unique IDs, and no replayA 3 fixtures ร— 3 repeats live wedge benchmark
One private cloud live run returned 20 validated Flashscore rows, zero duplicates, and a persisted checkpointPayer demand, durable creator revenue, or production margin
Zero creator billing in fixture mode; platform usage is non-zero and capped at $0.01Production browser cost and failure-rate distribution

Pricing and publication

The public comparator extractify-labs/flashscore-tennis-matches was read back on 2026-08-10 at $0.001 per Dataset result ($1.00 / 1,000) plus $0.00005 at Actor start. This Actor uses one paid event displayed as Tennis match delivered, counted once per validated Dataset row, with no start fee. The legacy internal event key is retained only so this user-positive price decrease can apply immediately instead of creating a new paid event with a 14-day notice period. Until its operational wedge is proven in cloud live runs, the Free price stays 10% below that comparator; subscription tiers extend the discount to 20%.

Apify planPrice per delivered matchPrice per 1,000Discount vs. comparator
Free$0.00090$0.9010%
Bronze$0.00088$0.8812%
Silver$0.00086$0.8614%
Gold$0.00084$0.8416%
Platinum$0.00082$0.8218%
Diamond$0.00080$0.8020%

Empty, failed, unchanged, duplicate-only, and private fixture cycles are not charged. Platform usage is included rather than added to the user's bill. One paid private cloud live cycle passed with 20 delivered rows; this is not proof of durable margin or multi-run reliability. The Actor remains private. This README does not authorize publication.