---
title: "How to match browser timezone and language to a proxy"
description: "A Berlin IP with a New York clock gets flagged. Set a Donut Browser profile's timezone and language from its proxy, and fix a mismatch after a change."
url: "https://donutbrowser.com/docs/guides/match-timezone-to-proxy/"
---

# How to match a browser's timezone and language to its proxy

Sites can compare the location of your IP address with the timezone and language your browser reports. A German IP with a US clock and `en-US` is a strong sign of a proxy, even when nothing else leaks. Donut Browser sets each profile's timezone and language from its proxy's exit when it makes the profile, and checks the pair again before each launch. You need a profile with a proxy.

## How Donut picks the values

When you create a profile with a proxy, Donut:

1. finds the proxy's exit IP through the proxy, from public echo services such as `api.ipify.org`,
2. looks the IP up in a MaxMind GeoLite2 database on your computer, so the IP is not sent to a lookup service,
3. writes the exit's IANA timezone (for example `Europe/Berlin`), its UTC offset, the latitude and longitude the database gives for the IP, and a language.

The language is a weighted random pick among the languages spoken in the exit's country. The weights come from the share of people who speak each language, so a US exit gives `en-US` most of the time and `es-US` some of the time. The `languages` list holds the locale and its base language, for example `de-DE` and `de`.

This happens on every plan. In **Create new profile**, the box "Automatically configure location information based on proxy configuration or your connection if no proxy provided" must stay checked. It is checked by default.

The values stay fixed after that. Donut does not rewrite them when you change the profile's proxy, so a mismatch shows up instead of being hidden.

## 1. Choose the proxy before you create the profile

1. Add and check the proxy on **Network** → **Proxies**. The check's **Connection details** show the exit **Timezone**, so you know what the profile will get.
2. Click **New** on the **Profiles** page, choose the proxy in **Create new profile**, and create the profile.

