# Exporting Your Story

Source: https://docs.skaz.io/guide/exporting

> Export from Skaz: player answers as CSV, webhooks, learner reports, the story as open JSON, and SCORM or xAPI packages for your LMS.

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

```json
{
  "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](/guide/characters): each with an
  `id`, `name`, `color`, `is_player`, and `emotions` (`id`, `name`, `image`).
  Absent if the story has none.

### A block

```json
{
  "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](/guide/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](/guide/tracking-plays).
- **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](/guide/publishing#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](/guide/tracking-plays).

## 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](/guide/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](/guide/tracking-plays#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.
