# Core Entities This page describes the main entities in Shuffll and how they relate to each other. Understanding this model will help you navigate the API correctly — knowing which ID to use where, and how resources are scoped. ## Entity overview ```mermaid flowchart TD Org["Organization"] WS["Workspace"] Brand["Branding\n(embedded)"] Tmpl["Template"] Asset["Asset"] Proj["Project"] Org -->|"1 or more"| WS Org -->|"has embedded"| Brand WS -->|"has embedded"| Brand WS -->|"contains"| Tmpl WS -->|"contains"| Asset WS -->|"contains"| Proj Tmpl -. "blueprint for" .-> Proj ``` ## Organization An Organization is the top-level container in Shuffll. It groups one or more workspaces under a single account and holds a shared branding configuration. - Retrieve your organizations and their workspace IDs with `GET /auth/organization/list`. - You need an `organizationId` to manage workspaces and their branding. ## Workspace A Workspace is the primary working environment. All content — projects, templates, and assets — lives inside a workspace, not directly on the organization. Each workspace also carries its own branding, which takes precedence over the organization's branding when videos are generated. - List workspaces via `GET /auth/organization/{organizationId}`. - Use `GET /auth/workspace/{workspaceId}/projects` to list a workspace's projects. - Workspace branding is managed via `GET` / `PUT /auth/branding/entity?workspaceId=...`. ## Template A Template is a reusable video blueprint. It defines the scene structure, visual design, typography, media source pipeline, and default AI settings. Templates are workspace-scoped. When you create a project from a template, the template configures the project's structure at creation time. It is **not** stored as a persistent link on the project afterward — the template is consumed once and the project stands on its own. - Browse templates with `GET /auth/templates` or `GET /auth/organization/{organizationId}/workspace/{workspaceId}/templates`. - Inspect a template's scene structure with `GET /auth/templates/{templateId}` before using it. ## Asset An Asset is a media file uploaded to a workspace — image, video, audio, or PDF. Assets are workspace-scoped and can be referenced directly in project creation requests via their `uploadPath` CDN URL. - Upload assets with `POST /auth/workspace/{workspaceId}/assets`. - The `uploadPath` returned on each asset is the URL to use in `customTemplate.scenes[].videosToAdd[].url`. ## Project A Project is a single video production. It is created inside a workspace, goes through an AI generation phase, automatic enhancement (post-production), and finally export. A project is the central unit of work in the Shuffll API. - Create a project with `POST /auth/project/create`. - Track status with `GET /auth/project/{projectId}/create/status`. - See [Workflow Overview](/guides) for the full lifecycle. ## Branding Branding is not a standalone entity — it is an embedded configuration inside both Organization and Workspace. It stores logo URLs, colour palette, company metadata, pronunciations, and the `about` text used in AI script generation. Workspace branding takes precedence over organization branding when videos are generated. Manage branding with `GET` / `PUT /auth/branding/entity`. ## Inside a Project A project is composed of several parts that together define the complete video production: ```mermaid flowchart TD Proj["Project"] Creative["Creative\n(AI-generated script\nand storyline)"] Scenes["Scenes"] SceneDetail["Per-scene content\n(dynamic values, videos,\nsubtitles, static text)"] Voice["AI Voice settings\n(provider, voice ID,\ntone instructions)"] Avatar["AI Avatar settings\n(avatar ID)"] Fonts["Font settings"] Brand["Branding snapshot\n(applied at generation time)"] Status["Status\nSTRUCTURE → GENERATING_IMAGES → DONE"] Exports["Export jobs\n(render results + output URLs)"] APIConfig["API config\n(webhook URL, additionalParams)"] Proj --> Creative Proj --> Scenes Scenes --> SceneDetail Proj --> Voice Proj --> Avatar Proj --> Fonts Proj --> Brand Proj --> Status Proj --> Exports Proj --> APIConfig ``` | Component | Description | | --- | --- | | **Creative** | The AI-generated script and narrative structure — the content backbone of the video | | **Scenes** | Ordered list of scenes. Each scene has its own dynamic content, media, subtitle settings, and optional static text | | **AI Voice settings** | Which AI voice to use, the provider (OpenAI or ElevenLabs), and any tone/style instructions | | **AI Avatar settings** | Which AI avatar presenter to use, if any | | **Font settings** | Typography applied across all scenes | | **Branding snapshot** | A copy of the workspace branding captured at creation time | | **Status** | The current stage: `STRUCTURE` → `GENERATING_IMAGES` → `DONE` (then enhancement begins) | | **Export jobs** | The list of export runs and their output URLs (`uploadPath` MP4, `dashPath` DASH manifest) | | **API config** | The webhook URL and any `additionalParams` to echo back in the webhook payload | ## Inside a Template A template defines the blueprint used to initialise a project's structure. Its settings are applied (and in some cases overridable) at project creation time: ```mermaid flowchart TD Tmpl["Template"] SceneBlueprints["Scene blueprints\n(structure and scene types)"] Design["Design reference\n(visual style, colours,\nanimations)"] Flexibility["Flexibility\nrigid / minor / flexible"] Fonts["Font settings\n+ toUseTemplateFont flag"] VideoPipeline["Video source pipeline\n(fallback order for scene media)"] ImagePipeline["Image source pipeline\n(fallback order for scene images)"] DefaultVoice["Default voice settings"] Description["AI description\n(system prompt injected\ninto script generation)"] Tmpl --> SceneBlueprints Tmpl --> Design Tmpl --> Flexibility Tmpl --> Fonts Tmpl --> VideoPipeline Tmpl --> ImagePipeline Tmpl --> DefaultVoice Tmpl --> Description ``` | Component | Description | Overridable at creation | | --- | --- | --- | | **Scene blueprints** | Defines the number, type, and order of scenes | Partially — `flexibilityOverride` controls how strictly they are followed | | **Design reference** | Points to the visual design that drives colours, animations, and layout | No | | **Flexibility** | Default AI adherence level for this template | Yes — `customTemplate.flexibilityOverride` | | **Font settings** | Typography for all scenes | Yes — `customTemplate.fontsSettings` or `toUseTemplateFont` | | **Video source pipeline** | Default fallback order for scene video media | Yes — `customTemplate.videoSourcesByOrder` | | **Image source pipeline** | Default fallback order for scene image slots | Yes — `customTemplate.imageSourcesByOrder` | | **Default voice settings** | Voice used if none is specified in the project request | Yes — `aiVoiceSettings` at the project level | | **AI description** | System prompt injected into script generation | Yes — `customTemplate.description` or `toUseTemplateDescription` | See [Using Templates](/guides/workflow-templates) for a full guide on all overridable options.