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

# Finding a machine's HWID

> How a customer finds the hardware id AuthForge needs to mint a bound .authforge file, and why a pasted string so often becomes a hwid_mismatch ticket.

A bound offline license file (`.authforge`) is locked to one or more hardware ids. The operator cannot mint that file until they have the id from the **same SDK** that will later call `loginFromFile`.

Do not ask the customer to type the HWID into an email. Email truncates, line-wraps, autocorrects and adds trailing whitespace; every one of those fails later as `hwid_mismatch` and looks like a product bug. Prefer an [activation request](/guides/activation-requests) file (`.authforge-request`) that the SDK writes and the dashboard checksums.

## Surface it in the product

Recommend a copy-to-clipboard control on an About, Settings or Support screen (or a `--hwid` CLI flag). The getter is already public in every official SDK; you do not need a network call or an app secret.

<CodeGroup>
  ```python Python theme={null}
  print(client.get_hwid())
  # or write a request file the operator can drop into the dashboard:
  client.write_activation_request("machine.authforge-request")
  ```

  ```js Node.js theme={null}
  console.log(client.getHwid());
  client.writeActivationRequest("./machine.authforge-request");
  ```

  ```go Go theme={null}
  fmt.Println(client.HWID())
  fmt.Print(client.CreateActivationRequest(authforge.ActivationRequestOptions{}))
  ```

  ```rust Rust theme={null}
  println!("{}", client.hwid());
  let request = client.create_activation_request(Default::default());
  ```

  ```csharp C# theme={null}
  Console.WriteLine(client.GetHwid());
  File.WriteAllText("machine.authforge-request", client.CreateActivationRequest());
  ```

  ```cpp C++ theme={null}
  std::cout << client.GetHwid() << "\n";
  std::ofstream out("machine.authforge-request");
  out << client.CreateActivationRequest();
  ```
</CodeGroup>

An offline-only client constructed with just `appId` and `publicKey` can do this. No `login()`, no app secret, no network.

## It is not portable

Collect the value from the **same SDK language** that will load the file. A Node `getHwid()` is not a C# `GetHwid()` on the same machine. See [HWID locking](/features/hwid-locking). If your product uses several SDKs on one box, pass `hwidOverride` with an identifier you control instead.

## It changes when hardware does

HWID is derived from MAC address, CPU and disk serial. A motherboard swap, a disk swap, or some VM moves produce a new value. The customer should expect to send a new request (and receive a new `.authforge` file) after significant hardware replacement.

## If they already pasted a string

Before you mint:

1. Strip whitespace.
2. Check for a line-wrap in the middle of the hex.
3. Ask for a `.authforge-request` instead.

A bound file minted to a damaged string is a wasted credit and another support ticket.
