Conversions

The unified API for all audio generation. Submit a changelog or any text document and get back polished audio.

Create a conversion

POST/conversions

Create a conversion

Parameters

ParameterTypeRequiredDescription
Idempotency-KeystringOptionalUnique key for idempotent requests. Keys must be 1-256 printable ASCII characters. If the same key is sent within 24 hours, the cached response is returned.
X-Organization-IDstringOptionalSpecify organization context for multi-org users. If omitted, uses default org for API key.

Request Body

ParameterTypeRequiredDescription
source_typestring
changelogdocument
RequiredType of content being converted
titlestringRequiredTitle for this conversion
contentstringRequiredContent to convert (max 50KB)
additional_contextstringOptionalAdditional context for the AI script generator (max 10KB)
product_idstringOptionalAssociate with a specific product
ignore_orgbooleanOptionalSkip organization-level context for this conversion
public_urlbooleanOptional(default: false)If true, creates publicly shareable listen and embed URLs
webhook_urlstringOptionalHTTPS URL to receive completion webhook notification
waitbooleanOptional(default: false)Block until completion (returns 200 instead of 202). Maximum wait is 90 seconds.
voiceobjectOptionalTTS voice configuration. Applies to ElevenLabs when provider is "elevenlabs".
settingsobjectOptionalScript generation and audio settings for conversions

voice

ParameterTypeRequiredDescription
providerstring
geminielevenlabs
Optional(default: gemini)Text-to-speech provider
delivery_presetstring
measureddynamictheatrical
OptionalControls the pacing and energy of the narration
expression_settings.emotional_rangestring
subtlemoderatefull
Optional
expression_settings.allow_whisperingbooleanOptional
expression_settings.allow_laughterbooleanOptional
expression_settings.emphasis_stylestring
pausesboth
Optional
expression_settings.emotional_arcbooleanOptional
pronunciation_notesstringOptionalPronunciation guidance for product names, acronyms, etc.
voice_idstringOptionalElevenLabs voice ID for single-speaker mode
modelstring
v3flash_v2
OptionalElevenLabs model to use
host_voice_ids.host1stringOptionalElevenLabs voice ID for host 1
host_voice_ids.host2stringOptionalElevenLabs voice ID for host 2

settings

ParameterTypeRequiredDescription
product_namestringOptionalProduct or company name to use in the script
versionstringOptionalVersion number to emphasize
tonestring
casualprofessionalenthusiastictechnical
Optional(default: casual)Voice tone for the script
audiencestringOptionalTarget audience description
verbositystring
briefnormaldetailed
Optional(default: normal)Script length preference
ctastringOptionalOptional call-to-action to include at the end
severity_aware_tonebooleanOptionalAdjust tone based on severity of changes (e.g. more serious for breaking changes)
summary_thresholdintegerOptionalMinimum number of changes before switching to summary mode
use_historybooleanOptional(default: true)Whether to include previous changelogs as context
history_limitintegerOptional(default: 10)Number of previous changelogs to include as context
speakersinteger
12
Optional(default: 1)Number of speakers (1 = single narrator, 2 = dialogue)

Body

{
"source_type": "changelog",
"title": "MyApp v2.0.0 Release",
"content": "## v2.0.0 - New Features\n- Added dark mode support\n- Improved performance by 40%",
"additional_context": "This release focuses on performance improvements after customer feedback.",
"settings": {
"product_name": "MyApp",
"version": "2.0.0",
"tone": "casual"
},
"use_history": true,
"history_limit": 5,
"public_url": true
}

List conversions

GET/conversions

List conversions

Parameters

ParameterTypeRequiredDescription
X-Organization-IDstringOptionalSpecify organization context for multi-org users. If omitted, uses default org for API key.
source_typestring
changelogdocument
OptionalFilter by source type
statusstring
pendingprocessinggeneratingcompletedfailed
OptionalFilter by conversion status
limitintegerOptional(default: 20)Maximum number of results to return
cursorstringOptionalPagination cursor from previous response
curl -X GET https://logtalk.io/api/v1/conversions \
-H "Authorization: Bearer lt_live_your_api_key_here" \
-H "Content-Type: application/json"

Get conversion details

GET/conversions/{id}

Get conversion details

Parameters

ParameterTypeRequiredDescription
idstringRequiredConversion UUID
X-Organization-IDstringOptionalSpecify organization context for multi-org users. If omitted, uses default org for API key.
curl -X GET https://logtalk.io/api/v1/conversions/{id} \
-H "Authorization: Bearer lt_live_your_api_key_here" \
-H "Content-Type: application/json"

Update a conversion

PATCH/conversions/{id}

Update a conversion

Parameters

ParameterTypeRequiredDescription
idstringRequiredConversion UUID
X-Organization-IDstringOptionalSpecify organization context for multi-org users. If omitted, uses default org for API key.

Request Body

ParameterTypeRequiredDescription
public_urlbooleanOptionalEnable or disable public listen/embed URLs
titlestringOptionalUpdate the conversion title
additional_contextstringOptionalUpdate the additional context

