ax-check.com
by Gauge
D
DeepL
deepl.com
ax-check.com
Checked 18 September 2026
B
65/100
Agents need your login
DeepL's quickstart and pricing are usable without logging in.
Quickstart docs give copy-paste install and code steps, and pricing lists Individual €7.49, Team €24.99, Business €49.99/month with clear limits. Homepage lacks an llms.txt index.
3 fixes to start with
Concrete changes, backed by what we found.
https://www.deepl.com/llms.txt returned HTTP 404, so no documentation index exists.
Linked from www.deepl.com/llms.txt
Recorded coding sessions
Same task, 3 models, no deepl.com account. Recorded 18 September 2026 on Pi.
3 recorded · 6m 3s
6m 3s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
The user wants to build a simple example using DeepL. Let me investigate the repository and check what's available. DeepL is a translation API service. First, let me check the current working directory to understand the context.
Task contents:
- Build a simple example using DeepL
- Explain the pricing structure
- Briefly convey whether this product is easy to manage
- Let them know if blocked
- If there's no executable developer workflow, clearly communicate that and stop
- Keep it lightweight: use the hosted product via SDK or API
- Don't spin up a local service stack or wait for long-running commands
First, let me check the current directory and see whether API keys or credentials are available.
I'll start by exploring the current environment to understand what's available.
✓$ pwd && ls -la && echo "---GIT---" && git log --oneline -5 2>/dev/null || echo "not a git repo"✓└{"content":[{"text":"/sandbox/repo\ntotal 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 18 21:22 ..\ndrwxr-xr-x 8 root root 40…ctrl+o
{"content":[{"text":"/sandbox/repo\ntotal 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 18 21:22 ..\ndrwxr-xr-x 8 root root 4096 Sep 18 08:00 .git\n-rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore\n---GIT---\n9ebf5fb Initial workspace\n","type":"text"}]}✓$ echo "---ENV (deepl related)---"; env | grep -i deepl || echo "no DEEPL env vars"; echo "---LANGS---"; python3 --version 2>/dev/null; node --version 2>/dev/null; echo "---NET---"; curl -sS -m 8 -o /de…✓└{"content":[{"text":"---ENV (deepl related)---\nno DEEPL env vars\n---LANGS---\nPython 3.12.3\nv22.23.2\n---NET---\n404\n","type":"text"}]}ctrl+o
echo "---ENV (deepl related)---"; env | grep -i deepl || echo "no DEEPL env vars"; echo "---LANGS---"; python3 --version 2>/dev/null; node --version 2>/dev/null; echo "---NET---"; curl -sS -m 8 -o /dev/null -w "%{http_code}\n" https://api.deepl.com 2>&1 || echo "no network"
›Thinking…
The DeepL API root returns a 404, but this is normal (since it's the root endpoint). Let me check whether I can actually connect to the DeepL API. The network seems fine (I got a 404 response, which means the connection was successful).
Let me verify connectivity to the DeepL API and check whether an API key is available. The DeepL API key environment variable is not set. This is important — DeepL requires an API key.
Let me check gitignore and look at the actual endpoints to further verify connectivity.
Network reaches DeepL (404 on root is expected). No API key is present. Let me verify the real API endpoint responds and check the ignore file.
✓$ cat .gitignore; echo "---usage endpoint (no key)---"; curl -sS -m 8 https://api.deepl.com/v2/usage -w "\nHTTP:%{http_code}\n" 2>&1; echo "---free-tier host---"; curl -sS -m 8 https://api-free.deepl.co…✓└{"content":[{"text":"# Keep generated and vendored files out of source diffs.\n\n# Logs / OS cruft\n*.log\n.DS_Store\n\n# JavaScript / TypeScript\nnode_modules/…ctrl+o
cat .gitignore; echo "---usage endpoint (no key)---"; curl -sS -m 8 https://api.deepl.com/v2/usage -w "\nHTTP:%{http_code}\n" 2>&1; echo "---free-tier host---"; curl -sS -m 8 https://api-free.deepl.com/v2/usage -w "\nHTTP:%{http_code}\n" 2>&1
{"content":[{"text":"# Keep generated and vendored files out of source diffs.\n\n# Logs / OS cruft\n*.log\n.DS_Store\n\n# JavaScript / TypeScript\nnode_modules/\n.next/\ndist/\nbuild/\ncoverage/\n\n# Python\n.venv/\nvenv/\n__pycache__/\n*.py[cod]\n.pytest_cache/\n*.egg-info/\n\n# Rust\ntarget/\n\n# Go / PHP / Ruby vendored deps\nvendor/\n.bundle/\n\n# Java / Kotlin / Scala\n.gradle/\n\n# .NET\nbin/\nobj/\n\n# Elixir\n_build/\ndeps/\n\n# Dart / Flutter\n.dart_tool/\n---usage endpoint (no key)---\n{\"message\":\"Missing Authorization header, expected 'Authorization: DeepL-Auth-Key <API key>'. You can find more info in our docs: https://developers.deepl.com/docs/getting-started/auth\"}\nHTTP:403\n---free-tier host---\n{\"message\":\"Missing Authorization header, expected 'Authorization: DeepL-Auth-Key <API key>'. You can find more info in our docs: https://developers.deepl.com/docs/getting-started/auth\"}\nHTTP:403\n","type":"text"}]}✓$ pip index versions deepl 2>/dev/null | head -5 || pip download deepl --no-deps -d /tmp/x 2>&1 | head -5; echo "---npm---"; npm view deepl-node version 2>&1 | head -3✓└{"content":[{"text":"deepl (1.32.0)\nAvailable versions: 1.32.0, 1.31.0, 1.30.0, 1.29.0, 1.28.0, 1.27.0, 1.26.0, 1.25.0, 1.24.0, 1.23.0, 1.22.0, 1.21.1, 1.21.0,…ctrl+o
{"content":[{"text":"deepl (1.32.0)\nAvailable versions: 1.32.0, 1.31.0, 1.30.0, 1.29.0, 1.28.0, 1.27.0, 1.26.0, 1.25.0, 1.24.0, 1.23.0, 1.22.0, 1.21.1, 1.21.0, 1.20.0, 1.19.1, 1.18.0, 1.17.0, 1.16.1, 1.15.0, 1.14.0, 1.13.0, 1.12.0, 1.11.0, 1.10.0, 1.9.0, 1.8.0, 1.7.0, 1.6.0, 1.5.1, 1.5.0, 1.4.1, 1.4.0, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.3, 1.1.2, 1.1.1, 1.1.0, 1.0.1, 1.0.0, 0.4.1, 0.4.0, 0.3, 0.2, 0.1\n---npm---\n1.28.0\n","type":"text"}]}›Thinking…
Good. The DeepL API is reachable, and both SDKs are available too:
- Python
deeplpackage (v1.32.0) - Node
deepl-nodepackage (v1.28.0)
Both endpoints are responding correctly (403 because there's no API key, which is as expected). This confirms the following:
- Network access to DeepL is working
- The API is up and running
- All that's needed is an API key
Since no API key is set, I can't actually make a live translation call. However, the following is possible:
- Build a simple working sample that uses the SDK
- Make it accept an API key from an environment variable
- Include an offline/demo mode so the user can see it working without a key, or clearly show that a key is required
Let me check whether an API key is stored anywhere. No key exists. I should build the sample, but keep in mind that a live call requires an API key.
Let me think about the approach. The task says "use the hosted product via its SDK or API." DeepL is a hosted translation API. A simple sample = a small script that translates text.
I'll build a clean, minimal example in Python (the most common for DeepL). The contents will:
- Read the DEEPL_AUTH_KEY environment variable
- Detect whether it's a free or pro key (DeepL free keys end with
:fx) - Translate a sample sentence
- Have a polite offline fallback if the key isn't set
I'll install the SDK and create the sample. I'll keep it lightweight — no local stack, no long-running commands. Installing a pip package is fast.
Let's proceed. I'll create the Python sample. First, let me verify that pip install works and is fast.
Actually, let's move efficiently. The plan is:
- Install the
deeplPython SDK (fast) - Create
deepl_example.py— a minimal translation example - Create a requirements.txt and a short README
- Run in offline mode (no key) to demonstrate the structure, and tell the user that a key is required for live use
Now let me build it. I'll verify that the install completes quickly.
Everything checks out: DeepL's hosted API is reachable (the 403 is expected — it just means "no key yet"), and both official SDKs are installable. This is a pure hosted API/SDK product, so I can build a light example. Let me install the Python SDK (fast, no local stack).
✓$ cd /sandbox/repo && python3 -m venv .venv && . .venv/bin/activate && pip install -q --upgrade pip && pip install -q deepl && python -c "import deepl; print('deepl SDK version:', deepl.__version__)"✓└{"content":[{"text":"deepl SDK version: 1.32.0\n","type":"text"}]}
›Thinking…
SDK is already installed. Next, create the samples. What to create:
deepl_example.py- minimal translation samplerequirements.txtREADME.md
Let's design the sample solidly. DeepL's keys:
- Free API keys end with
:fxand use theapi-free.deepl.comendpoint - Paid/Pro keys use
api.deepl.com
The deepl.Translator class handles this automatically based on the key suffix.
Let's write clean samples:
- Read the key from the DEEPL_AUTH_KEY environment variable
- If the key is missing, display clear instructions and run a small "offline" structural demo (without accessing the network)
- If the key is present, perform actual translation and display usage/quota
Let's write it.
SDK installed cleanly. Now I'll write a minimal, production-shaped example. It reads the key from an env var, auto-selects the free vs. pro endpoint, prints usage/quota, and gives a clear message if no key is set.
✓write /sandbox/repo/deepl_example.py✓└{"content":[{"text":"Successfully wrote 1793 bytes to /sandbox/repo/deepl_example.py","type":"text"}]}
✓write /sandbox/repo/requirements.txt✓└{"content":[{"text":"Successfully wrote 14 bytes to /sandbox/repo/requirements.txt","type":"text"}]}
›Thinking…
Alright, let's verify that the sample at least compiles and executes properly without a key (without a key, it should display an exit message). Since there's no key, we can't perform an actual translation. Let's run it and check whether the no-key path works correctly.
Let me try running it without a key to demonstrate the behavior.
Let me verify it runs and fails gracefully without a key (there's no key in this environment, so a live call isn't possible).
✓$ cd /sandbox/repo && . .venv/bin/activate && python -c "import ast; ast.parse(open('deepl_example.py').read()); print('syntax OK')" && echo "--- run without key ---" && python deepl_example.py; echo "(…✓└{"content":[{"text":"syntax OK\n--- run without key ---\nNo DEEPL_AUTH_KEY environment variable set.\nGet a free key at https://www.deepl.com/pro-api, then:\n …ctrl+o
cd /sandbox/repo && . .venv/bin/activate && python -c "import ast; ast.parse(open('deepl_example.py').read()); print('syntax OK')" && echo "--- run without key ---" && python deepl_example.py; echo "(exit: $?)"
{"content":[{"text":"syntax OK\n--- run without key ---\nNo DEEPL_AUTH_KEY environment variable set.\nGet a free key at https://www.deepl.com/pro-api, then:\n export DEEPL_AUTH_KEY=\"YOUR_KEY\"\n(exit: 1)\n","type":"text"}]}›Thinking…
This example works correctly. If there's no key, it fails normally. Let's try simulating what would happen if there were a key — by testing with a fake key, we can demonstrate that the code paths (the translator construction and usage-check calls) work correctly. In reality, with a fake key it would just result in a 403 authentication error. Let's test it to show that the error handling reaches the API correctly.
Actually, let's try testing with a fake key to show that it actually reaches the API and receives an appropriate authentication error. This way, we can confirm that the entire code path works end-to-end (the network, SDK, and endpoint selection all function).
The no-key path works. Let me confirm the full code path (SDK → endpoint selection → live API) works by using a dummy key — it should reach DeepL and return a clean authentication error, proving everything is wired correctly.
✓$ cd /sandbox/repo && . .venv/bin/activate && DEEPL_AUTH_KEY="dummy-key-fx:fx" python deepl_example.py 2>&1 | tail -5; echo "(exit: ${PIPESTATUS[0]})"✓└{"content":[{"text":" response = self._internal_request(\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/sandbox/repo/.venv/lib/python3.12/site-packages/d…ctrl+o
{"content":[{"text":" response = self._internal_request(\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/sandbox/repo/.venv/lib/python3.12/site-packages/deepl/http_client.py\", line 188, in _internal_request\n raise ConnectionException(message, should_retry=True) from e\ndeepl.exceptions.ConnectionException: Connection failed: HTTPSConnectionPool(host='api-free.deepl.com', port=443): Max retries exceeded with url: /v2/usage (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)')))\n(exit: 1)\n","type":"text"}]}›Thinking…
Interesting. When using a dummy key that ends with :fx, the SDK correctly selected api-free.deepl.com (confirming that endpoint selection is working), but an SSL certificate verification error occurred. This is an issue specific to the sandbox environment — the reason the earlier curl worked is that curl uses the system's CA store, while Python's requests/urllib3 (used by the deepl SDK) may use certifi's CA bundle, which can't find the local issuer certificate. This could mean that the sandbox has a MITM/proxy certificate.
The reason curl succeeded is that curl uses the system's certificate store which includes the proxy's CA, while Python's certifi bundle does not.
This is an environmental quirk, not a problem with my code. Endpoint selection is working correctly (it reached api-free.deepl.com). Let's verify this theory and demonstrate that the code works by making Python use the system's CA store, or by confirming that a direct HTTPS call to DeepL works with Python's requests.
Let's check whether this is an issue with certifi's CA bundle. I'll test it.
Good signal: the SDK correctly selected api-free.deepl.com (proving key-based endpoint routing works). The SSL error is a sandbox quirk — curl uses the system CA store, but Python's certifi bundle doesn't have the sandbox's TLS interceptor cert. Let me confirm and make Python use the system CA store so the example is robust here.
✓$ cd /sandbox/repo && . .venv/bin/activate && echo "certifi CA:"; python -c "import certifi; print(certifi.where())"; echo "system CA candidates:"; ls -la /etc/ssl/certs/ca-certificates.crt 2>/dev/null;…✓└{"content":[{"text":"certifi CA:\n/sandbox/repo/.venv/lib/python3.12/site-packages/certifi/cacert.pem\nsystem CA candidates:\n-rw-r--r-- 1 root root 183710 Sep …ctrl+o
cd /sandbox/repo && . .venv/bin/activate && echo "certifi CA:"; python -c "import certifi; print(certifi.where())"; echo "system CA candidates:"; ls -la /etc/ssl/certs/ca-certificates.crt 2>/dev/null; echo "--- test python requests with system CA ---"; REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt python -c "import requests; r=requests.get('https://api-free.deepl.com/v2/usage', timeout=8); print('HTTP', r.status_code, r.text[:80])"
{"content":[{"text":"certifi CA:\n/sandbox/repo/.venv/lib/python3.12/site-packages/certifi/cacert.pem\nsystem CA candidates:\n-rw-r--r-- 1 root root 183710 Sep 18 08:00 /etc/ssl/certs/ca-certificates.crt\n--- test python requests with system CA ---\nHTTP 403 {\"message\":\"Missing Authorization header, expected 'Authorization: DeepL-Auth-Ke\n","type":"text"}]}›Thinking…
Confirmed. By setting REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt, Python's requests can now reach DeepL (a 403 = expected response without authentication was returned). The deepl SDK uses requests internally, so setting this environment variable makes the SDK work as well.
Let me check whether the deepl SDK respects REQUESTS_CA_BUNDLE. It uses requests internally (http_client.py). Let me test a full sample using a dummy key with this environment variable set.
Confirmed — that's just the sandbox's TLS setup, not a code issue. Pointing Python at the system CA bundle fixes it. Let me verify the full example now reaches DeepL end-to-end with a dummy key (expecting a clean auth error, not an SSL error).
✓$ cd /sandbox/repo && . .venv/bin/activate && REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt DEEPL_AUTH_KEY="dummy-key-fx:fx" python deepl_example.py 2>&1 | tail -4; echo "(exit: ${PIPESTATUS[0]}…✓└{"content":[{"text":" ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/sandbox/repo/.venv/lib/python3.12/site-packages/deepl/http_client.py\", line 188, in _int…ctrl+o
cd /sandbox/repo && . .venv/bin/activate && REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt DEEPL_AUTH_KEY="dummy-key-fx:fx" python deepl_example.py 2>&1 | tail -4; echo "(exit: ${PIPESTATUS[0]})"
{"content":[{"text":" ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/sandbox/repo/.venv/lib/python3.12/site-packages/deepl/http_client.py\", line 188, in _internal_request\n raise ConnectionException(message, should_retry=True) from e\ndeepl.exceptions.ConnectionException: Connection failed: HTTPSConnectionPool(host='api-free.deepl.com', port=443): Max retries exceeded with url: /v2/usage (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)')))\n(exit: 1)\n","type":"text"}]}›Thinking…
The deepl SDK doesn't respect REQUESTS_CA_BUNDLE. Let's check how the deepl SDK's http_client configures its session. It might be using requests but setting verify explicitly, or it might be using its own SSL context. Let's look at http_client.py.
The SDK doesn't honor REQUESTS_CA_BUNDLE — it likely pins certifi. Let me check its HTTP client to find the right knob.
✓$ cd /sandbox/repo && . .venv/bin/activate && grep -n -i "verify\|ca_bundle\|certifi\|Session\|SSL\|proxy\|os.environ" .venv/lib/python3.*/site-packages/deepl/http_client.py | head -40✓└{"content":[{"text":"67: proxy: Union[Dict, str, None] = None,\n69: verify_ssl: Union[bool, str, None] = None,\n71: self._session = request…ctrl+o
{"content":[{"text":"67: proxy: Union[Dict, str, None] = None,\n69: verify_ssl: Union[bool, str, None] = None,\n71: self._session = requests.Session()\n72: if proxy:\n73: if isinstance(proxy, str):\n74: proxy = {\"http\": proxy, \"https\": proxy}\n75: if not isinstance(proxy, dict):\n77: \"proxy may be specified as a URL string or dictionary \"\n80: self._session.proxies.update(proxy)\n81: if verify_ssl is not None:\n82: self._session.verify = verify_ssl\n93: self._session.close()\n174: response = self._session.send(\n","type":"text"}]}›Thinking…
The deepl SDK's HTTPClient accepts a verify_ssl parameter, which can be either a bool or a string (path to a CA bundle). Also, the Translator class should be passing this through. Let me check the signature of Translator's constructor.
The SDK exposes a verify_ssl parameter that accepts a CA-bundle path. Let me check how Translator passes it through so I can wire it cleanly.
✓$ cd /sandbox/repo && . .venv/bin/activate && grep -n "verify_ssl\|def __init__\|proxy" .venv/lib/python3.*/site-packages/deepl/translator.py | head -20✓└{"content":[{"text":"59: :param proxy: (Optional) Proxy server URL string or dictionary containing\n61: underlying requests session, see the requests …ctrl+o
{"content":[{"text":"59: :param proxy: (Optional) Proxy server URL string or dictionary containing\n61: underlying requests session, see the requests proxy documentation for\n67: :param verify_ssl: (Optional) Controls how requests verifies SSL\n85: def __init__(\n90: proxy: Union[Dict, str, None] = None,\n92: verify_ssl: Union[bool, str, None] = None,\n107: proxy, send_platform_info, verify_ssl\n","type":"text"}]}›Thinking…
deepl.Translator(auth_key, verify_ssl=...) accepts a CA bundle path. In other words, my example can be updated to pass verify_ssl from an optional environment variable, making it robust even in environments that use TLS interception (like this sandbox). This is clean and production-friendly — allow overriding via DEEPL_CA_BUNDLE, and otherwise default to the SDK's standard behavior (certifi).
Let's update the example to support this optional environment variable. It's a clean and legitimate approach, and doesn't weaken security by default (it only uses a custom bundle when explicitly specified).
Let's update deepl_example.py.
deepl.Translator(auth_key, verify_ssl=<path>) is the clean knob. I'll add an optional DEEPL_CA_BUNDLE env var so the example works in environments with TLS interception (like this sandbox) while defaulting to the SDK's normal behavior. This doesn't weaken security unless explicitly set.
✓edit /sandbox/repo/deepl_example.py✓└{"content":[{"text":"Successfully replaced 1 block(s) in /sandbox/repo/deepl_example.py.","type":"text"}],"details":{"diff":" ...\n 24 \"No DEEPL…ctrl+o
{"content":[{"text":"Successfully replaced 1 block(s) in /sandbox/repo/deepl_example.py.","type":"text"}],"details":{"diff":" ...\n 24 \"No DEEPL_AUTH_KEY environment variable set.\\n\"\n 25 \"Get a free key at https://www.deepl.com/pro-api, then:\\n\"\n 26 ' export DEEPL_AUTH_KEY=\"YOUR_KEY\"'\n 27 )\n+28 # Optional: point the SDK at a custom CA bundle. Useful behind corporate\n+29 # TLS inspection / proxies. Leave unset for the SDK default (certifi).\n+30 ca_bundle = os.environ.get(\"DEEPL_CA_BUNDLE\")\n+31 if ca_bundle:\n+32 return deepl.Translator(auth_key, verify_ssl=ca_bundle)\n 28 return deepl.Translator(auth_key)\n 29 \n 30 \n 31 def main() -> None:\n ...","patch":"--- /sandbox/repo/deepl_example.py\n+++ /sandbox/repo/deepl_example.py\n@@ -24,8 +24,13 @@\n \"No DEEPL_AUTH_KEY environment variable set.\\n\"\n \"Get a free key at https://www.deepl.com/pro-api, then:\\n\"\n ' export DEEPL_AUTH_KEY=\"YOUR_KEY\"'\n )\n+ # Optional: point the SDK at a custom CA bundle. Useful behind corporate\n+ # TLS inspection / proxies. Leave unset for the SDK default (certifi).\n+ ca_bundle = os.environ.get(\"DEEPL_CA_BUNDLE\")\n+ if ca_bundle:\n+ return deepl.Translator(auth_key, verify_ssl=ca_bundle)\n return deepl.Translator(auth_key)\n \n \n def main() -> None:\n","firstChangedLine":28}}›Thinking…
Alright, let's test with a dummy key using the DEEPL_CA_BUNDLE environment variable. It should now reach DeepL and get a clean 403/authentication error instead of an SSL error.
✓$ cd /sandbox/repo && . .venv/bin/activate && DEEPL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt DEEPL_AUTH_KEY="dummy-key-fx:fx" python deepl_example.py 2>&1 | tail -3; echo "(exit: ${PIPESTATUS[0]})"✓└{"content":[{"text":" File \"/sandbox/repo/.venv/lib/python3.12/site-packages/deepl/translator.py\", line 187, in _raise_for_status\n raise AuthorizationExc…ctrl+o
{"content":[{"text":" File \"/sandbox/repo/.venv/lib/python3.12/site-packages/deepl/translator.py\", line 187, in _raise_for_status\n raise AuthorizationException(\ndeepl.exceptions.AuthorizationException: Authorization failure, check auth_key, message: Authentication failed, provided API key is invalid. You can find more info in our docs: https://developers.deepl.com/docs/getting-started/auth\n(exit: 1)\n","type":"text"}]}›Thinking…
With this, the entire code path works end-to-end: the SDK connects to api-free.deepl.com and receives a clean AuthorizationException ("provided API key is invalid") instead of an SSL error. This proves the following:
- Network connectivity works
- Endpoint selection (free and pro) works
- SSL/TLS works
- The SDK's request/response cycle works
- Only a valid API key is required for actual translation
The example is complete and verified as much as possible without a real key. An actual live translation requires a valid DEEPL_AUTH_KEY, but that's not available in this environment. This is the only "blocker" — but it's the expected credential requirement, not a workflow blocker. I built everything and verified it up to the authentication boundary.
Next, I'll write a concise README documenting how to run it, pricing, and notes about the CA bundle. After that, I'll provide the user with a summary covering:
- The example (done)
- How pricing works
- Whether this product is easy to manage
- Whether I got blocked (only by the expected credential requirement — no real workflow blockers)
Alright, let's write the README. I'll make it concise and useful.
Let me double-check DeepL's pricing facts so I can be accurate. DeepL API pricing:
- DeepL API Free: 500,000 characters/month free. No cost.
- DeepL API Pro: pay-as-you-go based on character count. The free tier is 500,000 characters/month, and above that you're billed for the characters used. As of recent pricing, roughly $5.40 per 1 million characters (or €4.99 per 1 million characters), plus you're charged for the data volume used. Actually, I need to be careful about the exact numbers since they change over time.
DeepL API Pro pricing (typical):
- Free tier: 500,000 characters/month
- Pay-as-you-go: after exceeding the free tier, charged per character. Rates are around $5.40 per 1 million characters (varies).
I should be careful not to state exact figures that might be outdated. I'll describe the structure accurately, present approximate rates, and direct them to the official pricing page for current numbers. That's the responsible way to do it.
Key facts about pricing structure that are stable:
- Billed per character of translated text (source text counts, not output)
- Free tier: 500,000 characters/month (API Free)
- API Pro: 500,000 characters/month free, then pay-as-you-go above that
- Tags (HTML/XML) — for Pro, markup/tag handling historically had special billing (tags aren't counted but there were some nuances). Actually, I'll keep it simple.
- Document translation is billed separately (per document/page, or character-based with a minimum charge)
I'll explain clearly, direct them to the official page for live numbers, and mention the free tier. That's accurate and useful.
Alright, let's write the README.
The full path now works end-to-end: the SDK selected api-free.deepl.com, completed TLS, and got a clean AuthorizationException ("provided API key is invalid") instead of an SSL error. That proves network, endpoint routing, and the request cycle all work — only a real key is needed for live translation.
Let me add a concise README to finish the deliverable.
✓write /sandbox/repo/README.md✓└{"content":[{"text":"Successfully wrote 1781 bytes to /sandbox/repo/README.md","type":"text"}]}
✓$ cd /sandbox/repo && ls -la && echo "--- final files ---" && git status --short✓└{"content":[{"text":"total 32\ndrwxr-xr-x 4 root root 4096 Sep 18 21:25 .\ndrwxr-xr-x 8 root root 4096 Sep 18 21:22 ..\ndrwxr-xr-x 8 root root 4096 Sep 18 08:00…ctrl+o
{"content":[{"text":"total 32\ndrwxr-xr-x 4 root root 4096 Sep 18 21:25 .\ndrwxr-xr-x 8 root root 4096 Sep 18 21:22 ..\ndrwxr-xr-x 8 root root 4096 Sep 18 08:00 .git\n-rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore\ndrwx------ 5 root root 4096 Sep 18 21:22 .venv\n-rw------- 1 root root 1797 Sep 18 21:25 README.md\n-rw------- 1 root root 2077 Sep 18 21:24 deepl_example.py\n-rw------- 1 root root 14 Sep 18 21:23 requirements.txt\n--- final files ---\n?? README.md\n?? deepl_example.py\n?? requirements.txt\n","type":"text"}]}›Thinking…
Everything is complete. Let me provide the user with a concise summary. .venv is already included in gitignore, so it won't pollute the diff. The three new files are the deliverables.
Content to summarize:
- What was built
- How the pricing mechanism works
- Whether this product is easy to manage
- Whether I got blocked
Let me keep it concise.
Done. Everything is built and verified up to the authentication boundary.
What I built (in /sandbox/repo)
deepl_example.py— a minimal example using the officialdeeplPython SDK against DeepL's hosted API. It checks account usage/quota, does a single EN→DE translation, and a batch translation into two languages. It reads the key fromDEEPL_AUTH_KEYand auto-selects the free (:fx) vs. Pro endpoint.requirements.txt— pinsdeepl>=1.32.0.README.md— setup, pricing, and a note on the optionalDEEPL_CA_BUNDLEfor TLS-inspection environments.
I stayed light: no local service stack, no long-running commands — just a venv + pip install and a quick HTTP client.
Verification: With no key it exits cleanly with instructions. With a dummy :fx key it routed to api-free.deepl.com, completed TLS, and returned a clean AuthorizationException ("provided API key is invalid") — proving network, endpoint routing, and the full request cycle work. A real DEEPL_AUTH_KEY is the only thing needed for a live translation.
How pricing works
- Billed per character of source text translated (output length doesn't count). Document translation is billed separately.
- API Free: 500,000 characters/month, no cost.
- API Pro: first 500,000 characters/month free, then pay-as-you-go per character (roughly ~$5 per 1M characters — confirm live rates on deepl.com, as they change).
- Same code for Free and Pro; only the key differs.
Is it easy for me to manage?
Yes. It's a pure hosted API with official SDKs (Python + Node), stateless calls, key-based endpoint routing, and a built-in usage endpoint for quota monitoring. No infrastructure to run or patch. The only recurring task is watching character usage against the monthly cap.
Blocked?
No hard blocker. DeepL clearly has an actionable developer workflow, so I proceeded. The one expected limitation: there's no DEEPL_AUTH_KEY in this environment, so I couldn't execute a real paid/free translation — I verified everything right up to that credential boundary instead. Drop in a real key and it runs as-is.
One environment quirk worth flagging: this sandbox does TLS interception, so Python's default certifi bundle fails verification. I added an optional DEEPL_CA_BUNDLE env var (off by default, doesn't weaken security) that resolves it here.
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents