API Reference

Complete reference for all TutorFlow Agent Platform endpoints.

Base URL

https://api.tutorflow.io/v1/platform

Authentication

External endpoints require a valid Platform API key passed via the Authorization header. Internal management endpoints are authenticated through TutorFlow admin auth and are intentionally not enumerated in public agent documentation. See Authentication for details.

Endpoints Overview

Evaluations (API Key required)

MethodEndpointDescription
POST/evaluationsCreate an evaluation request
GET/evaluations/:idGet evaluation result
GET/evaluations/:id/files/:field/:indexDownload evaluation files
GET/evaluationsList evaluation requests. Supports learnerId filter

Learners (API Key required)

MethodEndpointDescription
GET/learnersList learners with aggregate evaluation stats
GET/learners/:learnerIdGet learner profile with per-concept mastery summaries

Courses (API Key and token-gated routes)

MethodEndpointDescription
POST/coursesCreate a course generation request
GET/courses/:idGet course by ID
GET/coursesList course requests
PATCH/courses/:idUpdate course metadata
PATCH/courses/:id/canonicalBulk-update course metadata, chapters, and lessons
PATCH/courses/:id/chapters/:chapterIdUpdate one chapter
PATCH/courses/:id/lessons/:sequenceUpdate one lesson by sequence
PATCH/courses/:id/lessons/by-id/:lessonId/fullUpdate one full lesson by UUID
POST/courses/:id/edit-tokenGenerate an edit token for a course
GET/courses/public/:shareTokenGet public course by share token
GET/courses/public/:shareToken/fullGet full public course with lessons
GET/courses/public/:shareToken/lessons/:sequenceGet public lesson by sequence
GET/courses/edit/:editTokenGet course by edit token
GET/courses/edit/:editToken/fullGet full course with lessons
GET/courses/edit/:editToken/lessons/:sequenceGet lesson by edit token
PATCH/courses/edit/:editToken/lessons/:sequenceUpdate lesson by edit token
GET/courses/edit/:editToken/canonicalGet canonical course payload by edit token
PATCH/courses/edit/:editToken/canonicalBulk-update canonical course payload by edit token
GET/courses/edit/:editToken/lessons/by-id/:lessonId/fullGet one full lesson by UUID and edit token
POST/courses/edit/:editToken/lessons/by-id/:lessonId/generateGenerate one lesson's lecture, quizzes, or practice content
PATCH/courses/edit/:editToken/lessons/by-id/:lessonId/fullUpdate one full lesson by UUID and edit token
PATCH/courses/edit/:editTokenUpdate course by edit token
POST/courses/edit/:editToken/lessonsAdd a new lesson to a course
POST/courses/edit/:editToken/infer-typeInfer best lesson type from title/context

Modules (API Key and public share routes)

MethodEndpointDescription
POST/modulesCreate one generated module/standalone lesson
GET/modules/:idGet module by ID
GET/modulesList modules
PATCH/modules/:idUpdate module fields and quizzes
DELETE/modules/:idSoft-delete a module
GET/modules/public/:shareTokenPublic read-only module viewer payload

Tests (API Key and token-gated routes)

MethodEndpointDescription
POST/testsCreate a test generation request
GET/tests/:idGet test by ID
GET/testsList test requests
PATCH/tests/:idUpdate test metadata
PATCH/tests/:id/fullBulk-update test metadata and items
PATCH/tests/:id/items/by-id/:itemIdUpdate one test item by UUID
POST/tests/:id/edit-tokenGenerate an edit token for a test
GET/tests/:id/submissionsList submissions for a test
GET/tests/public/:shareTokenGet public test by share token
GET/tests/public/:shareToken/fullGet full public test with items and answers
GET/tests/public/:shareToken/items/:sequenceGet public item by sequence
GET/tests/public/:shareToken/takeGet test for taking (no answers)
POST/tests/public/:shareToken/submissionsStart a test submission
PATCH/tests/submissions/:submissionTokenSave or finalize submission answers
GET/tests/submissions/:submissionToken/resultGet the latest submission state (in-progress or finalized)
GET/tests/edit/:editTokenGet test by edit token (no API key)
GET/tests/edit/:editToken/fullGet full test with items by edit token (no API key)
GET/tests/edit/:editToken/items/:sequenceGet item by edit token (no API key)
PATCH/tests/edit/:editTokenUpdate test title or description (no API key)
PATCH/tests/edit/:editToken/fullBulk update for title, description, level, timeLimit, and items (no API key)
POST/tests/edit/:editToken/itemsCreate a single item (no API key)
PATCH/tests/edit/:editToken/items/by-id/:itemIdUpdate item by UUID (no API key)
DELETE/tests/edit/:editToken/items/by-id/:itemIdDelete item by UUID (no API key)
PATCH/tests/edit/:editToken/items/reorderReorder items (no API key)
POST/tests/edit/:editToken/items/generateGenerate additional items via AI, sync (no API key)
PATCH/tests/edit/:editToken/items/:sequenceUpdate item by sequence, legacy (no API key)

Slides (API Key and token-gated routes)

MethodEndpointDescription
POST/slidesCreate a slide-deck generation request
GET/slides/:idGet slide request by ID
GET/slidesList slide requests
PATCH/slides/:idUpdate slide metadata and content
GET/slides/edit/:editTokenGet slide content + outline by edit token (no API key)
PATCH/slides/edit/:editTokenUpdate title, description, outline, content, etc.
POST/slides/edit/:editToken/generate/imageGenerate a single AI image (no API key)
POST/slides/edit/:editToken/pptxExport to PowerPoint (no API key)
GET/slides/public/:shareTokenPublic read-only viewer (no API key)

