Ohio School Branding API
Retrieve school names, mascots, colors, and normalized logo assets for Ohio sports applications. Logo URLs are absolute and available as PNG or validated SVG files. SVG assets reject scripts, event handlers, external references, document types, and imported or executable styles.
Public access
No token is required. Requests are limited to 30 per minute per IP address, with up to 100 schools per page.
High-volume access
Approved integrations use a dedicated Sanctum bearer token with only the school-branding:read ability. It is unlimited on these branding endpoints and rejected everywhere else.
Quick start
curl "https://ohsportsrank.com/api/v1/school-branding?q=Napoleon&has_branding=1"
For an approved integration, send the token only in the HTTPS authorization header:
curl -H "Authorization: Bearer YOUR_TOKEN" \
"https://ohsportsrank.com/api/v1/school-branding?per_page=100"
Endpoints
/api/v1/school-branding
Returns a deterministic, paginated school collection.
| Query | Type | Purpose |
|---|---|---|
| q | string | Search name, common name, or city; 2–100 characters. |
| updated_since | date-time | Return records changed at or after an ISO 8601 timestamp. |
| football_season | integer | Optional season year, 1900–2100. Include football records; cannot be combined with updated_since. |
| has_branding | boolean | Filter schools that have any branding field, or none. |
| out_of_state | boolean | Include only Ohio or out-of-state opponents. |
| per_page | integer | 1–100 records; defaults to 50. |
| page | integer | Page number beginning at 1. |
/api/v1/school-branding/{stateId}
Returns one school by its stable Ohio Sports Rankings state ID, or HTTP 404.
School response
{
"state_id": 1080,
"name": "Napoleon High School",
"common_name": "Napoleon",
"city": "Napoleon, OH",
"nickname": "Wildcats",
"girls_nickname": "Wildcats",
"out_of_state": false,
"colors": { "primary": "#0A1633", "secondary": "#FFFFFF" },
"logos": {
"primary": "https://.../school-logos/example.png",
"alternate": null
},
"logo_formats": { "primary": "png", "alternate": null },
"updated_at": "2026-08-26T09:00:00-04:00"
}
Missing colors and logos are returned as null. Collection responses wrap schools in data and include standard Laravel links and meta pagination objects.
Both endpoints accept football_season=2026. This adds football_record with season, available, record, wins, losses, ties, and games_played. Records include regular-season and playoff games with both scores present, excluding cancelled games. Ties appear as a third number only when nonzero.
When no non-cancelled schedule exists for that school and season, available is false and the record and counts are null. A known schedule with no scored games returns 0-0. Records reflect the scores currently stored; they do not guarantee that every result has been collected.
For daily record synchronization, request /api/v1/school-branding?football_season=2026&per_page=100 and follow every next-page link. Do not send updated_since: score corrections and deletions do not necessarily change the school's branding timestamp. Requests combining the two parameters return HTTP 422. Existing scoped tokens work for these requests.
Incremental synchronization
Save the greatest updated_at received, then request updated_since on the next run. Follow every links.next URL before advancing the saved timestamp.
Errors and limits
Validation errors use HTTP 422, missing schools use 404, and rate limits use 429 with Retry-After and JSON retry_after values.
Logo usage
School names, mascots, and logos may be protected by their respective owners. API availability does not grant trademark or merchandising rights; consumers are responsible for lawful use and attribution requirements.