---
title: Motion Styles API - Saved and Built-In Video Styles
description: List PostNitro's built-in motion styles and your workspace's saved ones, and save, change or delete styles that video posts take by id.
canonical: https://postnitro.ai/docs/embed/api/motion-styles
---

# Motion Styles

A motion style is how a whole video moves: how its starting slide, body slides and ending slide come in, and how the slides change. A video post takes one in `videoSettings.motionStyle` on [generate](https://postnitro.ai/docs/embed/api/initiate/generate#video-posts) and [import](https://postnitro.ai/docs/embed/api/initiate/import#video-posts): a built-in style's name, such as `"bold"`, or a saved style's id. See [Video Motion](https://postnitro.ai/docs/embed/api/initiate/video-motion).

Saved styles belong to the workspace attached to your API key. They're the same styles as **Your styles** in the video editor: one saved here shows up there, and the other way round.

> **Reading is open to every key; saving, changing and deleting need an active paid plan.** A cancelled plan counts until it ends. Without one, those calls return `402`. A video already made keeps its own copy of its motion, so changing or deleting a style never changes it.

## List motion styles

**GET** `https://embed-api.postnitro.ai/motion-style`

Returns the 14 built-in styles, from the stillest to the liveliest, then the workspace's saved styles, newest first.

#### Headers
- `embed-api-key: your-api-key-here` (required)

#### Example Request

```bash
curl --location 'https://embed-api.postnitro.ai/motion-style' \
--header 'embed-api-key: pn-your-api-key'
```

#### Response

```json
{
    "success": true,
    "data": {
        "styles": [
            { "id": "none", "name": "None", "builtIn": true, "summary": "Nothing moves; each slide holds for its reading time." },
            { "id": "minimal", "name": "Minimal", "builtIn": true, "summary": "Everything fades in together, with quick cross-fades." },
            { "id": "clean", "name": "Clean", "builtIn": true, "summary": "Gentle fades and rises, one after another." },
            {
                "id": "cmvozvvni001dv09njlrzgmvc",
                "name": "Launch",
                "builtIn": false,
                "summary": "Starting slide: Typewriter · Body slides: Clean · Ending slide: Bold",
                "createdAt": "2026-10-26T08:28:44.670Z",
                "updatedAt": "2026-10-26T08:28:44.670Z"
            }
        ]
    }
}
```

(The other 11 built-in styles are left out above.)

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | The value to pass as `videoSettings.motionStyle`: a built-in style's name, or a saved style's id |
| `name` | string | The style's name, as the editor shows it |
| `builtIn` | boolean | `true` for PostNitro's styles, which can't be changed or deleted |
| `summary` | string | What it does, in a line. For a saved style, each kind of slide: a built-in style's name, or its own animations, written as in [Read a motion style](#read-a-motion-style) |
| `createdAt`, `updatedAt` | string | ISO-8601 times. Saved styles only |

## Read a motion style

**GET** `https://embed-api.postnitro.ai/motion-style/{id}`

Returns one saved style, with its stored `motion`, or a built-in style by its name.

```bash
curl --location 'https://embed-api.postnitro.ai/motion-style/cmvozvvni001dv09njlrzgmvc' \
--header 'embed-api-key: pn-your-api-key'
```

```json
{
    "success": true,
    "data": {
        "style": {
            "id": "cmvozvvni001dv09njlrzgmvc",
            "name": "Launch",
            "builtIn": false,
            "summary": "Starting slide: Typewriter · Body slides: title rise → description fade · Ending slide: Bold",
            "motion": { "version": 1, "start": null, "kinds": { "...": "..." } },
            "createdAt": "2026-10-26T08:28:44.670Z",
            "updatedAt": "2026-10-26T08:28:44.670Z"
        }
    }
}
```

A slide's own animations read in order: `→` starts after the step before, `&` with it, and elements that move alike share a step (`avatar,name,handle rise`). A text's split follows its preset (`title typewriter/letter`). After a `;`, each emphasis and exit. `motion` is the style as the editor stores it; you don't need it to use the style.

## Save a motion style

**POST** `https://embed-api.postnitro.ai/motion-style`

Saves a style for the workspace, in one of two ways.

#### From a video

The whole motion of a video in your workspace, as **Save as style** keeps it in the editor: how each kind of slide moves, and how the slides change. `designId` is a video's id: the `designId` [Post Output](https://postnitro.ai/docs/embed/api/post-output) gives a video post, or a video made in the editor.

```bash
curl --location 'https://embed-api.postnitro.ai/motion-style' \
--header 'Content-Type: application/json' \
--header 'embed-api-key: pn-your-api-key' \
--data '{
    "name": "Launch",
    "designId": "design123"
}'
```

#### From built-in styles

A built-in style for each slide type, named as the [import](https://postnitro.ai/docs/embed/api/initiate/import) endpoint names them. `body_slide` covers body slides with a picture and without one. A slide type you leave out takes after the nearest one you give.

```bash
curl --location 'https://embed-api.postnitro.ai/motion-style' \
--header 'Content-Type: application/json' \
--header 'embed-api-key: pn-your-api-key' \
--data '{
    "name": "Launch",
    "slides": {
        "starting_slide": "typewriter",
        "body_slide": "clean",
        "ending_slide": "bold"
    }
}'
```

#### Request Body

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `name` | string | Yes | Up to 60 characters. Names needn't be unique: use the style by its `id` |
| `designId` | string | One of these | A video in your workspace, whose motion is saved |
| `slides` | object | One of these | `starting_slide`, `body_slide` and `ending_slide`, each a built-in style's name |

#### Response

```json
{
    "success": true,
    "message": "Motion style created",
    "data": {
        "style": {
            "id": "cmw1k3x9a0001v0lk2b7q8d4e",
            "name": "Launch",
            "builtIn": false,
            "summary": "Starting slide: Typewriter · Body slides: Clean · Ending slide: Bold",
            "motion": { "version": 1, "start": null, "kinds": { "...": "..." } },
            "createdAt": "2026-10-29T10:00:00.000Z",
            "updatedAt": "2026-10-29T10:00:00.000Z"
        }
    }
}
```

The saved style comes back with its stored `motion`, as [reading it](#read-a-motion-style) gives it.

A workspace keeps up to 100 saved styles.

## Change a motion style

**PUT** `https://embed-api.postnitro.ai/motion-style/{id}`

A new `name`, new motion (a `designId` or `slides`, as when saving), or both. New motion replaces the old whole. The response is as for saving, with `"message": "Motion style updated"`. Videos already made with the style keep the motion they had.

```bash
curl --location --request PUT 'https://embed-api.postnitro.ai/motion-style/cmw1k3x9a0001v0lk2b7q8d4e' \
--header 'Content-Type: application/json' \
--header 'embed-api-key: pn-your-api-key' \
--data '{ "name": "Launch, slower", "slides": { "starting_slide": "typewriter", "body_slide": "cinematic", "ending_slide": "bold" } }'
```

## Delete a motion style

**DELETE** `https://embed-api.postnitro.ai/motion-style/{id}`

```bash
curl --location --request DELETE 'https://embed-api.postnitro.ai/motion-style/cmw1k3x9a0001v0lk2b7q8d4e' \
--header 'embed-api-key: pn-your-api-key'
```

```json
{
    "success": true,
    "message": "Motion style deleted",
    "data": { "deleted": "cmw1k3x9a0001v0lk2b7q8d4e" }
}
```

## Errors

| Status | Message | When |
|--------|---------|------|
| `402` | `Saving motion styles and sequences needs an active paid plan.` | Saving, changing or deleting with a plan that is expired or past due. A cancelled plan can until it ends. A key without API credits, such as a free plan's, gets the API's usual `402` before this |
| `404` | `Motion style not found.` | No saved style with that id in your workspace (a sequence's id included) |
| `404` | `Design not found in this workspace.` | `designId` isn't one of your workspace's designs |
| `422` | `Built-in styles can't be changed or deleted.` | `PUT` or `DELETE` on a built-in style's name |
| `422` | `Name is required` | Saving without a `name` |
| `422` | `Give the style's motion: …` / `… one way …, not more than one.` | Saving with neither `designId` nor `slides`, or with both |
| `422` | `Extra parameters passed in the body.` | Any other field, `steps` included: steps make a [sequence](https://postnitro.ai/docs/embed/api/motion-sequences) |
| `400` | `That design isn't a video, so it has no motion to save.` | `designId` is a carousel or an image |
| `400` | `slides.<type>: not a slide type. …` / `slides.<type> must be a built-in style: …` | A slide type or style name that doesn't exist |
| `400` | `There's no motion in it to save.` | The video, or `slides`, gives nothing to save |
| `409` | `A workspace keeps up to 100 of these.` | The workspace already has 100 saved styles |
