> ## Documentation Index
> Fetch the complete documentation index at: https://docs.statproxies.com/llms.txt
> Use this file to discover all available pages before exploring further.

# TCP Fingerprint Profiles

> Get proxy lists with a Windows, macOS, iOS or Linux TCP/IP fingerprint from the API with ?fingerprint=, or add -os-<name> to the username yourself.

Add `?fingerprint=windows`, `macos`, `ios` or `linux` to a proxy-list request, and every username in `proxies` comes back with the matching `-os-<name>` suffix. The password, IPs and ports don't change, and without the parameter you get the same plain list as before. You can also add the suffix to the username yourself.

| Profile | Username to connect with |
| - | - |
| Default (Windows, or the OS your User-Agent names) | `proxy_username` as returned |
| Windows 11 | `proxy_username` + `-os-windows` |
| macOS | `proxy_username` + `-os-macos` |
| iOS | `proxy_username` + `-os-ios` |
| Linux | `proxy_username` + `-os-linux` |

The suffix works on the HTTP port and on the SOCKS5 port, so it combines with `?protocol=socks5`. Any other name, including `-os-android`, returns **407 Proxy Authentication Required** (SOCKS5: authentication failure). For what each profile sends and how the default is chosen, see [TCP/IP Fingerprint](/articles/tcp-fingerprint).

## Ask the API for it

`fingerprint` works on [Get Order](/api-reference/order/get-order), [List Orders](/api-reference/order/list-orders) (with `include_proxies=true`) and [Get Customer Orders](/api-reference/order/get-customer-orders).

<ParamField query="fingerprint" type="string">
  `windows`, `macos`, `ios` or `linux`. Each username in `proxies` gets `-os-<value>` added. The top-level `proxy_username` and `proxy_password` fields stay plain. Leave it off, or pass `auto`, for the default list. Any other value, including `android`, returns **400**. Works with every `format` and with `protocol=socks5`.
</ParamField>

```bash theme={null}
curl -X GET "https://dashboard.statproxies.com/api/v2/order/fetch/sub_1rqjp3jb4g9i6pkhdwmkpjob?fingerprint=macos" \
  -H "Authorization: Bearer {your_api_key}"
```

```json theme={null}
{
  "response": "success",
  "order": {
    "proxy_username": "sub_1rqjp3jb4g9i6pkhdwmkpjob",
    "proxy_password": "stat261",
    "proxies": [
      "31.193.191.6:3128:sub_1rqjp3jb4g9i6pkhdwmkpjob-os-macos:stat261",
      "31.193.191.7:3128:sub_1rqjp3jb4g9i6pkhdwmkpjob-os-macos:stat261"
    ]
  }
}
```

Combine it with SOCKS5 and JSON objects: `?fingerprint=linux&protocol=socks5&format=object`.

#### 400 Bad Request - Invalid Fingerprint

```json theme={null}
{
  "message": "Invalid fingerprint. Use 'windows', 'macos', 'ios' or 'linux'."
}
```

## Or add the suffix yourself

Fetch the list as usual with [Get Order](/api-reference/order/get-order), [List Orders](/api-reference/order/list-orders) or [Get Customer Orders](/api-reference/order/get-customer-orders), then rewrite the username. `format=object` is the easiest to work with, because the username is its own field.

<Tabs>
  <Tab title="Python">
    ```python theme={null}
    import requests

    API_KEY = "YOUR_API_KEY"
    ORDER_ID = "sub_1rqjp3jb4g9i6pkhdwmkpjob"
    PROFILE = "macos"  # windows, macos, ios or linux

    r = requests.get(
        f"https://dashboard.statproxies.com/api/v2/order/fetch/{ORDER_ID}",
        params={"format": "object"},  # add "protocol": "socks5" for SOCKS5
        headers={"Authorization": f"Bearer {API_KEY}"},
        timeout=30,
    )
    proxies = [
        f"http://{p['username']}-os-{PROFILE}:{p['password']}@{p['ip']}:{p['port']}"
        for p in r.json()["order"]["proxies"]
    ]
    ```
  </Tab>

  <Tab title="Node.js">
    ```javascript theme={null}
    const API_KEY = "YOUR_API_KEY";
    const ORDER_ID = "sub_1rqjp3jb4g9i6pkhdwmkpjob";
    const PROFILE = "macos"; // windows, macos, ios or linux

    const res = await fetch(
      `https://dashboard.statproxies.com/api/v2/order/fetch/${ORDER_ID}?format=object`,
      { headers: { Authorization: `Bearer ${API_KEY}` } }
    );
    const { order } = await res.json();
    const proxies = order.proxies.map(
      (p) => `http://${p.username}-os-${PROFILE}:${p.password}@${p.ip}:${p.port}`
    );
    ```
  </Tab>

  <Tab title="cURL + jq">
    ```bash theme={null}
    curl -s "https://dashboard.statproxies.com/api/v2/order/fetch/sub_1rqjp3jb4g9i6pkhdwmkpjob?format=object" \
      -H "Authorization: Bearer YOUR_API_KEY" \
      | jq -r '.order.proxies[] | "\(.ip):\(.port):\(.username)-os-macos:\(.password)"'
    ```
  </Tab>
</Tabs>

### String formats

If you use a string `format`, add the suffix to the username field only.

| `format` | Line from the API | Line with a macOS profile |
| - | - | - |
| `ipup` (default) | `31.193.191.6:3128:sub_1abc:stat261` | `31.193.191.6:3128:sub_1abc-os-macos:stat261` |
| `upip` | `sub_1abc:stat261:31.193.191.6:3128` | `sub_1abc-os-macos:stat261:31.193.191.6:3128` |
| `upaip` | `sub_1abc:stat261@31.193.191.6:3128` | `sub_1abc-os-macos:stat261@31.193.191.6:3128` |

```python theme={null}
def with_profile(line: str, fmt: str, profile: str) -> str:
    suffix = f"-os-{profile}"
    if fmt == "ipup":
        ip, port, user, pw = line.split(":", 3)
        return f"{ip}:{port}:{user}{suffix}:{pw}"
    user, rest = line.split(":", 1)  # upip and upaip start with the username
    return f"{user}{suffix}:{rest}"
```

## Notes

* The suffix doesn't change billing. Traffic on every profile counts toward the same order in [Get Usage](/api-reference/order/get-usage)
* You can mix profiles on the same order and the same IP. The profile is chosen per connection
* Profile names are lowercase. A misspelled name gets a 407, so check the spelling first if a flagged username fails and the plain one works


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.