Videos (API Key and token-gated routes)

MethodEndpointDescription
POST/videosCreate a narrated-video generation request
GET/videos/:idGet video request by ID (includes renderStatus)
GET/videosList video requests
PATCH/videos/:idUpdate video metadata
POST/videos/:id/scenesAdd a scene
PATCH/videos/:id/scenes/:sceneIdUpdate a scene
DELETE/videos/:id/scenes/:sceneIdDelete a scene
PUT/videos/:id/scenes/reorderReorder scenes
GET/videos/edit/:editTokenGet full video + scenes by edit token (no API key)
PATCH/videos/edit/:editTokenUpdate video metadata (title, BGM, aspect, etc.)
POST/videos/edit/:editToken/scenesAdd a scene
PATCH/videos/edit/:editToken/scenes/:sceneIdUpdate a scene
DELETE/videos/edit/:editToken/scenes/:sceneIdDelete a scene
PUT/videos/edit/:editToken/scenes/reorderReorder scenes
POST/videos/edit/:editToken/scenes/:sceneId/ttsRegenerate TTS for a scene
POST/videos/edit/:editToken/scenes/:sceneId/clip/searchSearch Pexels + Pixabay for stock clips
POST/videos/edit/:editToken/scenes/:sceneId/clip/selectApply a selected stock clip
POST/videos/edit/:editToken/scenes/:sceneId/clip/uploadUpload a custom clip (multipart)
POST/videos/edit/:editToken/scenes/:sceneId/visual/image/uploadUpload a custom image visual (multipart)
POST/videos/edit/:editToken/scenes/:sceneId/overlays/sticker/uploadUpload a sticker overlay image (multipart)
POST/videos/edit/:editToken/scenes/:sceneId/overlays/character/generateGenerate a character sticker overlay
GET/videos/edit/:editToken/visual/slidesList available slide visuals for this video
POST/videos/edit/:editToken/scenes/:sceneId/visual/slideUse an existing slide as a scene visual
POST/videos/edit/:editToken/scenes/:sceneId/visual/slide/createCreate a new slide visual for a scene
POST/videos/edit/:editToken/sync-durationsRecompute scene durations from TTS audio
POST/videos/edit/:editToken/thumbnailUpload a thumbnail image (multipart)
POST/videos/edit/:editToken/bgm/searchSearch BGM presets
POST/videos/edit/:editToken/bgm/selectApply a BGM preset
DELETE/videos/edit/:editToken/bgmRemove BGM
POST/videos/edit/:editToken/renderStart a Remotion render
POST/videos/edit/:editToken/render/cancelCancel an in-progress render
GET/videos/public/:shareTokenPublic read-only viewer (no API key)

Agent Self-Service

See Agent Self-Service API for request bodies, response fields, and recovery errors.

MethodEndpointAuthDescription
GET/pricing-catalogNoneLive per-unit pricing catalog
GET/.well-known/agent.jsonNoneService discovery manifest
POST/agent/registerNone (IP throttled)Self-service registration
GET/agent/verify-emailNoneVerify workspace email. Requires token query parameter
POST/agent/verify-email/resendAPI KeyResend verification email
POST/agent/billing/sessionAPI KeyGet checkout page URL for credit purchase. Requires verified email
GET/agent/billing/statusAPI KeyBilling status and payment method info
GET/agent/accountAPI KeyWorkspace info and credit balance
GET/agent/checkoutNoneValidate a billing checkout token. Requires token query parameter
POST/agent/checkoutNoneCreate Stripe session from checkout token

LTI 1.3 Integration

MethodEndpointAuthDescription
POST/lti/registrationsAPI KeyCreate an LTI registration
GET/lti/registrationsAPI KeyList LTI registrations
GET/lti/registrations/:idAPI KeyGet an LTI registration
PUT/lti/registrations/:idAPI KeyUpdate an LTI registration
DELETE/lti/registrations/:idAPI KeyDeactivate an LTI registration
GET/lti/loginNoneOIDC login initiation (called by LMS)
POST/lti/launchNoneLaunch callback (called by LMS)
POST/lti/deep-linking/responseNoneDeep linking response callback
GET/lti/.well-known/jwks.jsonNonePublic JWKS endpoint

Health

MethodEndpointAuthDescription
GET/healthAPI KeyHealth check (validates API key)

MCP

Agents can also connect via the Model Context Protocol instead of calling REST endpoints directly.

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

Internal and Dashboard APIs

TutorFlow also has dashboard and internal management APIs for workspace administration, key management, webhook setup, usage inspection, and billing operations. They are intentionally not enumerated in the public agent docs because they are not callable with Platform API keys and are meant for TutorFlow dashboard or admin-auth surfaces.

Agents should use:

  • POST /v1/platform/agent/register for first key creation
  • GET /v1/platform/agent/account and GET /v1/platform/agent/billing/status for self-service state
  • POST /v1/platform/agent/billing/session for human-approved credit top-up

Response Format

All responses return JSON. Successful responses include the resource directly:

{
  "id": "uuid",
  "status": "COMPLETED",
  "evaluationType": "open_ended",
  "score": 8,
  "feedbackSummary": "Strong answer..."
}

External Platform API key error responses follow this format:

{
  "error": {
    "code": "platform_invalid_request",
    "message": "Validation failed",
    "status": 422
  }
}

Validation failures usually return HTTP 422 with error.code: "platform_invalid_request". Some malformed requests can return HTTP 400 with the same code. Agents should branch on error.code first.

Detailed References