List issues
curl --request GET \
--url https://restapi.deepdub.ai/api/v1/issues \
--header 'x-api-key: <api-key>'import requests
url = "https://restapi.deepdub.ai/api/v1/issues"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
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 => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://restapi.deepdub.ai/api/v1/issues"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://restapi.deepdub.ai/api/v1/issues")
.header("x-api-key", "<api-key>")
.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::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"issues": [
{
"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>"
}
],
"nextCursor": "<string>"
}{
"message": "invalid argument: \"08-2026\" must be YYYY-MM-DD or an RFC3339 timestamp"
}{
"message": "Unauthorized"
}{
"message": "Failed to list issues"
}Issues
List issues
List the issues reported by your account, newest first. Pagination is cursor-based: pass the nextCursor from a response as the next request’s cursor, and stop once a response omits it.
GET
/
issues
List issues
curl --request GET \
--url https://restapi.deepdub.ai/api/v1/issues \
--header 'x-api-key: <api-key>'import requests
url = "https://restapi.deepdub.ai/api/v1/issues"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
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 => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://restapi.deepdub.ai/api/v1/issues"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://restapi.deepdub.ai/api/v1/issues")
.header("x-api-key", "<api-key>")
.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::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"issues": [
{
"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>"
}
],
"nextCursor": "<string>"
}{
"message": "invalid argument: \"08-2026\" must be YYYY-MM-DD or an RFC3339 timestamp"
}{
"message": "Unauthorized"
}{
"message": "Failed to list issues"
}Returns the issues reported by your account, newest first. Only your own reports are visible — an API key never sees another customer’s issues.
A date that parses as neither format returns
Pagination
Paging is cursor-based. Make the first request without acursor, then pass the nextCursor from each response as the cursor of the next request:
curl "https://restapi.deepdub.ai/api/v1/issues?limit=50" \
-H "x-api-key: $DEEPDUB_API_KEY"
{
"issues": [{ "id": "iss_12345abcde", "state": "open" }],
"nextCursor": "eyJvZmZzZXQiOjUwfQ=="
}
nextCursor is only returned when another page actually exists, so you can loop until it’s absent without ever fetching an empty page:
cursor, all_issues = None, []
while True:
params = {"limit": 100, **({"cursor": cursor} if cursor else {})}
page = requests.get(f"{BASE_URL}/issues", params=params, headers=headers).json()
all_issues.extend(page["issues"])
cursor = page.get("nextCursor")
if not cursor:
break
limit defaults to 50 and is capped at 100 — asking for more returns 100 rather than an error.
Filtering by date
from and to bound the report date inclusively, and each accepts either YYYY-MM-DD or a full RFC3339 timestamp. A bare to date covers that entire UTC day, so to=2026-08-31 includes issues reported at 23:59 that evening.
curl "https://restapi.deepdub.ai/api/v1/issues?from=2026-08-01&to=2026-08-31" \
-H "x-api-key: $DEEPDUB_API_KEY"
400, as does a from later than the to.Authorizations
API key for authentication. Must start with dd- prefix.
Headers
API Key
Query Parameters
Maximum issues to return per page. Values above 100 are capped at 100.
Required range:
1 <= x <= 100The nextCursor value from a previous response. Omit to start from the newest issue.
Only return issues reported on or after this date. Accepts YYYY-MM-DD or an RFC3339 timestamp.
Only return issues reported on or before this date. Accepts YYYY-MM-DD or an RFC3339 timestamp; a bare date covers that entire UTC day.
