Interactive app
A small hands-on learning app built from your lesson, as a self-contained, sandboxed web page.
- Price3 credits (30p) per app
- Typical time60 s to 5 min
- Scope
media:write - Runs asA background job
Run interactive app in the sandbox
No key and nothing to pay. The sandbox returns a realistic example in a couple of seconds; no AI runs and no data is kept.
- Queued202 and a job id, straight away
- ProcessingPoll, stream or wait for a webhook
- SucceededResult and files on the job
Aurora Interactive designs one living little world for one idea in the lesson and builds it as plain HTML, CSS and JavaScript that passed EduMark's sandbox checks: no network, storage, cookies or access to the page around it. interactive.zip holds index.html (with a Content-Security-Policy that denies all network access) and manifest.json. Serve it in <iframe sandbox="allow-scripts">; theme it by overriding the CSS variables listed in the manifest; it posts {type: 'edumark-app', event, data} messages for size, score and errors.
Requires media:write. Costs 3 credits per app. Send a unique Idempotency-Key; reuse it with the identical body when retrying. Returns 202 with a job: poll GET /jobs/{job_id}, stream GET /jobs/{job_id}/events, or use a signed webhook.
Interactive app
POST/v1/interactives
Scope media:write
Headers
| Field | Details |
|---|---|
Idempotency-Key | stringRequiredA unique key per new operation; reuse it with the identical body when retrying. |
EduMark-Version | enumAPI version. Defaults to the latest.One of 2026-10-21 |
Request body
| Field | Details |
|---|---|
title | string, optionalThe lesson's title.Up to 160 characters |
course_title | string, optionalUp to 160 characters |
focus | string, optionalThe one idea the app should make hands-on.Up to 200 characters |
source_text | string, optionalThe lesson material (up to 10,000 words).Up to 60,000 characters |
document | FileReference or DocumentInput, optionalThe lesson as a PDF, DOCX or TXT. |
file_iddocument.file_id | stringRequiredThe id returned by POST /v1/files, after POST /v1/files/{id}/complete reported ready.When sending FileReferencePattern ^file_[a-f0-9]{32}$ |
filenamedocument.filename | stringRequiredWhen sending DocumentInputUp to 200 characters |
base64document.base64 | stringRequiredWhen sending DocumentInputUp to 27,962,028 characters |
mime_typedocument.mime_type | string, optionalWhen sending DocumentInputUp to 150 characters |
Responses
| Status | Meaning |
|---|---|
| 202 | Successful Response |
| 400 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 401 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 402 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 403 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 404 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 409 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 410 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 413 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 415 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 422 | Validation Error |
| 429 | Request rejected. Inspect error.code and request_id; failed work is not billed. |
| 503 | Request rejected. Inspect error.code and request_id; failed work is not billed. |