PSL APIpsl.co.za ↗
Access South African Premier Soccer League data via API. Get fixtures, live scores, results, standings, match details, news, and club info from psl.co.za.
What is the PSL API?
The PSL API exposes 9 endpoints covering the South African Premier Soccer League, returning fixtures, live scores, results, standings, and full match details from psl.co.za. The get_match_details endpoint is particularly deep, surfacing per-match stats, starting lineups, substitutes, and commentary events for any completed match. Tournament filtering is available on most endpoints via a slug parameter such as betway-premiership.
curl -X GET 'https://api.parse.bot/scraper/0c2008df-2286-497a-a5cb-55dd56ec9a4e/get_fixtures?team=Orlando+Pirates&tournament=betway-premiership' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace psl-co-za-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""PSL South Africa — fixtures, results, standings, news, and match details."""
from parse_apis.psl_premier_soccer_league_api import PSL, Tournament_, NotFound
client = PSL()
# Get league standings for the Betway Premiership using the enum
premiership = client.tournament(name=Tournament_.BETWAY_PREMIERSHIP)
for team in premiership.standings(limit=5):
print(team.club, team.pts, team.played)
# Get recent results filtered by team
for result in premiership.results(team="Orlando Pirates", limit=3):
print(result.date, result.home_team, result.score, result.away_team)
# Drill into match details from a result
first_result = premiership.results(limit=1).first()
if first_result:
match = first_result.details()
print(match.home_team, match.score, match.away_team, match.venue)
for stat in match.stats:
print(stat.stat, stat.home, stat.away)
# Browse latest news and read the first article
article_summary = client.articlesummaries.list(limit=1).first()
if article_summary:
try:
article = article_summary.full_article()
print(article.title, article.date, article.body[:100])
except NotFound as exc:
print(f"Article no longer available: {exc}")
# List all clubs
for club in client.clubs.list(limit=5):
print(club.name, club.division)
print("Exercised: standings, results, match details, news list, full article, clubs list")
Retrieve upcoming match fixtures for a given tournament. Returns all scheduled matches with dates, times, teams, and venues. May return an empty array when no fixtures are scheduled (e.g., end of season).
| Param | Type | Description |
|---|---|---|
| team | string | Filter fixtures by team name (exact match, case-insensitive) |
| tournament | string | Tournament slug |
{
"type": "object",
"fields": {
"fixtures": "array of fixture objects with date, time, home_team, away_team, venue, tournament"
},
"sample": {
"data": {
"fixtures": []
},
"status": "success"
}
}About the PSL API
Fixtures, Results, and Standings
The get_fixtures and get_results endpoints both accept optional team (case-insensitive exact match) and tournament slug parameters. Fixtures return date, time, home_team, away_team, venue, and tournament. Results extend this with a score field and a match_id slug — the identifier required by get_match_details. The get_standings endpoint returns a full log table with pos, club, played, won, drawn, lost, gf, ga, gd, and pts for every team in the specified tournament.
Match Details and Live Scores
get_match_details takes a match_id slug (e.g., 2593617-ts-galaxy-vs-mamelodi-sundowns) sourced from get_results and returns structured stats (an array of stat objects with stat, home, away values), lineups broken into starting and substitutes arrays for both home and away sides, a commentary event array, and the final score. get_live_scores requires no inputs and returns an array of live match objects when matches are in progress, or an empty array plus a status message when none are live.
News and Club Data
get_news_list returns article summaries with id, title, date, url, and thumbnail. Pass the article id slug to get_news_article to retrieve body, date, title, and an images array for the full piece. get_clubs_list enumerates all clubs from the site navigation, returning each club's name, division, and url. The search_items endpoint accepts a query string but may be temporarily unavailable depending on the source site's current state.
The PSL API is a managed, monitored endpoint for psl.co.za — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when psl.co.za changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official psl.co.za API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Display upcoming Betway Premiership fixtures filtered by a specific club in a fan app.
- Build a match-day dashboard showing live PSL scores without polling the PSL website directly.
- Populate a league table widget with standings including goal difference and points from
get_standings. - Retrieve full lineups and per-match stats from
get_match_detailsfor post-match analysis tools. - Aggregate PSL news thumbnails and headlines into a sports content aggregator using
get_news_list. - List all PSL clubs by division using
get_clubs_listto seed a team selection UI. - Track head-to-head results between two clubs by filtering
get_resultsby team name.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does psl.co.za have an official developer API?+
How do I get detailed stats and lineups for a specific match?+
get_results (optionally filtered by team or tournament) to retrieve the match_id slug for the match you want. Pass that slug to get_match_details, which returns stats (an array of home/away stat pairs), lineups with starting and substitutes for both sides, and a commentary event array.Does `get_live_scores` return data only during match windows?+
live_matches array alongside a descriptive message field. Live data only populates during active match periods.