> For the documentation index, fetch https://sync.so/docs/llms.txt. Append .md to a page URL for Markdown. Documentation-search MCP: https://sync.so/docs/_mcp/server.

# List Error Codes

GET https://api.sync.so/v2/errors

Returns the full catalog of machine-readable error codes — each with a human-readable message and a suggested fix. It covers generation failures plus the coded errors returned by the assets, voices, and TTS endpoints (e.g. project_not_found, voice_not_found, asset_forbidden). This endpoint is unauthenticated. Pair it with the errorCode field returned on a failed generation or on a coded 4xx/5xx response so an agent can look up what went wrong and how to correct it without hard-coding error strings.

Reference: https://sync.so/docs/api-reference/api/errors-api/list

## Servers

- `https://api.sync.so` (Default, default)
- `https://dev-api.sync.so` (dev)
- `http://localhost:3001` (local)

## Response

### 200

Error catalog retrieved successfully

- `list of ErrorCatalogEntry`

## Errors

### 500 Internal Server Error

Internal Server Error - An unexpected failure on our side. The body carries errorCode internal_error and a requestId; include the requestId when contacting support.

- `message` (GenerationErrorMessage, required) — A message describing the error.
- `statusCode` (double, required) — The type of error that occurred.
- `errorCode` (string, optional) — Stable, machine-readable error code (e.g. project_not_found, voice_not_found, concurrency_limit_reached). Branch your error handling on this, not on the message text. The full catalog of codes with messages and suggested fixes is served unauthenticated at GET /v2/errors.
- `suggestion` (string, optional) — A suggested fix an agent can act on.
- `field` (string, optional) — The request field the error refers to, when the failure is tied to a specific field (e.g. projectId, voiceId, input[].assetId).
- `docsUrl` (string, optional) — Link to the documentation page for the failing operation.
- `requestId` (string, optional) — Present on unexpected 500 responses. Include it when contacting support so the failing request can be located directly.
- `generationId` (string, optional) — Original generation ID when available for an uncertain keyed submission. Poll this ID; do not create another action to bypass IDEMPOTENCY_OUTCOME_UNKNOWN.
- `dialogueEditSection` (DialogueEditRetimeFailureSection, optional) — For dialogue_edit_removal_too_large: the section to change, when it can be identified. Create a new dialogue edit preview before submitting again.

## Types

### ErrorCatalogEntry

A single entry in the machine-readable error catalog.

- `code` (string, required) — The stable error code (e.g. generation_input_video_inaccessible).
- `message` (string, required) — A human-readable description of the error.
- `suggestion` (string, required) — A suggested fix an agent can act on.

### GenerationErrorMessage

A message describing the error.

### DialogueEditRetimeFailureSection

The dialogue-edit section that removes too much speech to stay in sync.

- `slotIndex` (integer, required) — Zero-based index of the section in the preview's `resultSlots`.
- `sourceStartMs` (integer, optional) — Start of the section in the source video, in absolute milliseconds.
- `sourceDurationMs` (integer, optional) — Length of the section in the source video, in milliseconds.

## Examples

**Response**

```json
[
  {
    "code": "generation_input_video_inaccessible",
    "message": "The video input could not be fetched.",
    "suggestion": "Check that the video URL is publicly reachable, or upload the file via POST /v2/assets/upload and reference it by assetId."
  },
  {
    "code": "generation_plan_duration_exceeded",
    "message": "The output duration exceeds your plan limit.",
    "suggestion": "Use shorter media or upgrade your plan."
  },
  {
    "code": "project_not_found",
    "message": "The projectId was not found in your organization.",
    "suggestion": "Omit projectId, or use a project id that belongs to your organization (project ids from other organizations or deleted projects are not valid)."
  },
  {
    "code": "voice_not_found",
    "message": "No voice was found with that id in your organization.",
    "suggestion": "List valid voice ids via GET /v2/voices. Cloned voice ids are UUIDs scoped to the organization that created them."
  },
  {
    "code": "elevenlabs_service_unavailable",
    "message": "Voice service is temporarily unavailable.",
    "suggestion": "Retry the request with backoff. If it keeps failing, contact support with the request id."
  },
  {
    "code": "dialogue_edit_retime_required",
    "message": "Dialogue edit previews need retiming (segment lipsync and section expansion) to be generated into a video.",
    "suggestion": "Create a new dialogue edit once retiming (segment lipsync and section expansion) is enabled for your organization."
  },
  {
    "code": "dialogue_edit_unsupported",
    "message": "Dialogue edits made with an API key must cover the whole video.",
    "suggestion": "Omit startMs and endMs on the request."
  },
  {
    "code": "generation_infra_service_unavailable",
    "message": "The dialogue-edit rollout flags could not be evaluated.",
    "suggestion": "Retry the request with backoff. If it keeps failing, contact support with the request id."
  }
]
```

**SDK Code**

```python
import requests

url = "https://api.sync.so/v2/errors"

response = requests.get(url)

print(response.json())
```

```javascript
const url = 'https://api.sync.so/v2/errors';
const options = {method: 'GET'};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.sync.so/v2/errors"

	req, _ := http.NewRequest("GET", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.sync.so/v2/errors")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.sync.so/v2/errors")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.sync.so/v2/errors');

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.sync.so/v2/errors");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://api.sync.so/v2/errors")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```