Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
openapi: 3.2.0
info:
title: crosbynews.com Calendar API
version: 1.7.0
description: 'Crosby, Texas community data: current conditions, hourly and 7-day forecast, active alerts, the EPA UV index, and a measured air-quality index (EPA/AirNow monitors, with an Open-Meteo modeled fallback) from the U.S. National Weather Service, EPA/AirNow, and Open-Meteo; river/bayou flood levels; the Atlantic tropical outlook; the Houston Health Department''s measured daily pollen and mold count; the Harris County burn-ban status from the Texas A&M Forest Service; road incidents and lane closures from Houston TranStar; recent local news headlines; and the Crosby ISD school calendar. Public, no authentication.'
contact:
url: https://crosbynews.com/
license:
name: Public domain (NWS source data)
url: https://www.weather.gov/disclaimer
servers:
- url: https://crosbynews.com
security: []
tags:
- name: Calendar
paths:
/api/calendar:
get:
operationId: getCalendar
summary: Upcoming Crosby ISD school calendar events
parameters:
- $ref: '#/components/parameters/IfNoneMatch'
responses:
'200':
description: Upcoming events (soonest first, capped at 60)
content:
application/json:
schema:
$ref: '#/components/schemas/SchoolCalendar'
'304':
$ref: '#/components/responses/NotModified'
'502':
description: Calendar unavailable
tags:
- Calendar
components:
schemas:
SchoolEvent:
type: object
properties:
summary:
type: string
location:
type:
- string
- 'null'
start:
type: string
description: 'All-day events: a date (YYYY-MM-DD). Timed events: zone-less ISO 8601 local time (America/Chicago wall-clock, as authored by the district).'
end:
type:
- string
- 'null'
allDay:
type: boolean
SchoolCalendar:
type: object
properties:
district:
type: string
source:
type: string
timezone:
type: string
updated:
type:
- string
- 'null'
format: date-time
events:
type: array
items:
$ref: '#/components/schemas/SchoolEvent'
parameters:
IfNoneMatch:
name: If-None-Match
in: header
required: false
description: A previously returned weak ETag. When it still matches the cached snapshot, the endpoint answers 304 with no body — the cheap way to poll.
schema:
type: string
responses:
NotModified:
description: Not Modified — the caller's If-None-Match matches the current snapshot, so no body is sent. The ETag is derived from the cache's refresh stamp, so it changes exactly when the payload would.