# Languages

> How the Curriculo API handles languages: language-preserving parsing, output language settings, translation across 85 language codes and language detection.

**Source:** /docs/languages/ (Curriculo Docs)  
**Updated:** 12 October 2026  
**Contact:** hello@curriculo.me

Language handling is built into every capability. All language parameters take ISO 639-1 codes (for example `en`, `ar`, `ko`).

## Send CVs in any language

Parsing and evaluation read the document as written (Arabic, Korean, Japanese, Hindi, French, Portuguese, Russian and the rest) with no pre-processing on your side.

## Nothing is silently rewritten

Parsed values come back in the CV's own language and script, so a name or an employer is never transliterated into something the candidate would not recognise.

## Choose the output language

These operations accept a `language` parameter for the prose they write:

| Operation | Parameter | Default |
|---|---|---|
| [`POST /evaluate/`](/docs/api/evaluate/) | `language`: language of the candidate-facing analysis | English |
| [`POST /jobs/`](/docs/api/jobs/) | `language`: default language for candidate-facing prose | |
| [`POST /summary/`](/docs/api/summary/) | `language`: language to render the summary in | English |
| [`POST /prompt/`](/docs/api/prompt/) | `language`: language to render the résumé in | Keeps the source language |

So an Arabic CV can be assessed in English, or an English CV rendered in Korean. On [`POST /transcribe/`](/docs/api/transcribe/), `language` is an optional hint for the recording's language.

> [!TIP]
> For the résumé assistant, set `language` to get a translated résumé. That, rather than asking for a translation in `prompt_text`, is how translation is requested.

## Translate

[`POST /translate/`](/docs/api/translate/) supports 85 ISO 639-1 language codes. A `source_language` or `target_language` outside that set is refused with `422`.

## Detect language

[`POST /detect-language/`](/docs/api/detect-language/) returns the language a text is written in, so you can branch a workflow (assign the right recruiter, pick the right template) before any human reads the document. It runs offline first, and falls back to a model for texts too short or too mixed to call confidently. That fallback can return any two-letter code, so a detected language is not always one that `/translate/` accepts.
