NWSL Soccer APInwslsoccer.com ↗
Access NWSL match results, event-level data with xG, player statistics, and news articles via 4 endpoints. Covers goals, cards, assists, passing accuracy, and more.
What is the NWSL Soccer API?
The NWSL API gives developers access to 4 endpoints covering the National Women's Soccer League: news articles, season match listings, per-match event data, and detailed player statistics. The get_match_details endpoint returns event-by-event breakdowns — goals, cards, substitutions — alongside team-level expected goals (xG). The get_player_stats endpoint surfaces per-player metrics including goals, assists, xG, passing accuracy, and tackles across a full season.
curl -X GET 'https://api.parse.bot/scraper/e58759f6-a60d-41d8-9f14-20e3e617ca1e/get_news?limit=5' \ -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 nwslsoccer-com-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.
"""Walkthrough: NWSL API — news, season matches, match details, player stats."""
from parse_apis.nwsl_api import NWSL, SeasonId, MatchNotFound
client = NWSL()
# Latest news articles
for article in client.articles.list(limit=3):
print(article.title, article.url)
# Construct a season and list its matches
season = client.season(season_id=SeasonId.NWSL__FOOTBALL_SEASON__FAD050BEEE834DB88FA9F2EB28CE5A5C)
match = season.matches(limit=1).first()
# Drill into match details (events + xG) via the match instance
if match:
print(match.home.short_name, match.home_score, "-", match.away_score, match.away.short_name)
detail = match.details()
print(detail.xg_stats.home_xg, detail.xg_stats.away_xg)
for event in detail.events[:3]:
print(event.type, event.description)
# Player stats for the season
for player in season.player_stats(limit=3):
print(player.first_name, player.last_name, player.team.short_name, player.role_label)
# Typed error handling — attempt to fetch details on a match with bad data
try:
detail = match.details()
print(detail.match_id)
except MatchNotFound as exc:
print(f"Match not found: {exc.match_id}")
print("exercised: articles.list / season.matches / match.details / season.player_stats")
Extract latest news articles from the NWSL website. Returns article titles and URLs. Fields such as description, image_link, and date may be null depending on upstream data availability.
| Param | Type | Description |
|---|---|---|
| limit | integer | Number of news articles to retrieve. |
{
"type": "object",
"fields": {
"news": "array of news article objects with title, description, image_link, url, and date fields"
},
"sample": {
"data": {
"news": [
{
"url": "https://www.nwslsoccer.com/news/nwsl-announces-may-best-xi-of-the-month-presented-by-amazon-prime-x0098",
"date": null,
"title": "NWSL Announces May Best XI of the Month, Presented by Amazon Prime",
"image_link": null,
"description": null
}
]
},
"status": "success"
}
}About the NWSL Soccer API
Match Data and xG Statistics
The get_match_details endpoint takes a match_id (and optionally a season_id) and returns two main structures: an events array and an xg_stats object. Each event carries a type, time, description, label, and xg value — note that time and xg on individual events may be null depending on data availability. The xg_stats object provides home_xg and away_xg as numeric values for the full match. Match IDs follow the format nwsl::Football_Match::{hash} and can be retrieved from list_matches.
Season Schedules and Player Stats
The list_matches endpoint accepts a season_id parameter (e.g. nwsl::Football_Season::fad050beee834db88fa9f2eb28ce5a5c) and defaults to the current season when omitted. It returns a competition object with metadata — season name, competition ID, and date range — plus a matches array with each match's matchId, status, matchDateUtc, home/away team details, and scores. An invalid season_id will produce an upstream error rather than an empty result.
The get_player_stats endpoint returns a paginated players array. Each player object includes playerId, name, team info, position, and a stats array where each entry has a statsId, statsLabel, and statsValue. Supported stats span attacking (goals, assists, xG), distribution (passing accuracy), and defending (tackles). The limit parameter controls how many player records are returned.
News Coverage
The get_news endpoint retrieves recent NWSL news articles with title, description, image_link, url, and date fields. The description, image_link, and date fields may be null depending on how the article was published. A limit parameter controls the number of articles returned.
The NWSL Soccer API is a managed, monitored endpoint for nwslsoccer.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when nwslsoccer.com 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 nwslsoccer.com 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?+
- Build a live NWSL match tracker displaying goals and cards using the
eventsarray fromget_match_details. - Compare team attacking efficiency by plotting
home_xgvsaway_xgacross a full season's matches. - Create a player performance leaderboard ranked by xG, assists, or passing accuracy from
get_player_stats. - Populate a season fixture calendar using match dates, team names, and statuses from
list_matches. - Feed an NWSL news aggregator or alert system with article titles and URLs from
get_news. - Analyze substitution patterns and card frequency per team using typed events from match event arrays.
- Track a specific player's stats across multiple seasons by querying
get_player_statswith differentseason_idvalues.
| 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 NWSL have an official developer API?+
What does `get_match_details` return beyond the score?+
events array — each entry typed as a goal, card, or substitution — with time, description, label, and per-event xg values where available. It also returns an xg_stats object with aggregate home_xg and away_xg for the match. Note that time and xg on individual events can be null.How do I get a valid `match_id` or `season_id`?+
nwsl::Football_Match::{hash} and nwsl::Football_Season::{hash}. Season IDs and match IDs are returned by list_matches, which defaults to the current season if no season_id is passed. Passing an invalid season_id returns an upstream error rather than an empty response.Does the API cover historical seasons beyond the current one?+
list_matches and get_player_stats both accept a season_id parameter, so historical seasons can be queried as long as you have the corresponding season identifier. The get_news endpoint does not accept a date or season filter; it returns the most recent articles up to the specified limit.