curl --request POST \
--url https://restapi.deepdub.ai/api/v1/issues \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"generationId": "abc123-def456",
"generatedText": "Hello world, welcome to Deepdub.",
"problemWord": "Deepdub",
"voicePromptId": "bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773"
}
'import requests
url = "https://restapi.deepdub.ai/api/v1/issues"
payload = {
"generationId": "abc123-def456",
"generatedText": "Hello world, welcome to Deepdub.",
"problemWord": "Deepdub",
"voicePromptId": "bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
generationId: 'abc123-def456',
generatedText: 'Hello world, welcome to Deepdub.',
problemWord: 'Deepdub',
voicePromptId: 'bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773'
})
};
fetch('https://restapi.deepdub.ai/api/v1/issues', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://restapi.deepdub.ai/api/v1/issues",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'generationId' => 'abc123-def456',
'generatedText' => 'Hello world, welcome to Deepdub.',
'problemWord' => 'Deepdub',
'voicePromptId' => 'bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://restapi.deepdub.ai/api/v1/issues"
payload := strings.NewReader("{\n \"generationId\": \"abc123-def456\",\n \"generatedText\": \"Hello world, welcome to Deepdub.\",\n \"problemWord\": \"Deepdub\",\n \"voicePromptId\": \"bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://restapi.deepdub.ai/api/v1/issues")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"generationId\": \"abc123-def456\",\n \"generatedText\": \"Hello world, welcome to Deepdub.\",\n \"problemWord\": \"Deepdub\",\n \"voicePromptId\": \"bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://restapi.deepdub.ai/api/v1/issues")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"generationId\": \"abc123-def456\",\n \"generatedText\": \"Hello world, welcome to Deepdub.\",\n \"problemWord\": \"Deepdub\",\n \"voicePromptId\": \"bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773\"\n}"
response = http.request(request)
puts response.read_body{
"id": "iss_12345abcde",
"state": "open",
"rejectionReason": "duplicate report",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"generationId": "<string>",
"generatedText": "<string>",
"problemWord": "<string>",
"voicePromptId": "<string>",
"type": "hallucinations",
"locale": "en-US",
"additionalComments": "<string>",
"problemSeconds": 123,
"phoneticHeard": "<string>",
"phoneticExpected": "<string>"
}{
"message": "generationId is required"
}{
"message": "Unauthorized"
}{
"message": "Failed to create issue"
}Create a new issue
Report a problem with a TTS generation by creating a new issue. Issues are tracked internally by the Deepdub team and used to improve voice quality. The problemAudioFile field can optionally include base64-encoded audio attached to the issue, and problemSeconds indicates the timestamp in the audio where the problem appears.
curl --request POST \
--url https://restapi.deepdub.ai/api/v1/issues \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"generationId": "abc123-def456",
"generatedText": "Hello world, welcome to Deepdub.",
"problemWord": "Deepdub",
"voicePromptId": "bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773"
}
'import requests
url = "https://restapi.deepdub.ai/api/v1/issues"
payload = {
"generationId": "abc123-def456",
"generatedText": "Hello world, welcome to Deepdub.",
"problemWord": "Deepdub",
"voicePromptId": "bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
generationId: 'abc123-def456',
generatedText: 'Hello world, welcome to Deepdub.',
problemWord: 'Deepdub',
voicePromptId: 'bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773'
})
};
fetch('https://restapi.deepdub.ai/api/v1/issues', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://restapi.deepdub.ai/api/v1/issues",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'generationId' => 'abc123-def456',
'generatedText' => 'Hello world, welcome to Deepdub.',
'problemWord' => 'Deepdub',
'voicePromptId' => 'bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://restapi.deepdub.ai/api/v1/issues"
payload := strings.NewReader("{\n \"generationId\": \"abc123-def456\",\n \"generatedText\": \"Hello world, welcome to Deepdub.\",\n \"problemWord\": \"Deepdub\",\n \"voicePromptId\": \"bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://restapi.deepdub.ai/api/v1/issues")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"generationId\": \"abc123-def456\",\n \"generatedText\": \"Hello world, welcome to Deepdub.\",\n \"problemWord\": \"Deepdub\",\n \"voicePromptId\": \"bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://restapi.deepdub.ai/api/v1/issues")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"generationId\": \"abc123-def456\",\n \"generatedText\": \"Hello world, welcome to Deepdub.\",\n \"problemWord\": \"Deepdub\",\n \"voicePromptId\": \"bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773\"\n}"
response = http.request(request)
puts response.read_body{
"id": "iss_12345abcde",
"state": "open",
"rejectionReason": "duplicate report",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"generationId": "<string>",
"generatedText": "<string>",
"problemWord": "<string>",
"voicePromptId": "<string>",
"type": "hallucinations",
"locale": "en-US",
"additionalComments": "<string>",
"problemSeconds": 123,
"phoneticHeard": "<string>",
"phoneticExpected": "<string>"
}{
"message": "generationId is required"
}{
"message": "Unauthorized"
}{
"message": "Failed to create issue"
}Reporting generation problems
Use this endpoint to flag a TTS generation that didn’t sound right — a mispronunciation, an unwanted artifact, or any other quality issue. Reports are reviewed by the Deepdub team and feed into model improvements. To make a report actionable, include:generationId— the ID of the affected generationgeneratedText— the exact text passed to TTSproblemWord— the specific word or phrase that was generated incorrectlyvoicePromptId— the voice prompt that was usedproblemSeconds— timestamp (in seconds) where the problem occurstype(optional) —hallucinations(the default) orglossaryphoneticHeard(optional) — how the word actually sounded, written phoneticallyphoneticExpected(optional) — how the word should have sounded, written phoneticallyproblemAudioFile(optional) — base64-encoded clip of the problem audioadditionalComments(optional) — anything else that helps reproduce or explain the issue
type to say what kind of problem you’re reporting: hallucinations for words the model got wrong or invented, glossary for terms that need a permanent pronunciation entry. Omitting it defaults to hallucinations; any other value returns 400.
The phoneticHeard and phoneticExpected pair is the fastest way to make a mispronunciation actionable — it tells the team exactly what the model produced and what it should have produced, without anyone having to listen to the audio.
The response includes an id you can use with the GET, PUT, and DELETE endpoints.Authorizations
API key for authentication. Must start with dd- prefix.
Headers
API Key
Body
Payload for creating a new issue against a TTS generation
ID of the generation that has the problem
"abc123-def456"
Text that was passed to the TTS endpoint
"Hello world, welcome to Deepdub."
Word (or phrase) that was generated incorrectly
"Deepdub"
ID of the voice prompt used in the generation
"bd1b00bb-be1c-4679-8eaa-0fcbfd4ff773"
Category of problem being reported. Omit to default to hallucinations. Any other value returns 400.
hallucinations, glossary "hallucinations"
Free-form comments describing the problem
"Mispronunciation of brand name"
Optional base64-encoded audio clip to attach to the issue
Seconds in the audio where the problem appears
2.5
Optional phonetic transcription of how the word actually sounded
"deep-dubb"
Optional phonetic transcription of how the word should sound
"deep-dub"
Response
Issue created
Issue details
"iss_12345abcde"
Current state of the issue.
open, uploaded_for_correction, in_progress, resolved, rejected "open"
Why the issue was rejected. Present only when state is rejected.
"duplicate report"
Category of problem being reported.
hallucinations, glossary Locale of the reported generation, when known.
"en-US"
Phonetic transcription of how the word actually sounded
Phonetic transcription of how the word should sound
