Episodes

Create, list, retrieve, retry, and delete changelog-to-audio/video episodes.

Create an Episode

POST/v1/episodes

Create a new changelog-to-audio or video episode. Audio episodes are processed synchronously and return immediately with results. Video episodes are processed asynchronously and return a poll URL.

Request Body

ParameterTypeRequiredDescription
contentstringRequiredChangelog content in markdown format. Maximum 50KB.
modestring
changelogproduct-feature
Optional(default: changelog)Content type being converted.
output_formatstring
audiovideo
Optional(default: audio)Desired output format. Audio is synchronous, video is asynchronous. (Video coming soon)
settingsobjectOptionalEpisode settings. See Settings Object below.
screenshot_urlsstring[]OptionalHTTPS URLs of product screenshots for video. Maximum 20. (Video coming soon)
webhook_urlstringOptionalHTTPS URL to receive completion webhook notification.
waitbooleanOptional(default: false)For video: block until completion (max 90 seconds). (Video coming soon)
further_detailsstringOptionalAdditional context about this changelog for the AI script generator. Maximum 2000 characters.
use_historybooleanOptional(default: true)Whether to include previous changelogs as context for the AI script generator.
history_limitintegerOptional(default: 10)Number of previous changelogs to include as context (1-20).
public_urlbooleanOptional(default: false)If true, creates a publicly shareable listen page and embeddable player.

Settings Object

Settings Object Reference

FieldTypeDefaultDescription
product_namestring-Product or company name to use in the script.
versionstring-Version number to emphasize (e.g., "2.0.0").
tonestring
casualprofessionalenthusiastictechnical
casualVoice tone for the generated script.
audiencestring-Target audience description (e.g., "developers", "general").
verbositystring
briefnormaldetailed
normalScript length preference.
durationstring
briefnormaldetailed
normalAlias for verbosity.

Body

{
"content": "## v2.0.0 - 2026-01-15\n\n### Added\n- Dark mode support\n- Real-time collaboration\n\n### Fixed\n- Login timeout issue",
"mode": "changelog",
"output_format": "audio",
"settings": {
"product_name": "Acme App",
"version": "2.0.0",
"tone": "casual"
},
"further_details": "This release focuses on user experience improvements after customer feedback.",
"use_history": true,
"history_limit": 5,
"public_url": true
}

Video Episode (Async)Coming Soon

Video episodes return immediately with status processing and a poll_url to check progress:

Video Response (202 Accepted)
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"output_format": "video",
"poll_url": "https://api.logtalk.io/v1/episodes/550e8400-e29b-41d4-a716-446655440000",
"estimated_completion_seconds": 60,
"created_at": "2026-01-18T14:30:00.000Z"
},
"request_id": "req_1kn5f2a_a3b4c5d6e7f8",
"timestamp": "2026-01-18T14:30:00.000Z"
}

List Episodes

GET/v1/episodes

Returns a paginated list of episodes for your organization. Results are sorted by creation date (newest first).

Query Parameters

ParameterTypeRequiredDescription
statusstring
pendingprocessinggeneratingcompletedfailed
OptionalFilter by episode status.
modestring
changelogproduct-feature
OptionalFilter by episode mode.
output_formatstring
audiovideo
OptionalFilter by output format. (Video coming soon)
created_afterstringOptionalFilter episodes created after this ISO 8601 timestamp.
created_beforestringOptionalFilter episodes created before this ISO 8601 timestamp.
limitintegerOptional(default: 20)Maximum results per page (1-100).
cursorstringOptionalPagination cursor from previous response.
200 OK
{
"success": true,
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"mode": "changelog",
"source": "api",
"progress_percent": 100,
"has_audio": true,
"has_video": false,
"duration_seconds": 45,
"created_at": "2026-01-18T14:30:00.000Z",
"completed_at": "2026-01-18T14:30:30.000Z"
}
],
"meta": {
"total_count": 42,
"has_more": true,
"next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wMS0xN1QxMjowMDowMC4wMDBaIn0="
},
"request_id": "req_1kn5f2a_a3b4c5d6e7f8",
"timestamp": "2026-01-18T14:30:00.000Z"
}

Get Episode

GET/v1/episodes/{id}

Retrieves the current status and details of a specific episode. Use this endpoint to poll for completion of async episodes (video coming soon).

Path Parameters

ParameterTypeRequiredDescription
idstring (UUID)RequiredThe unique identifier of the episode.

Query Parameters

ParameterTypeRequiredDescription
expandstringOptionalComma-separated list of objects to expand. Currently supports "organization".

Response by Status

Processing

{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"mode": "changelog",
"source": "api",
"progress_percent": 65,
"current_stage": "audio_generation",
"stages": ["pending", "script_generation", "audio_generation", "completed"],
"estimated_completion_seconds": 15,
"created_at": "2026-01-18T14:30:00.000Z"
},
"request_id": "req_1kn5f2a_a3b4c5d6e7f8",
"timestamp": "2026-01-18T14:30:15.000Z"
}

