MagicSchool APIapp.magicschool.ai ↗
Access MagicSchool AI's public teacher and student tool catalog. Two endpoints return tool cards, benefit blurbs, FAQs, and related tools from the listing page.
What is the MagicSchool API?
The MagicSchool AI API exposes 2 endpoints that cover the public tool catalog at app.magicschool.ai, returning tool names, descriptions, categories, and detail-page content. The list_tools endpoint retrieves up to 12 tool cards from the public listing in a single call, while get_tool returns the full marketing detail page for any individual teacher tool — including benefit blurbs, FAQ entries, and related tool recommendations.
curl -X GET 'https://api.parse.bot/scraper/69dbfefa-c2d5-40d6-919e-c3f995943b07/list_tools?category=teacher' \ -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 app-magicschool-ai-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: MagicSchool public tools catalog — browse, drill down, handle missing."""
from parse_apis.app_magicschool_ai_api import MagicSchool, ToolCategory, ToolNotFound
client = MagicSchool()
# List trending teacher tools from the public catalog.
for summary in client.tool_summaries.list(category=ToolCategory.TEACHER, limit=5):
print(summary.name, "-", summary.description)
# Drill into the first teacher tool's full detail page via its slug.
teacher_hit = client.tool_summaries.list(category=ToolCategory.TEACHER, limit=1).first()
if teacher_hit is not None and teacher_hit.detail_slug is not None:
tool = client.tools.get(slug=teacher_hit.detail_slug)
print(tool.page_title)
for benefit in tool.benefits:
print(" •", benefit.headline)
for faq in tool.faqs[:3]:
print(" Q:", faq.question)
for related in tool.related_tools:
print(" Related:", related.name, related.detail_slug)
# Demonstrate typed error handling for a slug that doesn't exist.
try:
client.tools.get(slug="nonexistent-tool")
except ToolNotFound:
print("Tool not found — expected for an invalid slug.")
print("exercised: tool_summaries.list / tools.get / ToolNotFound")
Returns every tool card shown on MagicSchool's public 'AI tools for teachers' listing page in one round trip (no pagination; the page currently shows 12 cards across two sections). Each row is one tool with its name, one-sentence description, category ('teacher' for the trending teacher tools section, 'student' for the top student tools section, 'other' if the site adds a new section), the section heading it came from, the marketing detail-page slug (teacher tools only; null for student tools), the in-app tool code from the student launch link (student tools only; null for teacher tools), the card link and image. Optional category filter is applied locally; an unknown category is rejected. The full 80+/50+ tool library is behind login and not included.
| Param | Type | Description |
|---|---|---|
| category | string | Restrict results to one section of the listing. Omitted = all tools. |
{
"type": "object",
"fields": {
"count": "number of tools returned after the category filter",
"tools": "array of tool cards: name, description, category (teacher|student|other), section_title, detail_slug (nullable; input for get_tool), app_tool_code (nullable in-app tool identifier for student tools), url, image_url",
"category": "the category filter applied, or null",
"source_url": "public listing page the cards were read from"
},
"sample": {
"data": {
"count": 2,
"tools": [
{
"url": "https://www.magicschool.ai/tools/lesson-plan",
"name": "AI lesson plan generator",
"category": "teacher",
"image_url": "https://cdn.prod.website-files.com/645187275d5e5e4179e4063b/69e91333a4c2d9a765b5786d_Tool-Lesson-Plan-Generator.png",
"description": "Build a lesson plan for any topic so you can spend more time teaching and less time planning.",
"detail_slug": "lesson-plan",
"app_tool_code": null,
"section_title": "Trending teacher tools"
},
{
"url": "https://app.magicschool.ai/magic-student/room/new?tool=quiz-me-s",
"name": "Quiz me!",
"category": "student",
"image_url": "https://cdn.prod.website-files.com/645187275d5e5e4179e4063b/69ea88711dd21b273e057543_Student-Tool-Quiz-me.png",
"description": "Give students a structured way to study any topic, at their own pace, on their own terms.",
"detail_slug": null,
"app_tool_code": "quiz-me-s",
"section_title": "Top AI tools for students"
}
],
"category": null,
"source_url": "https://www.magicschool.ai/magic-tools"
},
"status": "success"
}
}About the MagicSchool API
What the API covers
The API reads MagicSchool's publicly visible AI tools catalog, which currently lists tools across teacher and student sections. list_tools returns all tool cards in one call: each card includes the tool name, a one-sentence description, a category field (teacher, student, or other), a section_title, and a detail_slug that can be passed directly to get_tool. An optional category parameter filters the result to a single section. The response also includes a count of matched tools and the source_url of the listing page.
Detail page content via get_tool
get_tool accepts a slug string — taken directly from list_tools.tools[*].detail_slug — and returns the full public marketing page for that teacher tool. The response includes name, page_title, description (meta description), an array of benefits (each with a headline and text), an array of faqs (each with question and answer as published on the tool page), and a related_tools array listing tools promoted on that page. Each entry in related_tools carries its own name, description, and detail_slug, making it straightforward to iterate through the catalog.
Scope and data freshness
Both endpoints reflect the publicly accessible, no-login-required portions of the MagicSchool website. The full in-app tool library — accessible only after creating a MagicSchool account — is not covered. The listing page currently shows 12 cards; if MagicSchool adds more public tools, those will appear in list_tools responses accordingly.
The MagicSchool API is a managed, monitored endpoint for app.magicschool.ai — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when app.magicschool.ai 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 app.magicschool.ai 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 searchable directory of MagicSchool AI teacher tools using names, descriptions, and categories from list_tools
- Extract benefit blurbs and FAQ content from individual tool pages via get_tool for competitive education-tool research
- Map related_tools relationships returned by get_tool to understand how MagicSchool clusters its AI offerings
- Aggregate meta descriptions and page titles from multiple slugs to compare how different tools are positioned
- Identify all tools in the student category using the category filter on list_tools
- Seed a content brief or product catalog by pulling structured benefit headlines and answer text from get_tool responses
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.