---
title: "Launch AI or Crowdin translation for a paywall"
method: POST
path: "/paywalls/{paywallId}/translate"
tags: ["Translations"]
---

# Launch AI or Crowdin translation for a paywall

`POST /paywalls/{paywallId}/translate`

## Path parameters

- `paywallId` integer, required

## Request body

- TranslateRequest
  - `languages` string[], required — Target languages. Accepts both platform codes (`es`, `pt`, `fr`) and Crowdin codes (`es-ES`, `pt-PT`, `fr`). Codes are normalised to Crowdin form server-side. See GET /project/translation-languages.
  - `method` 'ai' | 'crowdin' — Translation provider. `crowdin` requires Crowdin connection enabled.
  - `custom_prompt` string, nullable — AI-only. Overrides the project default for this single run.
  - `save_prompt` boolean — AI-only. When true and `custom_prompt` is supplied, persist it on the project as the new default for subsequent translations.

## Response `202`

Translation queued

- TranslateAccepted — Returned with HTTP 202 when a translation has been queued asynchronously (the default and recommended path). The HTTP request returns immediately; progress lives at `status_url` (TranslationStatus schema). The job runs on the application's default Laravel queue — make sure your queue worker is processing it.
  - `success` integer
  - `async` boolean
  - `method` string
  - `status` string
  - `status_url` string, uri — GET this URL to poll progress (see TranslationStatus schema).
  - `languages` string[]
  - `message` string

## Other responses

- `422` — Validation error / Crowdin not configured

---

[API](https://skmtc.net/web2wave/apis/web2wave-api.md) · [All operations](https://skmtc.net/web2wave/apis/web2wave-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/web2wave/web2wave-api/revisions/c88545119271/schema)
