> ## Documentation Index
> Fetch the complete documentation index at: https://api-docs.voicecheap.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Opublikuj przetłumaczone wideo

> Opublikuj lub zaplanuj publikację ukończonego tłumaczenia, wyniku z synchronizacją ruchu ust lub dynamicznymi napisami na jednym z własnych połączonych kanałów. Adres URL wideo pochodzi z wybranej zapisanej wersji.

Opublikuj lub zaplanuj publikację ukończonego tłumaczenia, wyniku z synchronizacją ruchu ust lub dynamicznymi napisami na jednym z własnych połączonych kanałów. Adres URL wideo pochodzi z wybranej zapisanej wersji.

```http theme={null}
POST https://api.voicecheap.ai/v1/actions/publishing_translation_create
```

## Uwierzytelnianie i uprawnienia

<ParamField header="x-api-key" type="string" required>
  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.
</ParamField>

Wymagane uprawnienia: `publishing:write`, `projects:read`.

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

<ParamField body="projectId" type="string" required>
  Wartość tekstowa.

  Minimalna długość: 1. Maksymalna długość: 200. Wzorzec: `^[^/\\]+$`.
</ParamField>

<ParamField body="workId" type="string" required>
  Wartość tekstowa.

  Minimalna długość: 1. Maksymalna długość: 200. Wzorzec: `^[^/\\]+$`.
</ParamField>

<ParamField body="translatedVersionId" type="string" required>
  Wartość tekstowa.

  Minimalna długość: 1. Maksymalna długość: 200. Wzorzec: `^[^/\\]+$`.
</ParamField>

<ParamField body="platform" type="string" required>
  Wartość tekstowa.

  Dozwolone wartości: "youtube", "tiktok".
</ParamField>

<ParamField body="channelId" type="string" required>
  Wartość tekstowa.

  Minimalna długość: 1. Maksymalna długość: 200. Wzorzec: `^[^/\\]+$`.
</ParamField>

<ParamField body="videoSource" type="string">
  Wartość tekstowa.

  Dozwolone wartości: "translated", "lip-synced", "dynamic-subtitles". Wartość domyślna: "translated".
</ParamField>

<ParamField body="title" type="string" required>
  Wartość tekstowa.

  Minimalna długość: 1. Maksymalna długość: 100.
</ParamField>

<ParamField body="description" type="string">
  Wartość tekstowa.

  Maksymalna długość: 5000.
</ParamField>

<ParamField body="youtubePrivacyStatus" type="string">
  Wartość tekstowa.

  Dozwolone wartości: "public", "unlisted", "private". Wartość domyślna: "private".
</ParamField>

<ParamField body="tiktokPrivacyLevel" type="string">
  Wartość tekstowa.

  Dozwolone wartości: "PUBLIC\_TO\_EVERYONE", "MUTUAL\_FOLLOW\_FRIENDS", "FOLLOWER\_OF\_CREATOR", "SELF\_ONLY". Wartość domyślna: "SELF\_ONLY".
</ParamField>

<ParamField body="scheduledAt" type="string">
  Wartość tekstowa.

  Format: "date-time". Wzorzec: `^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$`.
</ParamField>

<ParamField body="requestId" type="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}$`.
</ParamField>

