{"openapi":"3.1.0","jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","info":{"title":"Hat Trick Local public read API","version":"1.0","summary":"Youth soccer clubs, soccer stores, registration windows, fees and tryouts in the United States.","description":"Directory data only, never players, families, rosters, orders or payments. No key; any origin; JSON or CSV; one call per question. Every answer carries license, attribution and the time the data was read. Errors are RFC 9457 problem+json. 60 requests a minute per address. Automated agents may read this API only. Terms: https://hattricklocal.com/developers/terms","termsOfService":"https://hattricklocal.com/developers/terms","contact":{"name":"Hat Trick Local","email":"api@hattricklocal.com","url":"https://hattricklocal.com/developers"},"license":{"name":"CC BY 4.0 (data)","url":"https://creativecommons.org/licenses/by/4.0/"}},"externalDocs":{"description":"Developer guide, field reference and changelog","url":"https://hattricklocal.com/developers"},"servers":[{"url":"https://hattricklocal-core-api.azurewebsites.net"}],"security":[],"tags":[{"name":"Clubs","description":"Youth soccer clubs, leagues and academies, with their registration status and fees."},{"name":"Stores","description":"Soccer stores and team dealers."},{"name":"Season records","description":"Current fees, registration windows and tryouts, each with its source."},{"name":"Domain advisories","description":"Dated observations about formerly listed club domains."}],"paths":{"/api/public/v1/clubs":{"get":{"operationId":"listClubs","tags":["Clubs"],"summary":"Clubs, filtered and paged.","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Words in the name, an alias or the town; every word must match."},{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Two-letter US state code, for example OH."},{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"Town name; case, spaces and hyphens do not matter."},{"name":"near","in":"query","required":false,"schema":{"type":"string"},"description":"latitude,longitude (for example 39.7589,-84.1916) or a 5-digit US ZIP code."},{"name":"radius_mi","in":"query","required":false,"schema":{"type":"number","minimum":1,"maximum":250},"description":"Radius around near, in miles (default 25)."},{"name":"verification","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: owner_claimed, staff_verified, observed, unverified."},{"name":"sport","in":"query","required":false,"schema":{"type":"string"},"description":"Sport key, for example soccer."},{"name":"updated_since","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Only listings updated at or after this time (ISO 8601)."},{"name":"registration_open","in":"query","required":false,"schema":{"type":"boolean"},"description":"true: registration open today; false: upcoming or not on record."},{"name":"registration_status","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: open, upcoming, not_on_record."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["name","-updated_at","distance","relevance"]},"description":"Default: relevance with q, distance with near, else name."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200},"description":"Page size (default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"From links.next; works only with the query that issued it."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"]},"description":"csv returns every match as CSV (same as the .csv path)."}],"responses":{"200":{"description":"A page of clubs.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubList"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/clubs.csv":{"get":{"operationId":"listClubsCsv","tags":["Clubs"],"summary":"Every matching club as CSV.","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Words in the name, an alias or the town; every word must match."},{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Two-letter US state code, for example OH."},{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"Town name; case, spaces and hyphens do not matter."},{"name":"near","in":"query","required":false,"schema":{"type":"string"},"description":"latitude,longitude (for example 39.7589,-84.1916) or a 5-digit US ZIP code."},{"name":"radius_mi","in":"query","required":false,"schema":{"type":"number","minimum":1,"maximum":250},"description":"Radius around near, in miles (default 25)."},{"name":"verification","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: owner_claimed, staff_verified, observed, unverified."},{"name":"sport","in":"query","required":false,"schema":{"type":"string"},"description":"Sport key, for example soccer."},{"name":"updated_since","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Only listings updated at or after this time (ISO 8601)."},{"name":"registration_open","in":"query","required":false,"schema":{"type":"boolean"},"description":"true: registration open today; false: upcoming or not on record."},{"name":"registration_status","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: open, upcoming, not_on_record."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["name","-updated_at","distance","relevance"]},"description":"Default: relevance with q, distance with near, else name."}],"responses":{"200":{"description":"Every match.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"text/csv":{"schema":{"type":"string","description":"One header row, RFC 4180, license and attribution as the last two columns."}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/clubs/{org_key}":{"get":{"operationId":"getClub","tags":["Clubs"],"summary":"One club in full.","parameters":[{"name":"org_key","in":"path","required":true,"schema":{"type":"string"},"description":"The listing's org_key ({slug}-{id}); the bare 5-character id or a plain or retired slug answers 301 to it."}],"responses":{"200":{"description":"The club.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubDetailResponse"}}}},"301":{"description":"An older form of the key: Location holds the canonical address.","headers":{"Location":{"schema":{"type":"string","format":"uri"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown key (code not_found), with suggestions.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/clubs/{org_key}/season-records":{"get":{"operationId":"getClubSeasonRecords","tags":["Clubs"],"summary":"A club's current fees, registration windows and tryouts.","parameters":[{"name":"org_key","in":"path","required":true,"schema":{"type":"string"},"description":"The listing's org_key ({slug}-{id}); the bare 5-character id or a plain or retired slug answers 301 to it."},{"name":"record_type","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: registration_window, fee, tryout, season_dates, other."}],"responses":{"200":{"description":"Current records.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonRecordList"}}}},"301":{"description":"An older form of the key: Location holds the canonical address.","headers":{"Location":{"schema":{"type":"string","format":"uri"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown key (code not_found), with suggestions.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/stores":{"get":{"operationId":"listStores","tags":["Stores"],"summary":"Soccer stores, filtered and paged.","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Words in the name, an alias or the town; every word must match."},{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Two-letter US state code, for example OH."},{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"Town name; case, spaces and hyphens do not matter."},{"name":"near","in":"query","required":false,"schema":{"type":"string"},"description":"latitude,longitude (for example 39.7589,-84.1916) or a 5-digit US ZIP code."},{"name":"radius_mi","in":"query","required":false,"schema":{"type":"number","minimum":1,"maximum":250},"description":"Radius around near, in miles (default 25)."},{"name":"verification","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: owner_claimed, staff_verified, observed, unverified."},{"name":"updated_since","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Only listings updated at or after this time (ISO 8601)."},{"name":"team_dealer","in":"query","required":false,"schema":{"type":"boolean"},"description":"Only stores that do (or do not) supply team uniforms."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["name","-updated_at","distance","relevance"]},"description":"Default: relevance with q, distance with near, else name."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200},"description":"Page size (default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"From links.next; works only with the query that issued it."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"]},"description":"csv returns every match as CSV (same as the .csv path)."}],"responses":{"200":{"description":"A page of stores.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreList"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/stores.csv":{"get":{"operationId":"listStoresCsv","tags":["Stores"],"summary":"Every matching store as CSV.","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Words in the name, an alias or the town; every word must match."},{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Two-letter US state code, for example OH."},{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"Town name; case, spaces and hyphens do not matter."},{"name":"near","in":"query","required":false,"schema":{"type":"string"},"description":"latitude,longitude (for example 39.7589,-84.1916) or a 5-digit US ZIP code."},{"name":"radius_mi","in":"query","required":false,"schema":{"type":"number","minimum":1,"maximum":250},"description":"Radius around near, in miles (default 25)."},{"name":"verification","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: owner_claimed, staff_verified, observed, unverified."},{"name":"updated_since","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Only listings updated at or after this time (ISO 8601)."},{"name":"team_dealer","in":"query","required":false,"schema":{"type":"boolean"},"description":"Only stores that do (or do not) supply team uniforms."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["name","-updated_at","distance","relevance"]},"description":"Default: relevance with q, distance with near, else name."}],"responses":{"200":{"description":"Every match.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"text/csv":{"schema":{"type":"string","description":"One header row, RFC 4180, license and attribution as the last two columns."}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/stores/{org_key}":{"get":{"operationId":"getStore","tags":["Stores"],"summary":"One store in full.","parameters":[{"name":"org_key","in":"path","required":true,"schema":{"type":"string"},"description":"The listing's org_key ({slug}-{id}); the bare 5-character id or a plain or retired slug answers 301 to it."}],"responses":{"200":{"description":"The store.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreDetailResponse"}}}},"301":{"description":"An older form of the key: Location holds the canonical address.","headers":{"Location":{"schema":{"type":"string","format":"uri"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown key (code not_found), with suggestions.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/stores/{org_key}/season-records":{"get":{"operationId":"getStoreSeasonRecords","tags":["Stores"],"summary":"A store's current season records (usually none).","parameters":[{"name":"org_key","in":"path","required":true,"schema":{"type":"string"},"description":"The listing's org_key ({slug}-{id}); the bare 5-character id or a plain or retired slug answers 301 to it."},{"name":"record_type","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: registration_window, fee, tryout, season_dates, other."}],"responses":{"200":{"description":"Current records.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonRecordList"}}}},"301":{"description":"An older form of the key: Location holds the canonical address.","headers":{"Location":{"schema":{"type":"string","format":"uri"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown key (code not_found), with suggestions.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/season-records":{"get":{"operationId":"listSeasonRecords","tags":["Season records"],"summary":"Current fees, registration windows and tryouts across clubs.","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Two-letter US state code, for example OH."},{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"Town name; case, spaces and hyphens do not matter."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Words in the name, an alias or the town; every word must match."},{"name":"record_type","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: registration_window, fee, tryout, season_dates, other."},{"name":"season","in":"query","required":false,"schema":{"type":"string"},"description":"Season label as the club states it, for example Fall 2026."},{"name":"verification","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: owner_claimed, staff_verified, observed, unverified."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200},"description":"Page size (default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"From links.next; works only with the query that issued it."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"]},"description":"csv returns every match as CSV (same as the .csv path)."}],"responses":{"200":{"description":"A page of records.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StateSeasonRecordList"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/season-records.csv":{"get":{"operationId":"listSeasonRecordsCsv","tags":["Season records"],"summary":"Every matching record as CSV.","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Two-letter US state code, for example OH."},{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"Town name; case, spaces and hyphens do not matter."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Words in the name, an alias or the town; every word must match."},{"name":"record_type","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: registration_window, fee, tryout, season_dates, other."},{"name":"season","in":"query","required":false,"schema":{"type":"string"},"description":"Season label as the club states it, for example Fall 2026."},{"name":"verification","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: owner_claimed, staff_verified, observed, unverified."}],"responses":{"200":{"description":"Every match.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"text/csv":{"schema":{"type":"string","description":"One header row, RFC 4180, license and attribution as the last two columns."}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/registration-windows":{"get":{"operationId":"listRegistrationWindows","tags":["Season records"],"summary":"Current registration windows by state and dates.","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Two-letter US state code, for example OH."},{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"Town name; case, spaces and hyphens do not matter."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Words in the name, an alias or the town; every word must match."},{"name":"status","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: open, upcoming."},{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Windows open on this day (YYYY-MM-DD)."},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Windows open at some point from this day (with to; at most 400 days)."},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Windows open at some point up to this day."},{"name":"opens_from","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Windows that open on or after this day."},{"name":"opens_to","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Windows that open on or before this day."},{"name":"verification","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: owner_claimed, staff_verified, observed, unverified."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200},"description":"Page size (default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"From links.next; works only with the query that issued it."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"]},"description":"csv returns every match as CSV (same as the .csv path)."}],"responses":{"200":{"description":"A page of windows.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationWindowList"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/registration-windows.csv":{"get":{"operationId":"listRegistrationWindowsCsv","tags":["Season records"],"summary":"Every matching window as CSV.","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Two-letter US state code, for example OH."},{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"Town name; case, spaces and hyphens do not matter."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Words in the name, an alias or the town; every word must match."},{"name":"status","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: open, upcoming."},{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Windows open on this day (YYYY-MM-DD)."},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Windows open at some point from this day (with to; at most 400 days)."},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Windows open at some point up to this day."},{"name":"opens_from","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Windows that open on or after this day."},{"name":"opens_to","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Windows that open on or before this day."},{"name":"verification","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated: owner_claimed, staff_verified, observed, unverified."}],"responses":{"200":{"description":"Every match.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"text/csv":{"schema":{"type":"string","description":"One header row, RFC 4180, license and attribution as the last two columns."}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/public/v1/domain-advisories":{"get":{"operationId":"listDomainAdvisories","tags":["Domain advisories"],"summary":"Dated observations about formerly listed club domains.","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Two-letter US state code, for example OH."},{"name":"domain","in":"query","required":false,"schema":{"type":"string"},"description":"One domain, for example example-club.org."}],"responses":{"200":{"description":"Every active advisory.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-License":{"$ref":"#/components/headers/XLicense"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdvisoryList"}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"A bad parameter: code invalid_param, invalid_date, invalid_range or invalid_cursor, with param naming it.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited (60 a minute per address).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"The data could not be loaded (code data_unavailable).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"schemas":{"Problem":{"type":"object","required":["title","status","code"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"param":{"type":"string"},"docs":{"type":"string","format":"uri"},"request_id":{"type":"string"},"suggestions":{"type":"array","items":{"type":"object"}}}},"Links":{"type":"object","properties":{"self":{"type":"string","format":"uri"},"next":{"type":["string","null"],"format":"uri","description":"Next page; null on the last."},"csv":{"type":"string","format":"uri"},"docs":{"type":"string","format":"uri"}}},"Envelope":{"type":"object","required":["api_version","license","attribution","generated_at","last_checked","warnings","data","links"],"properties":{"api_version":{"type":"string"},"dataset":{"type":"string"},"publisher":{"type":"string"},"license":{"type":"string"},"attribution":{"type":"string"},"methodology_url":{"type":"string","format":"uri"},"docs_url":{"type":"string","format":"uri"},"disclaimer":{"type":"string"},"timezone":{"type":["string","null"]},"dates":{"type":"string"},"generated_at":{"type":"string","format":"date-time","description":"When this answer was made."},"last_checked":{"type":"string","format":"date-time","description":"When the data was read; it refreshes about every five minutes."},"refresh_seconds":{"type":"integer"},"query":{"type":"object"},"warnings":{"type":"array","items":{"type":"string"}},"total":{"type":"integer"},"count":{"type":"integer"},"links":{"$ref":"#/components/schemas/Links"}}},"WebsiteAdvisory":{"type":["object","null"],"properties":{"domain":{"type":"string"},"advisory_type":{"type":["string","null"]},"evidence":{"type":["string","null"]},"observed_at":{"type":["string","null"],"format":"date-time"},"last_checked_at":{"type":["string","null"],"format":"date-time"}}},"Registration":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["open","upcoming","not_on_record"],"description":"open: a current window covers today; upcoming: one starts later; not_on_record: none on record. Never closed."},"season":{"type":["string","null"]},"opens":{"type":["string","null"]},"closes":{"type":["string","null"]},"record_id":{"type":["string","null"]},"source_url":{"type":["string","null"]},"verification_method":{"type":["string","null"],"enum":["owner_claimed","staff_verified","observed","unverified",null]}}},"OrgBase":{"type":"object","required":["id","org_key","name","profile_url","verification_method"],"properties":{"id":{"type":"string","description":"The permanent 5-character id."},"org_key":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"org_type":{"type":["string","null"]},"sports":{"type":"array","items":{"type":"string"}},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"zip":{"type":["string","null"]},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"geo_precision":{"type":["string","null"]},"timezone":{"type":["string","null"],"description":"IANA timezone; null in states that span two zones."},"website":{"type":["string","null"],"description":"Null when unknown or under a domain advisory."},"website_advisory":{"$ref":"#/components/schemas/WebsiteAdvisory"},"profile_url":{"type":"string","format":"uri"},"verification_method":{"type":"string","enum":["owner_claimed","staff_verified","observed","unverified"],"description":"How the facts were confirmed: owner_claimed > staff_verified > observed > unverified. observed is not verified."},"last_verified":{"type":["string","null"],"format":"date-time"},"observed_at":{"type":["string","null"],"format":"date-time","description":"Latest time the facts were seen at their source."},"updated_at":{"type":["string","null"],"format":"date-time"},"distance_mi":{"type":"number","description":"With near."}}},"Club":{"allOf":[{"$ref":"#/components/schemas/OrgBase"},{"type":"object","required":["org_type","registration"],"properties":{"org_type":{"type":"string","enum":["club","league","academy","association","program"],"description":"Every organization that is not a store."},"registration":{"$ref":"#/components/schemas/Registration"},"fee_band_usd":{"type":["object","null"],"properties":{"min":{"type":["number","null"]},"max":{"type":["number","null"]}}}}}]},"Store":{"allOf":[{"$ref":"#/components/schemas/OrgBase"},{"type":"object","required":["org_type"],"properties":{"org_type":{"type":"string","enum":["store"]},"street_address":{"type":["string","null"]},"phone":{"type":["string","null"]},"is_team_dealer":{"type":["boolean","null"]},"chain":{"type":["string","null"]},"brands":{"type":"array","items":{"type":"string"}}}}]},"DetailExtras":{"type":"object","properties":{"description":{"type":["string","null"]},"summary":{"type":["string","null"]},"year_established":{"type":["integer","null"]},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"logo_url":{"type":["string","null"]},"service_area":{"type":["string","null"]},"location_type":{"type":["string","null"]},"aliases":{"type":"array","items":{"type":"string"}},"locations":{"type":["array","null"]},"programs":{"type":["array","null"]},"season_records":{"type":"array","items":{"$ref":"#/components/schemas/SeasonRecord"}}}},"ClubDetail":{"allOf":[{"$ref":"#/components/schemas/Club"},{"$ref":"#/components/schemas/DetailExtras"},{"type":"object","properties":{"claim_url":{"type":"string","format":"uri"},"club_website_url":{"type":["string","null"]}}}]},"StoreDetail":{"allOf":[{"$ref":"#/components/schemas/Store"},{"$ref":"#/components/schemas/DetailExtras"},{"type":"object","properties":{"ordering_url":{"type":["string","null"]}}}]},"OrgRef":{"type":"object","required":["org_key","name"],"properties":{"id":{"type":"string"},"org_key":{"type":"string"},"name":{"type":"string"},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"timezone":{"type":["string","null"]},"profile_url":{"type":"string","format":"uri"}}},"SeasonRecord":{"type":"object","required":["id","org_key","record_type","verification_method"],"properties":{"id":{"type":["string","null"]},"org_key":{"type":"string"},"scope_key":{"type":["string","null"]},"sport":{"type":["string","null"]},"season":{"type":["string","null"]},"record_type":{"type":"string","enum":["registration_window","fee","tryout","season_dates","other"]},"title":{"type":["string","null"]},"summary":{"type":["string","null"],"description":"A plain sentence stating the fact."},"effective_from":{"type":["string","null"]},"effective_to":{"type":["string","null"],"description":"Null or not yet passed: only current records are served."},"value":{"type":["object","null"],"description":"Typed keys, unit in the name, e.g. fee_usd_per_player_per_season."},"source_url":{"type":["string","null"]},"evidence":{"type":["object","null"],"description":"snippet, page_url, retrieved_at, method"},"verification_method":{"type":"string","enum":["owner_claimed","staff_verified","observed","unverified"],"description":"How the facts were confirmed: owner_claimed > staff_verified > observed > unverified. observed is not verified."},"last_verified":{"type":["string","null"],"format":"date-time"},"observed_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"StateSeasonRecord":{"allOf":[{"$ref":"#/components/schemas/SeasonRecord"},{"type":"object","properties":{"org":{"$ref":"#/components/schemas/OrgRef"}}}]},"RegistrationWindow":{"allOf":[{"$ref":"#/components/schemas/SeasonRecord"},{"type":"object","required":["status","org"],"properties":{"status":{"type":"string","enum":["open","upcoming"]},"opens":{"type":["string","null"]},"closes":{"type":["string","null"]},"org":{"$ref":"#/components/schemas/OrgRef"}}}]},"Advisory":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"},"advisory_type":{"type":["string","null"]},"evidence":{"type":["string","null"]},"observed_at":{"type":["string","null"],"format":"date-time"},"last_checked_at":{"type":["string","null"],"format":"date-time"},"org":{"oneOf":[{"$ref":"#/components/schemas/OrgRef"},{"type":"null"}]}}},"ClubList":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Club"}}}}]},"StoreList":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Store"}}}}]},"SeasonRecordList":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SeasonRecord"}}}}]},"StateSeasonRecordList":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/StateSeasonRecord"}}}}]},"RegistrationWindowList":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RegistrationWindow"}}}}]},"AdvisoryList":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Advisory"}}}}]},"ClubDetailResponse":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ClubDetail"}}}]},"StoreDetailResponse":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/StoreDetail"}}}]}},"headers":{"ETag":{"description":"Hash of the content; send If-None-Match for a 304.","schema":{"type":"string"}},"RateLimit":{"description":"IETF draft-ietf-httpapi-ratelimit-headers: \"default\";r={remaining};t={seconds to reset}.","schema":{"type":"string"}},"RateLimitPolicy":{"description":"\"default\";q=60;w=60 (60 requests a minute per address).","schema":{"type":"string"}},"XLicense":{"description":"CC BY 4.0.","schema":{"type":"string"}},"RetryAfter":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}}