Podcast Creator API
Create and manage podcast shows and episodes. Upload finished audio, edit descriptions and covers, manage transcripts, and publish your feed.
Authentication
Use your Dali account token or a suitably scoped user API key on private requests: Authorization: Bearer <token>. Each account can access only its own content. Audio generation and voice management belong to Audio Lab.
API-key writes require deployment enablement. Use podcast:write to upload and edit drafts, podcast:publish to publish/unpublish, and podcast:delete to delete. Editing already-published content requires both write and publish. Read operations require podcast:read. Permissions are independent; existing keys are not upgraded.
Creating an episode
- Create a show with an operation ID and square RGB JPEG cover (1400–3000 pixels).
- Upload finished PCM WAV or MP3 audio (up to 64 MiB and 4 hours; chunks up to 1 MiB; set
audio_formattomp3for MP3) using drafts, chunks and finalize, or reuse an owned audio version. - Create an episode with that version ID.
- Publish the episode and show with
{"rights_confirmed": true}.
Creation starts as a draft. Reuse the same operation ID for an unchanged creation retry. Metadata updates include expected previous values to prevent overwriting another edit. Deleting hosted episodes preserves the source recording. Unpublishing an episode is terminal; it cannot be republished.
Endpoints
| Method | Path | Operation | API key scope |
|---|---|---|---|
GET | /v1/podcast/shows | List Shows | podcast:read |
POST | /v1/podcast/shows | Create Show | podcast:write |
GET | /v1/podcast/versions | List Versions | podcast:read |
POST | /v1/podcast/drafts | Create Draft | podcast:write |
GET | /v1/podcast/drafts/{draft_id} | Draft Status | podcast:read |
PUT | /v1/podcast/drafts/{draft_id}/chunks | Upload Chunk | podcast:write |
POST | /v1/podcast/drafts/{draft_id}/finalize | Finalize | podcast:write |
GET | /v1/podcast/shows/{show_id}/episodes | List Episodes | podcast:read |
POST | /v1/podcast/shows/{show_id}/episodes | Create Episode | podcast:write |
POST | /v1/podcast/episodes/{episode_id}/publish | Publish Episode | podcast:publish |
POST | /v1/podcast/shows/{show_id}/publish | Publish Show | podcast:publish |
POST | /v1/podcast/episodes/{episode_id}/unpublish | Unpublish Episode | podcast:publish |
DELETE | /v1/podcast/episodes/{episode_id} | Delete Episode | podcast:delete |
GET | /v1/podcast/episodes/{episode_id} | Get Episode | podcast:read |
PATCH | /v1/podcast/episodes/{episode_id} | Update Episode | podcast:write |
POST | /v1/podcast/shows/{show_id}/unpublish | Unpublish Show | podcast:publish |
DELETE | /v1/podcast/shows/{show_id} | Delete Show | podcast:delete |
GET | /v1/podcast/shows/{show_id} | Get Show | podcast:read |
PATCH | /v1/podcast/shows/{show_id} | Update Show | podcast:write |
PUT | /v1/podcast/shows/{show_id}/categories | Update Categories | podcast:write |
GET | /v1/podcast/shows/{show_id}/artwork | Get Artwork | podcast:read |
PUT | /v1/podcast/shows/{show_id}/artwork | Update Artwork | podcast:write |
GET | /v1/podcast/episodes/{episode_id}/transcript | Get Transcript | podcast:read |
PUT | /v1/podcast/episodes/{episode_id}/transcript | Update Transcript | podcast:write |
GET | /v1/podcast/storage | Storage Usage | podcast:read |
POST | /v1/podcast/imports | Import Recording | podcast:write, audio:read |
Request and response schemas
Expand a schema below, or download the complete OpenAPI specification for request/response references. Validation errors return 422; stale edits and unavailable private resources return 409; missing or forbidden credentials return 401/403.
DraftBody
{
"properties": {
"operation_id": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"title": "Operation Id"
},
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"title": "Title"
},
"sha256": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"title": "Sha256"
},
"bytes": {
"type": "integer",
"maximum": 67108864.0,
"exclusiveMinimum": 0.0,
"title": "Bytes"
},
"audio_format": {
"type": "string",
"enum": [
"wav",
"mp3"
],
"title": "Audio Format",
"default": "wav"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"operation_id",
"title",
"sha256",
"bytes"
],
"title": "DraftBody"
}EpisodeBody
{
"properties": {
"operation_id": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"title": "Operation Id"
},
"version_id": {
"type": "string",
"pattern": "^[0-9a-f]{32}$",
"title": "Version Id"
},
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"title": "Title"
},
"description": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"title": "Description"
},
"explicit": {
"type": "boolean",
"title": "Explicit",
"default": false
}
},
"additionalProperties": false,
"type": "object",
"required": [
"operation_id",
"version_id",
"title",
"description"
],
"title": "EpisodeBody"
}EpisodeDetails
{
"properties": {
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"title": "Title"
},
"description": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"title": "Description"
},
"explicit": {
"type": "boolean",
"title": "Explicit"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"title",
"description",
"explicit"
],
"title": "EpisodeDetails"
}HTTPValidationError
{
"properties": {
"detail": {
"items": {
"$ref": "#/components/schemas/ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}ImportRecording
{
"properties": {
"operation_id": {
"type": "string",
"pattern": "^[A-Za-z0-9._:-]{1,80}$",
"title": "Operation Id"
},
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"title": "Title"
},
"source_type": {
"type": "string",
"enum": [
"audio_job",
"personal_voice_job"
],
"title": "Source Type"
},
"job_id": {
"type": "string",
"format": "uuid",
"title": "Job Id"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"operation_id",
"title",
"source_type",
"job_id"
],
"title": "ImportRecording"
}PublishBody
{
"properties": {
"rights_confirmed": {
"type": "boolean",
"title": "Rights Confirmed"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"rights_confirmed"
],
"title": "PublishBody"
}ShowBody
{
"properties": {
"operation_id": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"title": "Operation Id"
},
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"title": "Title"
},
"description": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"title": "Description"
},
"author": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"title": "Author"
},
"artwork_jpeg_base64": {
"type": "string",
"maxLength": 12000000,
"minLength": 100,
"title": "Artwork Jpeg Base64"
},
"language": {
"type": "string",
"title": "Language",
"default": "en"
},
"category": {
"type": "string",
"title": "Category",
"default": "Fiction"
},
"explicit": {
"type": "boolean",
"title": "Explicit",
"default": false
}
},
"additionalProperties": false,
"type": "object",
"required": [
"operation_id",
"title",
"description",
"author",
"artwork_jpeg_base64"
],
"title": "ShowBody"
}ShowCategories
{
"properties": {
"category": {
"type": "string",
"title": "Category"
},
"subcategory": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Subcategory"
},
"secondary_category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Secondary Category"
},
"secondary_subcategory": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Secondary Subcategory"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"category"
],
"title": "ShowCategories"
}ShowDetails
{
"properties": {
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"title": "Title"
},
"description": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"title": "Description"
},
"author": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"title": "Author"
},
"language": {
"anyOf": [
{
"type": "string",
"pattern": "^[a-zA-Z]{2}(?:-[a-zA-Z]{2})?$"
},
{
"type": "null"
}
],
"title": "Language"
},
"explicit": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Explicit"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"title",
"description",
"author"
],
"title": "ShowDetails"
}TranscriptBody
{
"properties": {
"text": {
"type": "string",
"maxLength": 20000,
"title": "Text"
},
"visible": {
"type": "boolean",
"title": "Visible"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"text",
"visible"
],
"title": "TranscriptBody"
}UpdateEpisodeBody
{
"properties": {
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"title": "Title"
},
"description": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"title": "Description"
},
"explicit": {
"type": "boolean",
"title": "Explicit"
},
"expected": {
"$ref": "#/components/schemas/EpisodeDetails"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"title",
"description",
"explicit",
"expected"
],
"title": "UpdateEpisodeBody"
}UpdateShowArtworkBody
{
"properties": {
"expected_digest": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"title": "Expected Digest"
},
"artwork_jpeg_base64": {
"type": "string",
"maxLength": 12000000,
"minLength": 100,
"title": "Artwork Jpeg Base64"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"expected_digest",
"artwork_jpeg_base64"
],
"title": "UpdateShowArtworkBody"
}UpdateShowBody
{
"properties": {
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"title": "Title"
},
"description": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"title": "Description"
},
"author": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"title": "Author"
},
"language": {
"anyOf": [
{
"type": "string",
"pattern": "^[a-zA-Z]{2}(?:-[a-zA-Z]{2})?$"
},
{
"type": "null"
}
],
"title": "Language"
},
"explicit": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Explicit"
},
"expected": {
"$ref": "#/components/schemas/ShowDetails"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"title",
"description",
"author",
"expected"
],
"title": "UpdateShowBody"
}UpdateShowCategoriesBody
{
"properties": {
"category": {
"type": "string",
"title": "Category"
},
"subcategory": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Subcategory"
},
"secondary_category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Secondary Category"
},
"secondary_subcategory": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Secondary Subcategory"
},
"expected": {
"$ref": "#/components/schemas/ShowCategories"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"category",
"expected"
],
"title": "UpdateShowCategoriesBody"
}ValidationError
{
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
},
"input": {
"title": "Input"
},
"ctx": {
"type": "object",
"title": "Context"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
}