> For the complete documentation index, see [llms.txt](https://bountyv.gitbook.io/vdocs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bountyv.gitbook.io/vdocs/frontier-passthrough/frontier-seedance-dirty-dan.md).

# Seedance 2 — Dirty Dan Edition

Animate a single still into a clip on Seedance 2.0, **uncensored**.

```
POST /api/v1/frontier/seedance-dirty-dan
GET  /api/v1/frontier/seedance-dirty-dan/{id}
```

This is a different lane from [Seedance 2.0](/vdocs/frontier-passthrough/frontier-seedance.md). That one runs on BytePlus ModelArk directly and is SFW-only — ModelArk rejects adult and real-person input outright. This one reaches the same model through a provider with a partner exemption, so explicit source images and explicit prompts are accepted and the output is not sanitised.

Asynchronous: submit charges up front and returns a `generation_id` to poll. A failure observed on poll refunds in full.

## Entitlement

Requires the **`nsfw`** product on your account. A key with only `video` gets `403 product_disabled`.

## Authentication

```
Authorization: Bearer sk_live_...
```

## Request

**Content-Type:** `application/json`

| Field            | Type    | Required | Default  | Description                                       |
| ---------------- | ------- | -------- | -------- | ------------------------------------------------- |
| `prompt`         | string  | ✅        | —        | The motion to render                              |
| `image_url`      | string  | ✅        | —        | **Public `https://` URL** of the still to animate |
| `aspect_ratio`   | string  | —        | `"9:16"` | `"9:16"` \| `"16:9"` \| `"1:1"`                   |
| `resolution`     | string  | —        | `"720p"` | `"480p"` \| `"720p"`                              |
| `duration`       | integer | —        | `5`      | Clip length in seconds                            |
| `generate_audio` | boolean | —        | `false`  | Let the model generate an audio track             |

### The image must be a public URL

The provider fetches the image itself, so a `data:` URL or a base64 blob is rejected with `400`. Use [signed uploads](/vdocs/account/uploads-sign.md) to host yours first.

### Only 480p and 720p

Higher resolutions are not offered because their per-second cost has not been measured on our account, and we will not quote a price against an unverified rate. Passing anything else returns `400` with a `supported_resolutions` list.

## Safety

Adult content is permitted. Content involving minors is not, and never will be: every prompt runs through the age blocklist and is **rejected with `400`** if it implies a minor, with age-positive tokens injected on top.

## Response — submit

```json
{
  "generation_id": "gJ8nP3kQ2m",
  "status": "pending",
  "poll_url": "/api/v1/frontier/seedance-dirty-dan/gJ8nP3kQ2m",
  "model": "Seedance 2 Dirty Dan Edition",
  "resolution": "720p",
  "duration_sec": 5,
  "charged_cents": 249,
  "balance_cents": 4751
}
```

## Polling

```
GET /api/v1/frontier/seedance-dirty-dan/{id}
```

| Response                                                                | Meaning                                                   |
| ----------------------------------------------------------------------- | --------------------------------------------------------- |
| `{ "status": "pending" }`                                               | Still rendering — poll again                              |
| `{ "status": "completed", "video": "https://…", "generation_id": "…" }` | Done. `video` is a time-limited signed URL on our storage |
| `{ "status": "failed", "error": "…", "refunded_cents": 249 }`           | Failed; the up-front charge has been refunded             |

A `failed` result arrives with HTTP `200` — it's a render outcome, not a transport error. A 5s clip typically takes 90–120 seconds.

## Example

```bash
# 1. host the still
curl -X POST https://substance-api.com/api/v1/uploads/sign \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" -d '{"filename":"still.png"}'
# PUT your bytes to upload_url, then use public_url below

# 2. submit
curl -X POST https://substance-api.com/api/v1/frontier/seedance-dirty-dan \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "she turns slowly toward the camera, soft natural light",
    "image_url": "https://.../public_url.png",
    "resolution": "720p",
    "duration": 5
  }'

# 3. poll
curl https://substance-api.com/api/v1/frontier/seedance-dirty-dan/gJ8nP3kQ2m \
  -H "Authorization: Bearer sk_live_..."
```

## Errors

| Status | Meaning                                                                                                                   |
| ------ | ------------------------------------------------------------------------------------------------------------------------- |
| `400`  | Missing `prompt`/`image_url`, a non-https `image_url`, an unsupported `resolution`, or a prompt blocked by the age filter |
| `402`  | Balance below the call price — `required_cents` included                                                                  |
| `403`  | `nsfw` product not enabled, or polling a job that belongs to another account                                              |
| `404`  | Unknown `generation_id` (on poll)                                                                                         |
| `502`  | The provider rejected the submission. **Nothing is charged** — the charge lands only after a successful submit            |
| `503`  | The pipeline is disabled                                                                                                  |

## Pricing

From **$2.49** per clip. Cost scales with both length and resolution, so the price does too:

| Resolution | 5s    | 8s    | 10s   |
| ---------- | ----- | ----- | ----- |
| `480p`     | $2.49 | $2.49 | $2.49 |
| `720p`     | $2.49 | $3.46 | $4.32 |

The exact amount is returned as `charged_cents` on submit, and a `402` names the `required_cents` before anything is submitted. See [Credits & pricing](/vdocs/account/credits.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://bountyv.gitbook.io/vdocs/frontier-passthrough/frontier-seedance-dirty-dan.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
