curl --request POST 'https://api.voicecheap.ai/v1/actions/tts_generate' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"requestId":"284a861a-4da8-4d67-ad48-8123e76c8e91","text":"Hello world.","voice":"933563129e564b19a115bedd57b7406a","inputType":"text","instructionPreset":"narrator","instructions":"Speak clearly and leave a short pause at the end.","speed":1,"sourceFileName":"launch-script.txt"}'
const input = {
requestId: '284a861a-4da8-4d67-ad48-8123e76c8e91',
text: 'Hello world.',
voice: '933563129e564b19a115bedd57b7406a',
inputType: 'text',
instructionPreset: 'narrator',
instructions: 'Speak clearly and leave a short pause at the end.',
speed: 1,
sourceFileName: 'launch-script.txt',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/tts_generate', {
method: 'POST',
headers: {
'x-api-key': process.env.VOICECHEAP_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
});
const body = await response.json();
if (!response.ok) throw new Error(body.code + ': ' + body.message);
console.log(body);
import os
import requests
response = requests.post(
"https://api.voicecheap.ai/v1/actions/tts_generate",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91", "text": "Hello world.", "voice": "933563129e564b19a115bedd57b7406a", "inputType": "text", "instructionPreset": "narrator", "instructions": "Speak clearly and leave a short pause at the end.", "speed": 1, "sourceFileName": "launch-script.txt"},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"status": "running",
"pollAction": "action_request_get",
"pollAfterSeconds": 5
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"historyId": "722c80c6412edd4c3dcd625061e1c1feafbb0d54274d95fd8b5ca047f8cdd23d",
"status": "completed",
"characterCount": 12,
"previewEndIndex": null,
"downloadUrl": "https://files.example.com/launch-script-speech.mp3"
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"operation": "tts_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"operation": "tts_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "completed",
"resultStored": false,
"message": "The action completed. Retrieve its output from the corresponding history or resource action."
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
Zamiana tekstu na mowę
Wygeneruj mowę
Utwórz mowę z tekstu przy użyciu głosu z katalogu lub należącego do Ciebie własnego głosu. Obowiązują te same kredyty znaków i limity planu co w aplikacji. Zwraca identyfikator historii i tymczasowy adres URL do pobrania audio. Używaj ponownie requestId, aby uniknąć drugiego generowania.
POST
/
v1
/
actions
/
tts_generate
curl --request POST 'https://api.voicecheap.ai/v1/actions/tts_generate' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"requestId":"284a861a-4da8-4d67-ad48-8123e76c8e91","text":"Hello world.","voice":"933563129e564b19a115bedd57b7406a","inputType":"text","instructionPreset":"narrator","instructions":"Speak clearly and leave a short pause at the end.","speed":1,"sourceFileName":"launch-script.txt"}'
const input = {
requestId: '284a861a-4da8-4d67-ad48-8123e76c8e91',
text: 'Hello world.',
voice: '933563129e564b19a115bedd57b7406a',
inputType: 'text',
instructionPreset: 'narrator',
instructions: 'Speak clearly and leave a short pause at the end.',
speed: 1,
sourceFileName: 'launch-script.txt',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/tts_generate', {
method: 'POST',
headers: {
'x-api-key': process.env.VOICECHEAP_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
});
const body = await response.json();
if (!response.ok) throw new Error(body.code + ': ' + body.message);
console.log(body);
import os
import requests
response = requests.post(
"https://api.voicecheap.ai/v1/actions/tts_generate",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91", "text": "Hello world.", "voice": "933563129e564b19a115bedd57b7406a", "inputType": "text", "instructionPreset": "narrator", "instructions": "Speak clearly and leave a short pause at the end.", "speed": 1, "sourceFileName": "launch-script.txt"},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"status": "running",
"pollAction": "action_request_get",
"pollAfterSeconds": 5
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"historyId": "722c80c6412edd4c3dcd625061e1c1feafbb0d54274d95fd8b5ca047f8cdd23d",
"status": "completed",
"characterCount": 12,
"previewEndIndex": null,
"downloadUrl": "https://files.example.com/launch-script-speech.mp3"
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"operation": "tts_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"operation": "tts_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "completed",
"resultStored": false,
"message": "The action completed. Retrieve its output from the corresponding history or resource action."
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
Utwórz mowę z tekstu przy użyciu głosu z katalogu lub należącego do Ciebie własnego głosu. Obowiązują te same kredyty znaków i limity planu co w aplikacji. Zwraca identyfikator historii i tymczasowy adres URL do pobrania audio. Używaj ponownie requestId, aby uniknąć drugiego generowania.
Wymagane uprawnienia:
POST https://api.voicecheap.ai/v1/actions/tts_generate
Uwierzytelnianie i uprawnienia
string
wymagane
Wyślij klucz API VoiceCheap w tym nagłówku. Obsługiwany jest również nagłówek Authorization: Bearer z tym samym kluczem API. Tokeny dostępu OAuth są
akceptowane tylko przez MCP, a nie przez ten endpoint REST.
tts:write.
Wymagana jest aktywna płatna subskrypcja. Uprawnienia nie zmieniają ról w zespole, własności zasobów, kredytów na multimedia ani limitów planu.
Parametry
string
Opcjonalne na poziomie transportu: jeśli identyfikator zostanie pominięty, serwer doda go przed walidacją. Podaj własny, stały UUID v4, aby bezpiecznie odzyskać wynik po utracie odpowiedzi.Format: “uuid”. Wzorzec:
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$.string
wymagane
Wartość tekstowa.Minimalna długość: 1. Maksymalna długość: 128000.
string
wymagane
Identyfikator wyboru głosu z voices_list, w tym identyfikatory clone: dla zapisanych głosów niestandardowych.Minimalna długość: 1. Maksymalna długość: 255.
string
Wartość tekstowa.Dozwolone wartości: “text”, “pdf”. Wartość domyślna: “text”.
string
Wartość tekstowa.Dozwolone wartości: “default”, “cheerful”, “calm”, “narrator”, “dramatic”, “whisper”, “energetic”. Wartość domyślna: “default”.
string
Wartość tekstowa.Maksymalna długość: 300.
number
Wartość liczbowa.Minimum: 0.5. Maksimum: 2. Wartość domyślna: 1.
string
Wartość tekstowa.Maksymalna długość: 255.
Pełny schemat danych wejściowych
Pełny schemat danych wejściowych
Poniższy JSON Schema zachowuje dokładne nazwy pól, typy zagnieżdżone, wartości domyślne, ograniczenia i akceptowane wartości udostępniane przez mechanizm wykrywania. Dodatkowe reguły zależności między polami znajdują się w uwagach do operacji.
{
"type": "object",
"properties": {
"requestId": {
"description": "UUID v4 for this action. Reuse the same ID with identical arguments on retries.",
"type": "string",
"format": "uuid",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
},
"text": {
"type": "string",
"minLength": 1,
"maxLength": 128000
},
"voice": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "A voice selection ID from voices_list, including clone: IDs for saved custom voices."
},
"inputType": {
"default": "text",
"type": "string",
"enum": ["text", "pdf"]
},
"instructionPreset": {
"default": "default",
"type": "string",
"enum": ["default", "cheerful", "calm", "narrator", "dramatic", "whisper", "energetic"]
},
"instructions": {
"type": "string",
"maxLength": 300
},
"speed": {
"default": 1,
"type": "number",
"minimum": 0.5,
"maximum": 2
},
"sourceFileName": {
"type": "string",
"maxLength": 255
}
},
"required": ["text", "voice"],
"additionalProperties": false
}
Idempotencja
Dla każdej operacji zmieniającej dane użyj UUID v4 w requestId lub w nagłówku HTTP Idempotency-Key. Po awarii sieci użyj ponownie tego samego identyfikatora i identycznych argumentów. Jeśli podasz oba, muszą być zgodne. Ponowienie zapisanego żądania nie powtarza operacji ani nie zużywa kolejnego wywołania z miesięcznego limitu. Żądania zakończone błędem lub przerwane nie są automatycznie uruchamiane ponownie. Każda operacja zmieniająca dane może zwrócić HTTP 202, gdy ponowienie napotka to samo żądanie nadal w stanie running, nawet jeśli jej pierwsze wykonanie zwykle jest synchroniczne. Jeśli wykonanie się zakończyło, ale resultStored ma wartość false, ponowienie zwraca HTTP 200 z zapisanym stanem żądania zamiast pierwotnego wyniku. Pobierz wynik za pomocą akcji historii, wyniku lub pobierania właściwej dla danej domeny.Przykłady żądań
Zastąp przykładowe identyfikatory zasobów i klucze multimediów wartościami zwróconymi dla Twojego konta. Przy ponawianiu tej samej operacji zmieniającej dane zachowaj identyfikator żądania.curl --request POST 'https://api.voicecheap.ai/v1/actions/tts_generate' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"requestId":"284a861a-4da8-4d67-ad48-8123e76c8e91","text":"Hello world.","voice":"933563129e564b19a115bedd57b7406a","inputType":"text","instructionPreset":"narrator","instructions":"Speak clearly and leave a short pause at the end.","speed":1,"sourceFileName":"launch-script.txt"}'
const input = {
requestId: '284a861a-4da8-4d67-ad48-8123e76c8e91',
text: 'Hello world.',
voice: '933563129e564b19a115bedd57b7406a',
inputType: 'text',
instructionPreset: 'narrator',
instructions: 'Speak clearly and leave a short pause at the end.',
speed: 1,
sourceFileName: 'launch-script.txt',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/tts_generate', {
method: 'POST',
headers: {
'x-api-key': process.env.VOICECHEAP_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
});
const body = await response.json();
if (!response.ok) throw new Error(body.code + ': ' + body.message);
console.log(body);
import os
import requests
response = requests.post(
"https://api.voicecheap.ai/v1/actions/tts_generate",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91", "text": "Hello world.", "voice": "933563129e564b19a115bedd57b7406a", "inputType": "text", "instructionPreset": "narrator", "instructions": "Speak clearly and leave a short pause at the end.", "speed": 1, "sourceFileName": "launch-script.txt"},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
Odpowiedź
Ta operacja zwraca HTTP 202 podczas przetwarzania. Zapisz requestId i odpytuj action_request_get, podając ten identyfikator oraz nazwę pierwotnej operacji. Stany odpytywania to running, completed, failed i interrupted. Zakończony wynik może wskazywać osobne zadanie przetwarzania multimediów; kontynuuj za pomocą akcji stanu lub wyniku właściwej dla tej operacji. Metadane ukończonego generowania mowy i tymczasowy adres URL pobierania MP3. Procedura obsługi nie zwraca bajtów audio.{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"status": "running",
"pollAction": "action_request_get",
"pollAfterSeconds": 5
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"historyId": "722c80c6412edd4c3dcd625061e1c1feafbb0d54274d95fd8b5ca047f8cdd23d",
"status": "completed",
"characterCount": 12,
"previewEndIndex": null,
"downloadUrl": "https://files.example.com/launch-script-speech.mp3"
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"operation": "tts_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"operation": "tts_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "completed",
"resultStored": false,
"message": "The action completed. Retrieve its output from the corresponding history or resource action."
},
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91"
}
Pola wyniku
| Pole | Opis |
|---|---|
data.requestId | UUID v4 podany dla akcji generowania. |
data.historyId | Identyfikator własnej historii generowania mowy: 64 małe znaki szesnastkowe, opcjonalnie z prefiksem free- dla podglądu aplikacji. |
data.status | completed, gdy wynik generowania mowy jest gotowy. |
data.characterCount | Liczba znaków w pełnym tekście wejściowym po usunięciu skrajnych białych znaków. |
data.previewEndIndex | Granica znakowa częściowego podglądu audio lub null dla pełnego audio. Płatne generowanie przez integrację zwraca pełne audio. |
data.downloadUrl | Tymczasowy adres URL pobierania MP3. Poproś o nowy za pomocą tts_download. |
Odzyskaj żądanie i sprawdź jego stan
Używaj tego samego identyfikatora także po utracie połączenia. Jeśli resultStored ma wartość false, pobierz wynik za pomocą odpowiedniej akcji historii, wyniku lub pobierania. Nigdy nie uruchamiaj drugiego generowania tylko po to, aby sprawdzić postęp.curl --request POST 'https://api.voicecheap.ai/v1/actions/action_request_get' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"requestId":"284a861a-4da8-4d67-ad48-8123e76c8e91","operation":"tts_generate"}'
HTTP 200
{
"data": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"operation": "tts_generate",
"status": "completed",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"resultStored": true,
"result": {
"requestId": "284a861a-4da8-4d67-ad48-8123e76c8e91",
"historyId": "722c80c6412edd4c3dcd625061e1c1feafbb0d54274d95fd8b5ca047f8cdd23d",
"status": "completed",
"characterCount": 12,
"previewEndIndex": null,
"downloadUrl": "https://files.example.com/launch-script-speech.mp3"
}
}
}
Uwagi do operacji
- Użyj requestId w formacie UUID v4 dla tej mutacji i używaj go ponownie z identycznymi argumentami przy ponawianiu żądania. Długotrwałe akcje najpierw zwracają żądanie w stanie running; ten przykład przedstawia ukończony wynik procedury obsługi dostępny przez action_request_get.
- Wybierz voice z voices_list. Identyfikatory głosów dubbingowych z dubbing_voices_list należą do oddzielnej biblioteki.
- Z tekstu usuwane są skrajne białe znaki. Schemat akceptuje najwyżej 128,000 znaków; bieżące plany Beginner i Starter pozwalają na 64,000 znaków na jedno generowanie, a Creator i wyższe plany na 128,000. Bieżący plan i dostępne kredyty na znaki TTS są ponownie sprawdzane przed generowaniem.
- inputType ma domyślną wartość text i może przyjmować text lub pdf. Nawet przy pdf podaj wyodrębniony tekst w text; ta akcja nie przyjmuje przesłanego pliku PDF ani adresu URL.
- instructionPreset ma domyślną wartość default i obsługuje default, cheerful, calm, narrator, dramatic, whisper i energetic. instructions jest opcjonalne i ograniczone do 300 znaków po usunięciu skrajnych białych znaków. speed ma domyślną wartość 1 i mieści się w zakresie od 0.5 do 2.
- sourceFileName to opcjonalne metadane ograniczone do 255 znaków po usunięciu białych znaków z początku i końca; określają nazwę pobieranego pliku.
- Udane powtórzone żądanie zwraca ponownie zapisane audio bez ponownego generowania ani naliczania opłat. Adresy URL są tymczasowe; użyj tts_download, aby uzyskać nowy adres do pobrania.
- Historia mowy i głosy niestandardowe należą do uwierzytelnionego konta. Rozliczanie w ramach zespołu nie daje dostępu do mowy ani głosów innego członka.
Wykorzystanie
Każde pomyślne wywołanie zużywa jedno wywołanie z miesięcznego limitu API/MCP. Obowiązują również kredyty na multimedia oraz limity generowania danej operacji.Błędy
| Status HTTP | Kod | Znaczenie lub sposób rozwiązania |
|---|---|---|
| 400 | CREDENTIAL_IN_QUERY | Dane uwierzytelniające zostały podane w parametrze zapytania access_token lub api_key. Wysyłaj dane uwierzytelniające w nagłówkach. |
| 400 | IDEMPOTENCY_CONFLICT | Nagłówek Idempotency-Key i pole requestId w treści żądania muszą być zgodne. |
| 400 | INVALID_REQUEST_ID | Podaj requestId lub Idempotency-Key w formacie UUID v4. |
| 400 | INVALID_VOICE | Wybór głosu jest nieprawidłowy, nie należy do tego konta lub nie jest gotowy. |
| 400 | TEXT_REQUIRED | Tekst jest pusty po usunięciu znaczników sterowania sposobem wypowiedzi. |
| 400 | TEXT_TOO_LONG | Tekst przekracza limit znaków na jedno generowanie w bieżącym planie. |
| 400 | VALIDATION_ERROR | Dane wejściowe nie odpowiadają schematowi akcji; sprawdź details, aby poznać błędy pól. |
| 400 | VOICE_UNAVAILABLE | Wybrany głos z katalogu nie jest już dostępny; wybierz identyfikator zwrócony przez voices_list. |
| 401 | API_KEY_EXPIRED | Klucz API wygasł. |
| 401 | INVALID_API_KEY | Podaj prawidłowy, niewygasły klucz API. |
| 401 | INVALID_CREDENTIAL | Nagłówek Authorization ma nieprawidłowy format lub jest sprzeczny z x-api-key. |
| 401 | MISSING_CREDENTIAL | Nie podano użytecznych danych uwierzytelniających w nagłówku lub przekroczyły one 4096 znaków. |
| 401 | USER_NOT_FOUND | Konto powiązane z poświadczeniem już nie istnieje. |
| 403 | ACCOUNT_UNAVAILABLE | Konto wykonujące operację lub konto rozliczeniowe jest niedostępne albo jest w trakcie usuwania. |
| 403 | AMBIGUOUS_TEAM_API_KEY | Użytkownik, do którego należą dane uwierzytelniające, należy do więcej niż jednego zespołu, więc kontekst rozliczeniowy jest niejednoznaczny. |
| 403 | INSUFFICIENT_SCOPE | Nadaj wszystkie wymagane uprawnienia lub wybierz inne dane uwierzytelniające. |
| 403 | INTEGRATION_PLAN_UNSUPPORTED | Nie udało się zweryfikować limitów integracji konta. |
| 403 | PAID_PLAN_REQUIRED | Obecne konto nie ma już płatnego planu umożliwiającego generowanie mowy przez integrację. |
| 403 | SUBSCRIPTION_REQUIRED | Użyj aktywnej płatnej subskrypcji. |
| 403 | TEAM_OWNER_NOT_FOUND | Nie znaleziono konta faktycznego właściciela zespołu. |
| 409 | CONCURRENT_ACTION_LIMIT_REACHED | Na tym koncie działa już 10 akcji integracji. Sprawdzaj stan istniejącego żądania przed rozpoczęciem kolejnego. |
| 409 | IDEMPOTENCY_CONFLICT | Używaj ponownie identyfikatora wyłącznie z tą samą operacją i tymi samymi argumentami. |
| 409 | TEXT_TO_SPEECH_GENERATION_IN_PROGRESS | Identyczne żądanie mowy jest nadal przetwarzane. |
| 409 | TEXT_TO_SPEECH_REQUEST_CONFLICT | Ten requestId został już użyty z innymi danymi wejściowymi mowy. |
| 429 | INTEGRATION_MONTHLY_LIMIT_REACHED | Poczekaj na odnowienie miesięcznego limitu lub zmień plan. |
| 429 | INTEGRATION_RATE_LIMIT_REACHED | Jeśli występuje nagłówek Retry-After, odczekaj wskazany czas i stosuj rosnące odstępy między ponowieniami. |
| 429 | TEXT_TO_SPEECH_CHARACTER_LIMIT_REACHED | Skrypt przekracza łączną liczbę dostępnych znaków TTS wliczonych w plan i dokupionych. |
| 500 | INTERNAL_ERROR | Sprawdź stan zapisanego żądania i historię zasobu przed podjęciem decyzji o ponowieniu operacji zmieniającej dane. |
| 502 | INTERNAL_ERROR | Nie udało się ukończyć akcji lub potwierdzić jej wyniku. Sprawdź stan żądania i historię zasobu przed rozpoczęciem kolejnego generowania. |
| 503 | ACTION_RESULT_UNAVAILABLE | Akcja została wykonana, ale nie udało się zapisać jej wyniku. Sprawdź zapisany stan żądania i historię zasobu przed rozpoczęciem nowego generowania. |
| 503 | SERVER_RESTARTING | Serwer jest uruchamiany ponownie. Spróbuj ponownie wkrótce i zachowaj ten sam identyfikator żądania dla operacji zmieniającej dane. |
{
"code": "INSUFFICIENT_SCOPE",
"message": "This credential does not permit the requested action.",
"status": 403,
"details": {
"requiredScopes": ["tts:write"]
}
}
Czy ta strona była pomocna?

