Skip to Content
Editor GuideExporting Your Story

Exporting Your Story

Your story is yours. Two things can leave Skaz: what players did, and the story itself — as open JSON, or packaged for your LMS as SCORM or xAPI.

JSON and player data live on the story page in Studio, under Player data. SCORM and xAPI are in the editor, on the Story tab.

The story, as JSON

Export JSON downloads the whole story in an open, documented format — blocks, the links between them, choices and variables. Nothing in the file is specific to Skaz’s database, and nothing about it is encrypted or obfuscated: it is a text file you can read.

Exporting the story is available on the Creator plan and above. Everyone who joined during the beta keeps Creator for free.

The format

{ "skaz_format": 1, "exported_at": "2026-09-24T09:12:33Z", "story": { "id": "8ad49355-a1ee-46b0-8787-9392ac713d48", "title": "The complaint that escalates", "description": "A damaged order and an angry customer.", "starting_node_id": "a1b2c3d4-…", "nodes": [ … ], "v_schema": { "fields": [ { "id": "…", "name": "trust", "type": "int" } ] }, "characters": [ … ] } }
  • skaz_format — the version of this file layout. It changes only if the shape below changes in a way an old reader could not handle.
  • exported_at — when the file was written, UTC.
  • story.starting_node_id — the block the story opens on.
  • story.nodes — every block, in no particular order.
  • story.v_schema.fields — the variables the story declares, with their types.
  • story.characters — the story’s cast: each with an id, name, color, is_player, and emotions (id, name, image). Absent if the story has none.

A block

{ "id": "a1b2c3d4-…", "type": "text", "content": { "text": "The order arrived broken.", "image": "" }, "choices": [ { "id": "…", "parent_id": "a1b2c3d4-…", "label": "Apologise", "goto_id": "e5f6…" } ], "next_id": "", "ending_name": "" }
  • type — one of text, dialogue, user_input, audio, set_variable_value, change_number_variable_value, variable_router, play_background_audio, stop_background_audio. See Blocks.
  • content — the fields for that block type, exactly as the editor stores them.
  • choices — what the player can pick, each with the goto_id of the block it leads to. A router’s branches are choices too, with the condition as the label.
  • next_id — where a block with no choices continues to, if anywhere.
  • ending_name — set only on blocks the story can end on.

A dialogue block’s content holds background and lines. Each line has a character_id, an optional emotion id and its text — plus a speaker with the name, colour and portrait already filled in, so a line can be shown without looking the character up.

That is the whole format. A block, its content, and the ids it points at.

SCORM and xAPI

To put a story into a learning management system — Moodle, Canvas, Cornerstone, TalentLMS and the rest — open the story in the editor, go to the Story tab, and under Export Story pick:

  • Export as SCORM (ZIP) — a SCORM 2004 package. Upload it to your LMS as a new course or activity.
  • Export as xAPI (ZIP) — a Tin Can (xAPI) package, for LMSs and learning record stores that take those.

SCORM and xAPI export are on the Studio and Team plans.

The package holds a small launch page that plays the published story from Skaz inside the LMS. That means:

  • Publish the story first — an unpublished story won’t open for learners.
  • Edits reach learners without re-uploading. Fix a typo, publish, and the LMS course shows the new version. Re-export only if you change the title.
  • Plays count as normal plays — they show up in your statistics and sessions.
  • Stories that require signing in don’t work inside an LMS — the story plays in a frame, and signing in doesn’t survive a frame on someone else’s domain, the same as with embedding. Use stories anyone can play.

The package doesn’t report completion or a score back to the LMS yet. The LMS records that the learner opened the course; how they did lives in Skaz, in statistics and the answers export.

What players did

Export CSV gives you one row per session and one column per variable — including everything typed into input blocks — plus how far each player got and which ending they reached. A webhook can post the same thing to your own service the moment someone finishes. See Tracking plays.

One row per learner

For stories that ask players to sign in, Learner report turns the sessions into one row per person. See Learner report.

What is not exportable yet

Importing a story back from JSON is not built. The export exists so your work is never trapped here; re-importing it is on the list, not in the product. We would rather say that than let you find out later.


Exporting Your Story — Skaz Docs