This endpoint returns all possible language pairs for glossaries.
diff --git a/api-reference/openapi.json b/api-reference/openapi.json
index 32b0740d..34b13f26 100644
--- a/api-reference/openapi.json
+++ b/api-reference/openapi.json
@@ -797,7 +797,7 @@
}
},
"style_id": {
- "description": "Specify the [style rule list](/api-reference/style-rules) to use for the translation.\n\n**Important:** The target language has to match the language of the style rule list.\n\nAll `model_type` values are supported.",
+ "description": "Specify the [style rule list](/docs/customize/using-style-rules) to use for the translation.\n\n**Important:** The target language has to match the language of the style rule list.\n\nAll `model_type` values are supported.",
"type": "string",
"example": "7ff9bfd6-cd85-4190-8503-d6215a321519"
},
@@ -1159,7 +1159,7 @@
}
},
"style_id": {
- "description": "Specify the [style rule list](/api-reference/style-rules) to use for the translation.\n\n**Important:** The target language has to match the language of the style rule list.",
+ "description": "Specify the [style rule list](/docs/customize/using-style-rules) to use for the translation.\n\n**Important:** The target language has to match the language of the style rule list.",
"type": "string",
"example": "7ff9bfd6-cd85-4190-8503-d6215a321519"
},
@@ -3078,7 +3078,7 @@
"MetaInformation"
],
"summary": "Retrieve Supported Languages",
- "description": "**Deprecated.** Use `GET /v3/languages?resource=translate_text` (or the appropriate resource)\ninstead. See the [migration guide](https://developers.deepl.com/api-reference/languages/migrate-from-v2-languages)\nfor details.",
+ "description": "**Deprecated.** Use `GET /v3/languages?resource=translate_text` (or the appropriate resource)\ninstead. See the [migration guide](https://developers.deepl.com/docs/languages/migrating-from-v2-languages)\nfor details.",
"operationId": "getLanguagesV2",
"parameters": [
{
@@ -7210,7 +7210,7 @@
"example": "Hello\tGuten Tag"
},
"entries_format": {
- "description": "The format in which the glossary entries are provided. Formats currently available:\n- `tsv` (default) - tab-separated values\n- `csv` - comma-separated values\n\nSee [Supported Glossary Formats](/api-reference/multilingual-glossaries#formats) for details about each format.",
+ "description": "The format in which the glossary entries are provided. Formats currently available:\n- `tsv` (default) - tab-separated values\n- `csv` - comma-separated values\n\nSee [Supported Glossary Formats](/docs/customize/managing-glossaries#entry-formats) for details about each format.",
"type": "string",
"enum": [
"tsv",
@@ -7402,7 +7402,7 @@
"example": "Hello\tGuten Tag"
},
"GlossaryEntriesFormat": {
- "description": "The format in which the glossary entries are provided. Formats currently available:\n- `tsv` (default) - tab-separated values\n- `csv` - comma-separated values\n\nSee [Supported Glossary Formats](/api-reference/multilingual-glossaries#formats) for details about each format.",
+ "description": "The format in which the glossary entries are provided. Formats currently available:\n- `tsv` (default) - tab-separated values\n- `csv` - comma-separated values\n\nSee [Supported Glossary Formats](/docs/customize/managing-glossaries#entry-formats) for details about each format.",
"type": "string",
"enum": [
"tsv",
@@ -7695,7 +7695,7 @@
},
"SourceLanguage": {
"type": "string",
- "description": "Language of the text to be translated. If this parameter is omitted, the API will attempt to\ndetect the language of the text and translate it.\n\nFor the full list of supported source languages, see [supported languages](https://developers.deepl.com/docs/getting-started/supported-languages) or query the [`GET /v3/languages` endpoint](https://developers.deepl.com/api-reference/languages/retrieve-supported-languages-by-resource).",
+ "description": "Language of the text to be translated. If this parameter is omitted, the API will attempt to\ndetect the language of the text and translate it.\n\nFor the full list of supported source languages, see [supported languages](https://developers.deepl.com/docs/getting-started/supported-languages) or query the [`GET /v3/languages` endpoint](https://developers.deepl.com/docs/languages/using-the-languages-api).",
"example": "EN"
},
"TranslationMemory": {
@@ -7869,7 +7869,7 @@
},
"TargetLanguage": {
"type": "string",
- "description": "The language into which the text should be translated.\n\nFor the full list of supported target languages, see [supported languages](https://developers.deepl.com/docs/getting-started/supported-languages) or query the [`GET /v3/languages` endpoint](https://developers.deepl.com/api-reference/languages/retrieve-supported-languages-by-resource).",
+ "description": "The language into which the text should be translated.\n\nFor the full list of supported target languages, see [supported languages](https://developers.deepl.com/docs/getting-started/supported-languages) or query the [`GET /v3/languages` endpoint](https://developers.deepl.com/docs/languages/using-the-languages-api).",
"example": "DE"
},
"TargetLanguageWrite": {
diff --git a/api-reference/openapi.yaml b/api-reference/openapi.yaml
index a33ca7ee..84e14d39 100644
--- a/api-reference/openapi.yaml
+++ b/api-reference/openapi.yaml
@@ -601,7 +601,7 @@ paths:
example: def3a26b-3e84-45b3-84ae-0c0aaf3525f7
style_id:
description: |-
- Specify the [style rule list](/api-reference/style-rules) to use for the translation.
+ Specify the [style rule list](/docs/customize/using-style-rules) to use for the translation.
**Important:** The target language has to match the language of the style rule list.
@@ -916,7 +916,7 @@ paths:
example: def3a26b-3e84-45b3-84ae-0c0aaf3525f7
style_id:
description: |-
- Specify the [style rule list](/api-reference/style-rules) to use for the translation.
+ Specify the [style rule list](/docs/customize/using-style-rules) to use for the translation.
**Important:** The target language has to match the language of the style rule list.
type: string
@@ -2198,7 +2198,7 @@ paths:
summary: Retrieve Supported Languages
description: |-
**Deprecated.** Use `GET /v3/languages?resource=translate_text` (or the appropriate resource)
- instead. See the [migration guide](https://developers.deepl.com/api-reference/languages/migrate-from-v2-languages)
+ instead. See the [migration guide](https://developers.deepl.com/docs/languages/migrating-from-v2-languages)
for details.
operationId: getLanguagesV2
parameters:
@@ -5136,7 +5136,7 @@ components:
- `tsv` (default) - tab-separated values
- `csv` - comma-separated values
- See [Supported Glossary Formats](/api-reference/multilingual-glossaries#formats) for details about each format.
+ See [Supported Glossary Formats](/docs/customize/managing-glossaries#entry-formats) for details about each format.
type: string
enum:
- tsv
@@ -5299,7 +5299,7 @@ components:
- `tsv` (default) - tab-separated values
- `csv` - comma-separated values
- See [Supported Glossary Formats](/api-reference/multilingual-glossaries#formats) for details about each format.
+ See [Supported Glossary Formats](/docs/customize/managing-glossaries#entry-formats) for details about each format.
type: string
enum:
- tsv
@@ -5559,7 +5559,7 @@ components:
Language of the text to be translated. If this parameter is omitted, the API will attempt to
detect the language of the text and translate it.
- For the full list of supported source languages, see [supported languages](https://developers.deepl.com/docs/getting-started/supported-languages) or query the [`GET /v3/languages` endpoint](https://developers.deepl.com/api-reference/languages/retrieve-supported-languages-by-resource).
+ For the full list of supported source languages, see [supported languages](https://developers.deepl.com/docs/getting-started/supported-languages) or query the [`GET /v3/languages` endpoint](https://developers.deepl.com/docs/languages/using-the-languages-api).
example: EN
TranslationMemory:
type: object
@@ -5729,7 +5729,7 @@ components:
description: |-
The language into which the text should be translated.
- For the full list of supported target languages, see [supported languages](https://developers.deepl.com/docs/getting-started/supported-languages) or query the [`GET /v3/languages` endpoint](https://developers.deepl.com/api-reference/languages/retrieve-supported-languages-by-resource).
+ For the full list of supported target languages, see [supported languages](https://developers.deepl.com/docs/getting-started/supported-languages) or query the [`GET /v3/languages` endpoint](https://developers.deepl.com/docs/languages/using-the-languages-api).
example: DE
TargetLanguageWrite:
type: string
diff --git a/api-reference/style-rules.mdx b/api-reference/style-rules.mdx
deleted file mode 100644
index f83d9d50..00000000
--- a/api-reference/style-rules.mdx
+++ /dev/null
@@ -1,940 +0,0 @@
----
-title: "Style rules"
-sidebarTitle: "Overview"
-description: "Manage a shared list of rules for style, formatting, and more"
----
-
-
- The Style Rules API is currently available only to Pro API subscribers.
-
-
-## Overview
-
-The style rules feature allows you to select a set of rules to apply when translating text. These rules make changes to your text according to the selected formatting and spelling conventions.
-
-You can create style rules in the UI at [https://deepl.com/custom-rules](https://deepl.com/custom-rules).
-
-Both glossaries and style rules are unique to each of DeepL's global data centers and are not shared between them. Clients using the `api-us.deepl.com` endpoint will not be able to access glossaries or style rules created in the UI at this time.
-
-A **style rule list** contains two types of rules:
-- **Configured rules**: Predefined rules for formatting conventions (e.g., time format, number formatting, style and tone)
-- **Custom instructions**: User-defined instructions for specific styling requirements
-
-Both configured rules and custom instructions are applied during translation to ensure your translations match your style requirements. They work together to provide comprehensive style control over your translated content.
-
-### Limits
-
-- There is no limit to how many predefined rules can be selected per style rule list
-- A maximum of 200 custom instructions can be enabled per style rule list (although this may be adjusted based on plan tiers in the future)
-- Each custom instruction is at most 300 characters
-
-If you need more than 200 custom instructions, consider organizing your rules into multiple style rule lists for different use cases or content types.
-
-## Creating style rules
-
-### Create a style rule list
-
-`POST /v3/style_rules`
-
-Create a new style rule list with configured rules and optional custom instructions.
-
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```sh Example request: create a style rule list
- curl -X POST 'https://api.deepl.com/v3/style_rules' \
- --header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \
- --header 'Content-Type: application/json' \
- --data '{
- "name": "Technical Documentation Rules",
- "language": "en",
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "en"
- }
- ]
- }'
- ```
-
- ```json Example response
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-01T12:34:56Z",
- "language": "en",
- "version": 1,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "en"
- }
- ]
- }
- ```
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```http Example request: create a style rule list
- POST /v3/style_rules HTTP/2
- Host: api.deepl.com
- Authorization: DeepL-Auth-Key [yourAuthKey]
- User-Agent: YourApp/1.2.3
- Content-Length: 234
- Content-Type: application/json
-
- {
- "name": "Technical Documentation Rules",
- "language": "en",
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "en"
- }
- ]
- }
- ```
-
- ```json Example response
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-01T12:34:56Z",
- "language": "en",
- "version": 1,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "en"
- }
- ]
- }
- ```
-
-
-
-#### Request body parameters
-
-
- The name of the style rule list. Maximum length: 1024 characters.
-
-
- The target language for the style rules. Supported values: `de`, `en`, `es`, `fr`, `it`, `ja`, `ko`, `zh`.
-
-
- An object containing predefined rules to enable for the style rule list. Rules are organized by category (e.g., `dates_and_times`, `punctuation`). Each category can contain multiple rule options.
-
-
- An array of custom instruction objects. Each custom instruction must include `label`, `prompt`, and optionally `source_language`. Maximum 200 custom instructions per style rule list. Each prompt is limited to 300 characters.
-
-
-
- The `version` field in the response increments each time the style rule list is modified (e.g., when rules are updated or custom instructions are added/removed). You can use this field to track changes to your style rules.
-
-
-## Retrieving style rules
-
-### List all style rule lists
-
-`GET /v3/style_rules`
-
-Get all style rule lists and their meta-information.
-
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```sh Example request: get all style rule lists
- curl -X GET 'https://api.deepl.com/v3/style_rules' \
- --header 'Authorization: DeepL-Auth-Key [yourAuthKey]'
- ```
-
- ```json Example response
- {
- "style_rules": [
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-03T12:34:56Z",
- "language": "en",
- "version": 8
- }
- ]
- }
- ```
-
- You can also optionally pass in a `detailed` query parameter to retrieve all configured rules and custom instructions per rule list.
-
- ```sh Example request: get all style rule lists with details
- curl -X GET 'https://api.deepl.com/v3/style_rules?detailed=true' \
- --header 'Authorization: DeepL-Auth-Key [yourAuthKey]'
- ```
-
- ```json Example response
- {
- "style_rules": [
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-03T12:34:56Z",
- "language": "en",
- "version": 8,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "de"
- }
- ]
- }
- ]
- }
- ```
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```http Example request: get all style rule lists
- GET /v3/style_rules HTTP/2
- Host: api.deepl.com
- Authorization: DeepL-Auth-Key [yourAuthKey]
- User-Agent: YourApp/1.2.3
- ```
-
- ```json Example response
- {
- "style_rules": [
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-03T12:34:56Z",
- "language": "en",
- "version": 8
- }
- ]
- }
- ```
-
- You can also optionally pass in a `detailed` query parameter to retrieve all configured rules and custom instructions per rule list.
-
- ```http Example request: get all style rule lists with details
- GET /v3/style_rules?detailed=true HTTP/2
- Host: api.deepl.com
- Authorization: DeepL-Auth-Key [yourAuthKey]
- User-Agent: YourApp/1.2.3
- ```
-
- ```json Example response
- {
- "style_rules": [
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-03T12:34:56Z",
- "language": "en",
- "version": 8,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "de"
- }
- ]
- }
- ]
- }
- ```
-
-
-
-#### Query parameters
-
-
- Determines if the rule list's `configured_rules` and `custom_instructions` should be included in the response body. If `detailed` parameter is not included, defaults to `false`.
-
-
- The index of the first page to return. Default: 0 (the first page). Use with `page_size` to get the next page of rule lists.
-
-
- The maximum number of style rule lists to return. Default: 10. Minimum: 1. Maximum: 25.
-
-
-### Get a style rule list
-
-`GET /v3/style_rules/{style_id}`
-
-Get detailed information for a single style rule list, including all configured rules and custom instructions.
-
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```sh Example request: retrieve style rule list
- curl -X GET 'https://api.deepl.com/v3/style_rules/{style_id}' \
- --header 'Authorization: DeepL-Auth-Key [yourAuthKey]'
- ```
-
- ```json Example response
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-03T12:34:56Z",
- "language": "en",
- "version": 8,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "de"
- }
- ]
- }
- ```
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```http Example request: retrieve style rule list
- GET /v3/style_rules/{style_id} HTTP/2
- Host: api.deepl.com
- Authorization: DeepL-Auth-Key [yourAuthKey]
- User-Agent: YourApp/1.2.3
- ```
-
- ```json Example response
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-03T12:34:56Z",
- "language": "en",
- "version": 8,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "de"
- }
- ]
- }
- ```
-
-
-
-## Updating style rules
-
-Use `PATCH /v3/style_rules/{style_id}` to update the name of a style rule list, or use `PUT /v3/style_rules/{style_id}/configured_rules` to replace all configured rules.
-
-### Update a style rule list's name
-
-`PATCH /v3/style_rules/{style_id}`
-
-Update the name of a style rule list.
-
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```sh Example request: update a style rule list's name
- curl -X PATCH 'https://api.deepl.com/v3/style_rules/{style_id}' \
- --header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \
- --header 'Content-Type: application/json' \
- --data '{
- "name": "New Technical Documentation Rules"
- }'
- ```
-
- ```json Example response
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "New Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-01T12:34:56Z",
- "language": "en",
- "version": 2,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "en"
- }
- ]
- }
- ```
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```http Example request: update a style rule list's name
- PATCH /v3/style_rules/{style_id} HTTP/2
- Host: api.deepl.com
- Authorization: DeepL-Auth-Key [yourAuthKey]
- User-Agent: YourApp/1.2.3
- Content-Length: 52
- Content-Type: application/json
-
- {
- "name": "New Technical Documentation Rules"
- }
- ```
-
- ```json Example response
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "New Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-01T12:34:56Z",
- "language": "en",
- "version": 2,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "en"
- }
- ]
- }
- ```
-
-
-
-#### Request body parameters
-
-
- The new name for the style rule list. Maximum length: 1024 characters.
-
-
-### Replace configured rules
-
-`PUT /v3/style_rules/{style_id}/configured_rules`
-
-Replace all configured rules for a style rule list. Custom instructions are not affected.
-
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```sh Example request: replace configured rules
- curl -X PUT 'https://api.deepl.com/v3/style_rules/{style_id}/configured_rules' \
- --header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \
- --header 'Content-Type: application/json' \
- --data '{
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- }'
- ```
-
- ```json Example response
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-04T12:34:56Z",
- "language": "en",
- "version": 3,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "en"
- }
- ]
- }
- ```
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```http Example request: replace configured rules
- PUT /v3/style_rules/{style_id}/configured_rules HTTP/2
- Host: api.deepl.com
- Authorization: DeepL-Auth-Key [yourAuthKey]
- User-Agent: YourApp/1.2.3
- Content-Length: 145
- Content-Type: application/json
-
- {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- }
- ```
-
- ```json Example response
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-04T12:34:56Z",
- "language": "en",
- "version": 3,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "en"
- }
- ]
- }
- ```
-
-
-
-#### Request body parameters
-
-
- A `ConfiguredRules` object containing the complete set of predefined rules. This replaces all existing configured rules for the style rule list. Rules are organized by category (e.g., `dates_and_times`, `punctuation`).
-
-
-
- This endpoint replaces the entire configured rules object. Use `PATCH /v3/style_rules/{style_id}` instead if you only want to update the style rule list name.
-
-
-## Deleting style rules
-
-### Delete a style rule list
-
-`DELETE /v3/style_rules/{style_id}`
-
-Delete a style rule list. This operation cannot be undone.
-
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```sh Example request: delete style rule list
- curl -X DELETE 'https://api.deepl.com/v3/style_rules/{style_id}' \
- --header 'Authorization: DeepL-Auth-Key [yourAuthKey]'
- ```
-
- Returns a `204 No Content` status code on successful deletion. The response body will be empty. If the style rule list is not found, a `404` error will be returned.
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```http Example request: delete style rule list
- DELETE /v3/style_rules/{style_id} HTTP/2
- Host: api.deepl.com
- Authorization: DeepL-Auth-Key [yourAuthKey]
- User-Agent: YourApp/1.2.3
- ```
-
- Returns a `204 No Content` status code on successful deletion. The response body will be empty. If the style rule list is not found, a `404` error will be returned.
-
-
-
-## Managing custom instructions
-
-### Create a custom instruction
-
-`POST /v3/style_rules/{style_id}/custom_instructions`
-
-Add a new custom instruction to an existing style rule list. The response returns the complete updated style rule list, including the new custom instruction with its generated ID.
-
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```sh Example request: create custom instruction
- curl -X POST 'https://api.deepl.com/v3/style_rules/{style_id}/custom_instructions' \
- --header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \
- --header 'Content-Type: application/json' \
- --data '{
- "label": "Currency format instruction",
- "prompt": "Put currency symbols after the numeric amount",
- "source_language": "en"
- }'
- ```
-
- ```json Example response
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-01T12:34:56Z",
- "language": "en",
- "version": 2,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "en"
- },
- {
- "id": "f4515921-8fdf-4e3a-a981-ad7a6717a8aa",
- "label": "Currency format instruction",
- "prompt": "Put currency symbols after the numeric amount",
- "source_language": "en"
- }
- ]
- }
- ```
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```http Example request: create custom instruction
- POST /v3/style_rules/{style_id}/custom_instructions HTTP/2
- Host: api.deepl.com
- Authorization: DeepL-Auth-Key [yourAuthKey]
- User-Agent: YourApp/1.2.3
- Content-Length: 145
- Content-Type: application/json
-
- {
- "label": "Currency format instruction",
- "prompt": "Put currency symbols after the numeric amount",
- "source_language": "en"
- }
- ```
-
- ```json Example response
- {
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
- "name": "Technical Documentation Rules",
- "creation_time": "2024-10-01T12:34:56Z",
- "updated_time": "2024-10-01T12:34:56Z",
- "language": "en",
- "version": 2,
- "configured_rules": {
- "dates_and_times": {
- "calendar_era": "use_bc_and_ad"
- },
- "punctuation": {
- "periods_in_academic_degrees": "do_not_use"
- }
- },
- "custom_instructions": [
- {
- "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "en"
- },
- {
- "id": "f4515921-8fdf-4e3a-a981-ad7a6717a8aa",
- "label": "Currency format instruction",
- "prompt": "Put currency symbols after the numeric amount",
- "source_language": "en"
- }
- ]
- }
- ```
-
-
-
-#### Request body parameters
-
-
- A short descriptive label for the custom instruction. Maximum length: 100 characters.
-
-
- The instruction text that defines the style requirement. Maximum length: 300 characters.
-
-
- Optional source language code for the custom instruction (e.g., `en`, `de`, `fr`).
-
-
-### Get a custom instruction
-
-`GET /v3/style_rules/{style_id}/custom_instructions/{instruction_id}`
-
-Get details for a specific custom instruction within a style rule list.
-
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```sh Example request: retrieve custom instruction
- curl -X GET 'https://api.deepl.com/v3/style_rules/{style_id}/custom_instructions/{instruction_id}' \
- --header 'Authorization: DeepL-Auth-Key [yourAuthKey]'
- ```
-
- ```json Example response
- {
- "id": "f4515921-8fdf-4e3a-a981-ad7a6717a8aa",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "de"
- }
- ```
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```http Example request: retrieve custom instruction
- GET /v3/style_rules/{style_id}/custom_instructions/{instruction_id} HTTP/2
- Host: api.deepl.com
- Authorization: DeepL-Auth-Key [yourAuthKey]
- User-Agent: YourApp/1.2.3
- ```
-
- ```json Example response
- {
- "id": "f4515921-8fdf-4e3a-a981-ad7a6717a8aa",
- "label": "Tone instruction",
- "prompt": "Use a friendly, diplomatic tone",
- "source_language": "de"
- }
- ```
-
-
-
-### Replace a custom instruction
-
-`PUT /v3/style_rules/{style_id}/custom_instructions/{instruction_id}`
-
-Replace an existing custom instruction within a style rule list. All fields must be provided.
-
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```sh Example request: replace custom instruction
- curl -X PUT 'https://api.deepl.com/v3/style_rules/{style_id}/custom_instructions/{instruction_id}' \
- --header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \
- --header 'Content-Type: application/json' \
- --data '{
- "label": "Updated currency instruction",
- "prompt": "Put currency symbols after the numeric amount",
- "source_language": "en"
- }'
- ```
-
- ```json Example response
- {
- "id": "f4515921-8fdf-4e3a-a981-ad7a6717a8aa",
- "label": "Updated currency instruction",
- "prompt": "Put currency symbols after the numeric amount",
- "source_language": "en"
- }
- ```
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```http Example request: replace custom instruction
- PUT /v3/style_rules/{style_id}/custom_instructions/{instruction_id} HTTP/2
- Host: api.deepl.com
- Authorization: DeepL-Auth-Key [yourAuthKey]
- User-Agent: YourApp/1.2.3
- Content-Length: 145
- Content-Type: application/json
-
- {
- "label": "Updated currency instruction",
- "prompt": "Put currency symbols after the numeric amount",
- "source_language": "en"
- }
- ```
-
- ```json Example response
- {
- "id": "f4515921-8fdf-4e3a-a981-ad7a6717a8aa",
- "label": "Updated currency instruction",
- "prompt": "Put currency symbols after the numeric amount",
- "source_language": "en"
- }
- ```
-
-
-
-#### Request body parameters
-
-
- The updated label for the custom instruction. Maximum length: 100 characters.
-
-
- The updated instruction text. Maximum length: 300 characters.
-
-
- Optional source language code for the custom instruction (e.g., `en`, `de`, `fr`).
-
-
-### Delete a custom instruction
-
-`DELETE /v3/style_rules/{style_id}/custom_instructions/{instruction_id}`
-
-Delete a specific custom instruction from a style rule list. This operation cannot be undone.
-
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```sh Example request: delete custom instruction
- curl -X DELETE 'https://api.deepl.com/v3/style_rules/{style_id}/custom_instructions/{instruction_id}' \
- --header 'Authorization: DeepL-Auth-Key [yourAuthKey]'
- ```
-
- Returns a `204 No Content` status code on successful deletion. The response body will be empty. If the custom instruction is not found, a `404` error will be returned.
-
-
- The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
- ```http Example request: delete custom instruction
- DELETE /v3/style_rules/{style_id}/custom_instructions/{instruction_id} HTTP/2
- Host: api.deepl.com
- Authorization: DeepL-Auth-Key [yourAuthKey]
- User-Agent: YourApp/1.2.3
- ```
-
- Returns a `204 No Content` status code on successful deletion. The response body will be empty. If the custom instruction is not found, a `404` error will be returned.
-
-
-
-## Using style rules
-
-### In translation requests
-
-To use a style rule list in a translation request, include its `style_id` parameter in your translation call. For more information on using style rules in translations, see the [translation documentation](/api-reference/translate).
-
-```sh Example: translate with style rules
-curl -X POST 'https://api.deepl.com/v2/translate' \
---header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \
---header 'Content-Type: application/json' \
---data '{
- "text": ["Das Treffen ist um 15:00 Uhr"],
- "source_lang": "DE",
- "target_lang": "EN",
- "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994"
-}'
-```
-
-
- All `model_type` values are supported with style rules.
-
diff --git a/api-reference/translate.mdx b/api-reference/translate.mdx
deleted file mode 100644
index 3ec778c8..00000000
--- a/api-reference/translate.mdx
+++ /dev/null
@@ -1,537 +0,0 @@
----
-title: "Translate Text"
-sidebarTitle: "Overview"
-description: "API reference for translating text with the DeepL API."
-public: true
----
-
-The text-translation API currently consists of a single endpoint, `translate`, which is described below.
-
-For details on model selection, see the [`model_type` parameter](#about-the-model_type-parameter).
-
-To learn more about context in DeepL API translations, see our [context parameter guide](/docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter).
-
-For more detail about request body parameters, see the [Request Body Descriptions](/api-reference/translate#request-body-descriptions) section further down on the page.
-
-See [Translation memories](/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories) for a guide on using translation memories in your translations.
-
-We also provide a spec that is auto-generated from DeepL's OpenAPI file. [You can find it here](/api-reference/translate/request-translation).
-
-
-The total request body size for text translation requests must not exceed 128 KiB (128 · 1024 bytes). Please split up your text into multiple calls if it exceeds this limit.
-
-
-
-
-The examples below use our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
-```sh Example request: text translation (without glossary)
-curl -X POST 'https://api.deepl.com/v2/translate' \
---header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \
---header 'Content-Type: application/json' \
---data '{
- "text": [
- "Hello, world!"
- ],
- "target_lang": "DE"
-}'
-```
-
-```sh Example request: text translation (with glossary)
-curl -X POST 'https://api.deepl.com/v2/translate' \
---header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \
---header 'Content-Type: application/json' \
---data '{
- "text": [
- "Hello, world!"
- ],
- "target_lang": "DE",
- "source_lang": "EN",
- "glossary_id": "[yourGlossaryId]"
-}'
-```
-
-```json Example response
-{
- "translations": [
- {
- "detected_source_language": "EN",
- "text": "Hallo, Welt!"
- }
- ]
-}
-```
-
-
-The examples below use our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
-```http Example request: text translation (without glossary)
-POST /v2/translate HTTP/2
-Host: api.deepl.com
-Authorization: DeepL-Auth-Key [yourAuthKey]
-User-Agent: YourApp/1.2.3
-Content-Length: 45
-Content-Type: application/json
-
-{"text":["Hello, world!"],"target_lang":"DE"}
-```
-
-```http Example request: text translation (with glossary)
-POST /v2/translate HTTP/2
-Host: api.deepl.com
-Authorization: DeepL-Auth-Key [yourAuthKey]
-User-Agent: YourApp/1.2.3
-Content-Length: 97
-Content-Type: application/json
-
-{"text":["Hello, world!"],"target_lang":"DE","source_lang":"EN","glossary_id":"[yourGlossaryId]"}
-```
-
-```json Example response
-{
- "translations": [
- {
- "detected_source_language": "EN",
- "text": "Hallo, Welt!"
- }
- ]
-}
-```
-
-
-```py Example request: text translation (without glossary)
-import deepl
-
-auth_key = "f63c02c5-f056-..." # Replace with your key
-deepl_client = deepl.DeepLClient(auth_key)
-
-result = deepl_client.translate_text("Hello, world!", target_lang="FR")
-print(result.text) # "Bonjour, le monde !"
-```
-
-
-```php Example request: text translation (without glossary)
-$authKey = "f63c02c5-f056-..."; // Replace with your key
-$deeplClient = new DeepL\DeepLClient($authKey);
-
-$result = $deeplClient->translateText('Hello, world!', null, 'fr');
-echo $result->text; // Bonjour, le monde!
-```
-
-
-```cs Example request: text translation (without glossary)
-var authKey = "f63c02c5-f056-..."; // Replace with your key
-var deeplClient = new DeepLClient(authKey);
-
-// Translate text into a target language, in this case, French:
-var translatedText = await deeplClient.TranslateTextAsync(
- "Hello, world!",
- LanguageCode.English,
- LanguageCode.French);
-Console.WriteLine(translatedText); // "Bonjour, le monde !"
-// Note: printing or converting the result to a string uses the output text.
-```
-
-
-```javascript Example request: text translation (without glossary)
-import * as deepl from 'deepl-node';
-
-const authKey = "f63c02c5-f056-..."; // Replace with your key
-const deeplClient = new deepl.DeepLClient(authKey);
-
-(async () => {
- const result = await deeplClient.translateText('Hello, world!', null, 'fr');
- console.log(result.text); // Bonjour, le monde !
-})();
-```
-
-
-```java Example request: text translation (without glossary)
-import com.deepl.api.*;
-
-class Example {
- DeepLClient deeplClient;
-
- public Example() throws Exception {
- String authKey = "f63c02c5-f056-..."; // Replace with your key
- deeplClient = new DeepLClient(authKey);
- TextResult result =
- deeplClient.translateText("Hello, world!", null, "fr");
- System.out.println(result.getText()); // "Bonjour, le monde !"
- }
-}
-```
-
-
-
-These examples are for demonstration purposes only. In production code, the authentication key should not be hard-coded but instead fetched from a configuration file or environment variable.
-
-Note that we do not include examples for our client libraries in every single section of this reference, but our client libraries *do* support all use cases shown on this page.
-
-
- Please note that the Translate API is intended to be used for translation between different languages, but requests with the same source and target language are still counted toward billing.
-
- If trying to convert between variants of the same language (e.g. `EN-US` to `EN-GB`), please refer to [this guide](/docs/learning-how-tos/examples-and-guides/translating-between-variants). Translating between variants of the same language will result in no change to the text.
-
-
-### Request Body Descriptions
-
-
- Text to be translated. Only UTF-8-encoded plain text is supported. The parameter may be specified multiple times and translations are returned in the same order as they are requested. Each of the parameter values may contain multiple sentences. Up to 50 texts can be sent for translation in one request.
-
-
- Each text in the array is translated independently — texts do not share context with each other. If one text provides context that would help translate another (e.g. a headline and its article body), either combine them into a single text or use the context parameter to provide shared context.
-
-
-
- Language of the text to be translated. If omitted, the API will attempt to detect the language of the text and translate it. You can find supported source languages here.
-
-
- The language into which the text should be translated. You can find supported target languages here.
-
-
- The context parameter makes it possible to include additional context that can influence a translation but is not translated itself. This additional context can potentially improve translation quality when translating short, low-context source texts such as product names on an e-commerce website, article headlines on a news website, or UI elements.
-
- For example:
-
- - When translating a product name, you might pass the product description as context.
- - When translating a news article headline, you might pass the first few sentences or a summary of the article as context.
-
-
- For best results, we recommend sending a few complete sentences of context in the same language as the source text. There is no size limit for the context parameter itself, but the request body size limit of 128 KiB still applies to all text translation requests.
-
- If you send a request with multiple text parameters, the context parameter will be applied to each one.
-
- Characters included in the context parameter will not be counted toward billing (i.e., there is no additional cost for using the context parameter, and only characters sent in the text parameter(s) will be counted toward billing for text translation even when the context parameter is included in a request).
-
- See How to Use the Context Parameter Effectively for examples and best practices.
-
-
- Specifies which DeepL model should be used for translation.
-
- Possible values:
- - `latency_optimized`: Optimizes for the lowest latency (default parameter value)
- - `quality_optimized`: Optimizes for the highest translation quality
- - `prefer_quality_optimized`: Same as `quality_optimized`
-
- When the `model_type` parameter is set, the response includes a `model_type_used` field indicating which model was used.
-
- See [About the model_type parameter](#about-the-model_type-parameter) for more details.
-
-
- Sets whether the translation engine should first split the input into sentences. For text translations where tag_handling is not set to html, the default value is 1, meaning the engine splits on punctuation and on newlines.
-
- For text translations where tag_handling=html, the default value is nonewlines, meaning the engine splits on punctuation only, ignoring newlines.
-
- The use of nonewlines as the default value for text translations where tag_handling=html is new behavior that was implemented in November 2022, when HTML handling was moved out of beta.
-
- Possible values are:
-
- 0 - no splitting at all; whole input is treated as one sentence
- 1 (default when tag_handling is not set to html) - splits on punctuation and on newlines
- nonewlines (default when tag_handling=html) - splits on punctuation only, ignoring newlines
-
-
- For applications that send one sentence per text parameter, we recommend setting split_sentences to 0, in order to prevent the engine from splitting the sentence unintentionally.
-
- Please note that newlines will split sentences when split_sentences=1. We recommend cleaning files so they don't contain breaking sentences or setting the parameter split_sentences to nonewlines.
-
- Please note that this value may be overridden by the translation engine. When overridden, a value of:
-
- 0 will be used if tag_handling is not enabled
- nonewlines will be used if tag_handling is enabled
-
-
- ...as these settings yield the best quality.
-
-
- Sets whether the translation engine should respect the original formatting, even if it would usually correct some aspects.
- The formatting aspects affected by this setting include:
-
- - Punctuation at the beginning and end of the sentence
- - Upper/lower case at the beginning of the sentence
-
-
-
- Note: for requests sent as URL-encoded forms, boolean values should be specified as "1" or "0".
-
-
-
- Sets whether the translated text should lean towards formal or informal language. This feature currently only works for target languages DE (German), FR (French), IT (Italian), ES (Spanish), ES-419 (Latin American Spanish), NL (Dutch), PL (Polish), PT-BR and PT-PT (Portuguese), JA (Japanese), and RU (Russian). Learn more about the plain/polite feature for Japanese ↗️. To check formality support dynamically, call GET /v3/languages?resource=translate_text and look for the formality feature key on the target language.
-
- Setting this parameter with a target language that does not support formality will fail, unless one of the prefer_... options are used. Possible options are:
-
- default (default)
- more - for a more formal language
- less - for a more informal language
- prefer_more - for a more formal language if available, otherwise fallback to default formality
- prefer_less - for a more informal language if available, otherwise fallback to default formality
-
-
-
- Specify the glossary to use for the translation.
-
- Important: This requires the source_lang parameter to be set and the language pair of the glossary has to match the language pair of the request.
-
- Cannot be used together with glossary_ids.
-
- To check glossary support for a language pair, call GET /v3/languages?resource=translate_text and verify the glossary feature key is present on both the source and target language.
-
-
- Specify up to 5 glossaries to use for the translation, as an array of glossary IDs. Each glossary's matching terms are applied to the translation.
-
- Important: This requires the source_lang parameter to be set, and every listed glossary must contain a dictionary for the requested language pair.
-
- Cannot be used together with glossary_id.
-
-
-
- Specify the style rule list to use for the translation which can be used to customize translations according to the selected formatting and style conventions.
-
- The target language has to match the language of the style rule list.
-
-
-
-
- Specify a list of instructions to customize the translation behavior. Up to 10 custom instructions can be specified, each with a maximum of 300 characters.
-
-
- The target language must be `de`, `en`, `es`, `fr`, `it`, `ja`, `ko`, `zh` or any variants of these languages.
-
- You can find best practices on how to write custom instructions [here](/docs/best-practices/custom-instructions).
-
- To check language support dynamically, call GET /v3/languages?resource=translate_text and check for the style_rules feature key on the target language.
-
-
- The [translation memory](/api-reference/translation-memory/list-translation-memories) to use for the translation. The value should be the UUID of a translation memory associated with your account.
-
-
- The minimum matching percentage required for a translation memory segment to be applied (recommended to be 75% or higher). Accepts values from 0 to 100. Default: `75`.
-
-
- When true, the response will include an additional key-value pair with the key billed_characters and a value that is an integer showing the number of characters from the request that will be counted by DeepL for billing purposes.
-
- For example: "billed_characters": 42
-
- At some point in the future, we intend to include billed_characters in the API response by default, at which point it will be necessary to set show_billed_characters to false in order for an API response not to include billed_characters. We will notify users in advance of making this change.
-
- For requests sent as URL-encoded forms, boolean values should be specified as "1" or "0".
-
-
-
- Sets which kind of tags should be handled. Options currently available:
-
- To check tag handling support for a language pair, call GET /v3/languages?resource=translate_text and check the tag_handling feature key is present on both the source and target language.
-
-
- Select which version of the tag handling algorithm should be used. See tag handling v2.
-
- v2: Use the improved v2 algorithm.
- v1: Use the previous v1 algorithm.
-
- When `tag_handling` is set, the response includes a `tag_handling_version` field showing which version was applied, including the default when you don't specify one.
-
-
- The automatic detection of the XML structure won't yield best results in all XML files. You can disable this automatic mechanism altogether by setting the outline_detection parameter to false and selecting the tags that should be considered structure tags. This will split sentences using the splitting_tags parameter.
-
- In the example below, we achieve the same results as the automatic engine by disabling automatic detection with outline_detection=false and setting the parameters manually to tag_handling=xml, split_sentences=nonewlines, and splitting_tags=par,title.
-
- ```markup Example request
-
-
- A document's title
-
-
- This is the first sentence. Followed by a second one.
- This is the third sentence.
-
-
- ```
-
- ```markup Example response
-
-
- Der Titel eines Dokuments
-
-
- Das ist der erste Satz. Gefolgt von einem zweiten.
- Dies ist der dritte Satz.
-
-
- ```
-
- While this approach is slightly more complicated, it allows for greater control over the structure of the translation output.
-
-
- Note: For requests sent as URL-encoded forms, boolean values should be specified as "1" or "0".
-
-
-
- Comma-separated list of XML tags which never split sentences. Learn more
-
-
- Comma-separated list of XML tags which always cause splits. Learn more
-
-
- Comma-separated list of XML tags that indicate text not to be translated. Learn more
-
-
-
-### About the model\_type parameter
-
-The `model_type` parameter lets a user specify if they would like to optimize for speed until a request is served (latency) or translation quality. This is done on a best-effort basis by DeepL, not every language pair and feature must behave differently depending on this parameter.
-Currently, the DeepL translation API defaults to `latency_optimized` if no `model_type` is included in the request. All features and language pairs are compatible with all `model_type` values.
-Note that the API intentionally does not allow the user to specify a model, but rather their goal, so that the DeepL backend can choose the most suitable model for the user (this avoids users constantly having to update their code with new model versions and learning many different models name and their specifics).
-
-As of December 2025, all source and target languages are supported by next-gen models. Please note that DeepL reserves the right to quietly change which model serves e.g. a `model_type=quality_optimized` request, as long as we think it is a net benefit to the user (e.g. no significant latency increase, but a quality increase, or a significant latency reduction with no or only very slight decrease in quality).
-
-The `/languages` endpoint has not yet been updated to include information about `model_type` support, but we expect to make such a change in the future.
-
-### Multiple Sentences
-
-The translation function will (by default) try to split the text into sentences before translating. Splitting normally works on punctuation marks (e.g. "." or ";"), though you should not assume that every period will be handled as a sentence separator. This means that you can send multiple sentences as a value of the *text* parameter. The translation function will separate the sentences and return the whole translated paragraph.
-
-In some cases, the sentence splitting functionality may cause issues by splitting sentences where there is actually only one sentence. This is especially the case if you're using special/uncommon character sequences which contain punctuation. In this case, you can disable sentence splitting altogether by setting the parameter *split\_sentences* to *0*. Please note that this will cause overlong sentences to be cut off, as the DeepL API cannot translate overly long sentences. In this case, you should split the sentences manually before submitting them for translation.
-
-
-
-The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
-```sh Example request: multiple sentences
-curl -X POST 'https://api.deepl.com/v2/translate' \
---header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \
---header 'Content-Type: application/json' \
---data '{
- "text": [
- "The table is green. The chair is black."
- ],
- "target_lang": "DE"
-}'
-```
-
-```json Example response
-{
- "translations": [
- {
- "detected_source_language": "EN",
- "text": "Der Tisch ist grün. Der Stuhl ist schwarz."
- }
- ]
-}
-```
-
-
-
-The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
-```http Example request: multiple sentences
-POST /v2/translate HTTP/2
-Host: api.deepl.com
-Authorization: DeepL-Auth-Key [yourAuthKey]
-User-Agent: YourApp/1.2.3
-Content-Length: 71
-Content-Type: application/json
-
-{"text": ["The table is green. The chair is black."],"target_lang":"DE"}
-```
-
-```json Example response
-{
- "translations": [
- {
- "detected_source_language": "EN",
- "text": "Der Tisch ist grün. Der Stuhl ist schwarz."
- }
- ]
-}
-```
-
-
-
-### Translating Large Volumes of Text
-
-There are a few methods to translate larger volumes of text:
-
-* If your text is contiguous, you can submit whole paragraphs to be translated in one request and with one text parameter. Prior to translation, your text will be split into sentences and translated accordingly.
-* The translate function can take several text parameters and will return translations of each such parameter separately in the same order as they are requested (see example below). Each of the parameter values may contain multiple sentences. Up to 50 texts can be sent for translation per request.
-* You can make parallel requests by calling the translate function from several threads/processes.
-
-
-
-The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
-```sh Example request: large volumes of text
-curl -X POST 'https://api.deepl.com/v2/translate' \
---header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \
---header 'Content-Type: application/json' \
---data '{
- "text": [
- "This is the first sentence.",
- "This is the second sentence.",
- "This is the third sentence."
- ],
- "target_lang": "DE"
-}'
-```
-
-```json Example response
-{
- "translations": [
- {
- "detected_source_language": "EN",
- "text": "Das ist der erste Satz."
- },
- {
- "detected_source_language": "EN",
- "text": "Das ist der zweite Satz."
- },
- {
- "detected_source_language": "EN",
- "text": "Dies ist der dritte Satz."
- }
- ]
-}
-```
-
-
-
-The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
-```http Example request: large volumes of text
-POST /v2/translate HTTP/2
-Host: api.deepl.com
-Authorization: DeepL-Auth-Key [yourAuthKey]
-User-Agent: YourApp/1.2.3
-Content-Length: 120
-Content-Type: application/json
-
-{"text":["This is the first sentence.","This is the second sentence.","This is the third sentence."],"target_lang":"DE"}
-```
-
-```json Example response
-{
- "translations": [
- {
- "detected_source_language": "EN",
- "text": "Das ist der erste Satz."
- },
- {
- "detected_source_language": "EN",
- "text": "Das ist der zweite Satz."
- },
- {
- "detected_source_language": "EN",
- "text": "Dies ist der dritte Satz."
- }
- ]
-}
-```
-
-
-
-### In-Text Markup
-
-You should take precaution with uncommon characters you may have embedded in your texts. Uncommon character sequences, which may be recognized markers within your system, might get translated or removed, resulting in a corrupted structure. In this case, it is advisable to either split the text so that there is no need to send markers, or to convert your markers to XML tags and enable [XML handling](/docs/xml-and-html-handling/xml) or [HTML handling](/docs/xml-and-html-handling/html).
diff --git a/api-reference/translation-memory/list-translation-memories.mdx b/api-reference/translation-memory/list-translation-memories.mdx
index 7b5790e6..e44099f2 100644
--- a/api-reference/translation-memory/list-translation-memories.mdx
+++ b/api-reference/translation-memory/list-translation-memories.mdx
@@ -1,5 +1,5 @@
---
openapi: get /v3/translation_memories
title: "List translation memories"
-description: "Retrieve translation memories associated with your account, used to store and reuse previously created translations. See [How to use translation memories](/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories) to use them in translation requests."
+description: "Retrieve translation memories associated with your account, used to store and reuse previously created translations. See [How to use translation memories](/docs/customize/using-translation-memories) to use them in translation requests."
---
diff --git a/api-reference/usage-and-quota.mdx b/api-reference/usage-and-quota.mdx
deleted file mode 100644
index f7c3dbb1..00000000
--- a/api-reference/usage-and-quota.mdx
+++ /dev/null
@@ -1,79 +0,0 @@
----
-title: "Retrieve usage and quota"
-public: true
-sidebarTitle: "Overview"
-description: "API reference for retrieving usage and quota for the current billing period with the DeepL API."
----
-Retrieve usage information **within the current billing period** together with the corresponding account limits. For **Pro API users**, the `/usage`endpoint returns the following:
-
-* Text and document translation characters consumed in the current billing period in total _and_ for the API key used to make the request
-* Text improvement (`/write`) characters consumed in the current billing period in total _and_ for the API key used to make the request
-* Total characters consumed in the current billing period by the API key used to make the request
-* The key-level character limit for the API key used to make the request, if applicable (if a [key-level usage limit](../docs/getting-started/managing-api-keys#set-api-key-level-usage-limits) is set, it will be reflected in the `api_key_character_limit` field in the response; `1000000000000` will be returned if no key-level limit is set)
-* The current billing period start timestamp
-* The current billing period end timestamp
-* Total characters consumed in the current billing period
-* Subscription-level character limit that applies to the current billing period (if [Cost Control](../docs/best-practices/cost-control.md) is set, it will be reflected in the `character_limit` field in the response; `1000000000000` will be returned if no limit is set)
-
-An example request and response is shown below.
-
-
-Note that responses for Free API and Pro Classic users only contain `character_count` and `character_limit`.
-
-
-The value in the `character_count`field includes both text and document translations as well as text improvement (DeepL API for Write) characters. Characters are counted based on the source text length in Unicode code points, so for example "A", "Δ", "あ", and "深" are each counted as a single character.
-
-We also provide a spec that is auto-generated from DeepL's OpenAPI file. [You can find it here](/api-reference/usage-and-quota/check-usage-and-limits).
-
-
-
-The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
-```bash Example request: check usage and limits
-curl -X GET 'https://api.deepl.com/v2/usage' \
---header 'Authorization: DeepL-Auth-Key [yourAuthKey]'
-```
-
-```json Example response
-{
- "products": [
- {
- "product_type": "write",
- "api_key_character_count": 1000000,
- "character_count": 1250000
- },
- {
- "product_type": "translate",
- "api_key_character_count": 880000,
- "character_count": 900000
- }
- ],
- "api_key_character_count": 1880000,
- "api_key_character_limit": 0,
- "start_time": "2025-04-24T14:58:02Z",
- "end_time": "2025-05-24T14:58:02Z",
- "character_count": 2150000,
- "character_limit": 20000000
-}
-```
-
-
-The example below uses our API Pro endpoint `https://api.deepl.com`. If you're an API Free user, remember to update your requests to use `https://api-free.deepl.com` instead.
-
-```http Example request: check usage and limits
-GET /v2/usage HTTP/2
-Host: api.deepl.com
-Authorization: DeepL-Auth-Key [yourAuthKey]
-User-Agent: YourApp/1.2.3
-```
-
-```json Example response
-{
- "character_count": 180118,
- "character_limit": 1250000
-}
-```
-
-
-
-If you are looking for general API limitations, please see [here](/docs/resources/usage-limits).
diff --git a/api-reference/usage-and-quota/check-usage-and-limits.mdx b/api-reference/usage-and-quota/check-usage-and-limits.mdx
index eedd165a..4ce465a9 100644
--- a/api-reference/usage-and-quota/check-usage-and-limits.mdx
+++ b/api-reference/usage-and-quota/check-usage-and-limits.mdx
@@ -1,4 +1,15 @@
---
openapi: get /v2/usage
title: "Check usage and limits"
----
\ No newline at end of file
+description: "Retrieve near-real-time character usage and account limits for the current billing period."
+---
+
+Returns usage within the current billing period together with the corresponding limits. Data is near-real-time: typically up to date within a few minutes of the usage being generated.
+
+Response behavior the schema alone doesn't convey:
+
+- For Pro API accounts, the response breaks usage down by product (`translate`, `write`) and reports both account totals and counts for the API key used to make the request. Responses for Free API and Pro Classic accounts contain only `character_count` and `character_limit`.
+- `character_count` sums text translation, document translation, and text improvement characters. Characters are counted from the source text length in Unicode code points, so "A", "Δ", "あ", and "深" each count as one character.
+- `character_limit` reflects a [Cost Control](/docs/best-practices/cost-control) limit if one is set; `api_key_character_limit` reflects a [key-level usage limit](/docs/admin/managing-api-keys#set-a-key-level-usage-limit) if one is set. Both fields return `1000000000000` when no limit is configured.
+
+For usage data beyond the current billing period, or broken down by key or custom tag, see [Retrieving Usage Data](/docs/admin/retrieving-usage-data). For general API limitations, see [Usage limits](/docs/resources/usage-limits).
diff --git a/api-reference/voice.mdx b/api-reference/voice.mdx
deleted file mode 100644
index 75fff3df..00000000
--- a/api-reference/voice.mdx
+++ /dev/null
@@ -1,401 +0,0 @@
----
-title: "Translate Speech in Realtime"
-sidebarTitle: "Overview"
-description: "API reference for real-time voice transcription and translation with the DeepL Voice API."
-public: true
----
-
-The Voice API provides real-time voice transcription and translation services using a WebSocket connection.
-
-
- The Voice API provides **speech-to-text** capabilities: real-time transcription and text translation of spoken audio. These features are available to all customers with a paid DeepL API subscription.
-
- **Speech-to-speech** (producing translated TTS output) is a separate capability currently in closed beta and not included in standard API subscriptions.
-
- Please note that the existing provisions applying to customers' DeepL API Enterprise subscription also apply to
- DeepL Voice API speech to text with the following applicable additions to the
- [Terms and Conditions, the Service Specification and the Data
- Processing Agreement](/api-reference/voice/deepl-voice-api-service-specification-updates)
- (as new sub-processors have been added to serve specific languages for the Voice API).
-
-
-## Overview
-
-The Voice API provides a way to open WebSocket connections to transcribe and translate audio data. With each connection, you can:
-
-* Send a single audio stream
-* Receive transcripts in the source language
-* Receive translations in multiple target languages
-* closed beta Receive translated speech
-
-The API uses a two-step flow:
-1. [**Request a streaming URL**](/api-reference/voice/request-session) via POST request
-2. [**Stream audio and text**](/api-reference/voice/websocket-streaming) via WebSocket
-
-## Getting Started
-
-To start using the Voice API:
-
-1. Ensure you have a DeepL API Pro account with Voice API access
-2. Review the [Request Session](/api-reference/voice/request-session) documentation
-3. Review the [WebSocket Streaming](/api-reference/voice/websocket-streaming) documentation
-4. Choose your audio format and configuration
-5. Implement the two-step flow in your application
-
-## Supported Languages
-
-We support a wide range of source and target languages (see below). However, while translation is always provided by
-DeepL, for some languages we use external service partners to provide transcription and translated speech.
-All source languages can be translated into any target language.
-
-
-| **Language** | **Transcription** | **Translation** | closed beta
Translated Speech |
-| :------------------------------------- | :---------------: | :-------------: | :------------------------------------------------------------: |
-| Arabic | ⎋ | ✓ | ⎋ |
-| Bengali | ⎋ | ✓ | — |
-| Bulgarian | ⎋ | ✓ | ⎋ |
-| Chinese (Simplified/Traditional) | ✓ | ✓ | ✓ |
-| Croatian | ⎋ | ✓ | — |
-| Czech | ✓ | ✓ | ⎋ |
-| Danish | ⎋ | ✓ | ⎋ |
-| Dutch | ✓ | ✓ | ✓ |
-| English (American/British) | ✓ | ✓ | ✓ |
-| Estonian | ⎋ | ✓ | — |
-| Finnish | ⎋ | ✓ | ⎋ |
-| French | ✓ | ✓ | ✓ |
-| German | ✓ | ✓ | ✓ |
-| Greek | ⎋ | ✓ | ⎋ |
-| Hebrew | ⎋ | ✓ | — |
-| Hindi beta | ⎋ | ✓ | ⎋ |
-| Hungarian | ⎋ | ✓ | ⎋ |
-| Indonesian | ✓ | ✓ | ⎋ |
-| Irish | ⎋ | ✓ | — |
-| Italian | ✓ | ✓ | ✓ |
-| Japanese | ✓ | ✓ | ✓ |
-| Korean | ✓ | ✓ | ✓ |
-| Latvian | ⎋ | ✓ | — |
-| Lithuanian | ⎋ | ✓ | — |
-| Malay beta | ⎋ | ✓ | ⎋ |
-| Maltese | ⎋ | ✓ | — |
-| Norwegian Bokmål | ⎋ | ✓ | ⎋ |
-| Polish | ✓ | ✓ | ✓ |
-| Portuguese (Brazil/Portugal) | ✓ | ✓ | ✓ |
-| Romanian | ✓ | ✓ | ⎋ |
-| Russian | ✓ | ✓ | ✓ |
-| Slovak | ⎋ | ✓ | ⎋ |
-| Slovenian | ⎋ | ✓ | — |
-| Spanish | ✓ | ✓ | ✓ |
-| Swedish | ✓ | ✓ | ✓ |
-| Thai | ⎋ | ✓ | — |
-| Tagalog | ⎋ | ✓ | — |
-| Tamil beta | ⎋ | ✓ | ⎋ |
-| Turkish | ✓ | ✓ | ✓ |
-| Ukrainian | ✓ | ✓ | ⎋ |
-| Vietnamese | ⎋ | ✓ | ⎋ |
-
-✓ provided by DeepL / ⎋ provided by an external service partner / — not available
-
-
-
- Transcription provided by external service partners (marked with ⎋) cannot yet auto-detect the source language,
- which you must therefore specify explicitly.
-
-
-To retrieve supported languages and feature availability programmatically, call [`GET /v3/languages?resource=voice`](/api-reference/languages/retrieve-supported-languages-by-resource) and check for the `transcription` and `translated_speech` feature keys. The external flag on these features indicates if they are provided by an external service partner.
-
-## Supported Audio Formats
-
-The API supports various common combinations of streaming codecs and containers with a single channel (mono) audio stream.
-For a detailed list of supported input audio formats, please refer to
-[Source Media Content Type](/api-reference/voice/request-session#body-source-media-content-type).
-For supported output audio formats refer to
-[Target Media Content Type](/api-reference/voice/request-session#body-target-media-content-type).
-
-| **Audio Codec** | **Audio Container** | **Recommended Bitrate** |
-| :--------------------------- | :---------------------------------- | :--------------------------------------------------- |
-| **PCM** | **-** | **256 kbps (16kHz), default recommendation** |
-| **OPUS** | **Matroska / MPEG-TS / Ogg / WebM** | **32 kbps, recommended for low bandwidth scenarios** |
-| AAC | Matroska / MPEG-TS | 96 kbps |
-| FLAC | FLAC / Matroska / Ogg | 256 kbps (16kHz) |
-| MP3 | MPEG / Matroska | 128 kbps |
-
-
-## Customization
-
-Two optional features let you tailor transcription and translation to your domain:
-
-* beta **Spoken terms** — Improve transcription of frequently used terms like company-specific terminology, acronyms, product names, and team member names. Manage in [DeepL Home](https://www.deepl.com/en/voice/spoken-terms); management via API coming soon.
-* **Glossaries** — Enforce specific translations for terms in the target language. Manage in [DeepL Home](https://www.deepl.com/en/glossary) or programmatically with the [Glossaries API](/api-reference/multilingual-glossaries).
-
-## Connecting
-
-The Voice API uses a two-step flow to initiate a session.
-
-
-
- Make a POST request `v3/voice/realtime` to obtain an ephemeral streaming URL and authentication token. The response will look like this:
-
- ```json
- {
- "streaming_url": "wss://api.deepl.com/v3/voice/realtime/connect",
- "token": "VGhpcyBpcyBhIGZha2UgdG9rZW4K",
- "session_id": "4f911080-cfe2-41d4-8269-0e6ec15a0354"
- }
- ```
-
- This step handles:
- * Authentication and authorization
- * Main configuration options (audio formats, languages, glossaries, spoken terms, message encoding, etc.)
-
-
- URL and token are valid for one-time use only.
-
-
- See the [Request Session](/api-reference/voice/request-session) documentation for details.
-
-
- Use the received URL to establish a WebSocket connection to `wss://api.deepl.com/v3/voice/realtime/connect?token=VGhpcyBpcyBhIGZha2UgdG9rZW4K`.
- This step handles exchanging messages on the WebSocket connection:
- * Sending audio data
- * Receiving transcripts, translations, and translated speech in real-time
-
- Messages are sent as TEXT frames (JSON) or BINARY frames (MessagePack), depending on the `message_format` configured in Step 1.
-
-
- Once a WebSocket connection is established, you must send audio data to prevent connection closure within 30 seconds.
-
-
- See the [WebSocket Streaming](/api-reference/voice/websocket-streaming) documentation for details.
-
-
-
-
-The following sequence diagram shows the complete flow.
-```mermaid
-sequenceDiagram
- participant Client
- participant Voice API
-
- Note over Client,Voice API: Step 1: Request Session (POST)
-
- Client->>Voice API: Configuration options
- Voice API->>Client: Streaming URL and token
-
- Note over Client,Voice API: Step 2: Start Streaming (WebSocket)
-
- Client->>Voice API: Establish WebSocket connection
using the streaming URL
-
- Note over Client,Voice API: WebSocket Connection Established
-
- Client<<->>Voice API: Bidirectional message exchange:
Send audio, receive transcripts,
translations, and speech
-
- Note over Client,Voice API: Stream Closed
-```
-
-
-## Streaming Audio and Text
-
-**Sending Source Audio**
-
-Continuously send audio using [source media chunk](/api-reference/voice/websocket-streaming) messages.
-Use smaller chunks to get a lower latency. The recommended chunk duration is 50-250 milliseconds for optimal performance.
-Send an [end of source media](/api-reference/voice/websocket-streaming) message to signal that the
-audio stream is complete and to finalize the processing.
-
-**Receiving Transcripts and Translations**
-
-As the audio is processed, transcripts and translations are delivered incrementally in real-time via
-[source transcript updates](/api-reference/voice/websocket-streaming) and
-[target transcript updates](/api-reference/voice/websocket-streaming):
-
-* **Concluded segments** - Finalized text that will not change. These segments are sent once and remain fixed.
-* **Tentative segments** - Preliminary text that may be refined as more audio context becomes available. These segments may be updated in subsequent messages.
-
-Applications typically merge finalized content into the complete transcript and can display tentative content as
-provisional that will be updated.
-
- closed beta **Receiving Translated Speech**
-
-Translated speech is delivered incrementally as speech-only audio via
-[target media chunks](/api-reference/voice/websocket-streaming). To save on bandwidth,
-the audio stream contains only synthesized speech without silence or padding. Depending on the
-source audio content there will be pauses w/o data delivered.
-
-Using the text and audio duration information in the response, you are able to mark currently spoken text in the
-received translations or subtitle audio output.
-
-
-The following sequence diagram shows the detailed message exchange during streaming.
-```mermaid
-sequenceDiagram
- participant Client
- participant Voice API
-
- Note over Client,Voice API: WebSocket Connection Established
-
- par
- loop Send audio data
- Client->>Voice API: source_media_chunk
- end
- and
- loop Receive updates
- Voice API-->>Client: source_transcript_update
- end
- and Per target language
- loop Receive updates
- Voice API-->>Client: target_transcript_update
- end
- and Per target language
- loop Receive translated speech
- Voice API-->>Client: target_media_chunk
- end
- end
-
- Client->>Voice API: end_of_source_media
-
- par
- loop Final updates
- Voice API-->>Client: source_transcript_update
- end
- and Per target language
- loop Final updates
- Voice API-->>Client: target_transcript_update
- end
- and Per target language
- loop Final audio chunks
- Voice API-->>Client: target_media_chunk
- end
- end
-
- Voice API-->>Client: end_of_source_transcript
-
- Voice API-->>Client: end_of_target_transcript
(once per target language)
-
- Voice API-->>Client: end_of_target_media
(once per target language)
-
- Voice API-->>Client: end_of_stream
-
- Note over Client,Voice API: Stream Closed
-```
-`par` means parallel execution and `loop` means looped execution.
-
-
-## Reconnecting
-
-Network connections are inherently unreliable.
-Disconnections are unavoidable and must be planned for.
-In case your connection gets disconnected, request a new authentication token to pick up where you left off.
-Make a GET request `v3/voice/realtime?token=`.
-The response will look like this:
-
-```json
-{
- "streaming_url": "wss://api.deepl.com/v3/voice/realtime/connect",
- "token": "VGhpcyBpcyBhIGZha2UgdG9rZW4K",
- "session_id": "4f911080-cfe2-41d4-8269-0e6ec15a0354"
-}
-```
-
-Use the received URL and token to establish a new WebSocket connection.
-Should another reconnection become necessary, repeat the procedure.
-
-See the [Reconnect Session](/api-reference/voice/reconnect-session) documentation for details.
-
-
-Always use the latest authentication token to request a new authentication token.
-The use of outdated tokens will invalidate your session for security reasons.
-
-
-
-If you still have an active connection, requesting a reconnection token will disconnect you.
-
-
-## Message Encoding
-
-The Voice API supports two message encoding formats for WebSocket communication.
-For best developer experience, we recommend starting with the default JSON format
-and later switch to MessagePack if you need better performance.
-
-
- WebSocket messages must be sent as TEXT frames when using JSON format, and as BINARY frames when using MessagePack format. Sending the wrong frame type will result in connection errors.
-
-
-**JSON (Default)**
-
-This format is human-readable and easy to debug.
-Messages are JSON-encoded and sent as **TEXT** WebSocket frames.
-Fields with binary data (such as audio chunks) are base64-encoded strings.
-
-**MessagePack**
-
-This format offers better bandwidth and performance characteristics.
-Messages are [MessagePack](https://msgpack.org/)-encoded and sent as **BINARY** WebSocket frames. **Messages must be encoded as maps with string keys, not arrays** - ensure your MessagePack library is configured correctly.
-Fields with binary data (such as audio chunks) contain raw binary data instead of base64-encoded strings.
-Compared to JSON, MessagePack typically reduces bandwidth usage by 25-30% and improves message
-encoding/decoding speed by 2x-4x.
-
-
-MessagePack messages **must be encoded as maps with string keys**,
-not as arrays. The message structure must match the JSON schema exactly, with all field names
-preserved as string keys (e.g., `{"source_media_chunk": {"data": }}`). Array-based encoding is not supported.
-
-Ensure your MessagePack library is configured to encode objects as maps rather than arrays.
-Some libraries default to array encoding for performance - check your library's documentation for the correct configuration.
-
-
-
-
-```javascript JSON
-// Raw binary audio data
-const audioData = getAudioChunk();
-
-// Base64 encode the audio data
-const base64Audio = btoa(audioData);
-
-const message = {
- source_media_chunk: {
- data: base64Audio
- }
-};
-
-// Send as TEXT frame
-websocket.send(JSON.stringify(message));
-```
-
-```javascript MessagePack
-import { pack } from 'msgpackr';
-
-// Raw binary audio data
-const audioData = getAudioChunk();
-
-const message = {
- source_media_chunk: {
- data: audioData // No base64 encoding needed
- }
-};
-
-// Send as BINARY frame
-websocket.send(pack(message));
-```
-
-
-
-## Usage Examples
-
-You can find a reference usage example for python at our
-[Github repository for the DeepL Python Library](https://github.com/DeepLcom/deepl-python/tree/main/examples/voice/cli).
-There's no integration of the Voice API in the official DeepL SDKs yet, but you can use any WebSocket client library
-to interact with the API.
-
-## Limitations and Constraints
-
-* Maximum 5 translation targets per session (including translated speech targets)
-* Maximum 1 translated speech target per session
-* Audio chunk size: should not exceed 100 kilobyte or 1 second duration
-* Recommended chunk duration: 50-250 milliseconds for low latency
-* Audio stream speed: maximum 2x real-time
-* Timeout: If no data is received for 30 seconds, the session will be terminated
-* Maximum connection duration: After 1 hour, the connection will be closed. You can establish a new connection by [reconnecting](/api-reference/voice/reconnect-session) to the session.
-* Using any given token more than once to establish a WebSocket connection will terminate the associated session immediately for security reasons.
-
-If you need more translation targets or translated speech targets than these limits allow, open multiple concurrent sessions over the same source audio.
diff --git a/docs.json b/docs.json
index fbf6e412..c89cb7a7 100644
--- a/docs.json
+++ b/docs.json
@@ -2,10 +2,6 @@
"$schema": "https://mintlify.com/docs.json",
"theme": "mint",
"name": "DeepL Documentation",
- "banner": {
- "content": "[Join the Developer Community on DeepL Bridges](https://dee.pl/7iwrt)",
- "dismissible": true
- },
"colors": {
"primary": "#0f2b46",
"light": "#ffffff",
@@ -32,7 +28,8 @@
"navigation": {
"tabs": [
{
- "tab": "Documentation",
+ "tab": "Home",
+ "icon": "house",
"groups": [
{
"group": "Getting Started",
@@ -46,54 +43,11 @@
"group": "Languages",
"pages": [
"docs/getting-started/supported-languages",
+ "docs/languages/using-the-languages-api",
+ "docs/languages/migrating-from-v2-languages",
"docs/resources/language-release-process"
]
},
- {
- "group": "Translate",
- "pages": [
- {
- "group": "Text Translation",
- "pages": [
- "docs/learning-how-tos/examples-and-guides/translation-beginners-guide",
- "docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter",
- "docs/learning-how-tos/examples-and-guides/how-to-use-custom-reporting-tags",
- "docs/learning-how-tos/examples-and-guides/translating-between-variants",
- "docs/learning-how-tos/examples-and-guides/customizations-for-variants",
- "docs/learning-how-tos/examples-and-guides/placeholder-tags",
- "docs/best-practices/language-detection"
- ],
- "drilldown": false
- },
- "docs/best-practices/document-translations",
- {
- "group": "XML & HTML",
- "pages": [
- "docs/xml-and-html-handling/xml",
- "docs/xml-and-html-handling/structured-content",
- "docs/xml-and-html-handling/html",
- "docs/xml-and-html-handling/customized-xml-outline-detection",
- "docs/xml-and-html-handling/tag-handling-v2"
- ],
- "drilldown": false
- }
- ]
- },
- {
- "group": "Customize",
- "pages": [
- "docs/learning-how-tos/examples-and-guides/glossaries-in-the-real-world",
- "docs/best-practices/custom-instructions",
- "docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories"
- ]
- },
- {
- "group": "Admin",
- "pages": [
- "docs/getting-started/managing-api-keys",
- "docs/retrieving-usage-data"
- ]
- },
{
"group": "Going to Production",
"pages": [
@@ -150,8 +104,97 @@
}
]
},
+ {
+ "tab": "Translate",
+ "icon": "language",
+ "pages": [
+ "docs/translate/overview",
+ {
+ "group": "Text Translation",
+ "pages": [
+ "docs/translate/translate-text-quickstart",
+ "docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter",
+ "docs/translate/translating-large-volumes",
+ "docs/translate/understanding-model-types",
+ "docs/learning-how-tos/examples-and-guides/how-to-use-custom-reporting-tags",
+ "docs/learning-how-tos/examples-and-guides/translating-between-variants",
+ "docs/learning-how-tos/examples-and-guides/placeholder-tags",
+ "docs/translate/translating-xml",
+ "docs/translate/translating-html",
+ "docs/best-practices/language-detection"
+ ]
+ },
+ {
+ "group": "Document Translation",
+ "pages": [
+ "docs/translate/translate-documents-quickstart",
+ "docs/best-practices/document-translations"
+ ]
+ },
+ {
+ "group": "Write",
+ "pages": [
+ "docs/translate/write-quickstart",
+ "docs/translate/controlling-writing-style-and-tone"
+ ]
+ }
+ ]
+ },
+ {
+ "tab": "Voice",
+ "icon": "waveform-lines",
+ "pages": [
+ "docs/voice/overview",
+ "docs/voice/real-time-voice-quickstart",
+ "docs/voice/understanding-voice-sessions",
+ "docs/voice/message-encoding",
+ "docs/voice/supported-languages-formats-and-limits"
+ ]
+ },
+ {
+ "tab": "Customize",
+ "icon": "wand-magic-sparkles",
+ "pages": [
+ "docs/customize/overview",
+ "docs/customize/customizations-for-variants",
+ {
+ "group": "Glossaries",
+ "pages": [
+ "docs/customize/glossaries-in-the-real-world",
+ "docs/customize/managing-glossaries",
+ "docs/customize/glossary-v2-vs-v3-endpoints"
+ ]
+ },
+ {
+ "group": "Style Rules",
+ "pages": [
+ "docs/customize/using-style-rules",
+ "docs/customize/custom-instructions"
+ ]
+ },
+ {
+ "group": "Translation Memories",
+ "pages": [
+ "docs/customize/using-translation-memories"
+ ]
+ }
+ ]
+ },
+ {
+ "tab": "Admin",
+ "icon": "sliders",
+ "pages": [
+ "docs/admin/overview",
+ "docs/admin/quickstart",
+ "docs/admin/managing-api-keys",
+ "docs/admin/api-key-permissions",
+ "docs/admin/permission-scopes",
+ "docs/admin/retrieving-usage-data"
+ ]
+ },
{
"tab": "API Reference",
+ "icon": "code",
"groups": [
{
"group": "Translate",
@@ -159,7 +202,6 @@
{
"group": "Translate Text",
"pages": [
- "api-reference/translate",
"api-reference/translate/request-translation"
],
"drilldown": false
@@ -167,13 +209,20 @@
{
"group": "Translate Documents",
"pages": [
- "api-reference/document",
"api-reference/document/upload-and-translate-a-document",
"api-reference/document/check-document-status",
"api-reference/document/download-translated-document"
],
"drilldown": false
},
+ {
+ "group": "Write",
+ "pages": [
+ "api-reference/improve-text/request-text-improvement",
+ "api-reference/improve-text/correct-text"
+ ],
+ "drilldown": false
+ },
"api-reference/detect-language/detect-language-beta"
]
},
@@ -183,8 +232,6 @@
{
"group": "Glossaries",
"pages": [
- "api-reference/multilingual-glossaries",
- "api-reference/multilingual-glossaries/list-language-pairs-supported-by-glossaries",
"api-reference/multilingual-glossaries/create-a-glossary",
"api-reference/multilingual-glossaries/list-all-glossaries",
"api-reference/multilingual-glossaries/retrieve-glossary-details",
@@ -197,8 +244,7 @@
"group": "Glossaries v2",
"tag": "DEPRECATED",
"pages": [
- "api-reference/glossaries",
- "api-reference/glossaries/v2-vs-v3-endpoints",
+ "api-reference/multilingual-glossaries/list-language-pairs-supported-by-glossaries",
"api-reference/glossaries/create-a-glossary",
"api-reference/glossaries/list-all-glossaries",
"api-reference/glossaries/retrieve-glossary-details",
@@ -213,7 +259,6 @@
{
"group": "Style Rules",
"pages": [
- "api-reference/style-rules",
"api-reference/style-rules/list-all-style-rules",
"api-reference/style-rules/create-style-rule",
"api-reference/style-rules/get-style-rule",
@@ -239,10 +284,15 @@
{
"group": "Voice",
"pages": [
- "api-reference/voice",
- "api-reference/voice/request-session",
- "api-reference/voice/websocket-streaming",
- "api-reference/voice/reconnect-session"
+ {
+ "group": "Real-Time",
+ "pages": [
+ "api-reference/voice/request-session",
+ "api-reference/voice/websocket-streaming",
+ "api-reference/voice/reconnect-session"
+ ],
+ "drilldown": false
+ }
]
},
{
@@ -255,28 +305,21 @@
"api-reference/jobs-voice-translate/reference"
]
},
- {
- "group": "Write",
- "pages": [
- "api-reference/improve-text",
- "api-reference/improve-text/request-text-improvement",
- "api-reference/improve-text/correct-text"
- ]
- },
{
"group": "Languages",
"pages": [
- "api-reference/languages/retrieve-supported-languages-by-resource",
- "api-reference/languages/language-feature-use-cases",
- "api-reference/languages/retrieve-languages-by-resource",
- "api-reference/languages/retrieve-resources",
- "api-reference/languages/migrate-from-v2-languages",
- "api-reference/languages/v3-languages-changelog",
{
- "group": "v2 Languages",
+ "group": "Languages v3",
+ "pages": [
+ "api-reference/languages/retrieve-languages-by-resource",
+ "api-reference/languages/retrieve-resources"
+ ],
+ "drilldown": false
+ },
+ {
+ "group": "Languages v2",
"tag": "DEPRECATED",
"pages": [
- "api-reference/languages",
"api-reference/languages/retrieve-supported-languages"
],
"drilldown": false
@@ -286,12 +329,9 @@
{
"group": "Admin",
"pages": [
- "api-reference/admin-api",
- "api-reference/admin-api/managing-admin-keys",
{
"group": "Managing Developer Keys",
"pages": [
- "api-reference/admin-api/managing-developer-keys",
"api-reference/admin-api/managing-developer-keys/create-key",
"api-reference/admin-api/managing-developer-keys/get-keys",
"api-reference/admin-api/managing-developer-keys/deactivate-key",
@@ -303,7 +343,6 @@
{
"group": "Usage & Quota",
"pages": [
- "api-reference/usage-and-quota",
"api-reference/usage-and-quota/check-usage-and-limits"
],
"drilldown": false
@@ -311,7 +350,6 @@
{
"group": "Organization Usage Analytics",
"pages": [
- "api-reference/admin-api/organization-usage-analytics",
"api-reference/admin-api/get-usage-analytics",
"api-reference/admin-api/get-custom-tag-usage-analytics"
],
@@ -345,21 +383,29 @@
{
"title": "Resources",
"items": [
- { "label": "API Status", "href": "https://api-status.deepl.com" },
- { "label": "DeepL Status", "href": "https://www.deeplstatus.com" }
+ {
+ "label": "API Status",
+ "href": "https://api-status.deepl.com"
+ },
+ {
+ "label": "DeepL Status",
+ "href": "https://www.deeplstatus.com"
+ }
]
}
],
"socials": {
"facebook": "https://www.facebook.com/DeepLcom/",
"linkedin": "https://www.linkedin.com/company/deepl",
- "github": "https://github.com/DeepLcom",
+ "github": "https://github.com/DeepL",
"instagram": "https://www.instagram.com/deeplhq/"
}
},
"api": {
"examples": {
- "languages": ["curl"],
+ "languages": [
+ "curl"
+ ],
"defaults": "required"
},
"playground": {
@@ -372,6 +418,58 @@
}
},
"redirects": [
+ {
+ "source": "/docs/xml-and-html-handling/xml",
+ "destination": "/docs/translate/translating-xml"
+ },
+ {
+ "source": "/docs/xml-and-html-handling/structured-content",
+ "destination": "/docs/translate/translating-xml"
+ },
+ {
+ "source": "/docs/xml-and-html-handling/customized-xml-outline-detection",
+ "destination": "/docs/translate/translating-xml"
+ },
+ {
+ "source": "/docs/xml-and-html-handling/tag-handling-v2",
+ "destination": "/docs/translate/translating-xml"
+ },
+ {
+ "source": "/docs/xml-and-html-handling/html",
+ "destination": "/docs/translate/translating-html"
+ },
+ {
+ "source": "/api-reference/voice",
+ "destination": "/docs/voice/overview"
+ },
+ {
+ "source": "/docs/getting-started/managing-api-keys",
+ "destination": "/docs/admin/managing-api-keys"
+ },
+ {
+ "source": "/docs/retrieving-usage-data",
+ "destination": "/docs/admin/retrieving-usage-data"
+ },
+ {
+ "source": "/api-reference/admin-api",
+ "destination": "/docs/admin/overview"
+ },
+ {
+ "source": "/api-reference/admin-api/managing-admin-keys",
+ "destination": "/docs/admin/managing-api-keys"
+ },
+ {
+ "source": "/api-reference/admin-api/managing-developer-keys",
+ "destination": "/api-reference/admin-api/managing-developer-keys/create-key"
+ },
+ {
+ "source": "/api-reference/admin-api/organization-usage-analytics",
+ "destination": "/docs/admin/retrieving-usage-data"
+ },
+ {
+ "source": "/api-reference/usage-and-quota",
+ "destination": "/api-reference/usage-and-quota/check-usage-and-limits"
+ },
{
"source": "/api-reference/languages/retrieve-supported-languages-by-product",
"destination": "/api-reference/languages/retrieve-supported-languages-by-resource"
@@ -438,19 +536,99 @@
},
{
"source": "/docs/learning-how-tos/examples-and-guides/deepl-api-101",
- "destination": "/docs/learning-how-tos/examples-and-guides/first-things-to-try-with-the-deepl-api"
+ "destination": "/docs/translate/translate-text-quickstart"
},
{
"source": "/docs/learning-how-tos/examples-and-guides/deepl-api-101/first-things-to-try-with-the-deepl-api",
- "destination": "/docs/learning-how-tos/examples-and-guides/first-things-to-try-with-the-deepl-api"
+ "destination": "/docs/translate/translate-text-quickstart"
},
{
"source": "/docs/resources/examples-and-guides/deepl-api-101",
- "destination": "/docs/learning-how-tos/examples-and-guides/first-things-to-try-with-the-deepl-api"
+ "destination": "/docs/translate/translate-text-quickstart"
},
{
"source": "/docs/resources/examples-and-guides/deepl-api-101/first-things-to-try-with-the-deepl-api",
- "destination": "/docs/learning-how-tos/examples-and-guides/first-things-to-try-with-the-deepl-api"
+ "destination": "/docs/translate/translate-text-quickstart"
+ },
+ {
+ "source": "/docs/learning-how-tos/examples-and-guides/first-things-to-try-with-the-deepl-api",
+ "destination": "/docs/translate/translate-text-quickstart"
+ },
+ {
+ "source": "/docs/learning-how-tos/examples-and-guides/translation-beginners-guide",
+ "destination": "/docs/translate/translate-text-quickstart"
+ },
+ {
+ "source": "/docs/translate/quickstart",
+ "destination": "/docs/translate/translate-text-quickstart"
+ },
+ {
+ "source": "/api-reference/translate",
+ "destination": "/api-reference/translate/request-translation"
+ },
+ {
+ "source": "/api-reference/document",
+ "destination": "/api-reference/document/upload-and-translate-a-document"
+ },
+ {
+ "source": "/api-reference/multilingual-glossaries",
+ "destination": "/api-reference/multilingual-glossaries/create-a-glossary"
+ },
+ {
+ "source": "/api-reference/glossaries",
+ "destination": "/api-reference/glossaries/create-a-glossary"
+ },
+ {
+ "source": "/api-reference/glossaries/v2-vs-v3-endpoints",
+ "destination": "/docs/customize/glossary-v2-vs-v3-endpoints"
+ },
+ {
+ "source": "/api-reference/style-rules",
+ "destination": "/api-reference/style-rules/list-all-style-rules"
+ },
+ {
+ "source": "/api-reference/languages/retrieve-supported-languages-by-resource",
+ "destination": "/docs/languages/using-the-languages-api"
+ },
+ {
+ "source": "/api-reference/languages/language-feature-use-cases",
+ "destination": "/docs/languages/using-the-languages-api"
+ },
+ {
+ "source": "/api-reference/languages/migrate-from-v2-languages",
+ "destination": "/docs/languages/migrating-from-v2-languages"
+ },
+ {
+ "source": "/api-reference/languages/v3-languages-changelog",
+ "destination": "/docs/resources/roadmap-and-release-notes"
+ },
+ {
+ "source": "/api-reference/languages",
+ "destination": "/api-reference/languages/retrieve-supported-languages"
+ },
+ {
+ "source": "/api-reference/improve-text",
+ "destination": "/docs/translate/write-quickstart"
+ },
+ {
+ "source": "/docs/translate/write-api",
+ "destination": "/docs/translate/write-quickstart"
+ },
+ {
+ "source": "/docs/learning-how-tos/examples-and-guides/glossaries-in-the-real-world",
+ "destination": "/docs/customize/glossaries-in-the-real-world"
+ },
+ {
+ "source": "/docs/best-practices/custom-instructions",
+ "destination": "/docs/customize/custom-instructions"
+ },
+ {
+ "source": "/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories",
+ "destination": "/docs/customize/using-translation-memories"
+ },
+ {
+ "source": "/docs/learning-how-tos/examples-and-guides/customizations-for-variants",
+ "destination": "/docs/customize/customizations-for-variants"
},
{
"source": "/docs/resources/examples-and-guides",
@@ -526,7 +704,7 @@
},
{
"source": "/api-reference/translation-memory",
- "destination": "/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories"
+ "destination": "/docs/customize/using-translation-memories"
},
{
"source": "/docs/best-practices/working-with-context",
@@ -576,4 +754,4 @@
}
}
]
-}
\ No newline at end of file
+}
diff --git a/docs/admin/api-key-permissions.mdx b/docs/admin/api-key-permissions.mdx
new file mode 100644
index 00000000..8e74b8b4
--- /dev/null
+++ b/docs/admin/api-key-permissions.mdx
@@ -0,0 +1,43 @@
+---
+title: "Understanding API Key Permissions"
+description: "Why scoped API keys exist, how DeepL enforces permission scopes, and when to choose a scoped key over an unrestricted one."
+public: true
+---
+
+API key permissions let you limit what a developer API key can do. Instead of one key with full access to every endpoint, you can issue keys that are scoped to specific operations, for example a key that can only translate text or a key that can only read glossaries. Permissions are available on the API Pro, API Developer, API Growth, and API Enterprise plans, and currently apply only to developer keys; [admin keys](/docs/admin/managing-api-keys#manage-admin-api-keys) can't be scoped.
+
+This page explains how the permissions model works. For the UI steps, see [Set key permissions](/docs/admin/managing-api-keys#set-key-permissions); for the full list of scopes, see [Permission Scopes](/docs/admin/permission-scopes).
+
+## Permissions and scopes
+
+Permissions are implemented as scopes. Each scope groups a set of related operations into a single capability you can grant to a key: `translate:text` covers text translation, `glossaries:read` covers reading glossaries, and so on. "Permissions" is the user-facing feature; "scopes" is the technical mechanism behind it.
+
+## Why scoped keys
+
+Before permissions were introduced in June 2026, every DeepL API key had full access to every endpoint. That's convenient, but it means a key embedded in a translation widget could also delete your glossaries, and a leaked key exposes your entire API surface.
+
+Scoped keys apply the principle of least privilege: each key gets exactly the access its workload needs. A scoped key that leaks, or a service with a bug, can only do what its scopes allow.
+
+| **Key type** | **Choose when** |
+| --- | --- |
+| Unrestricted | The key needs access to any endpoint and doesn't need to be limited |
+| Scoped | The key should reach only specific endpoints, for example to prevent glossaries from being modified inadvertently |
+
+## How enforcement works
+
+A developer key becomes scoped the moment you assign it one or more scopes. Once scoped:
+
+- The key can call only the endpoints fully covered by its scopes.
+- Every other endpoint returns `403 Forbidden`, including endpoints that have no scope requirement of their own (currently the case for Voice API endpoints).
+- Some endpoints require more than one scope. The key must hold all of them; if any is missing, the request is denied.
+
+When a scoped key calls an endpoint outside its scopes, the `detail` field of the response lists what's missing:
+
+```json
+{
+ "message": "Forbidden",
+ "detail": "Missing required scope(s): glossaries:write"
+}
+```
+
+Enforcement applies only to scoped keys. Unrestricted keys retain full access to every endpoint, and existing keys remain unrestricted until you assign them scopes. An account can hold any mix of scoped and unrestricted keys.
diff --git a/docs/admin/managing-api-keys.mdx b/docs/admin/managing-api-keys.mdx
new file mode 100644
index 00000000..5511bb35
--- /dev/null
+++ b/docs/admin/managing-api-keys.mdx
@@ -0,0 +1,122 @@
+---
+title: "Managing API Keys in the Account UI"
+sidebarTitle: "Managing API Keys"
+description: "Create, rename, deactivate, and set usage limits and permissions on DeepL API keys in the account UI."
+public: true
+---
+
+Manage your API keys in the ["API Keys & Limits" tab](https://www.deepl.com/your-account/keys) when signed into your DeepL API account. A single subscription can have multiple simultaneously active keys: up to 25 on Pro API plans and up to 2 on Free API plans.
+
+
+To create, deactivate, and limit developer keys programmatically instead, use the [Admin API](/docs/admin/overview#the-admin-api).
+
+
+
+
+
+
+## Create a key
+
+Click "Create key". You can optionally name the key during creation; if you don't, it's named "DeepL API Key" automatically. Naming keys lets you find them later using the search bar on the "API keys" tab.
+
+
+
+
+
+After you confirm, a popup shows the new key. Copy it from this popup to use it immediately, or copy it from the key table at any time.
+
+
+
+
+
+To create a key that can only access specific endpoints, select **Custom permissions** during creation. See [Set key permissions](#set-key-permissions).
+
+## Copy a key
+
+Click the "Copy" icon next to the key. For security reasons, the full key is never shown in the key table. Both active and deactivated keys can be copied.
+
+
+
+
+
+## Rename a key
+
+Select "Rename key" from the key's options menu. Both active and deactivated keys can be renamed, and two keys can share the same name.
+
+
+
+
+
+## Deactivate a key
+
+
+A key stops working immediately when deactivated, and deactivation is permanent: a deactivated key cannot be reactivated.
+
+
+Select "Deactivate key" from the key's options menu, then confirm.
+
+
+
+
+
+
+
+
+
+## Set a key-level usage limit
+
+Key-level limits cap the total characters (across text translation, document translation, and text improvement) a key can consume in a one-month usage period. For example, a key with a 1,000,000 character limit stops consuming at 1,000,000 characters and starts fresh when the next usage period begins. You can see your current usage period dates in the [API Usage tab](https://www.deepl.com/your-account/usage).
+
+To set a limit, select "Set limit" from the key's options menu, activate the limit, and enter a character amount. Setting the limit to 0 prevents the key from consuming any characters.
+
+
+
+
+
+
+
+
+
+As with subscription-level [cost control](/docs/best-practices/cost-control):
+
+- You receive notification emails when a key reaches 80% and 100% of its limit
+- The API responds with `456 Quota exceeded` errors once 100% of the limit is reached
+
+To monitor consumption against a limit, check the "Characters consumed" column in the key table or see [Retrieving Usage Data](/docs/admin/retrieving-usage-data).
+
+## Set key permissions
+
+Permissions restrict a developer key to specific endpoints. This section covers the UI steps; to understand how permissions are enforced, see [Understanding API Key Permissions](/docs/admin/api-key-permissions), and for what each scope covers, see [Permission Scopes](/docs/admin/permission-scopes).
+
+To create a scoped key, click "Create key", select **Custom permissions**, choose one or more scopes from the list, and confirm.
+
+
+
+
+
+To change permissions on an existing key, select "Edit permissions" from the key's options menu. Choose **All access** to make the key unrestricted, or **Custom permissions** to select specific scopes, then save.
+
+
+
+
+
+The "Permissions" column in the key table shows each key's status as a badge. Hover over a badge to see the assigned scopes.
+
+
+
+
+
+## Manage admin API keys
+
+If your account has [Admin API access](/docs/admin/overview#the-admin-api), you manage admin keys separately in the ["Admin Keys" tab](https://www.deepl.com/your-account/admin).
+
+
+
+
+
+Admin keys support the same actions as developer keys: create, copy, rename, and deactivate them from the "Admin Keys" tab exactly as described above. The differences:
+
+- Admin keys always end with an `:adm` suffix, which distinguishes them from developer keys
+- Unnamed admin keys are called "DeepL Admin Key" by default
+- You can create up to 25 simultaneously active admin keys on any plan with Admin API access
+- Usage limits and permissions don't apply to admin keys
diff --git a/docs/admin/overview.mdx b/docs/admin/overview.mdx
new file mode 100644
index 00000000..3977667b
--- /dev/null
+++ b/docs/admin/overview.mdx
@@ -0,0 +1,41 @@
+---
+title: "Admin"
+sidebarTitle: "Overview"
+description: "Manage API keys, control what each key can access, and monitor usage across your organization, from the account UI or programmatically with the Admin API."
+public: true
+---
+
+You can administer your DeepL API subscription in two ways:
+
+- **Account UI**: the [API Keys & Limits](https://www.deepl.com/your-account/keys) and [API Usage](https://www.deepl.com/your-account/usage) tabs of your DeepL account, available on all plans
+- **Admin API**: programmatic key management and usage analytics, for automating key provisioning, enforcing limits, and feeding usage data into your own dashboards or billing systems (see the [Admin API reference](/api-reference/admin-api/managing-developer-keys/create-key))
+
+## The Admin API
+
+The Admin API is available to all API Growth and API Enterprise subscribers, and to a limited set of Pro API subscribers. To enable access, contact your DeepL customer success manager or DeepL support.
+
+The Admin API uses its own key type: admin keys, which always carry an `:adm` suffix to distinguish them from developer keys. You create admin keys in the ["Admin Keys" tab](https://www.deepl.com/your-account/admin) of your account (see [Managing API Keys in the Account UI](/docs/admin/managing-api-keys#manage-admin-api-keys)) and pass them in the `Authorization` header of each request, just like developer keys:
+
+`Authorization: DeepL-Auth-Key [yourAdminKey]`
+
+Admin API endpoints are available on the Pro endpoint `https://api.deepl.com`. See the [Admin API reference](/api-reference/admin-api/managing-developer-keys/create-key) for request and response schemas.
+
+## Start here
+
+
+
+ Create a developer key, cap its usage, and pull a usage report in four API calls.
+
+
+ Create, rename, deactivate, and set usage limits on developer and admin keys in the account UI.
+
+
+ Understand how permission scopes restrict what a developer key can do.
+
+
+ Pick the right usage data source and pull consumption data for your account, keys, or custom tags.
+
+
+ Endpoint reference for programmatic key management and usage analytics.
+
+
diff --git a/docs/admin/permission-scopes.mdx b/docs/admin/permission-scopes.mdx
new file mode 100644
index 00000000..4fb1c3f7
--- /dev/null
+++ b/docs/admin/permission-scopes.mdx
@@ -0,0 +1,98 @@
+---
+title: "Permission Scopes"
+description: "Every permission scope for DeepL developer API keys and the endpoints each scope covers."
+public: true
+---
+
+Each scope grants a [scoped API key](/docs/admin/api-key-permissions) access to the endpoints listed under it. A scoped key can call only endpoints fully covered by its scopes; requests to any other endpoint return `403 Forbidden`.
+
+
+
+ | **Method** | **Endpoint** |
+ | --- | --- |
+ | `POST` | [`/v2/translate`](/api-reference/translate/request-translation) |
+
+
+
+ | **Method** | **Endpoint** |
+ | --- | --- |
+ | `POST` | [`/v2/document`](/api-reference/document/upload-and-translate-a-document) |
+ | `GET` | [`/v2/document/{document_id}`](/api-reference/document/check-document-status) |
+ | `GET` | [`/v2/document/{document_id}/result`](/api-reference/document/download-translated-document) |
+
+
+
+ | **Method** | **Endpoint** |
+ | --- | --- |
+ | `POST` | [`/v2/write/rephrase`](/api-reference/improve-text/request-text-improvement) |
+ | `POST` | [`/v2/write/correct`](/api-reference/improve-text/correct-text) |
+
+
+
+ | **Method** | **Endpoint** |
+ | --- | --- |
+ | `GET` | [`/v3/glossaries`](/api-reference/multilingual-glossaries/list-all-glossaries) |
+ | `GET` | [`/v3/glossaries/{glossary_id}`](/api-reference/multilingual-glossaries/retrieve-glossary-details) |
+ | `GET` | [`/v3/glossaries/{glossary_id}/entries`](/api-reference/multilingual-glossaries/retrieve-glossary-entries) |
+ | `GET` | [`/v2/glossaries`](/api-reference/glossaries/list-all-glossaries) |
+ | `GET` | [`/v2/glossaries/{glossary_id}`](/api-reference/glossaries/retrieve-glossary-details) |
+ | `GET` | [`/v2/glossaries/{glossary_id}/entries`](/api-reference/glossaries/retrieve-glossary-entries) |
+ | `GET` | [`/v2/glossary-language-pairs`](/api-reference/multilingual-glossaries/list-language-pairs-supported-by-glossaries) |
+
+
+
+ | **Method** | **Endpoint** |
+ | --- | --- |
+ | `POST` | [`/v3/glossaries`](/api-reference/multilingual-glossaries/create-a-glossary) |
+ | `PATCH` | [`/v3/glossaries/{glossary_id}`](/api-reference/multilingual-glossaries/edit-glossary-details) |
+ | `PUT` | [`/v3/glossaries/{glossary_id}/dictionaries`](/api-reference/multilingual-glossaries/replaces-or-creates-a-dictionary-in-the-glossary-with-the-specified-entries) |
+ | `DELETE` | [`/v3/glossaries/{glossary_id}`](/api-reference/multilingual-glossaries/delete-a-glossary) |
+ | `DELETE` | [`/v3/glossaries/{glossary_id}/dictionaries`](/api-reference/multilingual-glossaries/deletes-the-dictionary-associated-with-the-given-language-pair-with-the-given-glossary-id) |
+ | `POST` | [`/v2/glossaries`](/api-reference/glossaries/create-a-glossary) |
+ | `DELETE` | [`/v2/glossaries/{glossary_id}`](/api-reference/glossaries/delete-a-glossary) |
+
+
+
+ | **Method** | **Endpoint** |
+ | --- | --- |
+ | `GET` | [`/v3/style_rules`](/api-reference/style-rules/list-all-style-rules) |
+ | `GET` | [`/v3/style_rules/{style_id}`](/api-reference/style-rules/get-style-rule) |
+ | `GET` | [`/v3/style_rules/{style_id}/custom_instructions/{instruction_id}`](/api-reference/style-rules/get-custom-instruction) |
+
+
+
+ | **Method** | **Endpoint** |
+ | --- | --- |
+ | `POST` | [`/v3/style_rules`](/api-reference/style-rules/create-style-rule) |
+ | `PATCH` | [`/v3/style_rules/{style_id}`](/api-reference/style-rules/update-style-rule) |
+ | `PUT` | [`/v3/style_rules/{style_id}/configured_rules`](/api-reference/style-rules/update-configured-rules) |
+ | `DELETE` | [`/v3/style_rules/{style_id}`](/api-reference/style-rules/delete-style-rule) |
+ | `POST` | [`/v3/style_rules/{style_id}/custom_instructions`](/api-reference/style-rules/create-custom-instruction) |
+ | `PUT` | [`/v3/style_rules/{style_id}/custom_instructions/{instruction_id}`](/api-reference/style-rules/update-custom-instruction) |
+ | `DELETE` | [`/v3/style_rules/{style_id}/custom_instructions/{instruction_id}`](/api-reference/style-rules/delete-custom-instruction) |
+
+
+
+ | **Method** | **Endpoint** |
+ | --- | --- |
+ | `GET` | [`/v3/translation_memories`](/api-reference/translation-memory/list-translation-memories) |
+
+
+
+ | **Method** | **Endpoint** |
+ | --- | --- |
+ | `GET` | [`/v3/languages`](/api-reference/languages/retrieve-languages-by-resource) |
+ | `GET` | [`/v3/languages/resources`](/api-reference/languages/retrieve-resources) |
+ | `GET` | [`/v2/languages`](/api-reference/languages/retrieve-supported-languages) |
+
+
+
+ | **Method** | **Endpoint** |
+ | --- | --- |
+ | `GET` | [`/v2/usage`](/api-reference/usage-and-quota/check-usage-and-limits) |
+
+
+
+
+No scope covers the Voice API yet, so Voice endpoints are accessible only with unrestricted keys. Voice scopes will be added in a future update.
+
diff --git a/docs/admin/quickstart.mdx b/docs/admin/quickstart.mdx
new file mode 100644
index 00000000..bfdfa53e
--- /dev/null
+++ b/docs/admin/quickstart.mdx
@@ -0,0 +1,189 @@
+---
+title: "Admin API Quickstart"
+description: "Create a developer API key, set a usage limit on it, and pull a per-key usage report in four calls to the Admin API."
+covers: [Admin]
+public: true
+---
+
+In this tutorial, we'll use the Admin API to provision a new developer API key for a team, set a character limit to control costs, and then retrieve a usage report to confirm activity. By the end, you'll have made four API calls that cover the core Admin API workflow.
+
+## What you'll learn
+
+- How to create a developer API key programmatically
+- How to apply a character usage limit to a key
+- How to retrieve an organization-wide usage report broken down by key
+- What the response objects look like at each step
+
+## Prerequisites
+
+- An API Growth or API Enterprise subscription, or a Pro API subscription with [Admin API access](/docs/admin/overview#the-admin-api)
+- An [**admin API key**](/docs/admin/managing-api-keys#manage-admin-api-keys) for your DeepL organization. Regular developer keys cannot access Admin API endpoints.
+- `curl` installed on your machine
+
+
+Responses in this tutorial are shown formatted. To pretty-print JSON in your terminal, install [jq](https://jqlang.org/) and pipe curl output through it: `curl ... | jq`
+
+
+## Building with an AI coding agent?
+
+Wire it up to the [DeepL Docs MCP Server](/docs/getting-started/docs-mcp-server) so it can search and read this documentation while it writes code. In Claude Code:
+
+```bash
+claude mcp add --transport http deepl-docs https://developers.deepl.com/mcp
+```
+
+Then describe what you want to build. To get the same result as this tutorial, paste:
+
+```text wrap
+Using the DeepL Admin API, write a script that creates a developer API key labeled "Staging Team Key", sets a 500,000 character usage limit on it, and then displays a per-key usage report for the last month.
+```
+
+## Step 1: List existing developer keys
+
+Before creating a new key, let's see what's already in the organization. This gives us a baseline and confirms that authentication is working.
+
+```bash
+curl https://api.deepl.com/v2/admin/developer-keys \
+ -H "Authorization: DeepL-Auth-Key YOUR_ADMIN_KEY"
+```
+
+You'll receive an array with one object per developer key, active and deactivated:
+
+```json
+[
+ {
+ "key_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890:1f2e3d4c-5b6a-7980-dcba-0987654321fe",
+ "label": "Production API Key",
+ "creation_time": "2026-05-12T09:41:03.512Z",
+ "deactivated_time": null,
+ "is_deactivated": false,
+ "usage_limits": {
+ "characters": null,
+ "speech_to_text_milliseconds": null
+ }
+ }
+]
+```
+
+Notice the `key_id` field, composed of two GUIDs separated by a `:` symbol. You'll use it to target specific keys in later steps. `null` usage limits mean no cap is set on that key.
+
+If you get a `403 Forbidden` response here, double-check that you're using an admin key with an `:adm` suffix, not a developer key.
+
+## Step 2: Create a new developer key
+
+Now let's create a key for a new team or service. We'll give it a descriptive label so it's easy to identify later.
+
+```bash
+curl https://api.deepl.com/v2/admin/developer-keys \
+ -H "Authorization: DeepL-Auth-Key YOUR_ADMIN_KEY" \
+ -H "Content-Type: application/json" \
+ -d '{"label": "Staging Team Key"}'
+```
+
+The response returns the newly created key object:
+
+```json
+{
+ "key_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210:0a1b2c3d-4e5f-6789-abcd-ef0123456789",
+ "label": "Staging Team Key",
+ "creation_time": "2026-07-09T10:02:47.118Z",
+ "deactivated_time": null,
+ "is_deactivated": false,
+ "usage_limits": {
+ "characters": null,
+ "speech_to_text_milliseconds": null
+ }
+}
+```
+
+Copy the `key_id` from this response. You'll need it in the next step.
+
+## Step 3: Set a character usage limit
+
+By default, a new key has no usage cap. Let's set a character limit so the staging key can't consume more quota than intended.
+
+Replace `KEY_ID` with the `key_id` from the previous step.
+
+```bash
+curl https://api.deepl.com/v2/admin/developer-keys/limits \
+ -X PUT \
+ -H "Authorization: DeepL-Auth-Key YOUR_ADMIN_KEY" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "key_id": "KEY_ID",
+ "characters": 500000
+ }'
+```
+
+The response returns the updated key object. Confirm that `usage_limits.characters` now shows `500000`:
+
+```json
+{
+ "key_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210:0a1b2c3d-4e5f-6789-abcd-ef0123456789",
+ "label": "Staging Team Key",
+ "creation_time": "2026-07-09T10:02:47.118Z",
+ "deactivated_time": null,
+ "is_deactivated": false,
+ "usage_limits": {
+ "characters": 500000,
+ "speech_to_text_milliseconds": null
+ }
+}
+```
+
+Once the key reaches its character limit, requests using it return `456 Quota exceeded` errors until the next usage period starts or you raise the limit.
+
+## Step 4: Pull a usage report by key
+
+After the team has started using the key, let's retrieve a usage report to see how much quota each key has consumed. We'll group the results by API key so we can see per-key totals.
+
+Replace the dates with a range that covers the period you want to inspect. Date ranges can span up to 366 days, and data is available up to and including the previous UTC calendar day.
+
+```bash
+curl "https://api.deepl.com/v2/admin/analytics?start_date=2026-06-01&end_date=2026-07-01&group_by=key" \
+ -H "Authorization: DeepL-Auth-Key YOUR_ADMIN_KEY"
+```
+
+The response includes a `usage_report` object with per-key breakdowns and an organization-wide total:
+
+```json
+{
+ "usage_report": {
+ "start_date": "2026-06-01T00:00:00",
+ "end_date": "2026-07-01T00:00:00",
+ "group_by": "key",
+ "key_usages": [
+ {
+ "api_key": "f9e8****6789",
+ "api_key_label": "Staging Team Key",
+ "usage": {
+ "text_translation_characters": 4892,
+ "text_improvement_characters": 4727,
+ "document_translation_characters": 0,
+ "speech_to_text_minutes": 107.46,
+ "total_characters": 9619
+ }
+ }
+ ],
+ "total_usage": {
+ "text_translation_characters": 4892,
+ "text_improvement_characters": 4727,
+ "document_translation_characters": 0,
+ "speech_to_text_minutes": 107.46,
+ "total_characters": 9619
+ }
+ }
+}
+```
+
+Notice that `api_key` values are partially masked in the response for security. You can match keys to their labels using the `api_key_label` field.
+
+You have now created a key, capped its usage, and confirmed activity through the analytics endpoint.
+
+## What's next
+
+- **Rename or reorganize keys**: Use the [rename endpoint](/api-reference/admin-api/managing-developer-keys/rename-key) to update a key's label as teams or services change.
+- **Deactivate a key**: When a key is no longer needed, [deactivate it](/api-reference/admin-api/managing-developer-keys/deactivate-key). Deactivation is permanent, but deactivated keys remain visible in your key list.
+- **Daily usage breakdowns**: Change `group_by` to `key_and_day` to see per-key usage broken down by day, which is useful for spotting spikes.
+- **Custom tag analytics**: If you annotate API requests with custom tags, use the [custom tag analytics endpoint](/api-reference/admin-api/get-custom-tag-usage-analytics) to break down usage by tag.
+- **Other data sources**: See [Retrieving Usage Data](/docs/admin/retrieving-usage-data) for a comparison of all the ways to monitor your DeepL API usage.
diff --git a/docs/admin/retrieving-usage-data.mdx b/docs/admin/retrieving-usage-data.mdx
new file mode 100644
index 00000000..8b164a05
--- /dev/null
+++ b/docs/admin/retrieving-usage-data.mdx
@@ -0,0 +1,77 @@
+---
+title: "Retrieving Usage Data"
+description: "Compare DeepL's usage data sources and pull character and minute consumption for your account, API keys, or custom tags."
+covers: [Admin]
+public: true
+---
+
+DeepL offers several ways to retrieve usage data so you can track character and minute consumption and the associated costs. This guide compares the available data sources and shows how to use each one.
+
+
+Consumption data in the account UI, in CSV exports, and in the [Admin API analytics endpoints](/api-reference/admin-api/get-usage-analytics) is available up to and including the previous UTC calendar day. For near-real-time data, use the [`/usage` endpoint](/api-reference/usage-and-quota/check-usage-and-limits).
+
+
+## Choose a data source
+
+| Data source | Scope | Time range | Data freshness | Interface |
+| --- | --- | --- | --- | --- |
+| [API Keys & Limits tab](#api-keys-and-limits-tab) | Per API key | Current usage period only | Previous UTC day | Account UI |
+| [API Usage tab](#api-usage-tab) | Account total (plus year-to-date on yearly plans) | Current usage period (and yearly period) | Previous UTC day | Account UI |
+| [Key-level CSV export](#api-key-level-csv-export) | Per API key | Custom or preset ranges up to 4 months, optional grouping by day | Previous UTC day | CSV download |
+| [`/usage` endpoint](#the-usage-endpoint) | Account total | Current usage period only | Near-real-time (within minutes) | REST API |
+| [Admin API analytics](#admin-api-analytics) | Per API key or per custom tag | Custom date range, optional grouping by day | Previous UTC day | REST API |
+
+Use the **account UI** for a quick check while signed in, the **CSV export** for detailed or offline analysis per key, the **`/usage` endpoint** for programmatic near-real-time quota checks, and the **Admin API analytics endpoints** for programmatic reporting and cost attribution via custom tags.
+
+## API Keys and Limits tab
+
+To check per-key consumption for the current monthly usage period, open the [API Keys & Limits tab](https://www.deepl.com/your-account/keys). It shows character and speech-to-text (STT) minute consumption for each API key.
+
+
+
+
+
+## API Usage tab
+
+To check your account totals, open the [API Usage tab](https://www.deepl.com/your-account/usage). It shows total character and STT minute usage for the current monthly usage period, and if you're on a yearly plan, usage to date for your yearly billing period, too.
+
+
+
+
+
+## API key-level CSV export
+
+Generate a CSV report with key-level characters translated for a chosen time period. The report includes a column that breaks out text improvement (Write API) characters separately. Key-level usage is not broken out on invoices; it's only available via CSV export or on the "API Keys & Limits" tab.
+
+To download a report, click "Download key-level usage report" on the [API Keys & Limits tab](https://www.deepl.com/your-account/keys) or "Download report" on the [API Usage tab](https://www.deepl.com/your-account/usage), then select a time period and click "Download your report".
+
+
+
+
+
+Select a custom date range of up to 4 months (on UTC calendar days) or one of the presets, which cover rolling windows from the last 24 hours up to the last year as well as calendar months and usage periods. Rolling presets include the current day; calendar-month and usage-period ranges align to UTC day or period boundaries, so they might not start and end on a full calendar day.
+
+For all time ranges except "Last 24 hours", "Current usage period", and "Last usage period", you can also group key-level usage data by UTC calendar day:
+
+
+
+
+
+
+Document translation data is only included in reports with a time period starting on or after May 16, 2024 00:00 UTC. Text translation data is included for all time periods.
+
+
+## The usage endpoint
+
+The [`/usage` endpoint](/api-reference/usage-and-quota/check-usage-and-limits) returns a near-real-time snapshot of character and minute usage in the current monthly usage period, typically up to date within a few minutes of the usage being generated. Use it for programmatic quota checks, for example before submitting a large translation batch.
+
+## Admin API analytics
+
+The Admin API provides programmatic access to usage data over a custom date range, with optional grouping by day. It requires [Admin API access](/docs/admin/overview#the-admin-api) and an [admin key](/docs/admin/managing-api-keys#manage-admin-api-keys) for authentication. Two endpoints are available:
+
+- [Get usage analytics](/api-reference/admin-api/get-usage-analytics) returns usage statistics across all services (text translation, document translation, text improvement, and speech-to-text), in total or grouped by API key
+- [Get custom tag usage analytics](/api-reference/admin-api/get-custom-tag-usage-analytics) returns usage broken down by custom tag
+
+Custom tags are an optional dimension for cost attribution: attach a tag to individual API requests with the `X-DeepL-Reporting-Tag` header to track consumption by team, project, or any other category. Only tagged requests appear in custom-tag analytics, so results reflect a subset of total usage unless every request is tagged. See [How to use custom reporting tags](/docs/learning-how-tos/examples-and-guides/how-to-use-custom-reporting-tags) for setup and naming guidance.
+
+For a worked example of pulling analytics data into a dashboard, see the [usage analytics dashboard cookbook](/docs/learning-how-tos/cookbook/usage-analytics-dashboard).
diff --git a/docs/best-practices/cors-requests.mdx b/docs/best-practices/cors-requests.mdx
index 1a5418b3..a184a730 100644
--- a/docs/best-practices/cors-requests.mdx
+++ b/docs/best-practices/cors-requests.mdx
@@ -12,4 +12,4 @@ If you realize your API authentication key has been compromised, log in to your
To safely use the DeepL API on your website or application, you can route your requests through your own backend servers. This keeps your credentials hidden and allows you to specify CORS policies and rate limits as required by your use case.
-DeepL's official open-source [client libraries](/docs/getting-started/client-libraries) can help you create these backend implementations. For prototyping and frontend testing, you can use the [DeepL API Node.js Proxy](https://github.com/DeepLcom/deepl-api-nodejs-proxy/), a lightweight ready-to-use proxy server that handles CORS and keeps your API key secure.
+DeepL's official open-source [client libraries](/docs/getting-started/client-libraries) can help you create these backend implementations. For prototyping and frontend testing, you can use the [DeepL API Node.js Proxy](https://github.com/DeepL/deepl-api-nodejs-proxy/), a lightweight ready-to-use proxy server that handles CORS and keeps your API key secure.
diff --git a/docs/best-practices/cost-control.mdx b/docs/best-practices/cost-control.mdx
index 7b9f801f..f5734d4f 100644
--- a/docs/best-practices/cost-control.mdx
+++ b/docs/best-practices/cost-control.mdx
@@ -23,6 +23,8 @@ Your new cost control limit is applied immediately.
Once you have reached your limit, DeepL will not process any further translation requests until the end of the usage period, in order to not exceed your set maximum cost. If you would like to translate more, you can make changes to the cost control limit at any time.
+The limit is enforced against the sum of Translate API and Write API characters; it's not possible to set separate limits for each.
+
#### *I have been notified that my Cost Control was raised, but I didn't raise it. What should I do?*
Every time your *Cost Control* limit is raised, you will receive a notification email for security reasons. If you receive such a notification, but you did not raise your *Cost Control* limit, we highly suggest you reset your authentication key and the password to your DeepL Pro account as soon as possible.
diff --git a/docs/best-practices/document-translations.mdx b/docs/best-practices/document-translations.mdx
index 5a9e73f1..4ecbc39c 100644
--- a/docs/best-practices/document-translations.mdx
+++ b/docs/best-practices/document-translations.mdx
@@ -12,6 +12,9 @@ For DOCX and PPTX, our .NET, PHP and NodeJS client libraries offer functionality
This allows users to translate files that might hit the size limit.
+### Billing minimums
+Every submitted document of type `.pptx`, `.docx`, `.doc`, `.xlsx`, or `.pdf` is billed a minimum of 50,000 characters on DeepL API plans, no matter how many characters the document contains.
+
### One source/target language pair per upload
The `source_lang` and `target_lang` values on the request apply to the entire uploaded file. For most formats, keep each upload to a single source language for consistent results — behavior on content that isn't in the selected source language is not guaranteed.
@@ -67,6 +70,18 @@ Each supported format has behaviors and constraints worth knowing before you upl
- Some valid FrameMaker 10 MIF files may fail with HTTP 500 — try re-saving from a newer FrameMaker version.
- MIF does not use `translate="no"`. Protect content via FrameMaker conditional text or character formatting.
+### Polling and translation time
+Translation time depends on document size and server load: small documents typically finish in seconds, larger ones in 1-2 minutes once translation has started. Poll the [status endpoint](/api-reference/document/check-document-status) at regular intervals or with exponential backoff. Treat the `seconds_remaining` field as a rough estimate only; it can be unreliable and occasionally returns implausible values (e.g. 2^27).
+
+### Using glossaries with documents
+You can apply a glossary to a document translation with the `glossary_id` parameter (or up to 5 glossaries with `glossary_ids`). This requires the `source_lang` parameter to be set, and the glossary's language pair has to match the language pair of the request.
+
+### Document format conversions
+By default, the translated document comes back in the same format as the input. Two conversions differ:
+
+- Translating a `.doc` file returns a `.docx` file.
+- With the `output_format` parameter on upload, you can translate a PDF and receive an editable Microsoft Word document (`output_format=docx`). No other input formats support alternative output formats.
+
### Error 429: Too Many Requests
This error may occur when:
@@ -85,5 +100,5 @@ This error indicates that your latest document translation request has exceeded
Further document translation requests will not be processed.
- Check out our [code example](https://github.com/DeepLcom/deepl-node/tree/main/examples/bulk-translation) on how to implement bulk document translations.
+ Check out our [code example](https://github.com/DeepL/deepl-node/tree/main/examples/bulk-translation) on how to implement bulk document translations.
diff --git a/docs/best-practices/error-handling.mdx b/docs/best-practices/error-handling.mdx
index cb9ee7f6..33c544e6 100644
--- a/docs/best-practices/error-handling.mdx
+++ b/docs/best-practices/error-handling.mdx
@@ -8,7 +8,7 @@ Errors are indicated by [standard HTTP status codes](https://developer.mozilla.o
* **HTTP 429: too many requests.** This is an error that you might receive when sending many API requests in a short period of time. Your application should be configured to resend the requests after some delay. Specifically, we recommend implementing retries with exponential backoff. This is implemented in all of the official, DeepL-supported [client libraries](/docs/getting-started/client-libraries).
-* **HTTP 456: quota exceeded** **If you're a Free API user**, you'll receive this error when the monthly 500,000 character limit of your subscription has been reached. You can consider [upgrading your subscription](https://www.deepl.com/pro) if you need more character volume. **If you're a Pro API user**, you'll receive this error when your [Cost Control](/docs/best-practices/cost-control) limit has been reached, and you can increase or remove your Cost Control limit if you need to continue translating. You can also use the [usage endpoint](/api-reference/usage-and-quota) to find out your currently used and available quota.
+* **HTTP 456: quota exceeded** **If you're a Free API user**, you'll receive this error when the monthly 500,000 character limit of your subscription has been reached. You can consider [upgrading your subscription](https://www.deepl.com/pro) if you need more character volume. **If you're a Pro API user**, you'll receive this error when your [Cost Control](/docs/best-practices/cost-control) limit has been reached, and you can increase or remove your Cost Control limit if you need to continue translating. You can also use the [usage endpoint](/api-reference/usage-and-quota/check-usage-and-limits) to find out your currently used and available quota.
* **HTTP 500: internal server error** This is an error you'll receive if there are temporary errors in DeepL Services. Your application should be configured to resend the requests after some delay. Specifically, we recommend implementing retries with exponential backoff. This is implemented in all of the official, DeepL-supported [client libraries](/docs/getting-started/client-libraries). You can check the [API Status Page](https://api-status.deepl.com) for current service availability and incident information.
diff --git a/docs/best-practices/estimating-character-usage.mdx b/docs/best-practices/estimating-character-usage.mdx
index e672366c..134525f4 100644
--- a/docs/best-practices/estimating-character-usage.mdx
+++ b/docs/best-practices/estimating-character-usage.mdx
@@ -10,7 +10,7 @@ This guide walks through techniques for counting characters in different content
## Before you start
-DeepL bills by source-text length in Unicode code points. Characters in the [`context` parameter](/docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter) and HTML/XML tags (when [tag handling](/docs/xml-and-html-handling/xml) is enabled) do not count. For the full billing rules and per-document character minimums, see [Usage and limits](/docs/resources/usage-limits#your-usage).
+DeepL bills by source-text length in Unicode code points. Characters in the [`context` parameter](/docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter) and HTML/XML tags (when [tag handling](/docs/translate/translating-xml) is enabled) do not count. For the full billing rules and per-document character minimums, see [Usage and limits](/docs/resources/usage-limits#your-usage).
## Estimate website content
@@ -94,7 +94,7 @@ For a Drupal site specifically, the `node_field_data` and `node__body` tables co
## Estimate document content
-For documents you plan to translate via the [Document Translation API](/api-reference/document), you can extract text locally to get a rough character count.
+For documents you plan to translate via the [Document Translation API](/api-reference/document/upload-and-translate-a-document), you can extract text locally to get a rough character count.
```python
import zipfile
@@ -140,7 +140,7 @@ If you're translating the same content into multiple languages, each language co
## Validate your estimate
-Once you've estimated your characters, you can [sign up for a DeepL API plan for free](https://www.deepl.com/en/pro#api) and test a small sample against the live API. Use the [`show_billed_characters`](/api-reference/translate#request-body-descriptions) parameter to compare actual billed characters against your local count.
+Once you've estimated your characters, you can [sign up for a DeepL API plan for free](https://www.deepl.com/en/pro#api) and test a small sample against the live API. Use the [`show_billed_characters`](/api-reference/translate/request-translation) parameter to compare actual billed characters against your local count. DeepL intends to include `billed_characters` in responses by default in the future, with advance notice to API users before the change.
```bash
curl -X POST https://api.deepl.com/v2/translate \
@@ -171,7 +171,7 @@ Run this on 5-10 representative pages or documents and compare the `billed_chara
After you start translating, monitor actual usage against your estimates:
-- **[`/v2/usage` endpoint](/api-reference/usage-and-quota)** - programmatic access to your current billing period consumption
+- **[`/v2/usage` endpoint](/api-reference/usage-and-quota/check-usage-and-limits)** - programmatic access to your current billing period consumption
- **[Usage Analytics Dashboard](/docs/learning-how-tos/cookbook/usage-analytics-dashboard)** - visualize usage across API keys with the open-source demo dashboard
- **[API Usage Logger](/docs/learning-how-tos/cookbook/api-usage-logger)** - per-request logging with billed characters, language pairs, and reporting tags
- **[Cost Control](/docs/best-practices/cost-control)** - set a monthly character limit on your Pro API subscription to cap spend
diff --git a/docs/best-practices/language-detection.mdx b/docs/best-practices/language-detection.mdx
index 3e39c31b..24f2a4ce 100644
--- a/docs/best-practices/language-detection.mdx
+++ b/docs/best-practices/language-detection.mdx
@@ -6,4 +6,4 @@ public: true
Our translation and document translation endpoints allow you to automatically detect the source language or set it. It is recommended to set the source language whenever possible, as this has a positive effect on translation quality. If you cannot specify the source language, the more context you provide, the better your results will be. Single words can lead to incorrect language detection, so the longer your text, the more reliable it will be.
-If you are translating single words or very short sentences, the results will generally be more reliable if the source language is specified. You can find all available [source languages here](/api-reference/languages), and you can read more about translation context in the next chapter.
+If you are translating single words or very short sentences, the results will generally be more reliable if the source language is specified. You can find all available [source languages here](/api-reference/languages/retrieve-supported-languages), and you can read more about translation context in the next chapter.
diff --git a/docs/best-practices/pre-production-checklist.mdx b/docs/best-practices/pre-production-checklist.mdx
index 41b4e7ff..c12b6e50 100644
--- a/docs/best-practices/pre-production-checklist.mdx
+++ b/docs/best-practices/pre-production-checklist.mdx
@@ -12,5 +12,5 @@ As you prepare to open your DeepL-powered application up to the world, these tip
* Uploading a file for document translation requires an HTTP POST request with `Content-Type: multipart/form-data`; this content type should not be used for text translation.
4. **No query parameters:** Please do not make API requests using query parameters. The examples throughout the API reference include properly formed HTTP POST requests. For security reasons, be especially sure not to send your authentication key via query parameters.
5. **CORS requests:** It's not possible to send requests to the DeepL API from the browser, as requests to third-party APIs from front-end applications would expose your credentials on the web. [You can learn more here](/docs/best-practices/cors-requests).
-6. **Translation context:** DeepL considers the broader context of a source text or document when translating. In general, including more context in a source text or document can result in a higher-quality DeepL translation. For text translation, you can also try the [`context` parameter](/api-reference/translate#request-body-descriptions). [Learn more about working with context here](/docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter).
+6. **Translation context:** DeepL considers the broader context of a source text or document when translating. In general, including more context in a source text or document can result in a higher-quality DeepL translation. For text translation, you can also try the [`context` parameter](/api-reference/translate/request-translation). [Learn more about working with context here](/docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter).
7. **Cache results from translation requests:** Storing API responses lets apps serve content faster and avoids extra costs from repeated requests for unchanged content.
diff --git a/docs/best-practices/custom-instructions.mdx b/docs/customize/custom-instructions.mdx
similarity index 95%
rename from docs/best-practices/custom-instructions.mdx
rename to docs/customize/custom-instructions.mdx
index d8eca577..dfbccc20 100644
--- a/docs/best-practices/custom-instructions.mdx
+++ b/docs/customize/custom-instructions.mdx
@@ -89,7 +89,7 @@ When using custom instructions, keep these constraints in mind:
## Related documentation
-- [Text translation API reference](/api-reference/translate)
+- [Text translation API reference](/api-reference/translate/request-translation)
- [Working with context](/docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter)
-- [Style rules API](/api-reference/style-rules)
-- [Multilingual glossaries](/api-reference/multilingual-glossaries)
+- [Style rules API](/docs/customize/using-style-rules)
+- [Multilingual glossaries](/docs/customize/managing-glossaries)
diff --git a/docs/learning-how-tos/examples-and-guides/customizations-for-variants.mdx b/docs/customize/customizations-for-variants.mdx
similarity index 95%
rename from docs/learning-how-tos/examples-and-guides/customizations-for-variants.mdx
rename to docs/customize/customizations-for-variants.mdx
index 97e50cc1..19cada0d 100644
--- a/docs/learning-how-tos/examples-and-guides/customizations-for-variants.mdx
+++ b/docs/customize/customizations-for-variants.mdx
@@ -79,7 +79,7 @@ Some CAT tools may prevent applying a glossary or style rule linked to a root co
## Next steps
-- **Apply glossaries in practice:** See [Glossaries in the real world](/docs/learning-how-tos/examples-and-guides/glossaries-in-the-real-world) for a full worked example
+- **Apply glossaries in practice:** See [Glossaries in the real world](/docs/customize/glossaries-in-the-real-world) for a full worked example
- **Translate between variants:** Learn about the Write API and style rules in [How to translate between language variants](/docs/learning-how-tos/examples-and-guides/translating-between-variants)
-- **Manage style rules:** Explore the [style rules API reference](/api-reference/style-rules) to create and retrieve style rules
+- **Manage style rules:** Explore the [style rules API reference](/docs/customize/using-style-rules) to create and retrieve style rules
- **Improve translation quality:** See how [the context parameter](/docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter) can further refine your translations
diff --git a/docs/learning-how-tos/examples-and-guides/glossaries-in-the-real-world.mdx b/docs/customize/glossaries-in-the-real-world.mdx
similarity index 99%
rename from docs/learning-how-tos/examples-and-guides/glossaries-in-the-real-world.mdx
rename to docs/customize/glossaries-in-the-real-world.mdx
index 00cfec4d..df854887 100644
--- a/docs/learning-how-tos/examples-and-guides/glossaries-in-the-real-world.mdx
+++ b/docs/customize/glossaries-in-the-real-world.mdx
@@ -1,4 +1,5 @@
---
+title: "Glossaries in the Real World"
description: A quick guide to using DeepL glossaries in translations
public: true
---
diff --git a/docs/customize/glossary-v2-vs-v3-endpoints.mdx b/docs/customize/glossary-v2-vs-v3-endpoints.mdx
new file mode 100644
index 00000000..c5e31a09
--- /dev/null
+++ b/docs/customize/glossary-v2-vs-v3-endpoints.mdx
@@ -0,0 +1,83 @@
+---
+title: "Glossary v2 vs v3 Endpoints"
+description: "How the v3 glossary endpoints differ from the deprecated v2 endpoints, what to watch out for when mixing them, and how to work with v2's immutability."
+public: true
+---
+
+DeepL's API has two generations of glossary endpoints. The [v2 endpoints](/api-reference/glossaries/create-a-glossary) create, delete, and retrieve **monolingual** glossaries: glossaries that map one language to another. The [v3 endpoints](/api-reference/multilingual-glossaries/create-a-glossary) include all v2 functionality, plus:
+
+- v3 lets you **edit** glossaries
+- v3 supports **multilingual** glossaries: a collection of dictionaries covering multiple language pairs
+
+We recommend using v3 for all glossary work; v2 is kept for backward compatibility. There is no need to migrate your existing glossaries: you can use v3 endpoints with any glossary, whichever version created it. Glossaries from either version work in all translation endpoints, both [`/translate`](/api-reference/translate/request-translation) and [`/document`](/api-reference/document/upload-and-translate-a-document).
+
+## Differences between v2 and v3
+
+A v2 glossary is a single list of mappings with one source and one target language:
+
+```json
+{
+ "glossary_id": "def3a26b-3e84-45b3-84ae-0c0aaf3525f7",
+ "name": "My Glossary",
+ "source_lang": "en",
+ "target_lang": "de",
+ "entries": {
+ "Hello": "Hallo"
+ },
+ "creation_time": "2025-08-03T14:16:18.329Z"
+}
+```
+
+A v3 glossary holds a collection of **dictionaries**, each with its own language pair. The same glossary can carry the reverse mapping too:
+
+```json
+{
+ "glossary_id": "def3a26b-3e84-45b3-84ae-0c0aaf3525f7",
+ "name": "My Glossary",
+ "dictionaries": [
+ {
+ "source_lang": "en",
+ "target_lang": "de",
+ "entries": {
+ "Hello": "Hallo"
+ }
+ },
+ {
+ "source_lang": "de",
+ "target_lang": "en",
+ "entries": {
+ "Hallo": "Hello"
+ }
+ }
+ ],
+ "creation_time": "2025-08-03T14:16:18.329Z"
+}
+```
+
+The v3 endpoints handle glossary management only; use v2 for everything else, including translation itself. The deprecated `/v2/glossary-language-pairs` endpoint is also superseded: use [`GET /v3/languages?resource=glossary`](/docs/languages/using-the-languages-api) instead.
+
+## Can I keep using v2?
+
+You can, but we recommend switching: new features land on v3, and the v2 glossary endpoints may be deprecated or removed at some point. If an immediate switch isn't possible, keep these implications in mind:
+
+- Once a glossary has been edited via v3, v2 endpoints can no longer query it correctly (for example, the "get entries" call). To avoid data loss, deleting such a glossary through v2 is disabled; use the v3 deletion endpoint.
+- Avoid mixing versions across a team or codebase. Glossaries created via v3 are still queryable via v2, where they can't be displayed correctly, which causes confusion.
+
+
+Don't use both v2 and v3 glossary endpoints in the same integration. Editing a glossary via v3 changes how it behaves on v2 endpoints.
+
+
+## Editing under v2: the workaround
+
+v2 glossaries are immutable: once created, the entries for a given glossary ID cannot be modified. If you stay on v2, identify glossaries by **name** instead of ID in your application, and modify them with this procedure:
+
+1. [Retrieve](/api-reference/glossaries/retrieve-glossary-entries) and store the current glossary's entries
+2. Modify the entries locally
+3. [Delete](/api-reference/glossaries/delete-a-glossary) the existing glossary
+4. [Create a new glossary](/api-reference/glossaries/create-a-glossary) with the same name
+
+On v3, none of this is necessary; edit dictionaries directly as shown in [Managing Glossaries](/docs/customize/managing-glossaries).
+
+## Client libraries
+
+Each of our [client libraries](/docs/getting-started/client-libraries) provides a guide explaining how to migrate its glossary support to v3.
diff --git a/docs/customize/managing-glossaries.mdx b/docs/customize/managing-glossaries.mdx
new file mode 100644
index 00000000..f61235d3
--- /dev/null
+++ b/docs/customize/managing-glossaries.mdx
@@ -0,0 +1,176 @@
+---
+title: "Managing Glossaries"
+description: "Create, edit, retrieve, and delete DeepL glossaries with the v3 endpoints, and apply them in translation requests."
+covers: [Customize]
+public: true
+---
+
+Glossaries let you specify exact translations for words and short phrases. During translation, DeepL intelligently flexes entries to account for case, gender, tense, and other grammar features when the target language has flexion. This guide shows how to manage glossaries programmatically with the [v3 glossary endpoints](/api-reference/multilingual-glossaries/create-a-glossary) and apply them in translations.
+
+A **glossary** contains one or more **dictionaries**. A dictionary maps source phrases to target phrases for a single language pair, in one direction:
+
+| **French →** | **Spanish** |
+| :--------- | :--------- |
+| belle | hermosa |
+| delicieux | exquisito |
+
+To apply the same terminology in both directions, add a second dictionary with the reverse mapping (Spanish → French). You can create dictionaries for [any language that supports glossaries](/docs/getting-started/supported-languages); to check programmatically, call [`GET /v3/languages?resource=glossary`](/docs/languages/using-the-languages-api).
+
+
+If you're new to glossaries, start with [Glossaries in the Real World](/docs/customize/glossaries-in-the-real-world), a hands-on tutorial that builds one from scratch.
+
+
+## Entry formats
+
+Glossary entries are formatted as CSV (comma-separated values) or TSV (tab-separated values), one entry per line, source phrase first:
+
+```csv CSV entries
+hermosa,belle
+exquisito,delicieux
+```
+
+You can also enclose each phrase in quotation marks. CSV entries follow standard CSV conventions:
+
+- Fields containing double quotes or commas must be enclosed in double quotes
+- A double quote inside a quoted field is escaped by doubling it (`""`)
+
+TSV is identical except that a tab separates the source and target phrases. In CSV, you can optionally append the source and target language after the phrases; entries whose languages don't match the dictionary's language pair are ignored.
+
+## Create a glossary
+
+Send `POST /v3/glossaries` an array of one or more dictionaries. This example creates a glossary with an English → German dictionary and its reverse:
+
+```sh Example request
+curl -X POST https://api.deepl.com/v3/glossaries \
+ --header "Authorization: DeepL-Auth-Key $API_KEY" \
+ --header "Content-Type: application/json" \
+ --data '{
+ "name": "My Glossary",
+ "dictionaries": [
+ {
+ "source_lang": "en",
+ "target_lang": "de",
+ "entries": "Hello\tGuten Tag",
+ "entries_format": "tsv"
+ },
+ {
+ "source_lang": "de",
+ "target_lang": "en",
+ "entries": "Guten Tag\tHello",
+ "entries_format": "tsv"
+ }
+ ]
+}'
+```
+
+```json Example response
+{
+ "glossary_id": "def3a26b-3e84-45b3-84ae-0c0aaf3525f7",
+ "ready": true,
+ "name": "My Glossary",
+ "dictionaries": [
+ { "source_lang": "en", "target_lang": "de", "entry_count": 1 },
+ { "source_lang": "de", "target_lang": "en", "entry_count": 1 }
+ ],
+ "creation_time": "2025-08-03T14:16:18.329Z"
+}
+```
+
+To create a glossary from an existing CSV file on the command line, use [`jq`](https://jqlang.github.io/jq/) to embed the file contents in the request body:
+
+```sh Create a glossary from a CSV file
+curl -X POST https://api.deepl.com/v3/glossaries \
+ --header "Authorization: DeepL-Auth-Key $API_KEY" \
+ --header "Content-Type: application/json" \
+ --data "$(jq -Rs '{
+ "name": "My Glossary",
+ "dictionaries": [
+ {
+ "source_lang": "en",
+ "target_lang": "de",
+ "entries": .,
+ "entries_format": "csv"
+ }
+ ]
+ }' glossary.csv)"
+```
+
+## Use a glossary in a translation
+
+Include the `glossary_id` in a [`/v2/translate`](/api-reference/translate/request-translation) or [`/v2/document`](/api-reference/document/upload-and-translate-a-document) request. You must also set `source_lang`: glossaries can't yet be used with automatic source language detection.
+
+```sh Example request
+curl -X POST https://api.deepl.com/v2/translate \
+ --header "Authorization: DeepL-Auth-Key $API_KEY" \
+ --header "Content-Type: application/json" \
+ --data '{
+ "text": ["Hello"],
+ "source_lang": "EN",
+ "target_lang": "DE",
+ "glossary_id": "def3a26b-3e84-45b3-84ae-0c0aaf3525f7"
+}'
+```
+
+```json Example response
+{
+ "translations": [
+ {
+ "detected_source_language": "EN",
+ "text": "Guten Tag"
+ }
+ ]
+}
+```
+
+Glossaries apply to root languages, not specific variants: a glossary with target language `EN` applies when translating into `EN-US` and `EN-GB` alike, and must be created with the root code. See [How to Apply Customizations to Language Variants](/docs/customize/customizations-for-variants).
+
+The `v3` endpoints handle glossary management only; translation itself stays on the `v2` endpoints.
+
+## Edit a glossary
+
+Two methods change an existing glossary, with different semantics:
+
+| Method | Scope | Behavior |
+| :---- | :---- | :---- |
+| [`PUT /v3/glossaries/{id}/dictionaries`](/api-reference/multilingual-glossaries/replaces-or-creates-a-dictionary-in-the-glossary-with-the-specified-entries) | One dictionary | Creates the dictionary for the given language pair, or **replaces** it entirely if it exists |
+| [`PATCH /v3/glossaries/{id}`](/api-reference/multilingual-glossaries/edit-glossary-details) | Whole glossary | Updates metadata like the name; entries passed for a language pair are **merged** into the existing dictionary |
+
+For example, this `PATCH` renames a glossary and adds one entry to its English → German dictionary, keeping existing entries:
+
+```sh Example request
+curl -X PATCH https://api.deepl.com/v3/glossaries/def3a26b-3e84-45b3-84ae-0c0aaf3525f7 \
+ --header "Authorization: DeepL-Auth-Key $API_KEY" \
+ --header "Content-Type: application/json" \
+ --data '{
+ "name": "Gertrude the glossary",
+ "dictionaries": [{
+ "source_lang": "en",
+ "target_lang": "de",
+ "entries": "Goodbye\tTschüß",
+ "entries_format": "tsv"
+ }]
+}'
+```
+
+A single `PUT` or `PATCH` can change one dictionary. To change the same source phrase across multiple language pairs, make one call per dictionary.
+
+## Retrieve glossaries
+
+- [`GET /v3/glossaries`](/api-reference/multilingual-glossaries/list-all-glossaries) lists all your glossaries with per-dictionary metadata (no entries)
+- [`GET /v3/glossaries/{id}`](/api-reference/multilingual-glossaries/retrieve-glossary-details) returns one glossary's metadata
+- [`GET /v3/glossaries/{id}/entries`](/api-reference/multilingual-glossaries/retrieve-glossary-entries) returns the entries of a single dictionary, selected via `source_lang` and `target_lang` query parameters. Entries are currently returned in TSV format only.
+
+To retrieve the contents of an entire glossary, iterate over its dictionaries and fetch each one's entries.
+
+## Delete glossaries
+
+- [`DELETE /v3/glossaries/{id}`](/api-reference/multilingual-glossaries/delete-a-glossary) deletes the whole glossary
+- [`DELETE /v3/glossaries/{id}/dictionaries?source_lang=...&target_lang=...`](/api-reference/multilingual-glossaries/deletes-the-dictionary-associated-with-the-given-language-pair-with-the-given-glossary-id) deletes a single dictionary
+
+## Limits and restrictions
+
+- Each dictionary can contain up to 10 MB of entries; a glossary with five dictionaries can hold up to 50 MB in total
+- The glossary name, each source phrase, and each target phrase can contain up to 1024 UTF-8 bytes
+- Duplicate source entries are not allowed, and neither source nor target may be empty
+- Entries must not contain control characters (such as `\t` or `\n` inside a phrase), Unicode newlines, or leading/trailing whitespace
+- The number of glossaries per account is [limited by your plan](https://www.deepl.com/en/pro-api)
diff --git a/docs/customize/overview.mdx b/docs/customize/overview.mdx
new file mode 100644
index 00000000..d052ee53
--- /dev/null
+++ b/docs/customize/overview.mdx
@@ -0,0 +1,48 @@
+---
+title: "Customize"
+sidebarTitle: "Overview"
+description: "Tailor DeepL translations to your domain with glossaries, style rules, custom instructions, and translation memories."
+public: true
+---
+
+DeepL's customization features let you control terminology, style, and consistency across your translations. They complement each other, and you can combine them in a single request:
+
+| Feature | What it controls | How it's applied |
+| :---- | :---- | :---- |
+| [Glossaries](/docs/customize/managing-glossaries) | Exact translations for specific terms, like product names or industry vocabulary | Stored on your account; passed per request via `glossary_id` |
+| [Style rules](/docs/customize/using-style-rules) | Formatting conventions (dates, numbers, punctuation) plus stored custom instructions | Stored on your account; passed per request via `style_id` |
+| [Custom instructions](/docs/customize/custom-instructions) | Tone, phrasing, and domain-specific behavior via natural-language directives | Inline per request via `custom_instructions`, or stored in a style rule list |
+| [Translation memories](/docs/customize/using-translation-memories) | Reuse of your previously approved translations for matching segments | Stored on your account; passed per request via `translation_memory_id` |
+
+All of these work with both [text translation](/docs/translate/translate-text-quickstart) and [document translation](/docs/translate/translate-documents-quickstart), and with all `model_type` values.
+
+
+Glossaries and style rules are unique to each of DeepL's global data centers and are not shared between them. Clients using [regional endpoints](/docs/getting-started/regional-endpoints) can't access glossaries or style rules created in the UI at this time.
+
+
+## Start here
+
+
+
+ A hands-on tutorial: build a glossary and apply it to keep customer-facing terminology consistent.
+
+
+ Create, edit, retrieve, and delete glossaries with the v3 endpoints, and use them in translations.
+
+
+ Build style rule lists with configured rules and custom instructions, and apply them via style_id.
+
+
+ Best practices for writing natural-language instructions that produce consistent results.
+
+
+ Retrieve your translation memories and control the matching threshold in translation requests.
+
+
+ Create customizations with root language codes and apply them to variants like pt-BR or fr-CA.
+
+
+
+## API reference
+
+Glossaries, style rules, and translation memories each have management endpoints under the [API Reference](/api-reference/multilingual-glossaries/create-a-glossary). If you're still on the deprecated v2 glossary endpoints, see [Glossary v2 vs v3 Endpoints](/docs/customize/glossary-v2-vs-v3-endpoints) for the differences and migration considerations.
diff --git a/docs/customize/using-style-rules.mdx b/docs/customize/using-style-rules.mdx
new file mode 100644
index 00000000..b7c293e0
--- /dev/null
+++ b/docs/customize/using-style-rules.mdx
@@ -0,0 +1,115 @@
+---
+title: "Using Style Rules"
+description: "Create style rule lists with configured rules and custom instructions, and apply them to translations with the style_id parameter."
+covers: [Customize]
+public: true
+---
+
+Style rules apply a reusable set of formatting and style conventions to your translations. A **style rule list** combines two types of rules:
+
+- **Configured rules**: predefined options for formatting conventions, like time format, number formatting, and punctuation
+- **Custom instructions**: your own natural-language instructions for requirements the predefined rules don't cover
+
+Both are applied together during translation. You can build style rule lists in the UI at [deepl.com/custom-rules](https://deepl.com/custom-rules) or manage them programmatically with the [style rules endpoints](/api-reference/style-rules/list-all-style-rules), as shown below.
+
+
+The Style Rules API is currently available only to Pro API subscribers.
+
+
+## Create a style rule list
+
+Send `POST /v3/style_rules` a name, the target `language` the rules apply to, and the rules themselves:
+
+```sh Example request
+curl -X POST https://api.deepl.com/v3/style_rules \
+ --header "Authorization: DeepL-Auth-Key $API_KEY" \
+ --header "Content-Type: application/json" \
+ --data '{
+ "name": "Technical Documentation Rules",
+ "language": "en",
+ "configured_rules": {
+ "dates_and_times": {
+ "calendar_era": "use_bc_and_ad"
+ },
+ "punctuation": {
+ "periods_in_academic_degrees": "do_not_use"
+ }
+ },
+ "custom_instructions": [
+ {
+ "label": "Tone instruction",
+ "prompt": "Use a friendly, diplomatic tone",
+ "source_language": "en"
+ }
+ ]
+}'
+```
+
+```json Example response
+{
+ "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994",
+ "name": "Technical Documentation Rules",
+ "creation_time": "2024-10-01T12:34:56Z",
+ "updated_time": "2024-10-01T12:34:56Z",
+ "language": "en",
+ "version": 1,
+ "configured_rules": {
+ "dates_and_times": {
+ "calendar_era": "use_bc_and_ad"
+ },
+ "punctuation": {
+ "periods_in_academic_degrees": "do_not_use"
+ }
+ },
+ "custom_instructions": [
+ {
+ "id": "68fdb803-c013-4e67-b62e-1aad0ab519cd",
+ "label": "Tone instruction",
+ "prompt": "Use a friendly, diplomatic tone",
+ "source_language": "en"
+ }
+ ]
+}
+```
+
+The `version` field increments each time the list is modified, so you can track changes to your style rules. See the [endpoint reference](/api-reference/style-rules/create-style-rule) for all available configured rule categories and options, and the [custom instructions guide](/docs/customize/custom-instructions) for how to write instructions that work well.
+
+## Apply style rules to a translation
+
+Pass the list's `style_id` in a [`/v2/translate`](/api-reference/translate/request-translation) or [`/v2/document`](/api-reference/document/upload-and-translate-a-document) request. The target language of the request has to match the style rule list's `language`:
+
+```sh Example request
+curl -X POST https://api.deepl.com/v2/translate \
+ --header "Authorization: DeepL-Auth-Key $API_KEY" \
+ --header "Content-Type: application/json" \
+ --data '{
+ "text": ["Das Treffen ist um 15:00 Uhr"],
+ "source_lang": "DE",
+ "target_lang": "EN",
+ "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994"
+}'
+```
+
+All `model_type` values are supported with style rules. Style rules apply to root languages, so a list with `language: "en"` works for `EN-US` and `EN-GB` targets alike; see [How to Apply Customizations to Language Variants](/docs/customize/customizations-for-variants).
+
+## Update a style rule list
+
+As with glossaries, the update methods have different scopes:
+
+- [`PATCH /v3/style_rules/{style_id}`](/api-reference/style-rules/update-style-rule) updates the list's name
+- [`PUT /v3/style_rules/{style_id}/configured_rules`](/api-reference/style-rules/update-configured-rules) **replaces all** configured rules; custom instructions are not affected
+
+Custom instructions are managed individually within a list:
+
+- [`POST /v3/style_rules/{style_id}/custom_instructions`](/api-reference/style-rules/create-custom-instruction) adds an instruction
+- [`PUT .../custom_instructions/{instruction_id}`](/api-reference/style-rules/update-custom-instruction) replaces one (all fields required)
+- [`DELETE .../custom_instructions/{instruction_id}`](/api-reference/style-rules/delete-custom-instruction) removes one
+
+To list or inspect rule lists, use [`GET /v3/style_rules`](/api-reference/style-rules/list-all-style-rules) (add `detailed=true` to include each list's rules and instructions) or [`GET /v3/style_rules/{style_id}`](/api-reference/style-rules/get-style-rule). Deleting a list with [`DELETE /v3/style_rules/{style_id}`](/api-reference/style-rules/delete-style-rule) cannot be undone.
+
+## Limits
+
+- Style rule lists support target languages `de`, `en`, `es`, `fr`, `it`, `ja`, `ko`, and `zh`
+- There is no limit on the number of configured rules per list
+- A list can hold up to 200 custom instructions (this cap may be adjusted per plan tier in the future); each instruction prompt is limited to 300 characters
+- If you need more than 200 custom instructions, split your rules across multiple style rule lists for different content types
diff --git a/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories.mdx b/docs/customize/using-translation-memories.mdx
similarity index 98%
rename from docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories.mdx
rename to docs/customize/using-translation-memories.mdx
index 805c6423..7c10354f 100644
--- a/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories.mdx
+++ b/docs/customize/using-translation-memories.mdx
@@ -1,7 +1,8 @@
---
-title: "Translate text using a translation memory"
-sidebarTitle: "Translation memories"
+title: "Using Translation Memories"
description: "Learn how to retrieve your translation memories and use them in translation requests"
+covers: [Customize]
+public: true
---
## About translation memories
diff --git a/docs/getting-started/about.mdx b/docs/getting-started/about.mdx
index c0ead69e..5a88d6b1 100644
--- a/docs/getting-started/about.mdx
+++ b/docs/getting-started/about.mdx
@@ -22,9 +22,9 @@ In addition, many leading computer-assisted translation (CAT) tool providers hav
## Why the DeepL API?
-- **High-quality text and document translations**: DeepL [consistently outperforms the competition](https://www.deepl.com/quality.html) in translation quality—and not only for text translation. The API also supports [many document, publishing, and localization formats](/api-reference/document) including DOCX, PPTX, XLSX, PDF, HTML, IDML, XLIFF, XML, JSON, DITA, and MIF.
+- **High-quality text and document translations**: DeepL [consistently outperforms the competition](https://www.deepl.com/quality.html) in translation quality—and not only for text translation. The API also supports [many document, publishing, and localization formats](/api-reference/document/upload-and-translate-a-document) including DOCX, PPTX, XLSX, PDF, HTML, IDML, XLIFF, XML, JSON, DITA, and MIF.
- **Maximum data security**: With DeepL API paid plans, texts aren’t saved on persistent storage and aren’t used to train our models. And DeepL adheres strictly to EU data protection laws and ISO 27001. [Learn more about data security at DeepL](https://www.deepl.com/pro-data-security/).
-- **Customization with glossaries**: [Specify your own translations for words and phrases](/api-reference/multilingual-glossaries), and customize your translations consistently and at scale.
+- **Customization with glossaries**: [Specify your own translations for words and phrases](/docs/customize/managing-glossaries), and customize your translations consistently and at scale.
To access the DeepL API, [sign up for a plan](https://www.deepl.com/en/pro#api).
diff --git a/docs/getting-started/auth.mdx b/docs/getting-started/auth.mdx
index b953d57b..6a495887 100644
--- a/docs/getting-started/auth.mdx
+++ b/docs/getting-started/auth.mdx
@@ -32,7 +32,7 @@ Keep your API key secure at all times. Do not use it in client-side code.
If your authentication key becomes compromised, you also deactivate it and create a new key in [the "API Keys" tab](https://www.deepl.com/your-account/keys).
-Learn more about managing your DeepL API keys [here](/docs/getting-started/managing-api-keys).
+Learn more about managing your DeepL API keys [here](/docs/admin/managing-api-keys).
The authentication key is provided by setting the *Authorization* HTTP header to `DeepL-Auth-Key [yourAuthKey]`.
diff --git a/docs/getting-started/client-libraries-reference.mdx b/docs/getting-started/client-libraries-reference.mdx
index 19bf4890..69934885 100644
--- a/docs/getting-started/client-libraries-reference.mdx
+++ b/docs/getting-started/client-libraries-reference.mdx
@@ -41,5 +41,5 @@ For terminal-based workflows, scripting, and CI/CD pipelines, see the [DeepL CLI
## Community-created client libraries
-The DeepL community [maintains client libraries](https://github.com/DeepLcom/awesome-deepl?tab=readme-ov-file#community-libraries--sdks) for other languages, including [Dart](https://github.com/komape/deepl_dart), [Go](https://github.com/candy12t/go-deepl), [Rust](https://github.com/Avimitin/deepl-rs), and [Kotlin](https://github.com/SimplyMika/DeeplKt).
+The DeepL community [maintains client libraries](https://github.com/DeepL/awesome-deepl?tab=readme-ov-file#community-libraries--sdks) for other languages, including [Dart](https://github.com/komape/deepl_dart), [Go](https://github.com/candy12t/go-deepl), [Rust](https://github.com/Avimitin/deepl-rs), and [Kotlin](https://github.com/SimplyMika/DeeplKt).
diff --git a/docs/getting-started/client-libraries.mdx b/docs/getting-started/client-libraries.mdx
index 436e0615..dc961789 100644
--- a/docs/getting-started/client-libraries.mdx
+++ b/docs/getting-started/client-libraries.mdx
@@ -8,7 +8,7 @@ mode: "wide"
## Overview
You can use many popular programming languages to access the DeepL API.
-DeepL enables this through six official client libraries. [Hosted on GitHub](https://github.com/DeepLcom), these client libraries handle API requests and help parse responses so you can focus on building your application. For example, [the JavaScript library's `translateDocument()` function](https://github.com/DeepLcom/deepl-node?tab=readme-ov-file#translating-documents) handles the document translation workflow - uploading a document, polling for completion, and downloading the result.
+DeepL enables this through six official client libraries. [Hosted on GitHub](https://github.com/DeepL), these client libraries handle API requests and help parse responses so you can focus on building your application. For example, [the JavaScript library's `translateDocument()` function](https://github.com/DeepL/deepl-node?tab=readme-ov-file#translating-documents) handles the document translation workflow - uploading a document, polling for completion, and downloading the result.
This documentation site frequently includes code samples in the six programming languages DeepL supports and maintains. But for complete information, setup instructions, installation steps, and code samples, see these GitHub repositories:
@@ -36,11 +36,11 @@ This documentation site frequently includes code samples in the six programming
## Community-created client libraries
-The DeepL community [maintains client libraries](https://github.com/DeepLcom/awesome-deepl?tab=readme-ov-file#community-libraries--sdks) for other languages, including [Dart](https://github.com/komape/deepl_dart), [Go](https://github.com/candy12t/go-deepl), [Rust](https://github.com/Avimitin/deepl-rs), and [Kotlin](https://github.com/SimplyMika/DeeplKt).
+The DeepL community [maintains client libraries](https://github.com/DeepL/awesome-deepl?tab=readme-ov-file#community-libraries--sdks) for other languages, including [Dart](https://github.com/komape/deepl_dart), [Go](https://github.com/candy12t/go-deepl), [Rust](https://github.com/Avimitin/deepl-rs), and [Kotlin](https://github.com/SimplyMika/DeeplKt).
## Next steps
Now that you've found your client library, here are a few ways to keep learning about the DeepL API:
* try sample requests [in our playground](https://developers.deepl.com/api-reference/translate/request-translation?playground=open)
-* [DeepL 101](/docs/learning-how-tos/examples-and-guides/first-things-to-try-with-the-deepl-api) - a quick guide to text and document translation
-* [Translation: a beginner's guide](/docs/learning-how-tos/examples-and-guides/translation-beginners-guide) - a detailed guide to fundamental translation features
+* [Translate Text Quickstart](/docs/translate/translate-text-quickstart) - send your first text translation requests
+* [Translate Documents Quickstart](/docs/translate/translate-documents-quickstart) - translate a complete file, formatting included
diff --git a/docs/getting-started/deepl-cli.mdx b/docs/getting-started/deepl-cli.mdx
index 1e8dfa4d..9d84f944 100644
--- a/docs/getting-started/deepl-cli.mdx
+++ b/docs/getting-started/deepl-cli.mdx
@@ -9,7 +9,7 @@ public: true
- How to authenticate and run your first translation
- What commands are available for translation, writing, voice, and more
-The [DeepL CLI](https://github.com/DeepLcom/deepl-cli) is an open-source (MIT license) command-line tool for interacting with the DeepL API. It covers text translation, document translation, writing enhancement, voice translation, glossary management, and admin operations — all from your terminal.
+The [DeepL CLI](https://github.com/DeepL/deepl-cli) is an open-source (MIT license) command-line tool for interacting with the DeepL API. It covers text translation, document translation, writing enhancement, voice translation, glossary management, and admin operations — all from your terminal.
## Installation
@@ -21,7 +21,7 @@ The CLI requires [Node.js](https://nodejs.org/) (v18+) and build tools for nativ
```bash
-git clone https://github.com/DeepLcom/deepl-cli.git
+git clone https://github.com/DeepL/deepl-cli.git
cd deepl-cli
npm install
npm run build
@@ -125,6 +125,6 @@ deepl hooks install --pre-commit --languages de,fr
## Further reading
-- [DeepL CLI on GitHub](https://github.com/DeepLcom/deepl-cli) — full documentation, changelog, and source code
+- [DeepL CLI on GitHub](https://github.com/DeepL/deepl-cli) — full documentation, changelog, and source code
- [DeepL API authentication](/docs/getting-started/auth) — set up your API key
- [Client libraries](/docs/getting-started/client-libraries) — official SDKs for six languages
diff --git a/docs/getting-started/deepl-mcp-server.mdx b/docs/getting-started/deepl-mcp-server.mdx
index 511c0940..5c568ed3 100644
--- a/docs/getting-started/deepl-mcp-server.mdx
+++ b/docs/getting-started/deepl-mcp-server.mdx
@@ -9,7 +9,7 @@ public: true
- How to install and configure it for Claude Code and Claude Desktop
- What tools are available to your AI agent
-The [DeepL MCP Server](https://github.com/DeepLcom/deepl-mcp-server) is an open-source (MIT license) [Model Context Protocol](https://modelcontextprotocol.io/) server that gives AI agents access to DeepL's translation, text improvement, and glossary capabilities. MCP lets AI agents discover and call external tools through a standardized protocol — your agent sends a tool request to the MCP server, which calls the DeepL API and returns the result.
+The [DeepL MCP Server](https://github.com/DeepL/deepl-mcp-server) is an open-source (MIT license) [Model Context Protocol](https://modelcontextprotocol.io/) server that gives AI agents access to DeepL's translation, text improvement, and glossary capabilities. MCP lets AI agents discover and call external tools through a standardized protocol — your agent sends a tool request to the MCP server, which calls the DeepL API and returns the result.
Looking to give your AI tool access to the DeepL documentation itself? See the [Docs MCP Server](/docs/getting-started/docs-mcp-server) for source-grounded answers about the DeepL API.
@@ -113,7 +113,7 @@ The agent will automatically use the appropriate DeepL tool to fulfill the reque
Now that you know how to use the DeepL MCP Server:
-- **Explore the source:** Review the [DeepL MCP Server on GitHub](https://github.com/DeepLcom/deepl-mcp-server) for full documentation and source code
+- **Explore the source:** Review the [DeepL MCP Server on GitHub](https://github.com/DeepL/deepl-mcp-server) for full documentation and source code
- **Build your own:** Follow the [MCP Server Cookbook](/docs/learning-how-tos/examples-and-guides/deepl-mcp-server-how-to-build-and-use-translation-in-llm-applications) to create a custom MCP server from scratch
- **Set up authentication:** Learn about [DeepL API authentication](/docs/getting-started/auth) and key management
- **Use client libraries:** Explore the [official SDKs](/docs/getting-started/client-libraries) for Python, Node.js, and more
diff --git a/docs/getting-started/managing-api-keys.mdx b/docs/getting-started/managing-api-keys.mdx
deleted file mode 100644
index 20f9d935..00000000
--- a/docs/getting-started/managing-api-keys.mdx
+++ /dev/null
@@ -1,281 +0,0 @@
----
-title: "Managing API keys"
-description: "A guide to creating API keys, getting API key-level usage, setting API key-level limits, and scoping keys to specific endpoints."
-public: true
----
-
-
-This page describes managing API keys in the self-admin area. An [Admin API](/api-reference/admin-api) for API key management is also available to all API Growth and API Enterprise subscribers, and to a limited set of Pro API subscribers.
-
-
-### Get started
-
-You can find and manage your API keys in the [“API Keys & Limits” tab](https://www.deepl.com/your-account/keys) when signed into your DeepL API account. It’s possible to create multiple, simultaneously active API keys in a single API subscription.
-
-
-
-
-
-### **Basic API key management**
-
-**Create new key**
-
-Creates a new API key. You can optionally give an API key a name of your choosing during the creation process. If you do not name the key, the name “DeepL API Key” will be given to the key automatically.
-
-
-
-
-
-Pro API subscribers can create up to 25 simultaneously active API keys. Free API subscribers can create up to 2 simultaneously active API keys.
-
-Giving your API keys a name during the key creation process makes it possible for you to search for the key by name using the search bar on the “API keys” tab:
-
-
-
-
-
-After creating a key, a popup with the newly created key will appear. You can copy the key from this popup and use the key immediately. You can also copy the key from the table in the “API keys” tab at any time.
-
-
-
-
-
-#### Deactivate key
-
-Deactivates an active API key. **IMPORTANT:** an API key will stop working immediately when it is deactivated. After a key is deactivated, it cannot be reactivated—deactivating a key is permanent!
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### Rename key
-
-Allows you to edit the name of an API key. Note that it *is* possible for two keys to have the same name.
-
-Both active and deactivated keys can be renamed.
-
-
-
-
-
-**Copy key**
-
-Copies the API key to your clipboard. For security reasons, we do not show the full key in the table in the “API Keys & Limits” tab. Both active and revoked keys can be copied.
-
-
-
-
-
-
-To learn how to see API key-level usage data, see [Retrieving usage data](/docs/retrieving-usage-data).
-
-
-### **Set API key-level usage limits**
-
-It's possible to set an API key-level usage limit. Key-level limits restrict the number of total characters (across text translation, document translation, and text improvement) that can be consumed by an API key in a one-month usage period. You can see the dates of your current usage period in [the Usage tab](https://www.deepl.com/your-account/usage).
-
-For example, if you set a key-level usage limit of 1,000,000 characters, the API key will not consume more than 1,000,000 characters per usage period.
-
-In the ["API Keys & Limits" tab](https://www.deepl.com/your-account/keys), the "Characters consumed" column in the API keys table shows the number of characters consumed by an API key in the current usage period. The character count will "reset" at the start of the next usage period, at which point the key will again be able to consume characters.
-
-As with subscription-level cost control:
-
-* You'll receive notification emails when 80% and 100% of a key-level limit has been reached
-* The API will respond with `456 Quota exceeded` errors when 100% of a key-level limit has been reached
-
-
-It's possible to set an API key-level limit to 0, which means the API key will not be able to consume characters.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### API key permissions
-
-API key permissions, introduced in June 2026, let you limit what a developer API key can do. Instead of one key with full access to every endpoint, you can issue keys that are scoped to specific operations, for example a key that can only translate text or a key that can only read glossaries.
-
-Permissions are implemented as scopes. Each scope groups a set of related operations into a single capability you can grant to a key. This section uses "permissions" for the user-facing feature and "scopes" for the technical mechanism.
-
-Permissions are currently supported only for developer API keys. An account can hold any mix of scoped and unrestricted developer keys.
-
-API key permissions are available on the API Pro, API Developer, API Growth, and API Enterprise plans.
-
-**When to use scoped keys**
-
-| **Key Type** | **Choose When** |
-| --- | --- |
-| **Unrestricted** | A key can access any endpoint and doesn't need to be limited in any way. |
-| **Scoped** | A key should have access only to specific endpoints, for example to prevent glossaries from being modified inadvertently. |
-
-Before API key permissions, every DeepL API key behaved like an unrestricted key.
-
-**How scopes work**
-
-Developer keys can be turned into scoped keys by assigning them one or more scopes. Once a key is scoped:
-
-- It can call only the endpoints fully covered by its scopes.
-- Every other endpoint returns `403 Forbidden`, including any endpoint that has no scope requirement of its own.
-- Some endpoints require more than one scope. A key must hold all of them; if any is missing, the request is denied and the response lists the missing scopes.
-
-Scopes are enforced only on scoped keys. Unrestricted keys retain full access to every endpoint. Existing keys remain unrestricted by default, but you can assign them scopes at any time.
-
-**Available scopes**
-
-
-
- | **Method** | **Endpoint** |
- | --- | --- |
- | `POST` | [`/v2/translate`](/api-reference/translate/request-translation) |
-
-
-
- | **Method** | **Endpoint** |
- | --- | --- |
- | `POST` | [`/v2/document`](/api-reference/document/upload-and-translate-a-document) |
- | `GET` | [`/v2/document/{document_id}`](/api-reference/document/check-document-status) |
- | `GET` | [`/v2/document/{document_id}/result`](/api-reference/document/download-translated-document) |
-
-
-
- | **Method** | **Endpoint** |
- | --- | --- |
- | `POST` | [`/v2/write/rephrase`](/api-reference/improve-text/request-text-improvement) |
- | `POST` | [`/v2/write/correct`](/api-reference/improve-text/correct-text) |
-
-
-
- | **Method** | **Endpoint** |
- | --- | --- |
- | `GET` | [`/v3/glossaries`](/api-reference/multilingual-glossaries/list-all-glossaries) |
- | `GET` | [`/v3/glossaries/{glossary_id}`](/api-reference/multilingual-glossaries/retrieve-glossary-details) |
- | `GET` | [`/v3/glossaries/{glossary_id}/entries`](/api-reference/multilingual-glossaries/retrieve-glossary-entries) |
- | `GET` | [`/v2/glossaries`](/api-reference/glossaries/list-all-glossaries) |
- | `GET` | [`/v2/glossaries/{glossary_id}`](/api-reference/glossaries/retrieve-glossary-details) |
- | `GET` | [`/v2/glossaries/{glossary_id}/entries`](/api-reference/glossaries/retrieve-glossary-entries) |
- | `GET` | [`/v2/glossary-language-pairs`](/api-reference/multilingual-glossaries/list-language-pairs-supported-by-glossaries) |
-
-
-
- | **Method** | **Endpoint** |
- | --- | --- |
- | `POST` | [`/v3/glossaries`](/api-reference/multilingual-glossaries/create-a-glossary) |
- | `PATCH` | [`/v3/glossaries/{glossary_id}`](/api-reference/multilingual-glossaries/edit-glossary-details) |
- | `PUT` | [`/v3/glossaries/{glossary_id}/dictionaries`](/api-reference/multilingual-glossaries/replaces-or-creates-a-dictionary-in-the-glossary-with-the-specified-entries) |
- | `DELETE` | [`/v3/glossaries/{glossary_id}`](/api-reference/multilingual-glossaries/delete-a-glossary) |
- | `DELETE` | [`/v3/glossaries/{glossary_id}/dictionaries`](/api-reference/multilingual-glossaries/deletes-the-dictionary-associated-with-the-given-language-pair-with-the-given-glossary-id) |
- | `POST` | [`/v2/glossaries`](/api-reference/glossaries/create-a-glossary) |
- | `DELETE` | [`/v2/glossaries/{glossary_id}`](/api-reference/glossaries/delete-a-glossary) |
-
-
-
- | **Method** | **Endpoint** |
- | --- | --- |
- | `GET` | [`/v3/style_rules`](/api-reference/style-rules/list-all-style-rules) |
- | `GET` | [`/v3/style_rules/{style_id}`](/api-reference/style-rules/get-style-rule) |
- | `GET` | [`/v3/style_rules/{style_id}/custom_instructions/{instruction_id}`](/api-reference/style-rules/get-custom-instruction) |
-
-
-
- | **Method** | **Endpoint** |
- | --- | --- |
- | `POST` | [`/v3/style_rules`](/api-reference/style-rules/create-style-rule) |
- | `PATCH` | [`/v3/style_rules/{style_id}`](/api-reference/style-rules/update-style-rule) |
- | `PUT` | [`/v3/style_rules/{style_id}/configured_rules`](/api-reference/style-rules/update-configured-rules) |
- | `DELETE` | [`/v3/style_rules/{style_id}`](/api-reference/style-rules/delete-style-rule) |
- | `POST` | [`/v3/style_rules/{style_id}/custom_instructions`](/api-reference/style-rules/create-custom-instruction) |
- | `PUT` | [`/v3/style_rules/{style_id}/custom_instructions/{instruction_id}`](/api-reference/style-rules/update-custom-instruction) |
- | `DELETE` | [`/v3/style_rules/{style_id}/custom_instructions/{instruction_id}`](/api-reference/style-rules/delete-custom-instruction) |
-
-
-
- | **Method** | **Endpoint** |
- | --- | --- |
- | `GET` | [`/v3/translation_memories`](/api-reference/translation-memory/list-translation-memories) |
-
-
-
- | **Method** | **Endpoint** |
- | --- | --- |
- | `GET` | [`/v3/languages`](/api-reference/languages/retrieve-languages-by-resource) |
- | `GET` | [`/v3/languages/resources`](/api-reference/languages/retrieve-resources) |
- | `GET` | [`/v2/languages`](/api-reference/languages/retrieve-supported-languages) |
-
-
-
- | **Method** | **Endpoint** |
- | --- | --- |
- | `GET` | [`/v2/usage`](/api-reference/usage-and-quota/check-usage-and-limits) |
-
-
-
-
- **Voice API support is coming.** Permissions don't yet cover the Voice API, so there's no Voice scope to assign. Because a scoped key is blocked from every endpoint its scopes don't cover, a scoped key can't currently reach the Voice API at all. Use an unrestricted key for any workload that needs Voice until Voice scopes ship in a future update.
-
-
-**Create a scoped key**
-
-Open the ["API Keys & Limits" tab](https://www.deepl.com/your-account/keys) in your account. Click "Create key" and optionally name the key.
-
-Select **Custom permissions**, then choose one or more scopes from the list.
-
-Click "Create key" to confirm. The key is created with the chosen scopes and shown once in a popup so you can copy it.
-
-
-
-
-
-**Edit scopes on an existing key**
-
-You can change scopes on any existing developer API key, including keys that were originally unrestricted.
-
-In the API keys table, open the key's menu and select "Edit permissions". Choose **All access** to make the key unrestricted, or **Custom permissions** to select specific scopes. Click "Save" to apply.
-
-
-
-
-
-
-
-
-
-**Identify scoped and unrestricted keys**
-
-The API keys table includes a column showing each key's permissions. Hover over the badge to view the assigned scopes.
-
-
-
-
-
-
-
-
-
-**Error responses**
-
-When a scoped key calls an endpoint outside its scopes, the API returns a `403 Forbidden` response. The `detail` field lists the scopes the key is missing:
-
-```json
-{
- "message": "Forbidden",
- "detail": "Missing required scope(s): glossaries:write"
-}
-```
-
-To resolve it, call an endpoint covered by the key's scopes, or add the missing scope to the key.
diff --git a/docs/getting-started/quickstart.mdx b/docs/getting-started/quickstart.mdx
index 3001d5b0..b404096f 100644
--- a/docs/getting-started/quickstart.mdx
+++ b/docs/getting-started/quickstart.mdx
@@ -12,24 +12,16 @@ New user? Follow these quick steps to get started with the DeepL API.
Visit [our plans page](https://www.deepl.com/pro-api#api-pricing), choose a plan, and sign up.
-
- If you already have a DeepL Translator account, you will need to log out and [create a new account for the DeepL API](https://support.deepl.com/hc/articles/360019358999-Change-plan).
-
+ If you already have a DeepL Translator account, you will need to log out and [create a new account](https://support.deepl.com/hc/articles/360019358999-Change-plan).
-
+
Find your API key [here](https://www.deepl.com/your-account/keys).
- Then try making a simple translation request in one of these ways:
- * cURL or an HTTP request
- * with [our client libraries](/docs/getting-started/client-libraries) for [Python](https://www.github.com/deeplcom/deepl-python), [JavaScript](https://www.github.com/deeplcom/deepl-node), [PHP](https://www.github.com/deeplcom/deepl-php), [.NET](https://www.github.com/deeplcom/deepl-dotnet), [Java](https://www.github.com/deeplcom/deepl-java), or [Ruby](https://www.github.com/deeplcom/deepl-rb)
- * [in our playground](https://developers.deepl.com/api-reference/translate/request-translation?playground=open)
- * [in Postman](/docs/getting-started/test-your-api-requests-with-postman)
-
- If you use the sample code below, be sure to replace `{YOUR_API_KEY}` with your own API key.
+ Then try making a simple translation request.
- If you chose a free API plan and you are writing cURL or HTTP requests, replace `https://api.deepl.com` with `https://api-free.deepl.com`.
+ If you chose a free API plan, replace `https://api.deepl.com` with `https://api-free.deepl.com`.
```http Sample request
@@ -56,7 +48,7 @@ New user? Follow these quick steps to get started with the DeepL API.
- If you chose a free API plan and you are writing cURL or HTTP requests, replace `https://api.deepl.com` with `https://api-free.deepl.com`.
+ If you chose a free API plan, replace `https://api.deepl.com` with `https://api-free.deepl.com`.
```sh Set the API key
@@ -126,7 +118,6 @@ New user? Follow these quick steps to get started with the DeepL API.
```text Sample output
Hallo, Welt!
-
```
In production code, it's safer to store your API key in an environment variable.
@@ -184,7 +175,7 @@ New user? Follow these quick steps to get started with the DeepL API.
```java Install client library
// For instructions on installing the DeepL Java library,
- // see https://github.com/DeepLcom/deepl-java?tab=readme-ov-file#installation
+ // see https://github.com/DeepL/deepl-java?tab=readme-ov-file#installation
```
```java Sample request
@@ -235,17 +226,33 @@ New user? Follow these quick steps to get started with the DeepL API.
-
- [Our official client libraries](/docs/getting-started/client-libraries) let you use the API with six popular programming languages - [Python](https://www.github.com/deeplcom/deepl-python), [JavaScript](https://www.github.com/deeplcom/deepl-node), [PHP](https://www.github.com/deeplcom/deepl-php), [.NET](https://www.github.com/deeplcom/deepl-dotnet), [Java](https://www.github.com/deeplcom/deepl-java), or [Ruby](https://www.github.com/deeplcom/deepl-rb). The DeepL community has [contributed client libraries](https://github.com/DeepLcom/awesome-deepl?tab=readme-ov-file#community-libraries--sdks) for other languages, including [Dart](https://github.com/komape/deepl_dart), [Go](https://github.com/candy12t/go-deepl), and [Rust](https://github.com/Avimitin/deepl-rs). You may also wish to check out [these examples and guides](/docs/learning-how-tos/examples-and-guides).
+
+ Pick the product you want to integrate:
+
+
+
+ Translate text strings and complete documents, with quickstarts for both.
+
+
+ Tailor translations to your domain with glossaries, style rules, and translation memories.
+
+
+ Transcribe and translate spoken audio in real time, starting with the Real-Time Voice Quickstart.
+
+
+ Manage API keys, permissions, and usage across your organization, in the account UI or via the Admin API.
+
+
+
+ [Our official client libraries](/docs/getting-started/client-libraries) wrap the API for Python, JavaScript, PHP, .NET, Java, and Ruby, and the community maintains [libraries for more languages](https://github.com/DeepL/awesome-deepl?tab=readme-ov-file#community-libraries--sdks), including Dart, Go, and Rust.
## Keep exploring
-- [**DeepL 101**](/docs/learning-how-tos/examples-and-guides/first-things-to-try-with-the-deepl-api) - A quick guide to text and document translation, using Postman to play with the API, client libraries for your favorite programming language, and joining our developer community
-- [Translation: a beginner's guide](/docs/learning-how-tos/examples-and-guides/translation-beginners-guide) - A detailed guide to fundamental translation features
-- [Cookbook](/docs/learning-how-tos/cookbook) - Explore short tutorials, examples, projects, and use cases
-- [Guides](/docs/learning-how-tos/examples-and-guides) - Discover in-depth explanations for API features and real-world applications
+- [**Cookbook**](/docs/learning-how-tos/cookbook) - Short tutorials, examples, projects, and use cases
+- [**Guides**](/docs/learning-how-tos/examples-and-guides) - In-depth explanations for API features and real-world applications
+- [**Docs MCP Server**](/docs/getting-started/docs-mcp-server) - Connect your AI tools to this documentation for source-grounded answers
## Community and Support
@@ -253,8 +260,8 @@ New user? Follow these quick steps to get started with the DeepL API.
Support Center
-
- DeepL Bridges - Developer Community
+
+ Discord Community
API Status Page
@@ -262,7 +269,7 @@ New user? Follow these quick steps to get started with the DeepL API.
DeepL Status Page (all services)
-
+
Release Notes
diff --git a/docs/getting-started/regional-endpoints.mdx b/docs/getting-started/regional-endpoints.mdx
index 43c7d4d7..6557b6fe 100644
--- a/docs/getting-started/regional-endpoints.mdx
+++ b/docs/getting-started/regional-endpoints.mdx
@@ -189,7 +189,7 @@ Glossaries and style rules are unique to each of DeepL's regional data centers a
Additionally, the DeepL web UI (at [deepl.com](https://www.deepl.com)) currently only accesses the European Union data center. Glossaries and style rules created in the UI are only accessible via the standard `api.deepl.com` endpoint, not regional endpoints like `api-us.deepl.com` or `api-jp.deepl.com`.
-For more details, see the [Style rules documentation](/api-reference/style-rules).
+For more details, see the [Style rules documentation](/docs/customize/using-style-rules).
---
@@ -197,5 +197,5 @@ For more details, see the [Style rules documentation](/api-reference/style-rules
- [Client libraries](/docs/getting-started/client-libraries) - Language-specific client library documentation and configuration
- [Authentication and access](/docs/getting-started/auth) - API authentication methods and security best practices
-- [Text translation](/api-reference/translate) - Text translation API reference
-- [Admin API](/api-reference/admin-api) - Programmatic API key management for enterprise administrators
+- [Text translation](/api-reference/translate/request-translation) - Text translation API reference
+- [Admin API](/docs/admin/overview) - Programmatic API key management for enterprise administrators
diff --git a/docs/getting-started/supported-languages.mdx b/docs/getting-started/supported-languages.mdx
index ce2d303a..01b51b00 100644
--- a/docs/getting-started/supported-languages.mdx
+++ b/docs/getting-started/supported-languages.mdx
@@ -6,7 +6,7 @@ sidebarTitle: "Languages supported"
mode: "wide"
---
-The DeepL API supports the following languages. These can also be retrieved programmatically via the [`/v3/languages` endpoint](/api-reference/languages/retrieve-supported-languages-by-resource), which returns language support per resource along with feature availability (e.g. formality, glossary, auto-detection). The legacy [`/v2/languages` endpoint](/api-reference/languages/retrieve-supported-languages) is also available but deprecated.
+The DeepL API supports the following languages. These can also be retrieved programmatically via the [`/v3/languages` endpoint](/docs/languages/using-the-languages-api), which returns language support per resource along with feature availability (e.g. formality, glossary, auto-detection). The legacy [`/v2/languages` endpoint](/api-reference/languages/retrieve-supported-languages) is also available but deprecated.
## API Supported Languages
@@ -19,5 +19,5 @@ import { LanguageTable } from "/snippets/language-table.jsx"