PowerPost APIv1
PowerPost APIv1
DashboardAPI keysPowerPost API
QuickstartAuthenticationWorkspacesErrors & Rate Limits
Input TypesPost TypesCreditsResearch Modes
Generate CaptionsGenerate ImagesPublish and ScheduleWebhooksMCP Server

Content

Generate ContentGenerations

Media

Upload MediaGenerate ImagesGenerate VideosVideo CaptionsAudio GenerationVideo AudioVideo Stitching

Publishing & planning

PostsPublish & SchedulePost ItemsAnalyticsCalendar

Account

Get Credits
Changelog
API reference

Audio Generation

Generate speech, sound effects, ambience, and music.

List voices

GET /api/v1/audio/voices

Scope: audio:read

Returns the voices you can pass as voice_id when generating speech. No X-Workspace-Id header. The list can change. A voice id that is not in this list still works if it already exists on the connected account.

Example

curl https://powerpost.ai/api/v1/audio/voices \
  -H "x-api-key: pp_live_sk_YOUR_KEY"

Response

{
  "voices": [
    {
      "id": "VOICE_ID",
      "name": "Sarah",
      "gender": "female",
      "accent": "american",
      "language": "en",
      "preview_url": "https://example.com/sarah.mp3"
    }
  ]
}
FieldTypeDescription
idstringPass this as provider_options.voice_id
namestringDisplay name
genderstring | nullVoice gender, when the catalog has one
accentstring | nullAccent, when the catalog has one
languagestring | nullLanguage label, when the catalog has one
preview_urlstring | nullShort sample of the voice. It can expire.

Errors

CodeDescription
401Invalid API key
403API key is missing the audio:read scope
429Rate limit exceeded
500Voice list could not be loaded

Generate audio

POST /api/v1/audio/generate

Scope: audio:generate

Generate speech, sound effects, ambient backgrounds, or music as an MP3. The request returns immediately with an id. Poll Get generation until the job is completed or failed.

Audio generation requires at least one credit purchase on the account. Signup credits are not enough. See Purchase required.

Request body

Generic fields stay at the top level. Mode-specific settings go in provider_options. Do not send a provider. PowerPost uses the current one. Older requests that still include provider keep working.

FieldTypeRequiredDescription
modestringNospeech (default), sound_effect, or music. Existing requests without a mode still generate speech.
textstringYesSpeech script, or a description of the effect or music. There is a character limit, and music allows less text than speech.
duration_secondsnumberEffects/music onlyHow long the clip should be. Required for effects and music. The API rejects a length it does not allow.
output_formatstringNomp3. That is also the default.
provider_optionsobjectYesProvider-specific settings (see below)

Speech settings

FieldTypeRequiredDescription
voice_idstringYesVoice id from List voices.
modelstringNoSpeech model. Leave it out to use the current default.
stabilitynumberNoFrom 0 to 1 (default: 0.5)
language_codestringNoTwo-letter ISO 639-1 code (en, he, …)
seedintegerNoBest-effort deterministic seed. Identical output is not guaranteed.
text_normalizationstringNoauto, on, or off (default: auto)

Use an id from List voices. A voice id that is not listed still works if it already exists on the connected account.

Credits

Audio generation uses credits. You are charged when the job starts. If the job fails, the credits are refunded. The start response includes credits_used and remaining_credits.

Sound effects and ambience

Use mode: "sound_effect" for effects, environmental sounds, or background ambience. No voice is needed.

{
  "mode": "sound_effect",
  "text": "Gentle rain falling on leaves with distant thunder",
  "duration_seconds": 10,
  "provider_options": {
    "loop": true,
    "prompt_influence": 0.3
  }
}

model, loop, and prompt_influence are optional. An empty provider_options object uses the current defaults. prompt_influence runs from 0 to 1. Looping makes the file suitable for seamless repetition. It does not extend the duration or repeat the sound in a video.

Music

Use mode: "music" for background music or songs. Instrumental music is the default.

{
  "mode": "music",
  "text": "Warm, gentle piano with soft strings for a calm product introduction",
  "duration_seconds": 30,
  "provider_options": {
    "force_instrumental": true
  }
}

model and force_instrumental are optional. force_instrumental defaults to instrumental music. Set it to false to allow vocals. An empty provider_options object uses the current defaults. If music is not enabled, or the settings do not belong to this mode, the request is rejected before you are charged.

All modes share the same status endpoint, media library, and refund flow. Use the resulting audio.media_id with Video audio to place music or effects in a video. Music can take several minutes.

PowerPost sends music text as the prompt and duration_seconds as the length. The file comes back as an MP3.

Speech text

You can put delivery direction in text:

  • Audio tags such as [whispers], [excited], or [sighs]
  • Ellipses, punctuation, capitalization, and line breaks for pauses and emphasis
  • Do not use SSML <break> tags. They are not supported.
  • Pick a voice that fits the delivery. Tags behave differently on different voices.

