Snow APIsnow.day ↗
Access Snow.day's database of high school enrichment programs via API. Search, filter, and retrieve costs, deadlines, and curated lists across 7 endpoints.
What is the Snow API?
The Snow.day API gives programmatic access to a database of extracurricular and enrichment opportunities for high school students across 7 endpoints. Using search_opportunities, you can query by keyword, filter by season, and sort by financial accessibility grade or deadline. Each record surfaces fields including program name, type, cost info, provider, sessions, and deadlines — enough to build directory tools, recommendation engines, or student-facing apps.
curl -X GET 'https://api.parse.bot/scraper/7846f91d-0b33-49f3-aa92-53f8fc6240fb/search_opportunities?page=0&limit=5&query=STEM&filter=%7B%27FILTER_SEASON%27%3A+%5B%27SUMMER%27%5D%7D&sort_field=relevancy&sort_order=ASC' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace snow-day-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Snowday SDK — discover extracurricular opportunities for high schoolers."""
from parse_apis.snowday_api import Snowday, SortField, Sort, OpportunityType, ResourceNotFound
snowday = Snowday()
# Search for STEM summer opportunities sorted by financial accessibility
for opp in snowday.opportunitysummaries.search(
query="STEM",
sort_field=SortField.FINANCIAL_ACCESSIBILITY_GRADE,
sort_order=Sort.ASC,
limit=5,
):
print(opp.name, opp.financial_accessibility_grade, opp.type)
# Drill into the first result's full detail and cost breakdown
opp = snowday.opportunitysummaries.search(query="robotics", limit=1).first()
if opp:
full = opp.details()
print(full.name, full.eligibility_info, full.description[:80])
cost = full.cost()
print(cost.financial_accessibility_grade, cost.tuition, cost.application_fee)
# Browse curated lists and explore their contents
for lst in snowday.curatedlistsummaries.list(limit=3):
print(lst.name, lst.author_display_name)
detail = lst.details()
print(detail.description)
for item in detail.items[:2]:
print(item.learning_opportunity.name, item.learning_opportunity.provider.name)
# Get predefined search categories (homepage shortcuts)
for cat in snowday.searchcategories.list(limit=5):
print(cat.name, cat.query, cat.filter)
# Typed error handling for a non-existent resource
try:
bad = snowday.opportunitysummaries.search(query="nonexistent_xyz_12345", limit=1).first()
if bad:
bad.details()
except ResourceNotFound as exc:
print(f"Not found: {exc.uuid}")
print("exercised: search / browse / details / cost / curated lists / search categories")
Search and browse extracurricular opportunities with optional query, filtering, and sorting. Returns paginated results from the Snowday database. Supports filtering by season, type, grade level, financial accessibility, and expert ratings. Each result includes basic program info, provider, sessions with locations, and deadlines.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (0-indexed). |
| limit | integer | Number of results per page. |
| query | string | Search keyword or interest (e.g. 'STEM', 'business', 'art'). |
| filter | object | JSON object containing filters. Supported keys: FILTER_SEASON (array of values: SUMMER, FALL, SPRING, YEAR_ROUND), FILTER_TYPE (array of values: PROGRAM, COMPETITION), FILTER_ONLINE_ONLY (boolean), FILTER_GRADE (array of integers representing grade levels), FILTER_FINANCIAL_ACCESSIBILITY (array of ratings: A_PLUS, A, A_MINUS, B_PLUS, B, B_MINUS, C_PLUS, C, C_MINUS), FILTER_EXPERTS_CHOICE (array of values: MOST_RECOMMENDED, HIGHLY_RECOMMENDED). All array filter values must be provided as arrays even for single values. |
| sort_field | string | Field to sort by: relevancy, expertsChoiceRating, isHighlySelective, deadline, financialAccessibilityGrade. |
| sort_order | string | Sort order: ASC or DESC. |
{
"type": "object",
"fields": {
"pageSize": "integer, number of results on this page",
"pageNumber": "integer, current page number",
"totalCount": "integer, total matching opportunities",
"learningOpportunities": "array of opportunity summary objects with id, name, type, seasons, financialAccessibilityGrade, expertsChoiceRating, isHighlySelective, interests, tags, logo, provider, sessions, deadlines"
},
"sample": {
"data": {
"pageSize": 5,
"pageNumber": 0,
"totalCount": 729,
"learningOpportunities": [
{
"id": "73f8cd5e-6acd-43a7-8a57-35b5ff824922",
"logo": {
"url": "https://snowday-data-prod.nyc3.cdn.digitaloceanspaces.com/media/gtech_RGaSPrT.jpg"
},
"name": "STEM@GTRI High School Summer Internship Program",
"tags": [],
"type": "PROGRAM",
"seasons": [
"SUMMER"
],
"provider": {
"id": "f0aad093-af65-41d6-b308-49a9a6cf5834",
"name": "Georgia Tech Research Institute"
},
"sessions": [
{
"id": "0c98a095-f577-4ad5-86f1-9840209b6838",
"endDate": null,
"dateType": "DATES",
"location": {
"id": "a25e5436-2258-4471-9729-a093cc395d26",
"name": "Atlanta, GA",
"latitude": 33.7812708,
"longitude": -84.4002907
},
"startDate": null,
"dateStatus": "NOT_PROVIDED",
"locationType": "IN_PERSON"
}
],
"deadlines": [
{
"id": "1bf15a61-521e-4b2c-b27a-b92c836144cf",
"date": "2026-01-19T04:59:00.000Z",
"status": "UP_TO_DATE",
"description": "Application Deadline"
}
],
"interests": [
{
"id": "c693e9ed-cbb9-4677-a2e9-ca7b680702b7",
"name": "Engineering"
}
],
"isHighlySelective": false,
"expertsChoiceRating": "HIGHLY_RECOMMENDED",
"financialAccessibilityGrade": "A_PLUS"
}
]
},
"status": "success"
}
}About the Snow API
Search and Browse Opportunities
The search_opportunities endpoint accepts a query string alongside a filter object that supports season values (SUMMER, FALL, SPRING, YEAR_ROUND) and other facets. Results can be sorted by relevancy, expertsChoiceRating, isHighlySelective, deadline, or financialAccessibilityGrade, with sort_order set to ASC or DESC. Pagination is 0-indexed via page and limit parameters. Each result in learningOpportunities includes the opportunity's id, name, type (PROGRAM or COMPETITION), seasons, financialAccessibilityGrade, provider, and arrays of sessions and deadlines. If you want to browse without a query, browse_all_opportunities provides the same paginated structure with no required parameters.
Detail and Cost Endpoints
get_opportunity_detail requires both a uuid (from search results) and a slug (the kebab-case program name). It returns the full record including a description string, the external url, costInfo, and structured sessions with dates and location data. For workflows that only need financial information, get_opportunity_cost returns a focused subset: tuition, costInfo, applicationFee, financialAccessibilityGrade, and a costInfoStatus field that indicates whether cost data is UP_TO_DATE or NOT_PROVIDED.
Curated Lists
get_lists returns paginated metadata for publicly curated program collections, including each list's id, name, and authorDisplayName. Passing a list's uuid and slug to get_list_detail returns the full list contents: an items array of opportunity objects with curator notes, a markdown description, and the author name. Lists are a useful starting point for surfacing editorially vetted program collections without constructing custom filters.
Discovery with Top Searches
get_top_searches requires no inputs and returns a categories array. Each category has a name and either a filter object or a query string, mirroring exactly the parameters accepted by search_opportunities. This makes it straightforward to replicate the homepage discovery experience or seed an autocomplete UI with commonly used search terms.
The Snow API is a managed, monitored endpoint for snow.day — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when snow.day changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official snow.day API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a program recommendation tool filtered by season and financial accessibility grade
- Aggregate deadline data from multiple opportunities to power a student calendar feature
- Display curated program lists with curator notes sourced from get_list_detail
- Surface financial aid accessibility ratings to help students identify affordable programs
- Generate a searchable directory of high school competitions filtered by COMPETITION type
- Use get_top_searches categories to populate a homepage discovery widget
- Compare tuition and application fees across programs using get_opportunity_cost in bulk
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.