Tailend API
Overview
What the Tailend API returns, who it is for, and a working request for each common job.
The Tailend API returns family activities as clean JSON: events, classes, camps, places and the organizations behind them, for each metro we cover. It is read-only, every request is a plain HTTPS GET with an API key, and no SDK is needed.
Use it to power a family app or website, a newsletter, a map, or an AI assistant that needs to answer "what can we do this weekend?" with real, current listings.
Examples
Pick a job to see the request. Every example opens in the API reference, ready to try.
curl -sS \
-H "X-API-Key: $TAILEND_API_KEY" \
"https://api.tailend.dev/v1/philadelphia/events?from=2026-10-17&to=2026-10-18&age=4"const res = await fetch("https://api.tailend.dev/v1/philadelphia/events?from=2026-10-17&to=2026-10-18&age=4", {
headers: { 'X-API-Key': '$TAILEND_API_KEY' },
});
const body = await res.json();
console.log(res.status, body);import os
import requests
response = requests.get(
"https://api.tailend.dev/v1/philadelphia/events?from=2026-10-17&to=2026-10-18&age=4",
headers={'X-API-Key': os.environ['TAILEND_API_KEY']},
)
response.raise_for_status()
print(response.json())curl -sS \
-H "X-API-Key: $TAILEND_API_KEY" \
"https://api.tailend.dev/v1/philadelphia/search?q=toddler%20story%20time&age=3"const res = await fetch("https://api.tailend.dev/v1/philadelphia/search?q=toddler%20story%20time&age=3", {
headers: { 'X-API-Key': '$TAILEND_API_KEY' },
});
const body = await res.json();
console.log(res.status, body);import os
import requests
response = requests.get(
"https://api.tailend.dev/v1/philadelphia/search?q=toddler%20story%20time&age=3",
headers={'X-API-Key': os.environ['TAILEND_API_KEY']},
)
response.raise_for_status()
print(response.json())curl -sS \
-H "X-API-Key: $TAILEND_API_KEY" \
"https://api.tailend.dev/v1/philadelphia/classes?starts_from=2026-10-19&starts_to=2026-10-25&age=6"const res = await fetch("https://api.tailend.dev/v1/philadelphia/classes?starts_from=2026-10-19&starts_to=2026-10-25&age=6", {
headers: { 'X-API-Key': '$TAILEND_API_KEY' },
});
const body = await res.json();
console.log(res.status, body);import os
import requests
response = requests.get(
"https://api.tailend.dev/v1/philadelphia/classes?starts_from=2026-10-19&starts_to=2026-10-25&age=6",
headers={'X-API-Key': os.environ['TAILEND_API_KEY']},
)
response.raise_for_status()
print(response.json())curl -sS \
-H "X-API-Key: $TAILEND_API_KEY" \
"https://api.tailend.dev/v1/philadelphia/events/calendar?from=2026-11-01&to=2026-11-30"const res = await fetch("https://api.tailend.dev/v1/philadelphia/events/calendar?from=2026-11-01&to=2026-11-30", {
headers: { 'X-API-Key': '$TAILEND_API_KEY' },
});
const body = await res.json();
console.log(res.status, body);import os
import requests
response = requests.get(
"https://api.tailend.dev/v1/philadelphia/events/calendar?from=2026-11-01&to=2026-11-30",
headers={'X-API-Key': os.environ['TAILEND_API_KEY']},
)
response.raise_for_status()
print(response.json())curl -sS \
-H "X-API-Key: $TAILEND_API_KEY" \
"https://api.tailend.dev/v1/philadelphia/around?address=1500%20Market%20St%2C%20Philadelphia%2C%20PA"const res = await fetch("https://api.tailend.dev/v1/philadelphia/around?address=1500%20Market%20St%2C%20Philadelphia%2C%20PA", {
headers: { 'X-API-Key': '$TAILEND_API_KEY' },
});
const body = await res.json();
console.log(res.status, body);import os
import requests
response = requests.get(
"https://api.tailend.dev/v1/philadelphia/around?address=1500%20Market%20St%2C%20Philadelphia%2C%20PA",
headers={'X-API-Key': os.environ['TAILEND_API_KEY']},
)
response.raise_for_status()
print(response.json())curl -sS \
-H "X-API-Key: $TAILEND_API_KEY" \
"https://api.tailend.dev/v1/changes?since=2026-10-01T00%3A00%3A00Z&metro=philadelphia"const res = await fetch("https://api.tailend.dev/v1/changes?since=2026-10-01T00%3A00%3A00Z&metro=philadelphia", {
headers: { 'X-API-Key': '$TAILEND_API_KEY' },
});
const body = await res.json();
console.log(res.status, body);import os
import requests
response = requests.get(
"https://api.tailend.dev/v1/changes?since=2026-10-01T00%3A00%3A00Z&metro=philadelphia",
headers={'X-API-Key': os.environ['TAILEND_API_KEY']},
)
response.raise_for_status()
print(response.json())What you get back
Every listing has a stable id and slug, a type, local and UTC times, ages, price and the place it happens at. Lists come in one envelope:
{
"data": [{ "id": "b81a95d2-…", "type": "event", "name": "Toddler Time", "starts_at": "2026-09-14T13:30:00.000Z" }],
"meta": { "limit": 50, "count": 1, "has_more": false, "next_cursor": null }
}- Events are dated occurrences. A weekly series is one listing; see Recurring events.
- Classes are enrollable programs with a term, a schedule and tuition.
- Camps are camps and their dated, priced sessions.
- Places are venues with hours, admission and what they offer.
- Organizations run the listings and the places.
How the docs are organized
- Quickstart: a key, a first request, filters and the next page.
- API reference (try it): every endpoint, parameter, field and status code, generated from the OpenAPI spec. Try any request with sample data, no key needed.
- Changelog: what changed, with dates. Also as RSS.
Building with an AI coding agent? Point it at undefined; every page is also available as Markdown. See Build with AI agents.