Sourcelane

Tennis Scraper

Sports Data

Operated by Sourcelane✓ verified

A web-scraping connector that aggregates tennis data from TennisExplorer, Flashscore and SofaScore into structured exports (JSON, CSV, Excel). It extracts fixtures and results, per-bookmaker odds history with timestamped opening and movement across markets (match winner, over/under, Asian handicap, correct score), match-level and match-detail data (set-by-set scores, tiebreaks, structured final scores), live and pre-match odds, point-by-point sequences with serving player, multi-match statistics (aces, double faults, break points, service/return points), player profiles and bios (rankings, age, height/weight, nationality, prize money, career and per-season win/loss by surface, titles), head-to-head records with every mutual match, and ATP/WTA ranking snapshots over time. The connector supports multiple modes (fixtures, results, match details, players, head-to-head, rankings, search) and can route TennisExplorer URLs automatically.

Verified Sep 28, 3:55 AM

$0.004

per result

Up to 100 per call. Only pay for results returned; failed calls are refunded.

What people use it for

Trust & reliability

7d uptime trend
WindowUptimeSuccess ratep50p95Calls
24h————0
7d————0
30d————0

Calling contract

Call it through Sourcelane's gateway or MCP server. We run the connector, apply your agent's spend guardrails, and bill only the results returned.

Call it via Sourcelane

curl -X POST https://api.usesourcelane.com/v1/call \
  -H "Authorization: Bearer sl_live_your_agent_key" \
  -H "Content-Type: application/json" \
  -d '{"listing":"flashscore-sofascore-tennis-scraper","params":{"maxItems":5},"maxResults":10}'

Request params

FieldTypeRequiredDescription
sourcestringoptionalWhich site to read. TennisExplorer: fixtures, results, per-bookmaker odds history, player profiles, head-to-head, rankings, player search — no proxy needed. Flashscore: one request per day of fixtures/results (±7 days) with surfaces and set scores — no proxy needed. SofaScore: live matches, match statistics, point-by-point, odds, player profiles and rankings — uses a residential proxy automaticall
modestringoptionalfixtures = upcoming matches with odds (today by default; SofaScore returns its live feed), results = finished matches with scores and closing odds (yesterday by default), matchDetails = deep per-match records (TennisExplorer: per-bookmaker odds history; SofaScore: statistics, point-by-point, odds), players = player profiles, h2h = head-to-head records (TennisExplorer), rankings = ATP/WTA tables, s
startUrlsarrayoptionalAny tennisexplorer.com URLs: /matches/, /next/, /results/, /match-detail/?id=…, /player/{slug}/, /mutual/{a}/{b}/, /ranking/… or /list-players/…. Each URL is auto-classified and routed to the right parser. Leave empty to use Mode instead.
tourTypestringoptionalWhich tournaments to include: both tours, or a single tour, singles or doubles.
dateFromstringoptionalFirst day to scrape. Defaults: fixtures = today, results = yesterday. Fixtures for past dates are served from the results pages. Flashscore covers today ±7 days.
dateTostringoptionalLast day, inclusive. Defaults to Date from (a single day). Ranges are capped at 62 days per run.
matchIdsarrayoptionalTennisExplorer numeric match ids (e.g. 3290771) or /match-detail/?id=… URLs — take them from the matchId field of fixtures/results rows. With source = SofaScore, pass SofaScore event ids instead.
includeOddsHistorybooleanoptionalKeep the full per-bookmaker odds movement — every price change with timestamp plus the opening price — on match-detail rows, across Home/Away, Over/Under, Asian Handicap and Correct Score. Turn off for lighter rows with current + opening odds only.
includeRecentFormbooleanoptionalKeep each player's recent-matches block on match-detail rows.
playerSlugsarrayoptionalFor the players mode: TennisExplorer slugs like djokovic or full /player/… URLs (find slugs with the searchPlayers mode). With source = SofaScore, pass SofaScore team ids, slugs like alcaraz-carlos, or player names.
h2hPairsarrayoptionalFor the h2h mode. One pair per line: djokovic vs alcaraz-5ab70, djokovic, alcaraz-5ab70 or a full /mutual/…/…/ URL.
searchQuerystringoptionalFor the searchPlayers mode: part of a player's name, case-insensitive (e.g. alcaraz). Returns matching players with their slugs/ids and current rank.
rankingTourstringoptionalWhich ranking to walk in rankings mode.
rankingDatestringoptionalHistorical weekly snapshot to read (Mondays), TennisExplorer only. Leave empty for the latest ranking.
maxItemsintegeroptionalGlobal cap on results rows for the run. You are billed per row, so this is your spend guard. Capped at 100 per call.
maxConcurrencyintegeroptionalParallel page fetches. 10 is a good default; raise it for large matchDetails batches.
sofaMaxTournamentsintegeroptionalReserved for SofaScore day fan-out. Currently SofaScore fixtures return the live feed in a single request, so this setting has no effect.