For a WireGuard VPN, Donut cannot measure the exit at this point and writes no location. See [step 5 of the WireGuard guide](https://donutbrowser.com/docs/guides/wireguard-one-browser#5-set-the-timezone-and-language) for the fix.

## 2. Keep the launch check on

**Settings** → **Privacy** → **Block on fingerprint mismatch** is on by default. Before a launch, Donut measures the exit of the profile's proxy or VPN and compares:

| Value | Passes when |
| --- | --- |
| Timezone | The profile's IANA zone is the exit's zone. |
| Language | The profile's language is one that is spoken in the exit's country. |

Coordinates are not compared. The measured exit is kept for 30 minutes per proxy, so quick relaunches do not measure it again.

The check lets the launch go ahead without a verdict when the exit cannot be measured within 8 seconds, when the GeoIP database is missing, or when the proxy is Shadowsocks. Launches from the [local API](https://donutbrowser.com/docs/quickstart) or MCP never block. They show a warning in the app instead.

## 3. Fix a mismatch with one click

When the values do not match, the launch stops with the dialog **Launch blocked** and the heading "The measured exit doesn't match the fingerprint". It names the problem, for example "Exit node is in Europe/Berlin but the fingerprint reports America/New_York."

1. Click **Match fingerprint to proxy**. Donut writes the measured exit's timezone, offset, coordinates and a new language into the profile.
2. Wait for "Fingerprint updated to match the proxy. Relaunch the profile to apply." Donut cancels this launch.
3. Launch the profile again.

**Match fingerprint to proxy** works on every plan, also on Free and Solo, where you cannot edit the fingerprint by hand. It keeps the rest of the device.

The dialog has two other options. **Launch anyway** starts the browser with the mismatch. "Don't block again for this exact mismatch" stops the dialog for this fingerprint and this exit until one of them changes. When you launch several profiles, "Apply this choice to the remaining profiles" uses your answer for all of them.

## 4. Check what sites see

Launch the profile and open [What is my IP](https://donutbrowser.com/tools/what-is-my-ip). It shows **Timezone (from IP)** next to **Timezone (from browser)**, and a pair of clocks marked "Same time zone" or "Different time zones".

You can also read the values in the browser's DevTools console:

```javascript
Intl.DateTimeFormat().resolvedOptions().timeZone; // "Europe/Berlin"
new Date().getTimezoneOffset();                    // -60 in winter, -120 in summer
navigator.language;                                // "de-DE"
navigator.languages;                               // ["de-DE", "de"]
```

A negative offset means the zone is ahead of UTC. [Browser fingerprint](https://donutbrowser.com/tools/browser-fingerprint) shows the rest of the device.

## When the values change by themselves

Three actions write a new location:

- **Regenerate fingerprint** in the profile's **Fingerprint** section (Pro, Team and Enterprise) makes the new device from your own connection, not through the proxy. The next launch will likely block. Click **Match fingerprint to proxy** then.
- **Generate random fingerprint on every launch** measures the exit at each start and writes a matching location, together with a new device.
- **Change IP** on a rotating proxy can move the exit to another city or country. The launch check reuses the exit it measured in the last 30 minutes, so it can miss the move. Open [What is my IP](https://donutbrowser.com/tools/what-is-my-ip) in the profile after a rotation. See [How to rotate a proxy's IP](https://donutbrowser.com/docs/guides/rotate-proxy-ip).

## Set the location from the API

`POST /v1/profiles` reads the location through the proxy you pass in `proxy_id`, as the app does. To pin the location to a known IP, without a probe, pass it in `wayfern_config.geoip`. To turn location off, pass `false`.

```bash
curl -sS -X POST http://127.0.0.1:10108/v1/profiles \
  -H "Authorization: Bearer $DONUT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "DE shop", "browser": "wayfern", "proxy_id": "<proxy id>"}'
```

```python
import os, requests

response = requests.post(
    "http://127.0.0.1:10108/v1/profiles",
    headers={"Authorization": f"Bearer {os.environ['DONUT_API_KEY']}"},
    json={
        "name": "DE shop",
        "browser": "wayfern",
        "proxy_id": proxy_id,
        "wayfern_config": {"geoip": "203.0.113.80"},  # optional: pin to this IP
    },
    timeout=60,
)
print(response.status_code, response.json())
```

`PUT /v1/profiles/{id}` cannot change the location. After a proxy change, launch the profile from the app and use **Match fingerprint to proxy**.

## Troubleshooting

| What you see | What to do |
| --- | --- |
| "Launch blocked" after you changed the profile's proxy | The values belong to the old exit. Click **Match fingerprint to proxy**. |
| "Nothing was verified against the exit" | The profile has no timezone to compare. This happens with profiles made on a VPN. See the [WireGuard guide](https://donutbrowser.com/docs/guides/wireguard-one-browser#5-set-the-timezone-and-language). |
| "Couldn't match the fingerprint to the proxy." | The match failed. Check the proxy, then launch again. |
| The language changed after a match | Each match draws the language again from the exit country's languages. |
| What is my IP shows "Different time zones" with no launch block | The launch came from the API, the check is off, the proxy is Shadowsocks, or you chose "Don't block again for this exact mismatch". Launch from the app with the check on, then click **Match fingerprint to proxy**. |

## Related

- [Profiles and fingerprints](https://donutbrowser.com/docs/profiles): the fingerprint values you can see and edit.
- [Leak protection](https://donutbrowser.com/docs/proxies#leak-protection): the launch checks in **Settings** → **Privacy**.
- [How to use a SOCKS5 proxy with a username and password](https://donutbrowser.com/docs/guides/socks5-proxy-with-password)
- [How to rotate a proxy's IP with a change-IP link](https://donutbrowser.com/docs/guides/rotate-proxy-ip)

Donut Browser sets a matching timezone and language on every plan, including Free. [Download it](https://donutbrowser.com/) for macOS, Windows or Linux.
