---
title: "Make sound effects and place them on their takes (costs credits)"
method: POST
path: "/v1/storyboards/{id}/effects"
tags: ["Storyboards"]
---

# Make sound effects and place them on their takes (costs credits)

`POST /v1/storyboards/{id}/effects`

## Request

- Base URL: `https://nanostudiopro.com/api`
- URL: `https://nanostudiopro.com/api/v1/storyboards/{id}/effects`
- Auth: HTTP bearer

Each effect is made with ElevenLabs sound generation from its `prompt`, `duration_s` long (0.5-6), brought to -20 LUFS so the `effects` layer's one level fits them all, added to the film's sounds (kind `effect`) and placed on its take at `at_s` seconds into the clip (`target` as in mutations: `{kind: "segment", id}` | `{kind: "loop", decisionId}` | `{kind: "ending", panelId}`), at `level` (0-2, times the `effects` layer), `pitch` (semitones, -12 to 12) and `rise` (dB it starts under). The same prompt and length twice is made once and placed twice, the second at another pitch. The player plays an effect where that second of the clip is on screen (through trims and ramps), dipped under speech. Placing an existing sound is free: `{op: "addEffect", target, takeId, effect: {id, soundId, atS, level?, pitch?, rise?}}`, `updateEffect {target, takeId, id, patch}`, `removeEffect {target, takeId, id}`. **Costs credits**: `audio_sfx_10s` per 10 s rendered (see `/v1/pricing`). Quote first with `dry_run: true`: `credits`, and `renders` (each sound to make, its credits and how many places it goes). Without `dry_run` it answers `202 { task_id }`: poll `GET /v1/tasks/{id}`. Each sound is charged once it is on the storyboard, through your token so its daily cap applies. Paid tier only (`402 audio_requires_purchase` on trial credits). A storyboard whose owner approves agent spending answers `403` except for the quote.

## Request body

- object
  - `effects` object[], required
    - `target` object, required
    - `take_id` string, required
    - `at_s` number, required
    - `duration_s` number, required
    - `prompt` string, required
    - `name` string
    - `level` number
    - `pitch` number
    - `rise` number
  - `dry_run` boolean

## Response `200`

The quote (dry_run)

- object
  - `dry_run` boolean
  - `available` boolean
  - `reason` string
  - `credits` integer
  - `per_10s` integer
  - `effects` integer
  - `renders` object[]
    - `name` string
    - `prompt` string
    - `duration_s` number
    - `credits` integer
    - `placements` integer
  - `running_task_id` string, nullable

## Other responses

- `202`: The run started
- `400`: an effect lasts 0.5 to 6 seconds
- `401`: Missing or invalid token
- `402`: Insufficient credits
- `403`: The owner approves an agent's spending on this storyboard
- `409`: Sound effects are being made for this film already
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/nanostudiopro/apis/nano-studio-pro-api.md) · [All operations](https://skmtc.dev/nanostudiopro/apis/nano-studio-pro-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nanostudiopro/apis/nano-studio-pro-api/revisions/b454211e598e?raw)
