# Creatify Boreal

> Text-to-video with synchronized native audio for product, UGC, and presenter clips.

## Overview

- **Model ID**: `creatify-boreal`
- **Workflow**: `creatify/boreal`
- **Provider**: Creatify
- **Category**: Text → Video (video)
- **Output**: A video URL.
- **Tags**: image input, audio input
- **Unified endpoint**: `POST https://api.picsart.com/workflows/v1/models/execute` (model id in the body)
- **Compatibility endpoint**: `POST https://api.picsart.com/workflows/creatify/boreal/execute` (vendor's own parameters)
- **Execution**: long-running — use the async submit/poll pair or the SDK, which polls for you
- **Model page**: https://picsart.com/api-platform/models/creatify-boreal

## Pricing

Live pricing for this model is not published yet. See https://picsart.com/pricing/ or the Pricing tab of the model page (https://picsart.com/api-platform/models/creatify-boreal/pricing).

## Authentication

The SDK and the REST API authenticate with a Picsart API key sent as a bearer token. Create a key in the console at https://picsart.com/api-platform/dashboard/api-keys, keep it in a server-side environment variable, and never ship it in browser code or commit it.

```bash
export PICSART_API_KEY="YOUR_KEY"
```

```http
Authorization: Bearer $PICSART_API_KEY
```

The CLI and the MCP server do not use an API key: `gen-ai login` signs in through the browser once per machine and stores a token locally.

## Interfaces

- **SDK** — `@picsart/ai-sdk` (TypeScript, Node 20+, ESM). Type-safe `ai.generate()` / `ai.generateText()` with per-model parameter types; polls long jobs for you.
- **REST** — the API gateway at `https://api.picsart.com`. Sync `/execute`, or async `/submit` + `/{taskId}/result`.
- **CLI** — `@picsart/gen-ai` (`gen-ai`). Generate from a terminal, quote cost before spending, emit JSON for pipelines.
- **MCP** — the same models inside Claude Code, Cursor, Windsurf and other MCP hosts. Setup: https://picsart.com/gen-ai-mcp/

```bash
npm install @picsart/ai-sdk      # SDK
npm install -g @picsart/gen-ai   # CLI (also drives the MCP server)
```

## Unified API (recommended)

One parameter set, used by the SDK and by REST alike: the names below are what `ai.generate('creatify-boreal', …)` takes, and what goes inside the inner `params` of a REST call. Over REST the model id travels in the body, not the path — one workflow, `v1/models`, fronts the whole catalogue.

### Execution modes

- **Sync** — `POST /workflows/v1/models/execute` returns the result in one call. Only for jobs that finish within ~20 seconds; otherwise it times out.
- **Async** — `POST /workflows/v1/models/submit` returns a task id; poll `GET /workflows/v1/models/{taskId}/result` until `response.status` is `COMPLETED` or `FAILED`. Task statuses: `ACCEPTED` · `IN_PROGRESS` · `COMPLETED` · `FAILED`.
- **SDK** — `ai.generate()` always awaits the finished result; polling is hidden.

Video jobs routinely outrun the sync limit: use async over REST, or the SDK, which polls for you.

### Input parameters

- **`prompt`** (`string`, _required_): Prompt
  - Max length: 5000 characters
- **`imageUrls`** (`list<string>`, _optional_): Reference Image
  - Accepts: image URLs (max 1)
- **`audioUrl`** (`string`, _optional_): Audio Track
  - Accepts: audio URL
- **`negativePrompt`** (`string`, _optional_): Negative Prompt
- **`resolution`** (`string`, _optional_)
  - Default: `"720p"`
  - Options: `720p`, `1080p`, `2k`
- **`aspectRatio`** (`string`, _optional_)
  - Default: `"auto"`
  - Options: `auto`, `16:9`, `9:16`, `1:1`, `4:3`, `3:4`
- **`duration`** (`number`, _optional_)
  - Default: `10`
  - Range: 1–20 (step 1)
- **`manifestDisclosure`** (`boolean`, _optional_): AI-Generated Disclosure
  - Default: `false`

### Input JSON Schema

The inner `params` object. Over REST it is wrapped as `{ "params": { "model": "<id>", "params": <this> } }`; the SDK takes it directly.

```json
{
  "type": "object",
  "required": [
    "prompt"
  ],
  "properties": {
    "prompt": {
      "type": "string",
      "maxLength": 5000,
      "description": "Prompt"
    },
    "imageUrls": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uri",
        "description": "image URL"
      },
      "maxItems": 1,
      "description": "Reference Image"
    },
    "audioUrl": {
      "type": "string",
      "format": "uri",
      "description": "Audio Track"
    },
    "negativePrompt": {
      "type": "string",
      "description": "Negative Prompt"
    },
    "resolution": {
      "type": "string",
      "enum": [
        "720p",
        "1080p",
        "2k"
      ],
      "default": "720p"
    },
    "aspectRatio": {
      "type": "string",
      "enum": [
        "auto",
        "16:9",
        "9:16",
        "1:1",
        "4:3",
        "3:4"
      ],
      "default": "auto"
    },
    "duration": {
      "type": "number",
      "minimum": 1,
      "maximum": 20,
      "multipleOf": 1,
      "default": 10
    },
    "manifestDisclosure": {
      "type": "boolean",
      "default": false,
      "description": "AI-Generated Disclosure"
    }
  },
  "additionalProperties": false
}
```

### Required parameters example

The required parameters plus the defaults that shape the output, as a REST body:

```json
{
  "params": {
    "model": "creatify-boreal",
    "params": {
      "prompt": "A serene mountain lake at golden hour, ultra detailed",
      "resolution": "720p",
      "aspectRatio": "auto",
      "duration": 10
    }
  }
}
```

### Response

The body is the gateway's status envelope: the output is at `response.result`, next to the task id, its status and the credits charged. Asset models return `url` plus an `items` array of results.

```json
{
  "status": "success",
  "response": {
    "id": "task_abc123",
    "status": "COMPLETED",
    "result": {
      "url": "https://cdn.picsart.com/…/result",
      "items": [
        {
          "url": "https://cdn.picsart.com/…/result"
        }
      ],
      "model": "creatify-boreal"
    }
  }
}
```

What `ai.generate()` / `ai.generateText()` resolve to (the envelope already unwrapped):

```json
{
  "items": [
    {
      "url": "https://cdn.picsart.com/…/result"
    }
  ],
  "model": "creatify-boreal"
}
```

### Usage examples

#### TypeScript (SDK)

```typescript
import { createClient } from '@picsart/ai-sdk';

const ai = createClient({
  apiKey: process.env.PICSART_API_KEY,
  apiUrl: 'https://api.picsart.com',
});

const result = await ai.generate('creatify-boreal', {
  prompt: "A serene mountain lake at golden hour, ultra detailed",
  resolution: "720p",
  aspectRatio: "auto",
  duration: 10
});

console.log(result.url); // video URL
```

#### cURL (sync)

```bash
curl -X POST 'https://api.picsart.com/workflows/v1/models/execute' \
  -H 'Authorization: Bearer $PICSART_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "params": {
    "model": "creatify-boreal",
    "params": {
      "prompt": "A serene mountain lake at golden hour, ultra detailed",
      "resolution": "720p",
      "aspectRatio": "auto",
      "duration": 10
    }
  }
}'
```

#### cURL (async: submit, then poll)

```bash
# 1. Submit the job
curl -X POST 'https://api.picsart.com/workflows/v1/models/submit' \
  -H 'Authorization: Bearer $PICSART_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "params": {
    "model": "creatify-boreal",
    "params": {
      "prompt": "A serene mountain lake at golden hour, ultra detailed",
      "resolution": "720p",
      "aspectRatio": "auto",
      "duration": 10
    }
  }
}'
# → { "status": "success", "response": { "id": "task_abc123" } }

# 2. Poll until response.status is COMPLETED
curl 'https://api.picsart.com/workflows/v1/models/task_abc123/result' \
  -H 'Authorization: Bearer $PICSART_API_KEY'
```

#### CLI

```bash
gen-ai login  # once per machine
gen-ai models info creatify-boreal  # this model's parameters
gen-ai pricing creatify-boreal  # quote before spending credits
gen-ai generate -m creatify-boreal \
  -p "A serene mountain lake at golden hour" \
  -d 10 \
  --ar auto
```

## Compatibility API (vendor parameters)

Alongside the unified API, the `creatify/boreal` workflow takes Creatify's own parameters exactly as the vendor defines them — nothing renamed or reshaped. It is the shortest path onto Picsart for request bodies already written against the vendor; the trade is that a request is written for one vendor, and the result comes back in the vendor's own shape. Same authentication.

- **Endpoint**: `POST https://api.picsart.com/workflows/creatify/boreal/execute` (sync) · `POST …/submit` + `GET …/{taskId}/result` (async)
- **SDK**: `ai.apis.run('creatify/boreal', params, { mode })` — params forwarded verbatim

### Vendor parameters

| Parameter | Type | Required | Default | Details |
| --- | --- | --- | --- | --- |
| `audio_url` | `string` | no | — | Optional driving audio (narration, dialogue, or a soundtrack). When provided it is preserved in the output instead of generated speech. · e.g. `https://storage.googleapis.com/falserverless/example_inputs/creatify/aurora/input.wav` |
| `enable_safety_checker` | `boolean` | no | `true` | Authorized callers may set false to request relaxed screening. |
| `duration` | `number` | no | `10` | Length of the generated video in seconds at 24 FPS, rounded by the model to the nearest legal frame count (5 s -> 121 frames, 10 s -> 241, 15 s -> 361). With `audio_url`, the first `duration` seconds of the audio are used; shorter audio is padded with silence. · 1–20 |
| `aspect_ratio` | `string` | no | `auto` | Frame ratio. `auto` follows the reference image's own ratio, and is landscape (16:9) when there is no image. A named ratio renders that ratio; with an image it centre-crops the image to it. · Options: `auto`, `16:9`, `9:16`, `1:1`, `4:3`, `3:4` |
| `resolution` | `string` | no | `720p` | Delivery tier. `2k` is 2016 px on the long edge for 16:9 and 9:16, and the 1440p row for 1:1, 4:3 and 3:4. · Options: `720p`, `1080p`, `2k` |
| `manifest_disclosure` | `boolean` | no | `false` | Add a visible `AI-generated` disclosure label to the video. Invisible C2PA metadata and watermarking are always applied. |
| `image_url` | `string` | no | — | Optional reference image to animate. Guides identity, composition, and appearance; the output follows this image's aspect ratio. · e.g. `https://storage.googleapis.com/falserverless/example_inputs/creatify/aurora/input_.png` |
| `prompt` | `string` | yes | — | Direction for the visuals, spoken dialogue, sounds, and on-screen text. Structure it with `[VISUAL]`, `[SPEECH]`, `[SOUNDS]`, and `[TEXT]` sections for best results. English is the validated language. · 1–5000 chars · e.g. `[VISUAL] A cinematic product close-up of a sparkling-water can on wet black stone. Condensation rolls down the can as the camera makes a slow half-orbit.  [SPEECH] "Clean flavor. Bright finish. Nothing extra."  [SOUNDS] A crisp can opening, gentle fizz, and restrained electronic music.  [TEXT] None.` |
| `negative_prompt` | `string` | no | — | Content or artifacts to avoid in the generated video. |
| `options` | `object` | no | — | Platform-specific options for safety checks and Picsart Drive integration. |
| └ `safety_checks` | `object` | no | — | Safety check configuration. |
| └   `enabled` | `boolean` | no | `true` | Enable or disable text safety checks. Defaults to true. |
| └ `drive` | `object` | no | — | Picsart Drive storage options. When provided, the result will be saved to the user's Drive. |
| └   `name` | `string` | yes | — | Filename to save the result as in Picsart Drive. |
| └   `attributes` | `object` | no | — | Additional file metadata attributes. |
| └   `folder` | `object` | no | — | Destination folder in Picsart Drive. |

### Example request body

```json
{
  "params": {
    "prompt": "[VISUAL]\nA cinematic product close-up of a sparkling-water can on wet black stone.\nCondensation rolls down the can as the camera makes a slow half-orbit.\n\n[SPEECH]\n\"Clean flavor. Bright finish. Nothing extra.\"\n\n[SOUNDS]\nA crisp can opening, gentle fizz, and restrained electronic music.\n\n[TEXT]\nNone."
  }
}
```

### Usage examples

#### TypeScript (`ai.apis.run`)

```typescript
import { createClient, ApiRunMode } from '@picsart/ai-sdk';

const ai = createClient({
  apiKey: process.env.PICSART_API_KEY,
  apiUrl: 'https://api.picsart.com',
});

// Calls the 'creatify/boreal' workflow directly — params are sent as-is.
const { result, usage } = await ai.apis.run('creatify/boreal', {
  prompt: "[VISUAL]\nA cinematic product close-up of a sparkling-water can on wet black stone.\nCondensation rolls down the can as the camera makes a slow half-orbit.\n\n[SPEECH]\n\"Clean flavor. Bright finish. Nothing extra.\"\n\n[SOUNDS]\nA crisp can opening, gentle fizz, and restrained electronic music.\n\n[TEXT]\nNone."
}, {
  mode: ApiRunMode.SYNC,
});

console.log(result); // workflow-specific output
console.log(usage?.credits); // amount charged, in $
```

#### cURL (sync)

```bash
curl -X POST 'https://api.picsart.com/workflows/creatify/boreal/execute' \
  -H 'Authorization: Bearer $PICSART_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "params": {
    "prompt": "[VISUAL]\nA cinematic product close-up of a sparkling-water can on wet black stone.\nCondensation rolls down the can as the camera makes a slow half-orbit.\n\n[SPEECH]\n\"Clean flavor. Bright finish. Nothing extra.\"\n\n[SOUNDS]\nA crisp can opening, gentle fizz, and restrained electronic music.\n\n[TEXT]\nNone."
  }
}'
```

#### cURL (async: submit, then poll)

```bash
# 1. Submit the job
curl -X POST 'https://api.picsart.com/workflows/creatify/boreal/submit' \
  -H 'Authorization: Bearer $PICSART_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "params": {
    "prompt": "[VISUAL]\nA cinematic product close-up of a sparkling-water can on wet black stone.\nCondensation rolls down the can as the camera makes a slow half-orbit.\n\n[SPEECH]\n\"Clean flavor. Bright finish. Nothing extra.\"\n\n[SOUNDS]\nA crisp can opening, gentle fizz, and restrained electronic music.\n\n[TEXT]\nNone."
  }
}'
# → { "status": "success", "response": { "id": "wf_abc123" } }

# 2. Poll until response.status is COMPLETED
curl 'https://api.picsart.com/workflows/creatify/boreal/wf_abc123/result' \
  -H 'Authorization: Bearer $PICSART_API_KEY'
```

### Response

Over HTTP the vendor-shaped result arrives inside the gateway envelope at `response.result`:

```json
{
  "status": "success",
  "response": {
    "id": "wf_abc123",
    "status": "COMPLETED",
    "result": {
      "video": {
        "height": 0,
        "content_type": "image/png",
        "file_name": "z9RV14K95DvU.png",
        "duration": 0,
        "file_size": 4404019,
        "num_frames": 0,
        "url": "https://cdn.picsart.com/…/result.mp4",
        "width": 0,
        "fps": 0
      }
    }
  }
}
```

`ai.apis.run()` unwraps that envelope and resolves to `{ result, usage }`:

```json
{
  "result": {
    "video": {
      "height": 0,
      "content_type": "image/png",
      "file_name": "z9RV14K95DvU.png",
      "duration": 0,
      "file_size": 4404019,
      "num_frames": 0,
      "url": "https://cdn.picsart.com/…/result.mp4",
      "width": 0,
      "fps": 0
    }
  }
}
```

## Additional resources

- Model page: https://picsart.com/api-platform/models/creatify-boreal
- Try it: https://picsart.com/api-platform/models/creatify-boreal/playground
- SDK: https://picsart.com/api-platform/models/creatify-boreal/sdk
- REST API (unified): https://picsart.com/api-platform/models/creatify-boreal/api
- Compatibility API (vendor parameters): https://picsart.com/api-platform/models/creatify-boreal/advanced
- Pricing: https://picsart.com/api-platform/models/creatify-boreal/pricing
- This document: https://picsart.com/api-platform/models/creatify-boreal/llms.txt
- All models: https://picsart.com/api-platform/models
- Docs — quickstart https://picsart.com/api-platform/docs/quickstart, authentication https://picsart.com/api-platform/docs/authentication, SDK https://picsart.com/api-platform/docs/sdk, REST https://picsart.com/api-platform/docs/api-reference, CLI https://picsart.com/api-platform/docs/cli, MCP https://picsart.com/api-platform/docs/mcp
- CLI reference: https://picsart.github.io/picsart-mcp-cli-docs/guide/introduction
