Skip to contents

Every match of a competition from the JSON-wrapped embed page (orgs whose plain pages answer 500).

Endpoint: GET https://hosted.dcd.shared.geniussports.com/embednf/{org}/en/competition/{comp_id}/schedule?roundNumber={round_number}

The same columns and rules as genius_schedule(), read from the /embednf/ {css, js, html} envelope.

Usage

genius_schedule_embed(org, comp_id, round_number = -1, return_parsed = TRUE)

Arguments

org

Genius ORG code of the league (ESAKE, CEBL, BNXT, SLB, ...); see genius_competitions().

comp_id

Genius competition id: one per org competition-season (comp_id of genius_competitions()), e.g. 49915.

round_number

Round to list; -1 (default) lists every round of the competition.

return_parsed

Parse into a tibble (default TRUE); FALSE returns the parsed body or page record (a list): data.json as served plus _request (the ids asked for), or the sdv-internal-refs capture shape of a page.

Value

A wehoop_data tibble (a zero-row tibble with these columns when Genius answers an empty valid page), or the raw list when return_parsed = FALSE:

col_nametypedescription
match_idintegerFrom the block id extfix_<id>. Genius match id: the {matchId} of data.json and /u/; one global sequence across every Genius customer (~0.3 M in 2016, ~2.9 M in Oct 2026)
link_match_idintegerMatch id of the block's /match/<id>/summary link; equals match_id (the capture refuses a page where it does not); null when the org hides match pages (FFBB)
comp_idintegerCompId of the match link, or of the team links when the org hides match pages (FFBB); equals the {compId} asked for. A 'To be determined' slot (no team or match link) takes the {compId} the page's other blocks prove
orgcharacterORG code of the match link (or the team links, as comp_id)
statuscharacterStatus from the block class STATUS_*: COMPLETE, SCHEDULED, POSTPONED, ...
date_timecharacterTip-off as displayed, 'Mon D, YYYY, h:mm AM' (local time, zone not stated); null when unscheduled
venue_idintegerGenius venue id (the /venue/{id} of hosted pages); null when the venue is plain text (FFBB)
venue_namecharacterVenue name as entered (local script)
home_team_idintegerHome team: Genius team id (warehouse key space, global across orgs and seasons; the /team/{id} of hosted pages, the tid of the widget, the teamId of data/competition). data.json carries no team id: join on name/code
home_team_namecharacterHome team full name
home_team_codecharacterHome team code (local script possible)
home_scoreintegerHome points; null before tip-off (typed integer only on a route whose 3 sampled rows were all played)
away_team_idintegerAway team: Genius team id (warehouse key space, global across orgs and seasons; the /team/{id} of hosted pages, the tid of the widget, the teamId of data/competition). data.json carries no team id: join on name/code
away_team_namecharacterAway team full name
away_team_codecharacterAway team code (local script possible)
away_scoreintegerAway points; null before tip-off (typed integer only on a route whose 3 sampled rows were all played)

Details

Access. The Genius hosts publish no robots.txt and no terms. CloudFront refuses datacenter IPs on the LiveStats and hosted hosts: from a server set options(wehoop.proxy = ...) or the GENIUS_PROXY environment variable to an http(s) proxy URL (never printed or logged). Requests are spaced at least one second apart per host; keep crawls slow and incremental. Some league sites (the NZ NBL) forbid AI crawlers in their own robots.txt, which does not cover these hosts. Unofficial use of a public source: payloads are not redistributed as release assets.

Org and season. Every competition is an ORG code plus a competition id (comp_id): genius_competitions() lists an org's competitions with the sdv END-year season (a START-year org lists 2025-26 as season 2026), genius_match_competition() maps a game to its competition, and data.json itself names no date, competition or season. The hosted ORG can differ from the LiveStats ORG of /u/ (NZNBL vs NZN). Match ids are one global sequence across every Genius customer. data.json carries no global team or player id: tno (1 or 2) and pno are in-game numbers; only finished games are read.

Errors (classed conditions, all inheriting wehoop_error): wehoop_no_data when Genius has nothing for the request (HTTP 404, the S3 AccessDenied 403, an empty 200 from the hosted host, an empty recent-games window, a schedule or widget with no matches); wehoop_bad_request for HTTP 400 / 422 or a URL that is not a Genius route (e.g. a non-numeric id); wehoop_asset_fetch when the answer is unknown: the CloudFront "Request blocked" 403, a rate limit or 5xx, the intermittent HTTP 500 "A website error has occurred" page (transient = TRUE: retry later), a dead connection, an error envelope, a cut-off page, an unfinished game, or a body for another match, competition or ORG.

 genius_schedule_embed(org = "HKS", comp_id = 49946)