Completed

Note: listen_url and embed_url appear when public_url: true was set.

{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"mode": "changelog",
"source": "api",
"audio_url": "https://api.logtalk.io/v1/episodes/550e8400.../audio",
"video_url": null,
"script": "[NARRATOR]: Welcome to Acme App...",
"duration_seconds": 45,
"listen_url": "https://logtalk.io/listen/550e8400-e29b-41d4-a716-446655440000",
"embed_url": "https://logtalk.io/embed/550e8400-e29b-41d4-a716-446655440000",
"completed_at": "2026-01-18T14:30:30.000Z",
"created_at": "2026-01-18T14:30:00.000Z"
},
"request_id": "req_1kn5f2a_a3b4c5d6e7f8",
"timestamp": "2026-01-18T14:30:30.000Z"
}

With expand=organization

{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"mode": "changelog",
"source": "api",
"audio_url": "https://api.logtalk.io/v1/episodes/550e8400.../audio",
"organization": {
"id": "org_123e4567-e89b-12d3",
"name": "Acme Corp",
"logo_url": "https://example.com/logo.png",
"created_at": "2026-01-01T00:00:00.000Z"
},
"completed_at": "2026-01-18T14:30:30.000Z",
"created_at": "2026-01-18T14:30:00.000Z"
},
"request_id": "req_1kn5f2a_a3b4c5d6e7f8",
"timestamp": "2026-01-18T14:30:30.000Z"
}

Failed

{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "failed",
"mode": "changelog",
"source": "api",
"error": {
"code": "GENERATION_FAILED",
"message": "Audio generation failed"
},
"failed_at": "2026-01-18T14:30:30.000Z",
"created_at": "2026-01-18T14:30:00.000Z"
},
"request_id": "req_1kn5f2a_a3b4c5d6e7f8",
"timestamp": "2026-01-18T14:30:30.000Z"
}

Retry a Failed Episode

POST/v1/episodes/{id}/retry

Retries a previously failed episode. Only episodes with status 'failed' can be retried. You can optionally override settings for the retry.

Path Parameters

ParameterTypeRequiredDescription
idstring (UUID)RequiredThe unique identifier of the failed episode to retry.

Request Body (Optional)

ParameterTypeRequiredDescription
override_settingsobjectOptionalOverride episode settings for the retry. Uses original settings if not provided.
webhook_urlstringOptionalHTTPS URL to receive completion webhook notification.

Body

{
"override_settings": {
"tone": "professional"
},
"webhook_url": "https://example.com/webhooks/logtalk"
}

Delete Episode

DELETE/v1/episodes/{id}

Permanently deletes an episode and its associated media files. This action cannot be undone.

Path Parameters

ParameterTypeRequiredDescription
idstring (UUID)RequiredThe unique identifier of the episode to delete.
200 OK
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"deleted": true,
"deleted_at": "2026-01-18T15:00:00.000Z"
},
"request_id": "req_1kn5f2a_a3b4c5d6e7f8",
"timestamp": "2026-01-18T15:00:00.000Z"
}

Request Headers

Optional headers that can be used with episode endpoints:

HeaderDescription
X-Organization-IDSpecify organization context for multi-org users. If omitted, uses the default organization for the API key.
Idempotency-KeyUnique key to prevent duplicate operations (POST endpoints only).

Idempotency

Use idempotency keys to safely retry requests without creating duplicate episodes. Include the Idempotency-Key header with a unique value:

curl -X POST https://api.logtalk.io/v1/episodes \
-H "Authorization: Bearer lt_live_your_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: release-v2.0.0-20260118" \
-d '{"content": "...", "output_format": "audio"}'
  • Keys must be 1-256 printable ASCII characters
  • Keys are valid for 24 hours
  • Retrying with the same key returns the cached response
  • Using the same key with a different request body returns 409 Conflict

Public Sharing & Embedding

When you create an episode with public_url: true, the response includes URLs for public sharing and embedding:

FieldDescription
listen_urlFull public page with audio player, show notes, share buttons, and subscribe form.
embed_urlCompact player designed for iframe embedding on external sites.

Embedding with iframe

Use the embed_url to embed a compact audio player on your website:

<iframe
src="https://logtalk.io/embed/550e8400-e29b-41d4-a716-446655440000"
width="100%"
height="180"
frameborder="0"
allow="autoplay"
></iframe>

oEmbed Support

LogTalk supports the oEmbed protocol for automatic embed discovery. Platforms like Notion, Medium, and others can automatically embed your episodes when you paste the listen_url.

oEmbed endpoint: https://logtalk.io/api/oembed?url={listen_url}