API Reference

The Agent Platform account routes, where content work lives on the Content API, and which /v1/platform content routes were removed.

Use this page to find where each route an agent calls lives. The Agent Platform account routes are listed here; content work links to the Content API reference. Terms such as workspace, classroom, and Content key are defined in Terms.

Where each route lives

WorkAPIBase URLReference
Courses, modules, tests, slides, videos, games, simulations, evaluations, the learner model, webhooksContent APIhttps://api.tutorflow.io/v1/contentContent API Reference
Registration, account, balance, top-ups, discovery, health, LTIAgent Platformhttps://api.tutorflow.io/v1/platformThis page

Content work goes to the Content API, under /v1/content/classrooms/{classroomId}, with a tf_content_ key. {classroomId} is the defaultClassroomId your account returns. The Content API reference lists every route with its scope and success answer, and links its OpenAPI 3.1 description.

The content routes under /v1/platform were removed on 2026-10-16. See Removed content routes.

Authentication

Send a key as Authorization: Bearer <key>. The account routes take a live Content key (tf_content_) with full access, like the one registration and the dashboard issue. A test key gets 403 platform_content_key_too_narrow. A legacy key (tf_platform_) also works on the account routes, and on nothing else. See Authentication.

Agent Platform routes

Paths are under /v1/platform.

Discovery

MethodRouteAuthDescription
GET/.well-known/agent.jsonNoneDiscovery manifest, pointing at the Content API
GET/pricing-catalogNonePrices per category, in credits and USD, one entry per priced Content API call; see Pricing and Billing.

Agent self-service

See Agent Self-Service API for bodies and answers.

MethodRouteAuthDescription
POST/agent/registerNoneCreate an agent account; returns a tf_content_ key and defaultClassroomId. 5 attempts per IP per rolling hour
GET/agent/accountKeyAccount, balance, defaultClassroomId, sandboxClassroomId, Content API URLs
GET/agent/verify-emailNoneVerify the account email. Takes token
POST/agent/verify-email/resendKeyResend the verification email
GET/agent/billing/statusKeyPayment method and balance
POST/agent/billing/sessionKeyCheckout link for a person. Needs a verified email
POST/agent/billing/x402/depositKeyUSDC deposit address. Needs a verified email
POST/agent/billing/x402KeyCredit a paid USDC deposit from the x-payment header
GET/agent/checkoutNoneValidate a checkout token. Used by the checkout page
POST/agent/checkoutNoneCreate the Stripe session. Used by the checkout page

LTI 1.3

MethodRouteAuthDescription
POST/lti/registrationsKeyCreate an LTI registration
GET/lti/registrationsKeyList LTI registrations
GET/lti/registrations/:idKeyRead an LTI registration
PUT/lti/registrations/:idKeyUpdate an LTI registration
DELETE/lti/registrations/:idKeyDeactivate an LTI registration
GET, POST/lti/login/{registrationId}NoneOIDC login initiation for one registration, called by the LMS. Use this one once the registration exists
GET, POST/lti/loginNoneOIDC login initiation matched by issuer and client_id; refuses a match to more than one registration
POST/lti/launchNoneLaunch callback, called by the LMS
GET/lti/.well-known/jwks.jsonNonePublic JWKS

See LTI Registrations, LTI Launch Flow, and LTI Grade Sync.

Health

MethodRouteAuthDescription
GET/healthKeyHealth check that also validates the key. Without a key: 401 platform_invalid_api_key

MCP

TransportURL
Streamable HTTPhttps://mcp.tutorflow.io/api/mcp

See MCP Integration.

Dashboard and internal routes

The Agent Platform dashboard uses its own routes, signed in with a TutorFlow session, to manage workspaces, keys, members, usage, and billing. They do not take API keys and are not part of the public API.

Errors

Agent Platform routes answer errors as:

JSON
{
  "error": {
    "code": "platform_invalid_api_key",
    "message": "Invalid or missing Platform API key",
    "error": "Unauthorized",
    "statusCode": 401,
    "status": 401
  }
}

Read code and status. error and statusCode repeat the HTTP status in another form.

Content API routes use content_* codes and add requestId. See Error Handling.

Three answers an agent must handle on every route it calls:

Statuserror.codeMeaning
402content_payment_requiredNot enough credits for a priced Content API call. Nothing was charged. The error carries billingSessionUrl, emailVerification, and, where USDC payment is enabled, x402. See When credits run out.
410platform_route_removedA removed /v1/platform content route. See Removed content routes.
429content_rate_limit_exceeded, platform_rate_limit_exceededOver the rate limit. Wait Retry-After seconds. See Rate Limiting.

Removed content routes

These Agent Platform routes were removed on 2026-10-16, together with their edit-token and share-token routes and the token editors. Every method on them answers 410, with any key or none:

JSON
{
  "error": {
    "code": "platform_route_removed",
    "message": "This Agent Platform content route was removed. Use the Content API with a tf_content_ key: https://tutorflow.io/agent-platform/docs/guides/content-api-migration",
    "migrationGuide": "https://tutorflow.io/agent-platform/docs/guides/content-api-migration",
    "status": 410
  }
}

Do not retry. Call the Content API instead, with a tf_content_ key:

Removed prefixContent API replacement
/v1/platform/courses/v1/content/classrooms/{classroomId}/courses, /courses/generate
/v1/platform/modules/v1/content/classrooms/{classroomId}/modules, /modules/generate
/v1/platform/tests/v1/content/classrooms/{classroomId}/tests, /tests/generate
/v1/platform/slides/v1/content/classrooms/{classroomId}/slides, /slides/generate
/v1/platform/videos/v1/content/classrooms/{classroomId}/videos
/v1/platform/games/v1/content/classrooms/{classroomId}/games
/v1/platform/evaluations/v1/content/classrooms/{classroomId}/evaluations
/v1/platform/learners/v1/content/classrooms/{classroomId}/mastery/{learner}, /concepts
/v1/platform/webhooks/v1/content/webhooks

Every route, one by one, is in Migrating to the Content API.