---
title: "Languages"
description: "Every operation in this group: what it accepts, what it returns and the errors it can answer with."
url: "https://openemail.uk/docs/api/reference/languages"
area: "API"
category: "Reference"
---

# Languages

Every operation in this group: what it accepts, what it returns and the errors it can answer with.

## Operations

Write in your own language and have it arrive in the recipient's.

Put `translate` on a send and the body (and the subject, unless you say otherwise) is translated at the moment the request is accepted, before any record of it exists. That timing is the feature: a scheduled message carries the words that were approved rather than whatever a model produces on Tuesday, and a translation that could not be produced refuses the send instead of quietly delivering the original. A message is never sent in a language its sender did not pick.

`includeOriginal` puts what you actually wrote below the translation, behind a separator and captioned in the recipient's language. Leave it on: it is the only thing that lets the person reading check a sentence that lands strangely, and without it they are being asked to trust a model neither of you can see the output of.

`POST /emails/translate` returns exactly what a send would produce, for showing somebody before they commit.

### `GET /languages`

Every language a message can be sent in

Behind a key like everything else, and needing no scope: it names no data belonging to anybody.

Fetch it once and keep it. The whole table comes back in one response with no cursor. It is a couple of hundred rows that change a handful of times a year, and a client that hardcodes the list or scrapes it out of this document goes stale the day a row is added.

The ORDER is meaningful: the languages people are most likely to be emailed in come first, then regional variants, then the rest by region. A picker should render it as it arrives until somebody types. Search over `native`, `label` and `code` together, and show `native` first, because it is the word someone looking for their own language is actually looking for.

- Needs an API key or an OAuth access token, and no scope.

**Returns**

- `200` `LanguageList`: The whole table, in picker order.

**Errors**

- The errors every operation can return: `400`, `401`, `403`, `404`, `422`, `500`, described in the [error catalog](https://openemail.uk/docs/api/errors).

Also available in: SDK [`languages.list()`](https://openemail.uk/docs/sdk/reference/languages#list); CLI [`openemail languages list`](https://openemail.uk/docs/cli/reference/languages#languages-list).

### Objects

#### `Language`

`object`

- `code` (`string`, required): BCP-47. What every endpoint here accepts and returns.
- `label` (`string`, required): The English name: "Brazilian Portuguese".
- `native` (`string`, required): The endonym, in its own script. Show this first.
- `flag` (`string`, required): Two regional-indicator codepoints. A scanning aid beside the native name, never an identifier. Never show it on its own.
- `rtl` (`boolean`, required): Right-to-left. A translated body for one of these is wrapped in `dir="rtl"` before it is sent, because a client that inherits direction renders it backwards otherwise.

#### `LanguageList`

`object`

- `object` (`string`, one of `"list"`)
- `data` (`Language[]`)
