curl --request POST 'https://api.voicecheap.ai/v1/actions/images_generate' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"requestId":"61becb70-00d6-4de0-9eb1-05829a0d851c","prompt":"A peaceful coastal village at sunrise, with warm natural light.","aspectRatio":"square","referenceImageKey":"uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png"}'
const input = {
requestId: '61becb70-00d6-4de0-9eb1-05829a0d851c',
prompt: 'A peaceful coastal village at sunrise, with warm natural light.',
aspectRatio: 'square',
referenceImageKey: 'uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/images_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/images_generate",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c", "prompt": "A peaceful coastal village at sunrise, with warm natural light.", "aspectRatio": "square", "referenceImageKey": "uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png"},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
{
"data": {
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
"status": "running",
"pollAction": "action_request_get",
"pollAfterSeconds": 5
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
{
"data": {
"generationId": "6224018c7635dcb933ce5c8f7804aea73738dd1c",
"status": "completed",
"aspectRatio": "square",
"width": 1024,
"height": 1024,
"referenceImageCount": 1,
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"expiresAt": 1792749600000
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
{
"data": {
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
"operation": "images_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
{
"data": {
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
"operation": "images_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "completed",
"resultStored": false,
"message": "The action completed. Retrieve its output from the corresponding history or resource action."
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
Obrazy
Wygeneruj obraz
Wygeneruj obraz dla połączonego konta. Obowiązują te same limity multimediów i zabezpieczenia co w aplikacji internetowej. Zapisz zwrócony generationId i użyj images_download, aby pobrać obraz. Przy ponawianiu tego samego żądania używaj ponownie requestId.
POST
/
v1
/
actions
/
images_generate
curl --request POST 'https://api.voicecheap.ai/v1/actions/images_generate' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"requestId":"61becb70-00d6-4de0-9eb1-05829a0d851c","prompt":"A peaceful coastal village at sunrise, with warm natural light.","aspectRatio":"square","referenceImageKey":"uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png"}'
const input = {
requestId: '61becb70-00d6-4de0-9eb1-05829a0d851c',
prompt: 'A peaceful coastal village at sunrise, with warm natural light.',
aspectRatio: 'square',
referenceImageKey: 'uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/images_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/images_generate",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c", "prompt": "A peaceful coastal village at sunrise, with warm natural light.", "aspectRatio": "square", "referenceImageKey": "uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png"},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
{
"data": {
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
"status": "running",
"pollAction": "action_request_get",
"pollAfterSeconds": 5
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
{
"data": {
"generationId": "6224018c7635dcb933ce5c8f7804aea73738dd1c",
"status": "completed",
"aspectRatio": "square",
"width": 1024,
"height": 1024,
"referenceImageCount": 1,
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"expiresAt": 1792749600000
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
{
"data": {
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
"operation": "images_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
{
"data": {
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
"operation": "images_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "completed",
"resultStored": false,
"message": "The action completed. Retrieve its output from the corresponding history or resource action."
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
Wygeneruj obraz dla połączonego konta. Obowiązują te same limity multimediów i zabezpieczenia co w aplikacji internetowej. Zapisz zwrócony generationId i użyj images_download, aby pobrać obraz. Przy ponawianiu tego samego żądania używaj ponownie requestId.
Wymagane uprawnienia:
POST https://api.voicecheap.ai/v1/actions/images_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.
images: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ść: 10. Maksymalna długość: 1200.
string
Wartość tekstowa.Dozwolone wartości: “square”, “landscape”, “portrait”. Wartość domyślna: “square”.
string
Klucz przesłanego obiektu JPG, PNG lub WebP w uploads/{yourUserId}/. Zdalne adresy URL nie są akceptowane.Minimalna długość: 1. Maksymalna długość: 512.
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": {
"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}$",
"description": "UUID v4 for this action. Reuse the same ID with identical arguments on retries."
},
"prompt": {
"type": "string",
"minLength": 10,
"maxLength": 1200
},
"aspectRatio": {
"default": "square",
"type": "string",
"enum": ["square", "landscape", "portrait"]
},
"referenceImageKey": {
"type": "string",
"minLength": 1,
"maxLength": 512,
"description": "An uploaded JPG, PNG or WebP object key under uploads/{yourUserId}/. Remote URLs are not accepted."
}
},
"required": ["prompt"],
"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/images_generate' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"requestId":"61becb70-00d6-4de0-9eb1-05829a0d851c","prompt":"A peaceful coastal village at sunrise, with warm natural light.","aspectRatio":"square","referenceImageKey":"uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png"}'
const input = {
requestId: '61becb70-00d6-4de0-9eb1-05829a0d851c',
prompt: 'A peaceful coastal village at sunrise, with warm natural light.',
aspectRatio: 'square',
referenceImageKey: 'uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/images_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/images_generate",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c", "prompt": "A peaceful coastal village at sunrise, with warm natural light.", "aspectRatio": "square", "referenceImageKey": "uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png"},
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. Końcowe metadane generowania zwracane przez procedurę obsługi po zakończeniu generowania obrazu. Nie zawierają bajtów obrazu, previewDataUrl ani adresu URL pobierania.{
"data": {
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
"status": "running",
"pollAction": "action_request_get",
"pollAfterSeconds": 5
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
{
"data": {
"generationId": "6224018c7635dcb933ce5c8f7804aea73738dd1c",
"status": "completed",
"aspectRatio": "square",
"width": 1024,
"height": 1024,
"referenceImageCount": 1,
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"expiresAt": 1792749600000
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
{
"data": {
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
"operation": "images_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
{
"data": {
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
"operation": "images_generate",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "completed",
"resultStored": false,
"message": "The action completed. Retrieve its output from the corresponding history or resource action."
},
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
}
Pola wyniku
| Pole | Opis |
|---|---|
data.generationId | Identyfikator do przekazania bez zmian do images_get lub images_download. |
data.status | pending, completed, failed lub expired. Wygaśnięcie ma pierwszeństwo przed zapisanym statusem. |
data.aspectRatio | square, landscape lub portrait. |
data.width | Szerokość wyniku w pikselach lub null, zanim wymiary będą dostępne. |
data.height | Wysokość wyjścia w pikselach lub null, zanim wymiary staną się dostępne. |
data.referenceImageCount | Liczba użytych obrazów referencyjnych: 0 lub 1. |
data.createdAt | Czas utworzenia w milisekundach Unix. |
data.updatedAt | Czas ostatniej aktualizacji w milisekundach Unix. |
data.expiresAt | Czas Unix w milisekundach, po którym pobranie wygenerowanego obrazu nie jest możliwe. |
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":"61becb70-00d6-4de0-9eb1-05829a0d851c","operation":"images_generate"}'
HTTP 200
{
"data": {
"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
"operation": "images_generate",
"status": "completed",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"resultStored": true,
"result": {
"generationId": "6224018c7635dcb933ce5c8f7804aea73738dd1c",
"status": "completed",
"aspectRatio": "square",
"width": 1024,
"height": 1024,
"referenceImageCount": 1,
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"expiresAt": 1792749600000
}
}
}
Uwagi do operacji
- Wymaga images:write. Z promptu usuwane są białe znaki z początku i końca, a jego długość musi wynosić 10–1200 znaków; przed generowaniem jest on również normalizowany. aspectRatio ma domyślnie wartość square i akceptuje również landscape lub portrait. Akceptowany jest co najwyżej jeden referenceImageKey.
- To długotrwała akcja. Początkowa odpowiedź API/MCP zwykle wskazuje running; sprawdzaj stan przez action_request_get z operation o wartości images_generate i tym samym requestId, aby uzyskać pokazany tutaj wynik końcowy.
- Korzysta ze standardowego dziennego limitu generowania obrazów dla konta. Obrazy wygenerowane na koncie wygasają siedem dni po utworzeniu; pobierz wynik przed expiresAt.
- Ta akcja korzysta z własnych utworzonych materiałów i przesłanych plików połączonego użytkownika, również gdy dane uwierzytelniające są połączone w kontekście zespołu.
- Klucze referencji muszą wskazywać ukończone przesłania w uploads/{yourUserId}/ i kończyć się na .jpg, .jpeg, .png lub .webp. Zdalne adresy URL, klucze innych użytkowników, segmenty przechodzenia po katalogach, ukośniki odwrotne, sekwencje kodowania procentowego, ciągi zapytania, fragmenty i znaki sterujące są odrzucane.
- Każdy obraz referencyjny musi być niepusty, mieć rozmiar najwyżej 8 MiB (8,388,608 bajtów), dawać się zdekodować jako typ obrazu wskazany przez rozszerzenie i mieć 128–4096 pikseli na każdym boku. Liczba zdekodowanych pikseli również podlega ograniczeniom. Przesłany obraz referencyjny pozostaje dostępny do ponownego użycia; te akcje generowania nie zużywają ani nie usuwają jego przesłanego pliku.
- Użyj requestId w formacie UUID v4 lub nagłówka HTTP Idempotency-Key i używaj tej samej wartości z identycznymi danymi wejściowymi przy ponownych próbach. Warstwa integracji zapisuje każdą modyfikację i zwraca jej zapisany stan lub wynik bez ponownego wykonywania. Żądanie w stanie failed lub interrupted nie jest automatycznie ponawiane.
- Dla tego użytkownika można generować tylko jeden obraz naraz. Użyj images_list i images_get, aby sprawdzić stan tworzenia, oraz images_download, aby pobrać bajty PNG. Identyfikator generowania jest nieprzezroczystym ciągiem znaków; nie zastępuj go requestId.
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 | BAD_REQUEST | Serwer nie mógł ustalić zaufanego kontekstu sieciowego żądania. |
| 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 | IMAGE_PROMPT_INVALID | Znormalizowany prompt nie mieści się w zakresie 10–1200 znaków. |
| 400 | IMAGE_REFERENCE_INVALID | Bajty obrazu referencyjnego nie spełniają wymagań dotyczących obsługiwanego typu obrazu, limitu bajtów, wymiarów lub dekodowania. |
| 400 | INVALID_REQUEST_ID | requestId lub Idempotency-Key nie jest identyfikatorem UUID v4. |
| 400 | REFERENCE_IMAGE_INVALID | Klucz pliku referencyjnego jest niebezpieczny, nie należy do użytkownika, jest nieobsługiwany, niedostępny lub dotyczy pliku większego niż 8 MiB. |
| 400 | VALIDATION_ERROR | Brakuje argumentu, ma on nieobsługiwaną wartość, przekracza limit lub nie należy do ścisłego schematu danych wejściowych. |
| 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 | 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 | Identyfikator żądania został już użyty z innymi argumentami; niezgodność identyfikatorów w nagłówku i treści zwraca HTTP 400 z tym samym kodem. |
| 409 | IMAGE_GENERATION_IN_PROGRESS | To żądanie obrazu lub generowanie innego obrazu dla połączonego użytkownika nadal trwa. |
| 409 | IMAGE_REQUEST_ID_REUSED | Identyfikator żądania obrazu jest już powiązany z innymi danymi wejściowymi. |
| 422 | IMAGE_REQUEST_REJECTED | Nie można wygenerować obrazu na podstawie tego promptu lub materiału referencyjnego. Zmień treść dla nowego żądania. |
| 429 | IMAGE_DAILY_LIMIT_REACHED | Dzienny limit generowania obrazów na koncie został wyczerpany. |
| 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. |
| 500 | INTERNAL_ERROR | Sprawdź stan zapisanego żądania i historię zasobu przed podjęciem decyzji o ponowieniu operacji zmieniającej dane. |
| 502 | INTERNAL_ERROR | Generowanie lub przygotowanie obrazu nie powiodło się. Sprawdź stan żądania, zanim zdecydujesz o rozpoczęciu 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 | INTERNAL_ERROR | Generowanie obrazu lub jego zapisany wynik są tymczasowo niedostępne. Sprawdź stan żądania przed ponowieniem próby. |
| 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": ["images:write"]
}
}
Czy ta strona była pomocna?

