Skip to main content
For the complete documentation index, see llms.txt.
Agent discovery resources are available at /.well-known/api-catalog and /openapi.json.

Student Offers API Docs

Public discovery and content endpoints for Student Offers. These routes are intended for agents, integrations, and machine-readable access to public offer data and documentation. Everything is read-only — no API keys, no authentication.

Public APIs

GET /api/offers

Returns the public offers directory as JSON. Supports Accept: text/markdown for a compact markdown export, and ?full=1 for rows that include alternate links, discount codes, and FAQs.

GET /api/v1/offers

The versioned entrypoint — currently a 307 redirect to /api/offers with query parameters preserved. Build integrations against this URL: breaking changes will surface as /api/v2/, and the old version will answer with Deprecation and Sunset headers for at least six months before removal.

GET /api/offers/{id} and /api/offers/by-slug/{slug}

Fetch a single offer by numeric id or URL slug, including the heavy per-offer fields.

<any page>.md or Accept: text/markdown

Every core page and offer has a markdown twin: append .md to the path or send Accept: text/markdown. The list of markdown-enabled paths is in /llms.txt.

GET or POST /mcp

MCP-style JSON-RPC endpoint exposing search_docs and get_page tools for Student Offers documentation and guides. Plain JSON-RPC 2.0 over HTTP — any HTTP client can call it; no MCP session handshake required.

Error model

Documented endpoints return errors as typed JSON, so agents can branch on a stable code instead of parsing prose:

{
  "error": {
    "code": "not_found",
    "message": "No offer exists with that slug.",
    "hint": "List all offers via /api/offers to find valid slugs."
  }
}

Codes: invalid_id, invalid_slug, invalid_json, not_found, payload_too_large, rate_limited, internal_error. The full schema is in /openapi.json.

Rate limits

Public read endpoints allow 60 requests per minute per IP. Every rate-limited response carries RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset headers (RFC 9331); 429 responses additionally include Retry-After. Self-throttle using these headers — there is no burst allowance.

Discovery Documents