---
title: "GET /api/script-assistant/sessions/{sessionId}/storyboard"
method: GET
path: "/api/script-assistant/sessions/{sessionId}/storyboard"
tags: ["ScriptAssistant"]
---

# GET /api/script-assistant/sessions/{sessionId}/storyboard

`GET /api/script-assistant/sessions/{sessionId}/storyboard`

## Request

- Base URL: `https://api.wearelearning.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.wearelearning.io/api/script-assistant/sessions/{sessionId}/storyboard`
- Auth: OAuth 2
  - Implicit: `https://login.wearelearning.io/authorize?audience=https://api.wearelearning.io`

## Path parameters

- `sessionId` string, required

## Response `200`

OK

- StoryboardDto
  - `renderJobId` string, nullable: Current render job. Null when the session has never had a deck rendered.
  - `expectedSlideCount` integer, nullable: The authoritative slide count once the render finishes, falling back to the claimed deck's advisory count while it is in progress. Null when neither is known yet.
  - `isComplete` boolean, required: True once the render finished, successfully or not - there is nothing more coming.
  - `renderFailure` 'None' | 'TooLarge' | 'ConversionFailed' | 'SourceMissing' | 'CouldNotStart', required
  - `renderFailurePageCount` integer, nullable: Slides found, for the over-ceiling message.
  - `renderFailureMaxSlides` integer, nullable: The ceiling that was exceeded, so the client need not know the configuration.
  - `renderNarrationSource` 'None' | 'AiDraft' | 'SpeakerNotes'
  - `narrationRequestState` 'NotAsked' | 'Declined' | 'Requested' | 'Completed' | 'Failed', required
  - `storyCreationStatus` 'NotStarted' | 'InProgress' | 'Created', required
  - `createdSimulationId` string, nullable: The story, once there is one. Null for every status but WeAreLearning.R2D2.Core.ScriptAssistant.Entities.SlideshowStoryCreationStatus.Created — a build under way has nothing to navigate into yet, which is exactly what lets the client tell "open it" from "keep waiting".
  - `storyCreationCompleted` boolean, required: Whether the build behind WeAreLearning.R2D2.Api.DTO.ScriptAssistant.StoryboardDto.CreatedSimulationId has FINISHED — every slide a node, every node wired in.
  - `storyCreationStopped` boolean, required: Whether the build behind WeAreLearning.R2D2.Api.DTO.ScriptAssistant.StoryboardDto.CreatedSimulationId stopped without finishing, with every attempt used up (WE-2694). The storyboard offers Resume on this.
  - `storyCreationMissingSlideCount` integer, required: How many slides the finished story is missing, when a resumed build finished with what it could build and left the rest for the user to add in the editor. Zero for a complete story.
  - `beats` StoryboardBeatDto[], required
    - `pageIndex` integer, required
    - `imageUrl` string, nullable
    - `extractedTextPreview` string, nullable
    - `notesPreview` string, nullable
    - `narration` string, nullable
    - `renderStatus` 'Pending' | 'Rendering' | 'Rendered' | 'Failed', required
    - `narrationStatus` 'Pending' | 'Drafted' | 'Skipped' | 'Failed', required
    - `excludedAt` string, date-time, nullable: When the user removed this slide from the storyboard. Null means present.

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found

---

[API](https://skmtc.dev/wearelearning/apis/we-are-learning-api.md) - [All operations](https://skmtc.dev/wearelearning/apis/we-are-learning-api/llms.txt) - [OpenAPI document](https://skmtc.dev/wearelearning/apis/we-are-learning-api/revisions/e2ca5265db77?raw)
