From 7f9876ecef7f5c511f398d81c9ac04ecae95bc67 Mon Sep 17 00:00:00 2001 From: Ben Morss Date: Thu, 2 Apr 2026 17:32:23 -0400 Subject: [PATCH 1/9] Put new guide into docs.json --- docs.json | 1 + 1 file changed, 1 insertion(+) diff --git a/docs.json b/docs.json index 6edbcbe9..c7c37dd8 100644 --- a/docs.json +++ b/docs.json @@ -76,6 +76,7 @@ "docs/learning-how-tos/examples-and-guides/placeholder-tags", "docs/learning-how-tos/examples-and-guides/first-things-to-try-with-the-deepl-api", "docs/learning-how-tos/examples-and-guides/glossaries-in-the-real-world", + "docs/learning-how-tos/examples-and-guides/using-custom-instructions-and-style-rules", "docs/learning-how-tos/examples-and-guides/deepl-mcp-server-how-to-build-and-use-translation-in-llm-applications", "docs/learning-how-tos/examples-and-guides/translating-between-variants" ] From 93829757facb3fff65741f8f70467fcf77ef1a42 Mon Sep 17 00:00:00 2001 From: Ben Morss Date: Thu, 2 Apr 2026 17:32:36 -0400 Subject: [PATCH 2/9] First draft, from Claude... well, ok --- ...ng-custom-instructions-and-style-rules.mdx | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 docs/learning-how-tos/examples-and-guides/using-custom-instructions-and-style-rules.mdx diff --git a/docs/learning-how-tos/examples-and-guides/using-custom-instructions-and-style-rules.mdx b/docs/learning-how-tos/examples-and-guides/using-custom-instructions-and-style-rules.mdx new file mode 100644 index 00000000..8e4795bf --- /dev/null +++ b/docs/learning-how-tos/examples-and-guides/using-custom-instructions-and-style-rules.mdx @@ -0,0 +1,139 @@ +--- +title: "How to Use Custom Instructions and Style Rules" +description: "Control translation tone, formatting, and style with custom instructions and style rule lists." +public: true +--- + +**This guide shows you:** +- What style rule lists, style rules, and custom instructions are +- How to apply a custom instruction in a translation request +- How to create, update, and delete a style rule list + +--- + +## Key concepts + +A **style rule list** is a named, reusable set of rules for a target language. It can contain two types of rules: + +- **Style rules** (also called *configured rules*): Predefined rules for formatting conventions such as date formats, punctuation style, or capitalization. +- **Custom instructions**: Natural language directives that guide the translation engine, such as "Use a formal tone" or "Put currency symbols after the numeric amount." + +When a style rule list is attached to a translation request via `style_id`, both types of rules are applied automatically. + +You can also pass custom instructions **directly** in a translation request, without creating a style rule list first — which is what the next section demonstrates. + + + Style rule lists require a Pro API subscription. You can also create and manage them in the UI at [deepl.com/custom-rules](https://deepl.com/custom-rules). + + +--- + +## How to use a custom instruction in a translation request + +Pass one or more instructions in the `custom_instructions` array of your `/v2/translate` request: + +```sh +curl -X POST 'https://api.deepl.com/v2/translate' \ +--header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \ +--header 'Content-Type: application/json' \ +--data '{ + "text": ["The meeting is at 3pm."], + "target_lang": "DE", + "custom_instructions": ["Use formal language"] +}' +``` + +```json +{ + "translations": [ + { + "detected_source_language": "EN", + "text": "Das Meeting findet um 15:00 Uhr statt." + } + ] +} +``` + +You can include up to 10 instructions per request, each up to 300 characters. + + + Requests with `custom_instructions` always use the `quality_optimized` model. Combining `custom_instructions` with `model_type: latency_optimized` will result in an error. + + +For guidance on writing effective instructions, see [Custom instructions best practices](/docs/best-practices/custom-instructions). + +--- + +## How to manage style rule lists + +### Create a style rule list + +```sh +curl -X POST 'https://api.deepl.com/v3/style_rules' \ +--header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \ +--header 'Content-Type: application/json' \ +--data '{ + "name": "My Rules", + "language": "en", + "configured_rules": { + "punctuation": { "periods_in_academic_degrees": "do_not_use" } + }, + "custom_instructions": [ + { "label": "Tone", "prompt": "Use a friendly tone" } + ] +}' +``` + +The response includes a `style_id` you will use to reference this list: + +```json +{ + "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994", + "name": "My Rules", + "language": "en", + ... +} +``` + +### Apply the list to a translation + +Pass the `style_id` in your translation request: + +```sh +curl -X POST 'https://api.deepl.com/v2/translate' \ +--header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \ +--header 'Content-Type: application/json' \ +--data '{ + "text": ["The meeting is at 3pm."], + "target_lang": "EN", + "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994" +}' +``` + +The target language of your request must match the language set on the style rule list. + +### Rename a style rule list + +```sh +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": "My Updated Rules" }' +``` + +### Delete a style rule list + +```sh +curl -X DELETE 'https://api.deepl.com/v3/style_rules/{style_id}' \ +--header 'Authorization: DeepL-Auth-Key [yourAuthKey]' +``` + +Returns `204 No Content` on success. + +--- + +## Next steps + +- **Full API reference**: See [Style rules](/api-reference/style-rules) for all endpoints, including managing individual custom instructions within a style rule list. +- **Write better instructions**: Follow the [custom instructions best practices](/docs/best-practices/custom-instructions) guide. +- **Enforce terminology**: Use [glossaries](/api-reference/multilingual-glossaries) alongside style rules for consistent brand names and terminology. From 72f8a69bfc4d4b510f677aaf7455b1fc058f5e61 Mon Sep 17 00:00:00 2001 From: Ben Morss Date: Sat, 18 Apr 2026 15:04:47 -0400 Subject: [PATCH 3/9] Propagated file name change into docs.json --- docs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs.json b/docs.json index c7c37dd8..4035d778 100644 --- a/docs.json +++ b/docs.json @@ -76,7 +76,7 @@ "docs/learning-how-tos/examples-and-guides/placeholder-tags", "docs/learning-how-tos/examples-and-guides/first-things-to-try-with-the-deepl-api", "docs/learning-how-tos/examples-and-guides/glossaries-in-the-real-world", - "docs/learning-how-tos/examples-and-guides/using-custom-instructions-and-style-rules", + "docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions", "docs/learning-how-tos/examples-and-guides/deepl-mcp-server-how-to-build-and-use-translation-in-llm-applications", "docs/learning-how-tos/examples-and-guides/translating-between-variants" ] From 92fc15f3109a567882f3938361ec2d7c1905fe1a Mon Sep 17 00:00:00 2001 From: Ben Morss Date: Sat, 18 Apr 2026 15:04:56 -0400 Subject: [PATCH 4/9] Shortened file name, lots more writing and changes --- .../style-rules-and-custom-instructions.mdx | 777 ++++++++++++++++++ 1 file changed, 777 insertions(+) create mode 100644 docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx diff --git a/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx b/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx new file mode 100644 index 00000000..8086523b --- /dev/null +++ b/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx @@ -0,0 +1,777 @@ +--- +title: "Style rules and custom instructions" +description: "Fine-tune your translations using style rules, style rule lists, and custom instructions" +sidebarTitle: "Style rules and custom instructions" +public: true +--- + +## What are style rules? + +Style rules let you customize DeepL translations in a wide variety of ways. + +[Glossaries](https://developers.deepl.com/api-reference/multilingual-glossaries) let you set specific translations for words or short phrases. [Translation memories](https://developers.deepl.com/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories) let you save and apply a whole database of translations. Style rules let you customize style, tone, grammar, punctuation conventions, numbers and currencies, and much more. + +DeepL supports two types of style rules: + +* **predefined rules**, a DeepL-provided set of rules to make common formatting, punctuation, and stylistic choices +* **custom instructions**, rules you write yourself + + +DeepL also refers to predefined rules as "configured rules". The two are the same. + + +All style rules live in **style rule lists**. Style rule lists can contain preset rules, custom instructions, or both. + +If you use the [DeepL Translator](https://www.deepl.com), you can also make style rule lists, predefined rules, and custom instructions in its [style rules page](https://www.deepl.com/en/custom-rules/f5dd1adb-93e5-4013-813d-e20568edabfd?tab=predefined§ion=style-tone). + + +Style rules are currently only available to users with [a paid plan](https://www.deepl.com/en/pro/change-plan#developer). + + +## Working with the API + +The Style Rules API lets you create, retrieve, edit, and delete style rule lists. + +Create, retrieve, and delete operations deal with entire lists. When you modify the rules in a list, the API treats predefined rules and custom instructions separately. + +## Creating a list + +Let's say we want to translate content into French, while following certain conventions used in Canadian French, also known as Québécois. (The DeepL API already supports Canadian French, but let's just conveniently ignore that for now.) To this end, we want to follow certain conventions: + +* Don't use a space before punctuation marks like "?", "!", and ":" +* Use French chevrons ("guillemets") for quotation marks +* Use accents and cedillas, even on capital letters + +How do we do this? Style rules, of course! + +To make a new style rule list, we need to pass the API: + +* the list's `name` +* the list's `language`, which is the target language for translations where we want this rule to be applied + +While creating a new list, we have the option to include: + +* a set of predefined rules +* a set of custom instructions +* both of these +* neither + +In other words, we can create an empty list, or we can populate our new list with predefined rules and/or custom instructions. + +### Discovering predefined rules + +As it happens, DeepL's predefined rules include each of our three conventions. You can find them in the Reference for API endpoints which let you change the predefined rules in a list. For example, go to [Create a style rule list](https://developers.deepl.com/api-reference/style-rules/create-style-rule). Look at [the `configured_rules` parameter](https://developers.deepl.com/api-reference/style-rules/create-style-rule#body-configured-rules) in the Body section. There, you will see all the available categories - like [`dates_and_times`](https://developers.deepl.com/api-reference/style-rules/update-configured-rules#body-dates-and-times) and [`punctuation`](https://developers.deepl.com/api-reference/style-rules/update-configured-rules#body-punctuation). Expand one of those categories, and you'll see all the options. + +We can find rules for each of these, noting the section, name, and desired option for each: + +* **Don't use a space before punctuation marks like "?", "!", and ":"** + * "punctuation" -> "spacing_and_punctuation" -> "do_not_use_space" +* **Use French chevrons ("guillemets") for quotation marks** + * "punctuation" -> "quotation mark" -> "use_guillemets" +* **Use accents and cedillas, even on capital letters** + * "spelling_and_grammar" -> "accents_and_cedillas" -> "use_even_on_capital_letters" + +### Making a list with predefined rules + +To create our new Québécois style rules list, we'll need to pass the API: + +* the `name` "Québécois" +* the `language`, which is "fr" for French +* and our predefined rules, which here we call `configured_rules` or `configuredRules`, depending on the conventions of your programming language + + + + + ```http Request + POST /v3/style_rules HTTP/2 + Host: api.deepl.com + Authorization: DeepL-Auth-Key [yourAuthKey] + Content-Type: application/json + + { + "name": "Québécois", + "language": "fr", + "configured_rules": { + "punctuation": { + "spacing_and_punctuation": "do_not_use_space", + "quotation_mark": "use_guillemets" + }, + "spelling_and_grammar": { + "accents_and_cedillas": "use_even_on_capital_letters" + } + } + } + ``` + + ```json Response + { + "style_id": "635073ee-dad3-4aaf-b1e9-2bc6f6ec314f", + "name": "Québécois", + "creation_time": "2026-04-16T18:20:33.773611Z", + "updated_time": "2026-04-16T18:20:33.773912Z", + "language": "fr", + "version": 1, + "custom_instructions": [], + "configured_rules": { + "punctuation": { + "quotation_mark": "use_guillemets", + "spacing_and_punctuation": "do_not_use_space" + }, + "spelling_and_grammar": { + "accents_and_cedillas": "use_even_on_capital_letters" + } + } + } + ``` + + + ```sh Set the API key + export API_KEY={YOUR_API_KEY} + ``` + + ```sh Request + curl -X POST https://api.deepl.com/v3/style_rules \ + --header "Content-Type: application/json" \ + --header "Authorization: DeepL-Auth-Key $DEEPL_API_KEY" \ + --data ' + { + "name": "Québécois", + "language": "fr", + "configured_rules": { + "punctuation": { + "spacing_and_punctuation": "do_not_use_space", + "quotation_mark": "use_guillemets" + }, + "spelling_and_grammar": { + "accents_and_cedillas": "use_even_on_capital_letters" + } + } + }' + ``` + + ```json Response + { + "style_id": "635073ee-dad3-4aaf-b1e9-2bc6f6ec314f", + "name": "Québécois", + "creation_time": "2026-04-16T18:20:33.773611Z", + "updated_time": "2026-04-16T18:20:33.773912Z", + "language": "fr", + "version": 1, + "custom_instructions": [], + "configured_rules": { + "punctuation": { + "quotation_mark": "use_guillemets", + "spacing_and_punctuation": "do_not_use_space" + }, + "spelling_and_grammar": { + "accents_and_cedillas": "use_even_on_capital_letters" + } + } + } + ``` + + + ```py Request + import deepl + + auth_key = "{YOUR_API_KEY}" # replace with your key + deepl_client = deepl.DeepLClient(auth_key) + + result = deepl_client.create_style_rule( + name="Québécois", + language="fr", + configured_rules={ + "punctuation": { + "spacing_and_punctuation": "do_not_use_space", + "quotation_mark": "use_guillemets" + }, + "spelling_and_grammar": { + "accents_and_cedillas": "use_even_on_capital_letters" + } + } + ) + + print(f"Yay, we made a new style rule list named '{result.name}' with the id '{result.style_id}'.") + ``` + + ```text Output + Yay, we made a new style rule list named 'Québécois' with the id '635073ee-dad3-4aaf-b1e9-2bc6f6ec314f' + ``` + + + In production code, it's safer to store your API key in an environment variable. + + + + ```javascript Request + const deepl = require('deepl-node'); + + const authKey = "{YOUR_API_KEY}"; // replace with your key + const deeplClient = new deepl.DeepLClient(authKey); + + (async () => { + const result = await deeplClient.createStyleRule({ + name: 'Québécois', + language: 'fr', + configured_rules: { + punctuation: { + spacing_and_punctuation: 'do_not_use_space', + quotation_mark: 'use_guillemets' + }, + spelling_and_grammar: { + accents_and_cedillas: 'use_even_on_capital_letters' + } + } + }); + + console.log(`Yay, we made a new style rule list named '${result.name}' with the id '${result.styleId}'`); + })(); + ``` + + ```text Output + Yay, we made a new style rule list named 'Québécois' with the id '635073ee-dad3-4aaf-b1e9-2bc6f6ec314f' + ``` + + + In production code, it's safer to store your API key in an environment variable. + + + + ```php Request + require_once 'vendor/autoload.php'; + use DeepL\Client; + + $authKey = "{YOUR_API_KEY}"; // replace with your key + $deeplClient = new DeepL\DeepLClient($authKey); + + $result = $deeplClient->createStyleRule('Québécois', 'fr', [ + 'punctuation' => [ + 'spacing_and_punctuation' => 'do_not_use_space', + 'quotation_mark' => 'use_guillemets' + ], + 'spelling_and_grammar' => [ + 'accents_and_cedillas' => 'use_even_on_capital_letters' + ] + ]); + + echo "Yay, we made a new style rule list named '{$result->name}' with the id '{$result->styleId}'"; + ``` + + ```text Output + Yay, we made a new style rule list named 'Québécois' with the id '635073ee-dad3-4aaf-b1e9-2bc6f6ec314f' + ``` + + + In production code, it's safer to store your API key in an environment variable. + + + + ```csharp Request + using DeepL; + using DeepL.Model; + using System.Collections.Generic; + + var authKey = "{YOUR_API_KEY}"; // replace with your key + var client = new DeepLClient(authKey); + + var configuredRules = new ConfiguredRules( + punctuation: new Dictionary { + ["spacing_and_punctuation"] = "do_not_use_space", + ["quotation_mark"] = "use_guillemets" + }, + spellingAndGrammar: new Dictionary { + ["accents_and_cedillas"] = "use_even_on_capital_letters" + } + ); + + var result = await client.CreateStyleRuleAsync("Québécois", "fr", configuredRules); + + Console.WriteLine($"Yay, we made a new style rule list named '{result.Name}' with the id '{result.StyleId}'"); + ``` + + ```text Output + Yay, we made a new style rule list named 'Québécois' with the id '635073ee-dad3-4aaf-b1e9-2bc6f6ec314f' + ``` + + + In production code, it's safer to store your API key in an environment variable. + + + + ```java Request + import com.deepl.api.*; + import java.util.HashMap; + import java.util.Map; + + public class Main { + public static void main(String[] args) throws DeepLException, InterruptedException { + String authKey = "{YOUR_API_KEY}"; // replace with your key + DeepLClient client = new DeepLClient(authKey); + + Map punctuation = new HashMap<>(); + punctuation.put("spacing_and_punctuation", "do_not_use_space"); + punctuation.put("quotation_mark", "use_guillemets"); + + Map spellingAndGrammar = new HashMap<>(); + spellingAndGrammar.put("accents_and_cedillas", "use_even_on_capital_letters"); + + ConfiguredRules configuredRules = new ConfiguredRules( + null, null, null, punctuation, spellingAndGrammar, null, null); + + StyleRuleInfo result = client.createStyleRule("Québécois", "fr", configuredRules, null); + + System.out.println("Yay, we made a new style rule list named '" + result.getName() + "' with the id '" + result.getStyleId() + "'"); + } + } + ``` + + ```text Output + Yay, we made a new style rule list named 'Québécois' with the id '635073ee-dad3-4aaf-b1e9-2bc6f6ec314f' + ``` + + + In production code, it's safer to store your API key in an environment variable. + + + + +The API returns everything in the new style rules list, including the `style_id` which DeepL has assigned it. You'll need this id later to refer to the list. + +### Including custom instructions + +What if we forgot a rule? In French Canadian, numbers below 10 are usually written out, unless the sentence contains other numbers. As the API presently has no predefined rule for that, this is a fine candidate for a custom instruction. + +Let's make a new style rule list which has the predefined rules above plus this custom instruction, which should cover most cases: "Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency" + +For clarity, in the client library code samples below, we create `configured_objects` and `custom_instructions` objects first, then pass those to `createStyleRule()`. + + + + ```http Request + POST /v3/style_rules HTTP/2 + Host: api.deepl.com + Authorization: DeepL-Auth-Key [yourAuthKey] + Content-Type: application/json + + { + "name": "Québécois++", + "language": "fr", + "configured_rules": { + "punctuation": { + "spacing_and_punctuation": "do_not_use_space", + "quotation_mark": "use_guillemets" + }, + "spelling_and_grammar": { + "accents_and_cedillas": "use_even_on_capital_letters" + } + }, + "custom_instructions": [ + { + "label": "one-digit numbers", + "prompt": "Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency" + } + ] + } + ``` + + ```json Response + { + "style_id": "7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c", + "name": "Québécois++", + "creation_time": "2026-04-16T18:45:12.123456Z", + "updated_time": "2026-04-16T18:45:12.234567Z", + "language": "fr", + "version": 1, + "custom_instructions": [ + { + "id": "ci-aabbccdd-1122-3344-5566-778899aabbcc", + "label": "one-digit numbers", + "prompt": "Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency" + } + ], + "configured_rules": { + "punctuation": { + "quotation_mark": "use_guillemets", + "spacing_and_punctuation": "do_not_use_space" + }, + "spelling_and_grammar": { + "accents_and_cedillas": "use_even_on_capital_letters" + } + } + } + ``` + + + ```sh Set the API key + export API_KEY={YOUR_API_KEY} + ``` + + ```sh Request + curl -X POST https://api.deepl.com/v3/style_rules \ + --header "Content-Type: application/json" \ + --header "Authorization: DeepL-Auth-Key $DEEPL_API_KEY" \ + --data '{ + "name": "Québécois++", + "language": "fr", + "configured_rules": { + "punctuation": { + "spacing_and_punctuation": "do_not_use_space", + "quotation_mark": "use_guillemets" + }, + "spelling_and_grammar": { + "accents_and_cedillas": "use_even_on_capital_letters" + } + }, + "custom_instructions": [ + { + "label": "one-digit numbers", + "prompt": "Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency" + } + ] + }' + ``` + + ```json Response + { + "style_id": "7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c", + "name": "Québécois++", + "creation_time": "2026-04-16T18:45:12.123456Z", + "updated_time": "2026-04-16T18:45:12.234567Z", + "language": "fr", + "version": 1, + "custom_instructions": [ + { + "id": "ci-aabbccdd-1122-3344-5566-778899aabbcc", + "label": "one-digit numbers", + "prompt": "Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency" + } + ], + "configured_rules": { + "punctuation": { + "quotation_mark": "use_guillemets", + "spacing_and_punctuation": "do_not_use_space" + }, + "spelling_and_grammar": { + "accents_and_cedillas": "use_even_on_capital_letters" + } + } + } + ``` + + + ```py Request + configured_rules={ + "punctuation": { + "spacing_and_punctuation": "do_not_use_space", + "quotation_mark": "use_guillemets" + }, + "spelling_and_grammar": { + "accents_and_cedillas": "use_even_on_capital_letters" + } + } + + custom_instructions=[ + { + "label": "one-digit numbers", + "prompt": "Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency" + } + ] + + result = deepl_client.create_style_rule( + name="Québécois++", + language="fr", + configured_rules=configured_rules, + custom_instructions=custom_instructions + ) + + print(f"Yay, we made a new style rule list named '{result.name}' with the id '{result.style_id}'.") + ``` + + ```text Output + Yay, we made a new style rule list named 'Québécois++' with the id '7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c' + ``` + + + ```javascript Request + const configured_rules = { + punctuation: { + spacing_and_punctuation: 'do_not_use_space', + quotation_mark: 'use_guillemets' + }, + spelling_and_grammar: { + accents_and_cedillas: 'use_even_on_capital_letters' + } + } + + const custom_instructions = [ + { + label: 'one-digit numbers', + prompt: 'Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency' + } + ] + + (async () => { + const result = await deeplClient.createStyleRule({ + name: 'Québécois++', + language: 'fr', + configured_rules, + custom_instructions + }); + + console.log(`Yay, we made a new style rule list named '${result.name}' with the id '${result.styleId}'`); + })(); + ``` + + ```text Output + Yay, we made a new style rule list named 'Québécois++' with the id '7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c' + ``` + + + ```php Request + $configured_rules = [ + 'punctuation' => [ + 'spacing_and_punctuation' => 'do_not_use_space', + 'quotation_mark' => 'use_guillemets' + ], + 'spelling_and_grammar' => [ + 'accents_and_cedillas' => 'use_even_on_capital_letters' + ] + ] + + $custom_instructions = [ + 'label' => 'one-digit numbers', + 'prompt' => 'Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency' + ] + + $result = $deeplClient->createStyleRule('Québécois++', 'fr', $configured_rules, $custom_instructions); + + echo "Yay, we made a new style rule list named '{$result->name}' with the id '{$result->styleId}'"; + ``` + + ```text Output + Yay, we made a new style rule list named 'Québécois++' with the id '7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c' + ``` + + + ```csharp Request + var configuredRules = new ConfiguredRules( + punctuation: new Dictionary { + ["spacing_and_punctuation"] = "do_not_use_space", + ["quotation_mark"] = "use_guillemets" + }, + spellingAndGrammar: new Dictionary { + ["accents_and_cedillas"] = "use_even_on_capital_letters" + } + ); + + var customInstructions = new List { + new CustomInstruction( + label: "one-digit numbers", + prompt: "Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency" + ) + }; + + var result = await client.CreateStyleRuleAsync("Québécois++", "fr", configuredRules, customInstructions); + + Console.WriteLine($"Yay, we made a new style rule list named '{result.Name}' with the id '{result.StyleId}'"); + ``` + + ```text Output + Yay, we made a new style rule list named 'Québécois++' with the id '7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c' + ``` + + + ```java Request + public class Main { + public static void main(String[] args) throws DeepLException, InterruptedException { + String authKey = "{YOUR_API_KEY}"; // replace with your key + DeepLClient client = new DeepLClient(authKey); + + Map punctuation = new HashMap<>(); + punctuation.put("spacing_and_punctuation", "do_not_use_space"); + punctuation.put("quotation_mark", "use_guillemets"); + + Map spellingAndGrammar = new HashMap<>(); + spellingAndGrammar.put("accents_and_cedillas", "use_even_on_capital_letters"); + + ConfiguredRules configuredRules = new ConfiguredRules( + null, null, null, punctuation, spellingAndGrammar, null, null); + + List customInstructions = List.of( + new CustomInstruction( + "one-digit numbers", + "Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency", + null + ) + ); + + StyleRuleInfo result = client.createStyleRule("Québécois++", "fr", configuredRules, customInstructions); + + System.out.println("Yay, we made a new style rule list named '" + result.getName() + "' with the id '" + result.getStyleId() + "'"); + } + } + ``` + + ```text Output + Yay, we made a new style rule list named 'Québécois++' with the id '7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c' + ``` + + + +### Client library Tips + +Tip that, in the client libraries, `StyleRule` refers to a style rule list. So, for example, to create a style rule list, depending on your language, you'd use something like `create_style_rule` or `CreateStyleRule`. + +In some client libraries, it is simpler to first make a `configuredRules` object, then create a new style rule list object containing those `configuredRules`. + +## Using style rules in translation + +Let's try our style rule list in an actual translation! To do so, we simply add our list's `style_id` to a translation request, like this: + + + + ```http Request + POST /v2/translate HTTP/2 + Host: api.deepl.com + Authorization: DeepL-Auth-Key [yourAuthKey] + Content-Type: application/json + + { + "text": ["He said, \"I ate 6 burritos all at once!\" She responded, \"STOP!\""], + "target_lang": "fr", + "style_id": "7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c" + } + ``` + + ```json Response + { + "translations": [ + { + "detected_source_language": "EN", + "text": "Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! »" + } + ] + } + ``` + + + ```sh Set the API key + export API_KEY={YOUR_API_KEY} + ``` + + ```sh Request + curl -X POST https://api.deepl.com/v2/translate \ + --header "Content-Type: application/json" \ + --header "Authorization: DeepL-Auth-Key $DEEPL_API_KEY" \ + --data '{ + "text": ["He said, \"I ate 6 burritos all at once!\" She responded, \"STOP!\""], + "target_lang": "fr", + "style_id": "7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c" + }' + ``` + + ```json Response + { + "translations": [ + { + "detected_source_language": "EN", + "text": "Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! »" + } + ] + } + ``` + + + ```py Request + text = 'He said, "I ate 6 burritos all at once!" She responded, "STOP!"' + result = deepl_client.translate_text(text, target_lang='fr', style_id='7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c') + + print(result.text) + ``` + + ```text Output + Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! » + ``` + + + ```javascript Request + (async () => { + const text = 'He said, "I ate 6 burritos all at once!" She responded, "STOP!"'; + const result = await deeplClient.translateText(text, null, 'fr', { styleId: '7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c' }); + + console.log(result.text); + })(); + ``` + + ```text Output + Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! » + ``` + + + ```php Request + require_once 'vendor/autoload.php'; + use DeepL\Client; + + $authKey = "{YOUR_API_KEY}"; // replace with your key + $deeplClient = new DeepL\DeepLClient($authKey); + + $text = 'He said, "I ate 6 burritos all at once!" She responded, "STOP!"'; + + $result = $deeplClient->translateText($text, null, 'fr', ['style_id' => '7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c']); + + echo $result->text; + ``` + + ```text Output + Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! » + ``` + + + ```csharp Request + var text = "He said, \"I ate 6 burritos all at once!\" She responded, \"STOP!\""; + var options = new TextTranslateOptions { StyleId = "7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c" }; + var result = await client.TranslateTextAsync(text, null, "fr", options); + + Console.WriteLine(result.Text); + ``` + + ```text Output + Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! » + ``` + + + ```java Request + public class Main { + public static void main(String[] args) throws DeepLException, InterruptedException { + String authKey = "{YOUR_API_KEY}"; // replace with your key + DeepLClient client = new DeepLClient(authKey); + + String text = "He said, \"I ate 6 burritos all at once!\" She responded, \"STOP!\""; + TextTranslateOptions options = new TextTranslateOptions().setStyleId("7f0a3b2c-1d4e-5f6a-9b8c-0d2e4f6a8b0c"); + + TextResult result = client.translateText(text, null, "fr", options); + + System.out.println(result.getText()); + } + } + ``` + + ```text Output + Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! » + ``` + + + +Notice that the translation includes French chevrons, the number "six" is spelled out, the circumflex accent is included on "ARRÊTE", and there's no space before final exclamation points. + +## Details + +### Sharing lists with the app +In certain cases, you can share these rules between the [DeepL Translator](https://www.deepl.com) and the API. See the [style rules reference](/api-reference/style-rules) for details. +The API often many predefined rules that are unavailable in the DeepL Translator. Sometimes it’s good to be a programmer. + +### Languages +Predefined rules can only be applied to specific languages. If you try to add a predefined rule to a list for a language where it is not supported, the API will throw an error. + +## Keep exploring +For information on retrieving style rule lists, deleting lists, or modifying the predefined rules or custom instructions in a list, see the Style Rules reference. Happy customization! From 5f5f7d30233f42e34ff0de4e23ef517016802d2d Mon Sep 17 00:00:00 2001 From: Ben Morss Date: Wed, 22 Apr 2026 21:37:24 -0400 Subject: [PATCH 5/9] MVP version of new style rules guide Comes with light and dark mode versions of a diagram --- _assets/images/style-rule-list-dark.jpg | Bin 0 -> 35703 bytes _assets/images/style-rule-list-light.jpg | Bin 0 -> 35088 bytes .../style-rules-and-custom-instructions.mdx | 117 +++++++++++------- 3 files changed, 69 insertions(+), 48 deletions(-) create mode 100644 _assets/images/style-rule-list-dark.jpg create mode 100644 _assets/images/style-rule-list-light.jpg diff --git a/_assets/images/style-rule-list-dark.jpg b/_assets/images/style-rule-list-dark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec1f6d997851293182193a2e55c093c87798f217 GIT binary patch literal 35703 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 D_p<9g literal 0 HcmV?d00001 diff --git a/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx b/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx index 8086523b..a1ed162a 100644 --- a/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx +++ b/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx @@ -9,34 +9,38 @@ public: true Style rules let you customize DeepL translations in a wide variety of ways. -[Glossaries](https://developers.deepl.com/api-reference/multilingual-glossaries) let you set specific translations for words or short phrases. [Translation memories](https://developers.deepl.com/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories) let you save and apply a whole database of translations. Style rules let you customize style, tone, grammar, punctuation conventions, numbers and currencies, and much more. +[Glossaries](https://developers.deepl.com/api-reference/multilingual-glossaries) let you set specific translations for words or short phrases. [Translation memories](https://developers.deepl.com/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories) allow you to save and apply a whole database of translations. Style rules are more flexible, letting you customize style, tone, grammar, punctuation conventions, numbers and currencies, and much more. DeepL supports two types of style rules: -* **predefined rules**, a DeepL-provided set of rules to make common formatting, punctuation, and stylistic choices +* **predefined rules**, a set of rules DeepL provides to enforce common formatting, punctuation, and stylistic choices * **custom instructions**, rules you write yourself DeepL also refers to predefined rules as "configured rules". The two are the same. -All style rules live in **style rule lists**. Style rule lists can contain preset rules, custom instructions, or both. +All style rules live in **style rule lists**. A style rule list can contain predefined rules, custom instructions, or both: +
+ Diagram showing predefined rules and custom instructions inside a style rule list + Diagram showing predefined rules and custom instructions inside a style rule list +
-If you use the [DeepL Translator](https://www.deepl.com), you can also make style rule lists, predefined rules, and custom instructions in its [style rules page](https://www.deepl.com/en/custom-rules/f5dd1adb-93e5-4013-813d-e20568edabfd?tab=predefined§ion=style-tone). +If you use the [DeepL Translator](https://www.deepl.com), you can also make style rule lists, predefined rules, and custom instructions on its [style rules page](https://www.deepl.com/en/custom-rules/f5dd1adb-93e5-4013-813d-e20568edabfd?tab=predefined§ion=style-tone). -Style rules are currently only available to users with [a paid plan](https://www.deepl.com/en/pro/change-plan#developer). +Style rules are currently available only to users with [a paid plan](https://www.deepl.com/en/pro/change-plan#developer). -## Working with the API +## API overview The Style Rules API lets you create, retrieve, edit, and delete style rule lists. -Create, retrieve, and delete operations deal with entire lists. When you modify the rules in a list, the API treats predefined rules and custom instructions separately. +Create, retrieve, and delete operations deal with entire lists. When modifying the rules in a list, the API treats predefined rules and custom instructions separately, with dedicated sections for each. ## Creating a list -Let's say we want to translate content into French, while following certain conventions used in Canadian French, also known as Québécois. (The DeepL API already supports Canadian French, but let's just conveniently ignore that for now.) To this end, we want to follow certain conventions: +Let's say we want to translate content into French, while following certain conventions used in Canadian French, also known as Québécois. (The DeepL API already supports Canadian French, but we'll conveniently ignore that for now.) * Don't use a space before punctuation marks like "?", "!", and ":" * Use French chevrons ("guillemets") for quotation marks @@ -47,37 +51,53 @@ How do we do this? Style rules, of course! To make a new style rule list, we need to pass the API: * the list's `name` -* the list's `language`, which is the target language for translations where we want this rule to be applied +* the list's `language` - the target language for translations where we want this rule to apply -While creating a new list, we have the option to include: +When creating a new list, you have the option to include: * a set of predefined rules * a set of custom instructions * both of these * neither -In other words, we can create an empty list, or we can populate our new list with predefined rules and/or custom instructions. +In short, you can create an empty list, or you can populate our new list with predefined rules and/or custom instructions. ### Discovering predefined rules -As it happens, DeepL's predefined rules include each of our three conventions. You can find them in the Reference for API endpoints which let you change the predefined rules in a list. For example, go to [Create a style rule list](https://developers.deepl.com/api-reference/style-rules/create-style-rule). Look at [the `configured_rules` parameter](https://developers.deepl.com/api-reference/style-rules/create-style-rule#body-configured-rules) in the Body section. There, you will see all the available categories - like [`dates_and_times`](https://developers.deepl.com/api-reference/style-rules/update-configured-rules#body-dates-and-times) and [`punctuation`](https://developers.deepl.com/api-reference/style-rules/update-configured-rules#body-punctuation). Expand one of those categories, and you'll see all the options. +To find whether DeepL provides predefined rules for the three Québécois guidelines we need, we can check the API Reference for any method that changes the predefined rules in a list. Let's try this with the [Create a style rule list](https://developers.deepl.com/api-reference/style-rules/create-style-rule) method, looking for a rule that matches our first guideline: 'Don't use a space before punctuation marks like "?", "!", and ":"'. -We can find rules for each of these, noting the section, name, and desired option for each: +Scanning through the `Body` section, we find [the `configured_rules` parameter](https://developers.deepl.com/api-reference/style-rules/create-style-rule#body-configured-rules). Expanding that reveals the available categories of predefined rules, including [`configured_rules.punctuation`](/api-reference/style-rules/create-style-rule#body-configured-rules-punctuation). Expand the "child attributes" section and scroll down to find the [`spacing_and_punctuation`](/api-reference/style-rules/create-style-rule#body-configured-rules-punctuation-spacing-and-punctuation) rule, with the option `do_not_use_space`. That's just what we need! + +Use this method to find rules for each of our three guidelines, noting the category, rule name, and desired option for each: * **Don't use a space before punctuation marks like "?", "!", and ":"** - * "punctuation" -> "spacing_and_punctuation" -> "do_not_use_space" + * `punctuation` → `spacing_and_punctuation` → `do_not_use_space` * **Use French chevrons ("guillemets") for quotation marks** - * "punctuation" -> "quotation mark" -> "use_guillemets" + * `punctuation` → `quotation_mark` → `use_guillemets` * **Use accents and cedillas, even on capital letters** - * "spelling_and_grammar" -> "accents_and_cedillas" -> "use_even_on_capital_letters" + * `spelling_and_grammar` → `accents_and_cedillas` → `use_even_on_capital_letters` + +In the API, predefined rules go into a `configured_rules` object: a dictionary where each key is a category, and each value is a dictionary of rule names mapped to options. For our three rules, that looks like this: + +```json + "configured_rules": { + "punctuation": { + "spacing_and_punctuation": "do_not_use_space", + "quotation_mark": "use_guillemets" + }, + "spelling_and_grammar": { + "accents_and_cedillas": "use_even_on_capital_letters" + } + } +``` ### Making a list with predefined rules -To create our new Québécois style rules list, we'll need to pass the API: +To create our new Québécois style rules list, we'll need to send the API: -* the `name` "Québécois" -* the `language`, which is "fr" for French -* and our predefined rules, which here we call `configured_rules` or `configuredRules`, depending on the conventions of your programming language +* the `name`: `"Québécois"` +* the `language`: `"fr"` for French +* our predefined rules dictionary, which here we call `configured_rules` or `configuredRules`, depending on the conventions of your programming language @@ -269,23 +289,24 @@ To create our new Québécois style rules list, we'll need to pass the API: ```csharp Request using DeepL; using DeepL.Model; - using System.Collections.Generic; var authKey = "{YOUR_API_KEY}"; // replace with your key var client = new DeepLClient(authKey); - var configuredRules = new ConfiguredRules( - punctuation: new Dictionary { - ["spacing_and_punctuation"] = "do_not_use_space", - ["quotation_mark"] = "use_guillemets" - }, - spellingAndGrammar: new Dictionary { - ["accents_and_cedillas"] = "use_even_on_capital_letters" - } + var result = await client.CreateStyleRuleAsync( + "Québécois", + "fr", + new ConfiguredRules( + punctuation: new Dictionary { + ["spacing_and_punctuation"] = "do_not_use_space", + ["quotation_mark"] = "use_guillemets" + }, + spellingAndGrammar: new Dictionary { + ["accents_and_cedillas"] = "use_even_on_capital_letters" + } + ) ); - var result = await client.CreateStyleRuleAsync("Québécois", "fr", configuredRules); - Console.WriteLine($"Yay, we made a new style rule list named '{result.Name}' with the id '{result.StyleId}'"); ``` @@ -335,13 +356,13 @@ To create our new Québécois style rules list, we'll need to pass the API: -The API returns everything in the new style rules list, including the `style_id` which DeepL has assigned it. You'll need this id later to refer to the list. +The API returns everything in the new style rules list, including the `style_id` which DeepL has assigned it. You'll need this id to reference the list later. ### Including custom instructions What if we forgot a rule? In French Canadian, numbers below 10 are usually written out, unless the sentence contains other numbers. As the API presently has no predefined rule for that, this is a fine candidate for a custom instruction. -Let's make a new style rule list which has the predefined rules above plus this custom instruction, which should cover most cases: "Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency" +Let's make a new style rule list with the predefined rules above plus this custom instruction, which should cover most cases: "Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency" For clarity, in the client library code samples below, we create `configured_objects` and `custom_instructions` objects first, then pass those to `createStyleRule()`. @@ -618,9 +639,9 @@ For clarity, in the client library code samples below, we create `configured_obj -### Client library Tips +### Client library tips -Tip that, in the client libraries, `StyleRule` refers to a style rule list. So, for example, to create a style rule list, depending on your language, you'd use something like `create_style_rule` or `CreateStyleRule`. +In the client libraries, `StyleRule` refers to a style rule list, not a single style rule. So, for example, to create a style rule list, depending on your language, you'd use something like `create_style_rule` or `CreateStyleRule`. In some client libraries, it is simpler to first make a `configuredRules` object, then create a new style rule list object containing those `configuredRules`. @@ -648,7 +669,7 @@ Let's try our style rule list in an actual translation! To do so, we simply add "translations": [ { "detected_source_language": "EN", - "text": "Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! »" + "text": "Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE! »" } ] } @@ -675,7 +696,7 @@ Let's try our style rule list in an actual translation! To do so, we simply add "translations": [ { "detected_source_language": "EN", - "text": "Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! »" + "text": "Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE! »" } ] } @@ -690,7 +711,7 @@ Let's try our style rule list in an actual translation! To do so, we simply add ``` ```text Output - Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! » + Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE! » ``` @@ -704,7 +725,7 @@ Let's try our style rule list in an actual translation! To do so, we simply add ``` ```text Output - Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! » + Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE! » ``` @@ -723,7 +744,7 @@ Let's try our style rule list in an actual translation! To do so, we simply add ``` ```text Output - Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! » + Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE! » ``` @@ -736,7 +757,7 @@ Let's try our style rule list in an actual translation! To do so, we simply add ``` ```text Output - Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! » + Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE! » ``` @@ -757,20 +778,20 @@ Let's try our style rule list in an actual translation! To do so, we simply add ``` ```text Output - Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE ! » + Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE! » ``` -Notice that the translation includes French chevrons, the number "six" is spelled out, the circumflex accent is included on "ARRÊTE", and there's no space before final exclamation points. +Notice that the translation includes French chevrons, the number "six" is spelled out, the circumflex accent is included on "ARRÊTE", and there's no space before final exclamation points. -## Details +## Additional details -### Sharing lists with the app -In certain cases, you can share these rules between the [DeepL Translator](https://www.deepl.com) and the API. See the [style rules reference](/api-reference/style-rules) for details. -The API often many predefined rules that are unavailable in the DeepL Translator. Sometimes it’s good to be a programmer. +### Sharing lists with DeepL Translator +In certain cases, you can share these rules between the [DeepL Translator](https://www.deepl.com) and the API. See the [style rules reference](/api-reference/style-rules) for current information. +The API provides many predefined rules that are unavailable in the DeepL Translator. Sometimes it’s good to be a programmer. -### Languages +### Language support Predefined rules can only be applied to specific languages. If you try to add a predefined rule to a list for a language where it is not supported, the API will throw an error. ## Keep exploring From 42aae87dd3608a88709e3d2c7a865b110cc48474 Mon Sep 17 00:00:00 2001 From: Ben Morss Date: Wed, 22 Apr 2026 22:21:09 -0400 Subject: [PATCH 6/9] A number of small fixes, mostly inspired by Copilot --- docs.json | 2 +- .../style-rules-and-custom-instructions.mdx | 16 ++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/docs.json b/docs.json index cd91d649..4cae7248 100644 --- a/docs.json +++ b/docs.json @@ -63,7 +63,7 @@ "docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter", "docs/learning-how-tos/examples-and-guides/translating-between-variants", "docs/learning-how-tos/examples-and-guides/glossaries-in-the-real-world", - "docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions", + "docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions", "docs/learning-how-tos/examples-and-guides/placeholder-tags", "docs/learning-how-tos/examples-and-guides/deepl-mcp-server-how-to-build-and-use-translation-in-llm-applications", "docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories" diff --git a/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx b/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx index a1ed162a..7d6f2f68 100644 --- a/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx +++ b/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx @@ -28,10 +28,6 @@ All style rules live in **style rule lists**. A style rule list can contain pred If you use the [DeepL Translator](https://www.deepl.com), you can also make style rule lists, predefined rules, and custom instructions on its [style rules page](https://www.deepl.com/en/custom-rules/f5dd1adb-93e5-4013-813d-e20568edabfd?tab=predefined§ion=style-tone). - -Style rules are currently available only to users with [a paid plan](https://www.deepl.com/en/pro/change-plan#developer). - - ## API overview The Style Rules API lets you create, retrieve, edit, and delete style rule lists. @@ -146,7 +142,7 @@ To create our new Québécois style rules list, we'll need to send the API: ```sh Set the API key - export API_KEY={YOUR_API_KEY} + export DEEPL_API_KEY={YOUR_API_KEY} ``` ```sh Request @@ -364,7 +360,7 @@ What if we forgot a rule? In French Canadian, numbers below 10 are usually writt Let's make a new style rule list with the predefined rules above plus this custom instruction, which should cover most cases: "Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency" -For clarity, in the client library code samples below, we create `configured_objects` and `custom_instructions` objects first, then pass those to `createStyleRule()`. +For clarity, in the client library code samples below, we create `configured_rules` and `custom_instructions` objects first, then pass those to `createStyleRule()`. @@ -424,7 +420,7 @@ For clarity, in the client library code samples below, we create `configured_obj ```sh Set the API key - export API_KEY={YOUR_API_KEY} + export DEEPL_API_KEY={YOUR_API_KEY} ``` ```sh Request @@ -557,12 +553,12 @@ For clarity, in the client library code samples below, we create `configured_obj 'spelling_and_grammar' => [ 'accents_and_cedillas' => 'use_even_on_capital_letters' ] - ] + ]; $custom_instructions = [ 'label' => 'one-digit numbers', 'prompt' => 'Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency' - ] + ]; $result = $deeplClient->createStyleRule('Québécois++', 'fr', $configured_rules, $custom_instructions); @@ -677,7 +673,7 @@ Let's try our style rule list in an actual translation! To do so, we simply add ```sh Set the API key - export API_KEY={YOUR_API_KEY} + export DEEPL_API_KEY={YOUR_API_KEY} ``` ```sh Request From 2efc67b5405c1c5bcd3c51b6555523bbe0dd98d9 Mon Sep 17 00:00:00 2001 From: Ben Morss Date: Wed, 22 Apr 2026 23:10:34 -0400 Subject: [PATCH 7/9] Removing Claude's original creation --- ...ng-custom-instructions-and-style-rules.mdx | 139 ------------------ 1 file changed, 139 deletions(-) delete mode 100644 docs/learning-how-tos/examples-and-guides/using-custom-instructions-and-style-rules.mdx diff --git a/docs/learning-how-tos/examples-and-guides/using-custom-instructions-and-style-rules.mdx b/docs/learning-how-tos/examples-and-guides/using-custom-instructions-and-style-rules.mdx deleted file mode 100644 index 8e4795bf..00000000 --- a/docs/learning-how-tos/examples-and-guides/using-custom-instructions-and-style-rules.mdx +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: "How to Use Custom Instructions and Style Rules" -description: "Control translation tone, formatting, and style with custom instructions and style rule lists." -public: true ---- - -**This guide shows you:** -- What style rule lists, style rules, and custom instructions are -- How to apply a custom instruction in a translation request -- How to create, update, and delete a style rule list - ---- - -## Key concepts - -A **style rule list** is a named, reusable set of rules for a target language. It can contain two types of rules: - -- **Style rules** (also called *configured rules*): Predefined rules for formatting conventions such as date formats, punctuation style, or capitalization. -- **Custom instructions**: Natural language directives that guide the translation engine, such as "Use a formal tone" or "Put currency symbols after the numeric amount." - -When a style rule list is attached to a translation request via `style_id`, both types of rules are applied automatically. - -You can also pass custom instructions **directly** in a translation request, without creating a style rule list first — which is what the next section demonstrates. - - - Style rule lists require a Pro API subscription. You can also create and manage them in the UI at [deepl.com/custom-rules](https://deepl.com/custom-rules). - - ---- - -## How to use a custom instruction in a translation request - -Pass one or more instructions in the `custom_instructions` array of your `/v2/translate` request: - -```sh -curl -X POST 'https://api.deepl.com/v2/translate' \ ---header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \ ---header 'Content-Type: application/json' \ ---data '{ - "text": ["The meeting is at 3pm."], - "target_lang": "DE", - "custom_instructions": ["Use formal language"] -}' -``` - -```json -{ - "translations": [ - { - "detected_source_language": "EN", - "text": "Das Meeting findet um 15:00 Uhr statt." - } - ] -} -``` - -You can include up to 10 instructions per request, each up to 300 characters. - - - Requests with `custom_instructions` always use the `quality_optimized` model. Combining `custom_instructions` with `model_type: latency_optimized` will result in an error. - - -For guidance on writing effective instructions, see [Custom instructions best practices](/docs/best-practices/custom-instructions). - ---- - -## How to manage style rule lists - -### Create a style rule list - -```sh -curl -X POST 'https://api.deepl.com/v3/style_rules' \ ---header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \ ---header 'Content-Type: application/json' \ ---data '{ - "name": "My Rules", - "language": "en", - "configured_rules": { - "punctuation": { "periods_in_academic_degrees": "do_not_use" } - }, - "custom_instructions": [ - { "label": "Tone", "prompt": "Use a friendly tone" } - ] -}' -``` - -The response includes a `style_id` you will use to reference this list: - -```json -{ - "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994", - "name": "My Rules", - "language": "en", - ... -} -``` - -### Apply the list to a translation - -Pass the `style_id` in your translation request: - -```sh -curl -X POST 'https://api.deepl.com/v2/translate' \ ---header 'Authorization: DeepL-Auth-Key [yourAuthKey]' \ ---header 'Content-Type: application/json' \ ---data '{ - "text": ["The meeting is at 3pm."], - "target_lang": "EN", - "style_id": "a74d88fb-ed2a-4943-a664-a4512398b994" -}' -``` - -The target language of your request must match the language set on the style rule list. - -### Rename a style rule list - -```sh -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": "My Updated Rules" }' -``` - -### Delete a style rule list - -```sh -curl -X DELETE 'https://api.deepl.com/v3/style_rules/{style_id}' \ ---header 'Authorization: DeepL-Auth-Key [yourAuthKey]' -``` - -Returns `204 No Content` on success. - ---- - -## Next steps - -- **Full API reference**: See [Style rules](/api-reference/style-rules) for all endpoints, including managing individual custom instructions within a style rule list. -- **Write better instructions**: Follow the [custom instructions best practices](/docs/best-practices/custom-instructions) guide. -- **Enforce terminology**: Use [glossaries](/api-reference/multilingual-glossaries) alongside style rules for consistent brand names and terminology. From 1cbec8068a0a894ab93a9bb6045664fd002cb53e Mon Sep 17 00:00:00 2001 From: Ben Morss Date: Wed, 22 Apr 2026 23:16:58 -0400 Subject: [PATCH 8/9] Fix PHP sample Custom instructions are an array of associative arrays --- .../style-rules-and-custom-instructions.mdx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx b/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx index 7d6f2f68..bc2ff45e 100644 --- a/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx +++ b/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx @@ -556,8 +556,10 @@ For clarity, in the client library code samples below, we create `configured_rul ]; $custom_instructions = [ - 'label' => 'one-digit numbers', - 'prompt' => 'Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency' + [ + 'label' => 'one-digit numbers', + 'prompt' => 'Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency' + ] ]; $result = $deeplClient->createStyleRule('Québécois++', 'fr', $configured_rules, $custom_instructions); From 82e4d16b7cea9c2a8fa5572a3e53a5410e336c46 Mon Sep 17 00:00:00 2001 From: Ben Morss Date: Thu, 23 Apr 2026 18:38:38 -0400 Subject: [PATCH 9/9] Yet more changes from review --- docs.json | 2 +- .../style-rules-and-custom-instructions.mdx | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs.json b/docs.json index 4cae7248..e2a6b37f 100644 --- a/docs.json +++ b/docs.json @@ -63,7 +63,7 @@ "docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter", "docs/learning-how-tos/examples-and-guides/translating-between-variants", "docs/learning-how-tos/examples-and-guides/glossaries-in-the-real-world", - "docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions", + "docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions", "docs/learning-how-tos/examples-and-guides/placeholder-tags", "docs/learning-how-tos/examples-and-guides/deepl-mcp-server-how-to-build-and-use-translation-in-llm-applications", "docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories" diff --git a/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx b/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx index bc2ff45e..ad8f3d5c 100644 --- a/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx +++ b/docs/learning-how-tos/examples-and-guides/style-rules-and-custom-instructions.mdx @@ -9,7 +9,7 @@ public: true Style rules let you customize DeepL translations in a wide variety of ways. -[Glossaries](https://developers.deepl.com/api-reference/multilingual-glossaries) let you set specific translations for words or short phrases. [Translation memories](https://developers.deepl.com/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories) allow you to save and apply a whole database of translations. Style rules are more flexible, letting you customize style, tone, grammar, punctuation conventions, numbers and currencies, and much more. +[Glossaries](/api-reference/multilingual-glossaries) let you set specific translations for words or short phrases. [Translation memories](/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories) allow you to save and apply a whole database of translations. Style rules are more flexible, letting you customize style, tone, grammar, punctuation conventions, numbers and currencies, and much more. DeepL supports two types of style rules: @@ -26,7 +26,7 @@ All style rules live in **style rule lists**. A style rule list can contain pred Diagram showing predefined rules and custom instructions inside a style rule list -If you use the [DeepL Translator](https://www.deepl.com), you can also make style rule lists, predefined rules, and custom instructions on its [style rules page](https://www.deepl.com/en/custom-rules/f5dd1adb-93e5-4013-813d-e20568edabfd?tab=predefined§ion=style-tone). +If you use the [DeepL Translator](https://www.deepl.com), you can also make style rule lists, predefined rules, and custom instructions on its [style rules page](https://www.deepl.com/custom-rules/). ## API overview @@ -56,13 +56,13 @@ When creating a new list, you have the option to include: * both of these * neither -In short, you can create an empty list, or you can populate our new list with predefined rules and/or custom instructions. +In short, you can create an empty list, or you can populate a new list with predefined rules and/or custom instructions. ### Discovering predefined rules -To find whether DeepL provides predefined rules for the three Québécois guidelines we need, we can check the API Reference for any method that changes the predefined rules in a list. Let's try this with the [Create a style rule list](https://developers.deepl.com/api-reference/style-rules/create-style-rule) method, looking for a rule that matches our first guideline: 'Don't use a space before punctuation marks like "?", "!", and ":"'. +To find whether DeepL provides predefined rules for the three Québécois guidelines we need, we can check the API Reference for any method that changes the predefined rules in a list. Let's try this with the [Create a style rule list](/api-reference/style-rules/create-style-rule) method, looking for a rule that matches our first guideline: 'Don't use a space before punctuation marks like "?", "!", and ":"'. -Scanning through the `Body` section, we find [the `configured_rules` parameter](https://developers.deepl.com/api-reference/style-rules/create-style-rule#body-configured-rules). Expanding that reveals the available categories of predefined rules, including [`configured_rules.punctuation`](/api-reference/style-rules/create-style-rule#body-configured-rules-punctuation). Expand the "child attributes" section and scroll down to find the [`spacing_and_punctuation`](/api-reference/style-rules/create-style-rule#body-configured-rules-punctuation-spacing-and-punctuation) rule, with the option `do_not_use_space`. That's just what we need! +Scanning through the `Body` section, we find [the `configured_rules` parameter](/api-reference/style-rules/create-style-rule#body-configured-rules). Expanding that reveals the available categories of predefined rules, including [`configured_rules.punctuation`](/api-reference/style-rules/create-style-rule#body-configured-rules-punctuation). Expand the "child attributes" section and scroll down to find the [`spacing_and_punctuation`](/api-reference/style-rules/create-style-rule#body-configured-rules-punctuation-spacing-and-punctuation) rule, with the option `do_not_use_space`. That's just what we need! Use this method to find rules for each of our three guidelines, noting the category, rule name, and desired option for each: @@ -510,7 +510,7 @@ For clarity, in the client library code samples below, we create `configured_rul ```javascript Request - const configured_rules = { + const configuredRules = { punctuation: { spacing_and_punctuation: 'do_not_use_space', quotation_mark: 'use_guillemets' @@ -520,7 +520,7 @@ For clarity, in the client library code samples below, we create `configured_rul } } - const custom_instructions = [ + const customInstructions = [ { label: 'one-digit numbers', prompt: 'Write out any integer below 10, in any sentence that only contains one number, unless that integer is part of a date, time, percentage, or currency' @@ -531,8 +531,8 @@ For clarity, in the client library code samples below, we create `configured_rul const result = await deeplClient.createStyleRule({ name: 'Québécois++', language: 'fr', - configured_rules, - custom_instructions + configuredRules, + customInstructions }); console.log(`Yay, we made a new style rule list named '${result.name}' with the id '${result.styleId}'`); @@ -667,7 +667,7 @@ Let's try our style rule list in an actual translation! To do so, we simply add "translations": [ { "detected_source_language": "EN", - "text": "Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu : « ARRÊTE! »" + "text": "Il a dit: «J'ai mangé six burritos d'un coup!» Elle a répondu: « ARRÊTE! »" } ] }