Body

{
"public_url": true
}

Retry a failed conversion

POST/conversions/{id}/retry

Retry a failed conversion

Parameters

ParameterTypeRequiredDescription
idstringRequiredConversion UUID
X-Organization-IDstringOptionalSpecify organization context for multi-org users. If omitted, uses default org for API key.
curl -X POST https://logtalk.io/api/v1/conversions/{id}/retry \
-H "Authorization: Bearer lt_live_your_api_key_here" \
-H "Content-Type: application/json"

Get signed audio URL

GET/conversions/{id}/audio

Get signed audio URL

Parameters

ParameterTypeRequiredDescription
idstringRequiredConversion UUID
X-Organization-IDstringOptionalSpecify organization context for multi-org users. If omitted, uses default org for API key.
curl -X GET https://logtalk.io/api/v1/conversions/{id}/audio \
-H "Authorization: Bearer lt_live_your_api_key_here" \
-H "Content-Type: application/json"

Delete a conversion

DELETE/conversions/{id}

Delete a conversion

Parameters

ParameterTypeRequiredDescription
idstringRequiredConversion UUID
X-Organization-IDstringOptionalSpecify organization context for multi-org users. If omitted, uses default org for API key.
curl -X DELETE https://logtalk.io/api/v1/conversions/{id} \
-H "Authorization: Bearer lt_live_your_api_key_here" \
-H "Content-Type: application/json"

Embed Tokens

Embed tokens allow you to embed an audio player on external sites without making the conversion fully public. Each token is scoped to a single conversion and does not expire.

Rate limit: 100 tokens per organization per day. Requires paid tier.

Create an embed token

POST/conversions/{id}/embed-token

Create an embed token

Parameters

ParameterTypeRequiredDescription
idstringRequiredConversion UUID
X-Organization-IDstringOptionalSpecify organization context for multi-org users. If omitted, uses default org for API key.
curl -X POST https://logtalk.io/api/v1/conversions/{id}/embed-token \
-H "Authorization: Bearer lt_live_your_api_key_here" \
-H "Content-Type: application/json"

List embed tokens

GET/conversions/{id}/embed-token

List embed tokens

Parameters

ParameterTypeRequiredDescription
idstringRequiredConversion UUID
X-Organization-IDstringOptionalSpecify organization context for multi-org users. If omitted, uses default org for API key.
curl -X GET https://logtalk.io/api/v1/conversions/{id}/embed-token \
-H "Authorization: Bearer lt_live_your_api_key_here" \
-H "Content-Type: application/json"

Revoke an embed token

DELETE/conversions/{id}/embed-token/{token}

Revoke an embed token

Parameters

ParameterTypeRequiredDescription
idstringRequiredConversion UUID
tokenstringRequiredThe embed token to revoke
X-Organization-IDstringOptionalSpecify organization context for multi-org users. If omitted, uses default org for API key.
curl -X DELETE https://logtalk.io/api/v1/conversions/{id}/embed-token/{token} \
-H "Authorization: Bearer lt_live_your_api_key_here" \
-H "Content-Type: application/json"

Polling for Completion

After creating a conversion, poll GET /v1/conversions/{id} until status is completed or failed:

const API_KEY = process.env.LOGTALK_API_KEY;
const BASE = 'https://logtalk.io/api/v1';
// 1. Create conversion
const { data } = await fetch(`${BASE}/conversions`, {
method: 'POST',
headers: { Authorization: `Bearer ${API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
source_type: 'changelog',
title: 'MyApp v2.0.0',
content: changelogMarkdown,
settings: { product_name: 'MyApp' }
})
}).then(r => r.json());
// 2. Poll until complete (max 2 minutes)
let conversion;
const maxAttempts = 40;
for (let i = 0; i < maxAttempts; i++) {
await new Promise(r => setTimeout(r, 3000));
const res = await fetch(`${BASE}/conversions/${data.id}`, {
headers: { Authorization: `Bearer ${API_KEY}` }
}).then(r => r.json());
conversion = res.data;
if (conversion.status === 'completed') break;
if (conversion.status === 'failed') throw new Error('Conversion failed');
}
if (conversion.status !== 'completed') throw new Error('Polling timed out');
console.log('Audio URL:', conversion.audio_url);

Tip: Use "wait": true on the create request to skip polling entirely — the API blocks until completion and returns the full result.

Public Sharing & Embedding

Set public_url: true when creating a conversion (or via PATCH) to generate public share and embed URLs:

FieldDescription
listen_urlFull public page with audio player, show notes, and share buttons.
embed_urlCompact player for iframe embedding on external sites.
<iframe
src="https://logtalk.io/embed/550e8400-e29b-41d4-a716-446655440000"
width="100%"
height="180"
frameborder="0"
allow="autoplay"
></iframe>

Idempotency

Include the Idempotency-Key header on POST requests to prevent duplicate conversions on retries:

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