One voice per request. For more than one speaker, generate a separate job per voice.

Example

curl -X POST https://powerpost.ai/api/v1/audio/generate \
  -H "x-api-key: pp_live_sk_YOUR_KEY" \
  -H "X-Workspace-Id: YOUR_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "[warmly] Welcome to PowerPost.",
    "output_format": "mp3",
    "provider_options": {
      "voice_id": "YOUR_VOICE_ID",
      "stability": 0.5,
      "language_code": "en"
    }
  }'

Response

{
  "audio_generation_id": "22222222-2222-4222-8222-222222222222",
  "status": "processing",
  "status_url": "/api/v1/audio/generations/22222222-2222-4222-8222-222222222222",
  "created_at": "2026-09-04T18:30:00Z",
  "credits_used": 1,
  "remaining_credits": 46
}
FieldTypeDescription
audio_generation_idstringId to poll for this job
statusstringAlways processing on a successful start
status_urlstringRelative URL to poll for results
created_atstringISO 8601 timestamp
credits_usednumberCredits deducted
remaining_creditsnumberBalance after deduction

Errors

CodeDescription
400Invalid request body
401Invalid API key
402Insufficient credits (INSUFFICIENT_CREDITS)
402Purchase required (MEDIA_REQUIRES_PURCHASE)
403API key is missing the audio:generate scope
429Rate limit exceeded

Get generation

GET /api/v1/audio/generations/{id}

Scope: audio:read

Poll until status is completed or failed.

Path parameters

ParameterTypeDescription
idstringThe audio generation id

Example

curl https://powerpost.ai/api/v1/audio/generations/22222222-2222-4222-8222-222222222222 \
  -H "x-api-key: pp_live_sk_YOUR_KEY" \
  -H "X-Workspace-Id: YOUR_WORKSPACE_ID"

Response (processing)

{
  "audio_generation_id": "22222222-2222-4222-8222-222222222222",
  "status": "processing",
  "model": "eleven_v3",
  "error": null,
  "created_at": "2026-09-04T18:30:00Z",
  "updated_at": "2026-09-04T18:30:01Z",
  "audio": null
}

Response (completed)

{
  "audio_generation_id": "22222222-2222-4222-8222-222222222222",
  "status": "completed",
  "model": "eleven_v3",
  "error": null,
  "created_at": "2026-09-04T18:30:00Z",
  "updated_at": "2026-09-04T18:30:08Z",
  "audio": {
    "audio_id": "33333333-3333-4333-8333-333333333333",
    "media_id": "33333333-3333-4333-8333-333333333333",
    "url": "https://temporary-signed-url.example/audio.mp3",
    "file_name": "33333333-3333-4333-8333-333333333333.mp3",
    "file_size": 123456,
    "mime_type": "audio/mpeg",
    "duration": 4.2
  }
}

Response (failed)

{
  "audio_generation_id": "22222222-2222-4222-8222-222222222222",
  "status": "failed",
  "model": "eleven_v3",
  "error": {
    "code": "AUDIO_GENERATION_FAILED",
    "message": "Audio generation failed"
  },
  "created_at": "2026-09-04T18:30:00Z",
  "updated_at": "2026-09-04T18:30:08Z",
  "audio": null
}

Response fields

FieldTypeDescription
audio_generation_idstringAudio generation id
statusstringprocessing, completed, or failed
modelstringModel used for this job
errorobject | nullPresent when status is failed
created_atstringISO 8601 timestamp
updated_atstringISO 8601 timestamp
audioobject | nullOutput file when status is completed

Audio object

FieldTypeDescription
audio_idstringGenerated audio asset id. Same value as media_id.
media_idstringWorkspace media library id.
urlstring | nullSigned MP3 link. It expires.
file_namestringStored file name
file_sizenumberSize in bytes
mime_typestringaudio/mpeg
durationnumber | nullLength in seconds, when known

Status values

StatusDescription
processingAudio is being generated
completedMP3 is ready
failedGeneration failed; credits are refunded

audio.url is a signed link and it expires. Keep audio_generation_id and call this endpoint again for a fresh URL. Completed audio is also stored in the workspace media library as media_type: audio. You cannot pass media_id on posts yet; no publish destination accepts a raw MP3. Use Video audio to mix it into a publishable MP4. If the media item is deleted, the generation remains in history and audio becomes null, matching image and video generations.

Errors

CodeDescription
401Invalid API key
403API key is missing the audio:read scope
404Audio generation not found
429Rate limit exceeded

Video Captions

Add timed, styled captions to a video.

Video Audio

Mix voiceover, music, or sound effects into a video.

On this page

List voicesExampleResponseErrorsGenerate audioRequest bodySpeech settingsCreditsSound effects and ambienceMusicSpeech textExampleResponseErrorsGet generationPath parametersExampleResponse (processing)Response (completed)Response (failed)Response fieldsAudio objectStatus valuesErrors