스키마의 게시된 문서를 대상 언어로 일괄 번역하는 백그라운드 작업을 시작합니다.
하나 이상의 컴포넌트 스키마에 속한 게시된 모든 문서를 하나 이상의 대상 언어로 백그라운드에서 번역하도록 대기열에 추가합니다. 각 번역이 완료될 때마다 결과가 translations 테이블에 업서트됩니다.
엔드포인트: POST /translation
인증: Bearer JWT (WorkOS)
{
"websiteId": "<uuid>",
"schemaNames": ["post", "hero"],
"languages": ["fr", "es", "de"]
}
| 필드 | 유형 | 필수 | 비고 |
|---|---|---|---|
websiteId | uuid | 예 | 원본 문서가 포함된 웹사이트입니다. |
schemaNames | string[] | 예* | 번역할 컴포넌트 스키마입니다. 중복된 이름은 제거됩니다. |
schemaName | string | 예* | 단일 스키마를 제출하기 위한 레거시 대안입니다. |
languages | string[] | 예 | 지원되는 대상 언어 코드입니다. 중복된 코드는 제거됩니다. |
* schemaNames 또는 schemaName 중 하나를 제공해야 합니다.
게시된 콘텐츠가 null이 아닌 게시 문서만 처리 대상으로 고려됩니다.
{
"job_id": "<uuid>",
"website_id": "<uuid>",
"schema_name": null,
"schema_names": ["post", "hero"],
"languages": ["fr", "es", "de"],
"status": "queued",
"documents_processed": 12,
"translations_scheduled": 30,
"translations_skipped": 6,
"translations_completed": 0,
"translations_failed": 0,
"reused": false,
"created_at": "2026-07-15T18:00:00Z",
"updated_at": "2026-07-15T18:00:00Z"
}
반환되는 응답:
202 Accepted200 OK| 필드 | 설명 |
|---|---|
job_id | 작업 진행 상황을 조회하는 데 사용되는 식별자입니다. |
status | 현재 작업 상태입니다. |
documents_processed | 조건에 부합하는 원본 문서의 수입니다. |
translations_scheduled | 대기열에 추가된 문서-언어 쌍의 수입니다. |
translations_skipped | 원본 해시가 최신 상태이므로 건너뛴 항목의 수입니다. |
translations_completed | 성공적으로 번역된 항목의 수입니다. |
translations_failed | 번역에 실패한 항목의 수입니다. |
reused | 응답이 기존 활성 작업을 참조하는지 여부입니다. |
가능한 작업 상태는 다음과 같습니다.
preparing — 준비 중queued — 대기 중running — 실행 중completed — 완료completed_with_errors — 오류와 함께 완료failed — 실패각 문서-언어 쌍에는 원본 문서의 게시된 콘텐츠에 대한 SHA-256 해시가 저장됩니다.
저장된 원본 해시가 현재 게시된 콘텐츠와 일치하면 번역을 건너뜁니다. 이를 통해 변경되지 않은 콘텐츠를 다시 번역하지 않고 엔드포인트를 반복해서 호출할 수 있습니다.
동일한 작업이 활성 상태인 동안 게시된 콘텐츠가 변경되면 서비스는 새 요청을 거부합니다. 활성 작업이 완료된 후 다시 제출하세요.
번역은 최초 응답 이후 비동기적으로 실행됩니다.
completed_with_errors 상태로 완료됩니다.curl -X POST '{TRANSLATION_API_URL}/translation' \
-H 'Authorization: Bearer <workos-jwt>' \
-H 'Content-Type: application/json' \
-d '{
"websiteId": "<uuid>",
"schemaNames": ["post", "hero"],
"languages": ["fr", "es"]
}'
400 Bad Request — 스키마 또는 언어가 누락되었거나, 지원되지 않는 언어이거나, 배치가 구성된 한도를 초과했습니다.401 Unauthorized — bearer 토큰이 없거나 유효하지 않습니다.409 Conflict — 일치하는 작업이 활성 상태이지만 게시된 원본 콘텐츠가 변경되었습니다.500 Internal Server Error — 원본 문서를 준비할 수 없거나 데이터베이스 작업에 실패했습니다.번역 작업의 최신 진행 상황을 조회합니다.
엔드포인트: GET /translation-jobs/{job_id}
인증: Bearer JWT (WorkOS)
응답에는 POST /translation에서 반환된 것과 동일한 작업 객체가 사용되며, 상태 및 진행률 수가 업데이트됩니다.
{
"job_id": "<uuid>",
"website_id": "<uuid>",
"schema_name": null,
"schema_names": ["post", "hero"],
"languages": ["fr", "es"],
"status": "running",
"documents_processed": 12,
"translations_scheduled": 24,
"translations_skipped": 0,
"translations_completed": 16,
"translations_failed": 1,
"reused": false,
"created_at": "2026-07-15T18:00:00Z",
"updated_at": "2026-07-15T18:01:30Z"
}
curl '{TRANSLATION_API_URL}/translation-jobs/<job-id>' \
-H 'Authorization: Bearer <workos-jwt>'
401 Unauthorized — bearer 토큰이 없거나 유효하지 않습니다.404 Not Found — 작업이 존재하지 않거나 더 이상 보관되지 않습니다.현재 번역 작업은 메모리에 보관됩니다. 번역 서비스가 재시작되면 작업 상태가 손실되며, 여러 인스턴스로 배포하는 경우 고정 라우팅이 필요합니다.