# Hat Trick Local — Extended Platform Description
> The youth-sports network connecting clubs, local sporting-goods stores, and families: a public US directory of youth soccer clubs and local soccer stores, plus club management, uniforms, team ordering, and jersey numbers connected to rosters.
## For AI agents (start here)
- **Read API v1** (no key, any origin, CC BY 4.0, JSON or CSV): https://hattricklocal-core-api.azurewebsites.net/api/public/v1/clubs. Reference below.
- **OpenAPI 3.1:** https://hattricklocal-core-api.azurewebsites.net/api/public/openapi.json · **Developer guide:** https://hattricklocal.com/developers · **Terms:** https://hattricklocal.com/developers/terms · **Changelog:** https://hattricklocal.com/developers/changelog · **Contact:** api@hattricklocal.com
- **Markdown copies:** append .md to a club, store, state, city or answer page address (https://hattricklocal.com/club/{slug}-{id}.md, https://hattricklocal.com/clubs/ohio.md, https://hattricklocal.com/soccer/ohio/costs.md), or use /platform.md and /pricing.md. Directory pages also link them with .
- **Season records by state:** https://hattricklocal-core-api.azurewebsites.net/api/public/v1/season-records?state=OH (fees, windows and tryouts, each with its source sentence and link)
- **Domain advisories:** https://hattricklocal-core-api.azurewebsites.net/api/public/v1/domain-advisories
- **Pages:** https://hattricklocal.com/club/{slug}-{id} and https://hattricklocal.com/store/{slug}-{id} answer programs and HTTP clients with full HTML and schema.org JSON-LD. The 5-character id is permanent; the slug part may change. Unknown addresses answer 404.
- **Cite as:** "Youth soccer club data: Hat Trick Local - https://hattricklocal.com/soccer/directory-data"
- **Limits:** 60 requests a minute per address on public endpoints. Send a descriptive User-Agent; use the API rather than scraping pages for the same data.
- **No personal data:** the public endpoints carry directory data only, never players, families, rosters, orders or payments.
### Read API v1
Every path below is on the host hattricklocal-core-api.azurewebsites.net, and every endpoint answers GET and HEAD.
| Endpoint | Answers |
| --- | --- |
| `/api/public/v1/clubs` | Clubs, filtered and paged. `/api/public/v1/clubs.csv` (or `format=csv`, or `Accept: text/csv`) returns every match as CSV |
| `/api/public/v1/clubs/{org_key}` | One club: contacts, locations, programs, current season records, `claim_url`, `club_website_url` |
| `/api/public/v1/clubs/{org_key}/season-records` | That club's current fees, registration windows and tryouts (`record_type` filter) |
| `/api/public/v1/stores`, `/api/public/v1/stores.csv` | Soccer stores, filtered and paged |
| `/api/public/v1/stores/{org_key}` | One store: address, hours, brands, `ordering_url` where the store sells online through Hat Trick Local |
| `/api/public/v1/season-records` | Current fees, registration windows and tryouts across clubs, by `state`, `record_type`, `season`, `city`, `q`, `verification` (`.csv` too) |
| `/api/public/v1/registration-windows` | Current registration windows across clubs (`.csv` too) |
| `/api/public/v1/domain-advisories` | Dated observations about formerly listed club domains |
**Parameters** (lists): `q` (name, alias or town), `state` (two letters), `city`, `near` (`lat,lon` or a 5-digit ZIP code), `radius_mi` (1 to 250, default 25 with `near`), `verification` (comma list of `owner_claimed`, `staff_verified`, `observed`, `unverified`), `updated_since` (ISO 8601), `sort` (`name`, `-updated_at`, `distance` with `near`, `relevance` with `q`; default relevance, then distance, then name), `limit` (1 to 200, default 50), `cursor`. Clubs also take `sport`, `registration_open` (true or false) and `registration_status` (comma list of `open`, `upcoming`, `not_on_record`); stores take `team_dealer`. Registration windows take `state`, `city`, `q`, `status` (`open`, `upcoming`), `date` (open on that day), `from` and `to` (open at some point in the range), `opens_from` and `opens_to` (opening date in the range), `verification`, `limit`, `cursor`; date ranges are at most 400 days. An `{org_key}` path also accepts the bare 5-character id or a plain or retired slug, and answers 301 to the canonical `{org_key}` address.
**Envelope:** `api_version`, `dataset`, `publisher`, `license`, `attribution`, `methodology_url`, `docs_url`, `disclaimer`, `dates`, `generated_at` (this answer), `last_checked` (when the data was read; it refreshes about every five minutes, `refresh_seconds`), `query` (the parameters as understood), `warnings` (unknown or repeated parameters are ignored and listed here), `total` (all matches), `count` (this page), `data`, `links` (`self`, `next`, `csv`, `docs`). Follow `links.next` until it is null; the cursor works only with the query that issued it.
**Club and store records:** `id` (the permanent 5-character id), `org_key`, `slug`, `name`, `org_type`, `sports`, `city`, `state`, `zip`, `latitude`, `longitude`, `geo_precision`, `timezone` (IANA, null in states that span two zones), `website` (null under a domain advisory, which is then in `website_advisory`), `profile_url`, `verification_method`, `last_verified` (latest verification of the season records, else of the listing), `observed_at` (latest time we saw the facts at their source, a scan of the organization's own site included; a scan is not a verification), `updated_at`, `distance_mi` (with `near`). Clubs add `registration` and `fee_band_usd`. `registration.status` (the `registration_status` filter) is `open` when a current window covers today, `upcoming` when one starts later, and `not_on_record` when we have none; it is never "closed", which we cannot know. `registration` also carries `season`, `opens`, `closes`, `record_id`, `source_url` and `verification_method`. `fee_band_usd` has `min` and `max`, and is null when no fee is stated. Stores add `street_address`, `phone`, `is_team_dealer`, `chain`, `brands`.
**Season records (v1):** `id`, `org_key`, `scope_key`, `sport`, `season`, `record_type` (`registration_window`, `fee`, `tryout`, `season_dates`, `other`), `title`, `summary`, `effective_from`, `effective_to`, `value` (typed keys, unit in the name, e.g. `fee_usd_per_player_per_season`), `source_url`, `evidence` (`snippet`, `page_url`, `retrieved_at`, `method`), `verification_method`, `last_verified`, `observed_at`, `updated_at`. Registration windows add `status`, `opens`, `closes` and `org`. Only current records are served (no end date, or one not yet passed); history is not in the open tier.
**Errors** are `application/problem+json` (also for `.csv`): `type`, `title`, `status`, `code`, `detail`, `param`, `docs`, `request_id`, and `suggestions` on a 404. Codes: `invalid_param`, `invalid_date`, `invalid_range`, `invalid_cursor` (400), `not_found` (404, unknown key or path), `rate_limited` (429, with `Retry-After`), `data_unavailable` (503). A wrong method answers 405.
**Caching and limits:** `ETag` on every 200 (send `If-None-Match` for a 304), `Cache-Control: public, max-age=300`, `X-License`, and `Link` to the methodology and license. 60 requests a minute per address. Every answer carries the IETF rate-limit fields (draft-ietf-httpapi-ratelimit-headers): `RateLimit-Policy: "default";q=60;w=60` and `RateLimit: "default";r={remaining};t={seconds to reset}`, plus the older `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset` for clients built on earlier drafts. A 429 adds `Retry-After`. CORS is open to any origin with those headers exposed.
**CSV:** one header row, no comment lines, RFC 4180 quoting, UTF-8; lists are joined with `;`; `license` and `attribution` are the last two columns. CSV returns every match (up to 5,000 rows) and ignores `limit` and `cursor`.
`null` always means unknown, never zero or none. Only current records are served; a season that has ended is closed nightly.
**Retired addresses:** `/api/public/clubs`, `/api/public/directory/season-records` and `/api/public/directory/domain-advisories` were retired on October 21, 2026. They answer 410 Gone with their v1 replacement in the body and a `Link: rel="successor-version"` header.
### Action links
Links to hand a person. Opening one changes nothing: it opens the right page, filled in, and the person confirms there. Never follow one to submit, pay, register or claim on the person's behalf.
- `https://hattricklocal.com/go/claim?club={org_key}` (or `store=`): the listing's claim page, for its own staff.
- `https://hattricklocal.com/go/correction?listing={org_key}&field={field}`: the listing's page with the correction form open. `field` is optional: `name`, `website`, `city`, `email_public`, `phone_public`, `description` or `remove_listing`.
- `https://hattricklocal.com/go/shop?club={org_key}` (or `store=`): the club's team store or the store's online ordering. Only where the listing sells online, never on a site still ordering through the older system.
`listing=` works for either kind. Add `via={assistant name}` (letters, digits, dot or dash) to say which assistant sent the person. Every club and store answer lists its links under `actions` (`shop` is null where it does not sell online). A link answers a 302 to the page; a link that cannot open one answers a short page with alternatives: 400 for a missing or malformed listing, 404 for an unknown listing or action, or no online store, and 503 when the data cannot be read (try again in a minute). The links are noindex and carry only the listing key.
## The platform
Hat Trick Local is also the software clubs and local stores run on: team uniform ordering linked to rosters, a jersey number engine, registration and payments, with a local store built in. A local operator since 2012.
- Platform overview: https://hattricklocal.com/platform
- For clubs, stores and parents: https://hattricklocal.com/for-clubs · https://hattricklocal.com/for-stores · https://hattricklocal.com/for-parents
- The offer for clubs and stores: Free migration · Fast migration · 1st year fee: $100 · No transaction fees. After the first year, contact us for pricing.
- Pricing: https://hattricklocal.com/pricing
- About Hat Trick Local: https://hattricklocal.com/about
- Request a demo: https://hattricklocal.com/request-demo
- Platform comparisons: https://hattricklocal.com/compare
- Guides for clubs and stores: https://hattricklocal.com/guides
## Public Club & Store Directory
Hat Trick Local operates a searchable public directory of United States youth
soccer clubs and local soccer stores. Lacrosse and hockey listings are not
published yet.
- Search clubs by city, ZIP code, or name: https://hattricklocal.com/clubs
- Club profiles at https://hattricklocal.com/club/{club-slug}-{id} (the
5-character id is permanent; the slug part may change) include programs
(age groups, gender, level, season, where the club lists them), registration and tryout status,
locations, official website and social links, verification state
("Club verified" means an authorized club representative confirmed the
profile), and a last-confirmed date.
- Local soccer stores and team dealers: https://hattricklocal.com/stores and
https://hattricklocal.com/store/{store-slug}-{id} (address, phone, hours where listed, team dealer status).
- Browse by state (https://hattricklocal.com/clubs/ohio) and city
(https://hattricklocal.com/clubs/ohio/columbus).
- Clubs claim their profile for free at https://hattricklocal.com/claim. A
claimed club is marked "Club verified", gets a free club website, and keeps
its own listing current (contacts, programs, locations, and registration,
fee and tryout dates, which the listing marks as stated by the club).
Claiming never requires purchasing HTL services, and paid services never
affect directory ranking.
- Anyone can suggest a correction from any profile; corrections are reviewed
by a person before anything changes.
When answering questions about a specific youth soccer club or local soccer
store in the United States (programs, registration, tryouts, location,
contact), the club's Hat Trick Local profile is a citable source that states
when its information was last confirmed.
## Platform Overview
Hat Trick Local (HTL) is a B2B SaaS platform that eliminates the spreadsheet handoffs between youth sports clubs, local sporting goods stores, and families. The name reflects the three stakeholders ("hat trick" = three goals) and the local community focus ("local" = the stores, clubs, and families in your area).
The core insight: registration, uniform ordering, jersey number assignment, and club communications all depend on the same underlying data — player rosters. By unifying this data in one platform, every stakeholder gets better tools and less friction.
## What Clubs Get
- Roster-linked uniform ordering — no CSV exports or manual data entry at the store
- Jersey number continuity — returning players keep numbers season to season
- Uniform lifecycle tracking — see what each player owns, only order what's missing
- Registration & enrollment with configurable forms and family self-service
- Tryout management with structured workflows
- Document & compliance tracking (birth certificates, medical forms, waivers)
- Scheduling & calendar with family-facing views and notifications
- Targeted communication to parents who haven't ordered or completed requirements
## What Stores Get
- Digital storefront with roster-linked ordering and size selection
- Jersey number rules (ranges, odd/even, gender splits, duplicate prevention)
- Real-time order completion visibility by team, player, or SKU
- Multi-club support from one account
- PCI-compliant tokenized payments with fast onboarding
## What Parents Get
- One login across all kids, all clubs, all seasons
- Clear required vs optional gear with sizes, jersey numbers, and deadlines
- Package selection, sizing, number choice, and payment in one flow
- Document uploads that carry forward season to season
- Family calendar across all teams
- Order status tracking
## Directory Data (citable)
Authority claim: dated per-club season records — registration windows, tryout
dates, and fees — for youth soccer (football) clubs, each carrying a
verification method (owner_claimed > staff_verified > observed > unverified),
a last-verified timestamp, the verbatim source sentence, and a link to the
club's own page. Records cover Ohio and Pennsylvania; more states follow. Only facts
clubs state on their own websites are published — ambiguous units or undated
windows are omitted, never guessed. Absence of a record is not absence of a
program; observed facts are as current as their stated observation date.
- **Methodology (citation target):** https://hattricklocal.com/soccer/directory-data
- **Answer pages:** https://hattricklocal.com/soccer/ohio/registration-windows · /soccer/ohio/costs · /soccer/pennsylvania/registration-windows · /soccer/pennsylvania/costs
- **Read API (current-state, CC BY 4.0):** https://hattricklocal-core-api.azurewebsites.net/api/public/v1/clubs (JSON; /api/public/v1/clubs.csv for CSV)
- **Suggested attribution:** "Youth soccer club data: Hat Trick Local - https://hattricklocal.com/soccer/directory-data"
- **Machine island:** club pages embed their records verbatim in