Each result contains

FieldTypeDescription
typestringType
sourcestringSource
slugstring—
playerUrlstring—
namestring—
countrystringCountry
heightCminteger—
weightKginteger—
ageinteger—
birthdatestring—
sexstring—
playsstring—
rankSinglesobject—
rankDoublesobject—
photoUrlstring—
nextMatchnull—
careerBalanceobject—
seasonBalancearray—
careerBalanceDoublesobject—
seasonBalanceDoublesarray—
titlesarray—
titlesDoublesarray—
injuriesarray—
sourceUrlstringSource Url
scrapedAtstringScraped At

Use Tennis Scraper from Claude, ChatGPT or Cursor

Pick your tool and connect in under a minute. Then just ask — for example: “What are the current odds for this weekend's Premier League matches?”

Connect Claude

Web, desktop and mobile. Paste one URL.

  1. 1Copy your personal connector URL
  2. 2In Claude open Settings → Connectors → Add custom connector
  3. 3Paste the URL and click Add — done
Manual setup (config files, REST, Python) +

Claude Code

Adds the Sourcelane MCP server with your key as a header.

terminal
claude mcp add --transport http sourcelane https://api.usesourcelane.com/mcp \
  --header "Authorization: Bearer sl_live_your_agent_key"

Claude Desktop (config file)

Alternative to the connector URL: add to claude_desktop_config.json, then restart Claude.

claude_desktop_config.json
{
  "mcpServers": {
    "sourcelane": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.usesourcelane.com/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer sl_live_your_agent_key"
      }
    }
  }
}

Cursor & Windsurf

Add to ~/.cursor/mcp.json (or Windsurf's mcp_config.json).

mcp.json
{
  "mcpServers": {
    "sourcelane": {
      "url": "https://api.usesourcelane.com/mcp",
      "headers": {
        "Authorization": "Bearer sl_live_your_agent_key"
      }
    }
  }
}

VS Code

Save as .vscode/mcp.json. VS Code prompts for your key once.

.vscode/mcp.json
{
  "servers": {
    "sourcelane": {
      "type": "http",
      "url": "https://api.usesourcelane.com/mcp",
      "headers": {
        "Authorization": "Bearer ${input:sourcelane-key}"
      }
    }
  },
  "inputs": [
    {
      "type": "promptString",
      "id": "sourcelane-key",
      "description": "Sourcelane agent key",
      "password": true
    }
  ]
}

ChatGPT Custom GPT (Actions)

Create a GPT → Actions → Import from URL, then Authentication: API Key, Bearer.

OpenAPI schema URL
https://usesourcelane.com/openapi.json

REST

One POST. Pass maxResults to cap cost.

curl
curl -X POST https://api.usesourcelane.com/v1/call \
  -H "Authorization: Bearer sl_live_your_agent_key" \
  -H "Content-Type: application/json" \
  -d '{"listing":"flashscore-sofascore-tennis-scraper","params":{"maxItems":5},"maxResults":10}'

Python, LangChain, CrewAI, OpenAI Agents SDK…

Wrap the REST call as a tool, or point an MCP client at the endpoint.

python
import requests

res = requests.post(
    "https://api.usesourcelane.com/v1/call",
    headers={"Authorization": "Bearer sl_live_your_agent_key"},
    json={
        "listing": "flashscore-sofascore-tennis-scraper",
        "params": {"maxItems":5},
        "maxResults": 10,
    },
    timeout=300,
)
body = res.json()
print(body["receipt"]["chargedMicros"], "micro-USD for", body["receipt"]["results"], "results")
print(body["data"])

Reviews

—

0 reviews

5
0
4
0
3
0
2
0
1
0

Leave a review

Loading reviews…