Developer API
A simple, read-only REST API that lets your own website display your organization's live schedule, scores, standings and practice schedules. Authenticate with one key, get clean JSON back. No player data is ever exposed.
Getting started
- Open Settings → Public API in the intelliHoops admin app (organization admins only).
- Turn on Enable public API.
- Click Generate key and copy it — it's shown only once.
- Send that key in the
X-API-Keyheader on every request.
Authentication
Every request must include your API key in the X-API-Keyheader. Keys are scoped to a single organization, so a key can only ever read its own org's data.
Base URL:
https://api.intellihoops.com/api/public/v1
Example request:
curl -H "X-API-Key: ih_live_your_key_here" \ https://api.intellihoops.com/api/public/v1/schedule?seasonId=SEASON_ID
Responses & conventions
- • Successful responses wrap the payload in a
{ "data": … }envelope. - • Every endpoint is GET and read-only, except the two newsletter doors, which only ever add a subscriber and answer the same for any address.
- • The API is versioned under
/v1. Breaking changes ship as a new version. - • CORS is open, so you can call it directly from your website's JavaScript or from your backend.
- • Requests are rate limited per key; keep a light polling interval (e.g. every 30–60s).
Example response body:
{
"data": [
{
"id": "…",
"status": "completed",
"scheduledAt": "2026-04-12T17:00:00.000Z",
"homeTeamName": "Thunder U12",
"awayTeamName": "Wolves U12",
"homeScore": 48,
"awayScore": 41,
"venueName": "Community Center"
}
]
}Endpoints
/orgYour organization's public profile (name, slug, logo, colors, website).
/programsYour programs (id, name, type, gender, level).
/seasonsSeasons with dates and active/archived status.
/divisionsDivisions with age/grade eligibility.
seasonId— Optional. Limit to one season.
/teamsTeams (name, logo, division, gender). No rosters or member data.
seasonId— Optional. Teams in this season.divisionId— Optional. Teams in this division.
/venuesVenues (name, city, state). No street addresses.
/scheduleGames & results with team, venue, and division names resolved, plus links to the game video and the scanned box score when your club has filed them. Tournament games also carry clubSide — whether your team was home or away.
seasonId— Optional. Filter by season.divisionId— Optional. Filter by division.teamId— Optional. Games for one team (home or away).from— Optional. YYYY-MM-DD lower bound (UTC).to— Optional. YYYY-MM-DD upper bound (UTC).limit— Optional. 1–500, default 100.
/games/:gameIdA single game / scoreboard.
/standingsComputed standings (wins, losses, points for/against, differential).
divisionId— Required. The division to rank.
/practice-schedulesEach team’s recurring weekly practice slots (weekday, start and end as wall-clock times in your org’s timeZone from /org, venue, court, practice type). Blocks that have already ended are left out unless you ask.
seasonId— Optional. Schedules in this season.teamId— Optional. One team’s schedules.includeEnded— Optional. `true` to include blocks whose end date has passed.
/practicesIndividual practice sessions with their status, so a cancellation, a moved time or an added session reaches your site the moment the office records it. A canceled practice stays in the feed with status "canceled".
seasonId— Optional. Filter by season.teamId— Optional. One team’s practices.from— Optional. YYYY-MM-DD lower bound (UTC). Defaults to today.to— Optional. YYYY-MM-DD upper bound (UTC), inclusive.limit— Optional. 1–500, default 100.
/eventsTournaments, shootouts and showcases your teams are entered in: name, kind, dates, organizer, website, and each team with its standing (confirmed, pending or canceled). An event that is already under way is included, so you can show what is happening right now.
seasonId— Optional. Filter by season.teamId— Optional. Events one team is entered in.from— Optional. YYYY-MM-DD; events still running on or after this day. Defaults to today.to— Optional. YYYY-MM-DD; events starting on or before this day.includeTentative— Optional. `true` to include penciled-in events.limit— Optional. 1–200, default 50.
/coachesYour coaching staff, for your website’s coaches page: name, title, the coach’s own bio, profile photo, hire date, and the head or assistant role on each team of a current season. The hire date comes with hireDateSource: "set" when your office recorded it, "joined" when it is the day the coach joined your account, standing in. Adult coaches only; contact details are never included.
/newsletter/subscribersAdd an address to your club’s newsletter from your own server (JSON body: email, and optionally firstName, lastName, tags). The person gets a confirmation email before anything else is sent. Always answers 202 { accepted: true } — whether the address was new, already on the list or unsubscribed — so the API never reveals who subscribes. Needs the newsletter switched on in Settings.
/newsletter/subscribers/countHow many addresses stand subscribed to your newsletter.
/newsletter/signupThe browser form for your website: post email (and optionally first name) with your PUBLISHABLE form key from Settings → Newsletter → Sign-up — never the secret key — as form fields or JSON. Pass redirect to send the visitor back to a page on an origin you listed; otherwise they land on the hosted “check your inbox” page. The snippet on the Sign-up tab is ready to paste.
key— Your publishable form key (ih_nlf_…).email— The visitor’s address.redirect— Optional. A URL on one of your listed website origins.
Errors
Errors use standard HTTP status codes and a consistent body:
{
"error": {
"code": "api_disabled",
"message": "The public API is disabled for this organization."
}
}400— Bad request — a parameter was malformed (e.g. an invalid id).401— Missing or invalid API key.403— The public API is turned off for this organization.404— The requested record was not found in your organization.429— Rate limited — slow down and retry shortly.
Privacy first
The public API deliberately exposes only public league facts — teams, schedules, scores, standings and practice times — and your adult coaches as you introduce them to families. It never returns player names, dates of birth, contact information, health notes, financial data, or street addresses. Youth privacy is non-negotiable, so player-level data is simply not part of this API, and a coach under 18 is never listed.