<Accordion title="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.

  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200,
        "pattern": "^[^/\\\\]+$"
      },
      "workId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200,
        "pattern": "^[^/\\\\]+$"
      },
      "translatedVersionId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200,
        "pattern": "^[^/\\\\]+$"
      },
      "platform": {
        "type": "string",
        "enum": ["youtube", "tiktok"]
      },
      "channelId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200,
        "pattern": "^[^/\\\\]+$"
      },
      "videoSource": {
        "default": "translated",
        "type": "string",
        "enum": ["translated", "lip-synced", "dynamic-subtitles"]
      },
      "title": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      },
      "description": {
        "type": "string",
        "maxLength": 5000
      },
      "youtubePrivacyStatus": {
        "default": "private",
        "type": "string",
        "enum": ["public", "unlisted", "private"]
      },
      "tiktokPrivacyLevel": {
        "default": "SELF_ONLY",
        "type": "string",
        "enum": ["PUBLIC_TO_EVERYONE", "MUTUAL_FOLLOW_FRIENDS", "FOLLOWER_OF_CREATOR", "SELF_ONLY"]
      },
      "scheduledAt": {
        "type": "string",
        "format": "date-time",
        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
      },
      "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."
      }
    },
    "required": ["projectId", "workId", "translatedVersionId", "platform", "channelId", "title"],
    "additionalProperties": false
  }
  ```
</Accordion>

## 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.

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST 'https://api.voicecheap.ai/v1/actions/publishing_translation_create' \
    --header "x-api-key: $VOICECHEAP_API_KEY" \
    --header 'Content-Type: application/json' \
    --data '{"projectId":"project_launch_2026","workId":"5f8423d1-e4c0-4f80-9e3f-eed959389e24","translatedVersionId":"0fa684f3-4997-4d7a-9424-16d1f9ac849c","platform":"youtube","channelId":"UC1234567890abcdefghijkl","videoSource":"translated","title":"English product launch","description":"Our latest product update.","youtubePrivacyStatus":"private","scheduledAt":"2030-10-16T12:00:00+02:00","requestId":"41321bda-e243-4b6f-96a4-622cd047c991"}'
  ```

  ```javascript JavaScript theme={null}
  const input = {
    projectId: 'project_launch_2026',
    workId: '5f8423d1-e4c0-4f80-9e3f-eed959389e24',
    translatedVersionId: '0fa684f3-4997-4d7a-9424-16d1f9ac849c',
    platform: 'youtube',
    channelId: 'UC1234567890abcdefghijkl',
    videoSource: 'translated',
    title: 'English product launch',
    description: 'Our latest product update.',
    youtubePrivacyStatus: 'private',
    scheduledAt: '2030-10-16T12:00:00+02:00',
    requestId: '41321bda-e243-4b6f-96a4-622cd047c991',
  };
  const response = await fetch('https://api.voicecheap.ai/v1/actions/publishing_translation_create', {
    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);
  ```

  ```python Python theme={null}
  import os
  import requests

  response = requests.post(
      "https://api.voicecheap.ai/v1/actions/publishing_translation_create",
      headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
      json={"projectId": "project_launch_2026", "workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24", "translatedVersionId": "0fa684f3-4997-4d7a-9424-16d1f9ac849c", "platform": "youtube", "channelId": "UC1234567890abcdefghijkl", "videoSource": "translated", "title": "English product launch", "description": "Our latest product update.", "youtubePrivacyStatus": "private", "scheduledAt": "2030-10-16T12:00:00+02:00", "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"},
      timeout=120,
  )
  body = response.json()
  if not response.ok:
      raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
  print(body)
  ```
</RequestExample>

## 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.

Zwraca identyfikator zaplanowanej publikacji i znacznik czasu albo identyfikator natychmiast opublikowanego filmu i adres URL.

<ResponseExample>
  ```json HTTP 202 theme={null}
  {
    "data": {
      "requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
      "status": "running",
      "pollAction": "action_request_get",
      "pollAfterSeconds": 5
    },
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
  }
  ```

  ```json HTTP 200 theme={null}
  {
    "data": {
      "publicationId": "7db6b953-7664-4bc2-811a-6aa7aa29038d",
      "projectId": "project_launch_2026",
      "platform": "youtube",
      "status": "scheduled",
      "scheduledAt": 1918375200000
    },
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
  }
  ```

  ```json HTTP 202 replay_running theme={null}
  {
    "data": {
      "requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
      "operation": "publishing_translation_create",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "running",
      "pollAfterSeconds": 5
    },
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
  }
  ```

  ```json HTTP 200 replay_completed_without_result theme={null}
  {
    "data": {
      "requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
      "operation": "publishing_translation_create",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "completed",
      "resultStored": false,
      "message": "The action completed. Retrieve its output from the corresponding history or resource action."
    },
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
  }
  ```
</ResponseExample>

## Pola wyniku

| Pole | Opis |
| - | - |
| `data.publicationId` | Identyfikator nowej próby publikacji lub zaplanowanej publikacji. |
| `data.projectId` | Identyfikator projektu nadrzędnego. |
| `data.platform` | youtube lub tiktok. |
| `data.status` | scheduled po utworzeniu harmonogramu; published w wariancie odpowiedzi natychmiastowej. |
| `data.scheduledAt` | Zaplanowany czas w milisekundach Unix; występuje wyłącznie w ścieżce publikacji zaplanowanej. |
| `data.videoId` | Identyfikator filmu na platformie społecznościowej; wyłącznie dla wariantu publikacji natychmiastowej. |
| `data.videoUrl` | Adres URL filmu na platformie, jeśli zostanie zwrócony przez mechanizm publikacji; tylko dla ścieżki natychmiastowej publikacji. |

## scheduledAt jest pominięte, a usługa publikacji natychmiastowej kończy działanie pomyślnie.

Zwraca identyfikator natychmiastowej próby publikacji i informacje o wideo na platformie.

```json HTTP 200 theme={null}
{
  "data": {
    "publicationId": "7db6b953-7664-4bc2-811a-6aa7aa29038d",
    "projectId": "project_launch_2026",
    "platform": "youtube",
    "status": "published",
    "videoId": "example1234",
    "videoUrl": "https://www.youtube.com/watch?v=example1234"
  }
}
```

## 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.

```bash theme={null}
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":"41321bda-e243-4b6f-96a4-622cd047c991","operation":"publishing_translation_create"}'
```

```json HTTP 200 theme={null}
{
  "data": {
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
    "operation": "publishing_translation_create",
    "status": "completed",
    "createdAt": 1792144800000,
    "updatedAt": 1792144820000,
    "resultStored": true,
    "result": {
      "publicationId": "7db6b953-7664-4bc2-811a-6aa7aa29038d",
      "projectId": "project_launch_2026",
      "platform": "youtube",
      "status": "scheduled",
      "scheduledAt": 1918375200000
    }
  }
}
```

## Uwagi do operacji

* Ta akcja publikuje na zewnątrz. Wybierz jeden kanał należący do uwierzytelnionego wywołującego; dostęp do multimediów projektu zespołowego nie daje dostępu do kanału innego członka.
* videoSource ma domyślną wartość translated. lip-synced wybiera ostatni ukończony film z synchronizacją ruchu ust; dynamic-subtitles wybiera zapisany wynik z dynamicznymi napisami. Wersja musi być ukończona, a wybrany wynik musi istnieć.
* Integracja domyślnie używa private dla YouTube i SELF\_ONLY dla TikTok. Adres URL wideo pochodzi z zapisanej wersji objętej uprawnieniami, a nie z adresu URL podanego przez wywołującego.
* scheduledAt jest opcjonalne. Jeśli zostanie podane, musi być prawidłową datą i godziną ISO z przesunięciem strefy czasowej i wskazywać czas ściśle w przyszłości; procedura obsługi zwraca tę wartość w milisekundach Unix. Bez tego pola akcja publikuje natychmiast.
* To długotrwała akcja. Sprawdzaj action\_request\_get, aby uzyskać wynik procedury obsługi, oraz publishing\_list, aby śledzić późniejszy stan publikacji. Odpowiedzi dla publikacji zaplanowanych i natychmiastowych mają różne pola.
* Procedura obsługi wykonywana natychmiast zgłasza status published wraz z videoId zwróconym przez usługę publikowania w mediach społecznościowych i opcjonalnym videoUrl. Odpowiedź dotycząca harmonogramu dodanego do kolejki nie zawiera videoId ani videoUrl.
* W przypadku TikTok videoId może być identyfikatorem publikacji na platformie, gdy ostateczny liczbowy identyfikator wideo jest niedostępny; videoUrl może wskazywać adres URL połączonego kanału lub zapisane źródłowe wideo jako wartość zastępczą.

## 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_SCHEDULE` | scheduledAt nie wskazuje czasu w przyszłości. |
| 400 | `OUTPUT_NOT_READY` | Brakuje wybranego wynikowego wideo przetłumaczonego, z synchronizacją ruchu ust lub z napisami. |
| 400 | `TRANSLATION_NOT_READY` | Wybrana przetłumaczona wersja nie jest ukończona. |
| 400 | `VALIDATION_ERROR` | Popraw dane wejściowe zgodnie ze schematem. Nieprawidłowe lub niespójne wartości są odrzucane przed wykonaniem. |
| 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 | `FORBIDDEN` | Uwierzytelniony podmiot wykonujący akcję nie ma dostępu do tego projektu. |
| 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 | `PUBLISHING_CHANNEL_FORBIDDEN` | Kanał nie należy do uwierzytelnionego podmiotu wykonującego akcję. |
| 403 | `SUBSCRIPTION_REQUIRED` | Użyj aktywnej płatnej subskrypcji. |
| 403 | `TEAM_OWNER_NOT_FOUND` | Nie znaleziono konta faktycznego właściciela zespołu. |
| 404 | `PROJECT_NOT_FOUND` | Projekt nie istnieje na dostępnym koncie. |
| 404 | `TRANSLATION_NOT_FOUND` | workId nie wskazuje wersji językowej należącej do tego projektu. |
| 404 | `TRANSLATION_VERSION_NOT_FOUND` | translatedVersionId nie należy do wybranej wersji językowej. |
| 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. |
| 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` | Nie udało się ukończyć publikacji. Sprawdź historię żądania i publikacji przed ponowną próbą. |
| 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. |

```json theme={null}
{
  "code": "INSUFFICIENT_SCOPE",
  "message": "This credential does not permit the requested action.",
  "status": 403,
  "details": {
    "requiredScopes": ["publishing:write", "projects:read"]
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.