Back to Knowledge Hub
Identity

Browser Identity Surfaces: A Practical Consistency Overview

Map user-agent, client hints, navigator properties, and locale into a bounded identity consistency review without collecting people.

BotBrowser Team

Documentation

Want the structured docs for Identity?

This article lives in the editorial library. For step-by-step setup, reference material, and ongoing updates, jump into the docs section.

Browser identity is a set of related surfaces, not one string. This hub connects the identity cluster and adds a consistency review to User-agent reduction and client hints.

BotBrowser can support a repeated authorized profile and report declared browser observations; it cannot identify a person, prove uniqueness, or guarantee that a service accepts a profile.

Browser identity surface consistency map

TL;DR

  • Compare user-agent, client hints, navigator properties, and locale as related but separate observations.
  • Record the declared input and observed output together.
  • Treat missing or reduced fields as a compatibility state, not an identity verdict.
  • Keep account data and detector scores out of the review artifact.

Contents

Map the surfaces

The user-agent string is a legacy request signal. Client hints are negotiated request metadata and can be reduced or unavailable. Navigator properties are page-visible values with their own compatibility rules. Language and timezone describe presentation choices, not a person's identity.

Compare one surface at a time, then review the relationship. A missing client hint can be expected under reduction; it is not automatically a mismatch. For a paired network check, use the proxy configuration overview and the engine/API protection test before assigning ownership. The goal is a documented application decision, not a detector score.

Use the identity cluster

The hub owns the order of review and the shared vocabulary. Each linked article owns its surface-specific detail.

Run a consistency review

Use a fresh controlled profile, a page you own, and the same request sequence. Store a redacted artifact:

{
  "runId": "identity-review-20261016-01",
  "declared": { "browser": "Chrome 155", "locale": "en-US", "timezone": "UTC" },
  "observed": {
    "userAgent": "reduced-and-recorded",
    "clientHints": "declared-or-absent",
    "navigator": "recorded",
    "language": "en-US"
  },
  "differences": [],
  "testedOn": "2026-10-16"
}

Do not include cookies, account identifiers, raw headers, or a service's detector response. The artifact is for compatibility and troubleshooting.

Start with the declared input. Before reading a browser value, write down the release, profile class, locale, timezone, permissions, and page version that the application expects. A declared value is an input to the workflow, not proof that the browser will expose the same value in every context. Keeping the input beside the observation makes a later difference easier to classify. It also prevents a support operator from changing a profile while trying to diagnose a page that simply negotiated a reduced signal.

Separate request signals from page signals. The user-agent string and client hints travel through request negotiation. Navigator properties are read by page code after the document loads. They can be related without being identical. A server can receive a reduced hint while a page still exposes a compatible navigator value, or a page can use a fallback while the request remains unchanged. Record the request row and page row separately. If the rows disagree, investigate the negotiation or application fallback before changing the profile.

Treat language and timezone as presentation choices. Language, locale, and timezone affect formatting, sorting, and content selection. They can be declared for a workflow without representing a person. Compare them with the application's supported locale list and record whether the fallback was intentional. A language mismatch may be a product configuration issue rather than an identity issue. The artifact should contain a locale category such as expected, fallback, or unavailable, not a personal location or account history.

Understand reduced client hints. A missing or reduced hint can be expected because a server did not request it, a policy limited it, or the browser deliberately minimized it. Start by checking the request negotiation and the response policy. Do not classify an absent hint as a failure until the fixture says that the hint is required. If the application can operate with a reduced value, record that as a supported compatibility state. This keeps the review focused on the page's contract instead of turning privacy-preserving reduction into an identity verdict.

Compare navigator properties by ownership. A navigator property can be supplied by the browser, constrained by a permission, or interpreted by application code. Name the property category in the artifact and record the expected compatibility range rather than an unnecessary raw value. If a property is unavailable, distinguish an unsupported capability from a page that read the wrong global object. A top-level page, worker, iframe, and popup may have different ownership and lifecycle. The useful result is the first observed difference and its context, not a single combined score.

Use a stable page fixture. Choose a page your team owns, pin its script or response version, and make its checks deterministic. A remote page that changes its content can create an apparent identity difference that is really a fixture change. The fixture can write a small redacted status object containing the rows it measured. It should not collect cookies, account identifiers, full headers, or unrelated browsing history. A stable page makes a compatibility review repeatable without turning the article into a collection point for personal data.

Review the cluster in order. Begin with user-agent reduction and client hints, then inspect client-hints privacy, navigator properties, language behavior, and finally account boundaries. This order moves from request negotiation to page-visible values and then to application ownership. Use the linked articles for the detail of each surface. The hub owns the vocabulary and the order so that a handoff can name the next check without asking another team to repeat every surface at once.

Keep account boundaries outside the browser value. A profile can be assigned to a team account, but a browser value does not identify the person using that account. Record the account owner and the profile owner in the approved access system, not in the identity artifact. If two team accounts need isolation, test the profile boundary and the account workflow separately. A difference in a navigator value cannot prove that two users are different, and an identical value cannot prove that they are the same. This distinction protects both the product decision and the people represented by the account.

Classify the first disagreement. If the user-agent and client hints differ, inspect negotiation and reduction. If navigator and locale differ, inspect the page fallback and the context in which the property was read. If a language or timezone value changes after a profile update, record the changed input before assigning ownership. If the browser observations match but the service rejects the request, the remaining decision belongs to the service or application owner. Preserve the first record so a later retry cannot overwrite the boundary that failed.

Make one change per retry. Keep the browser release, page version, permissions, request route, and profile class fixed while changing one declared input. A profile update, locale change, and server policy change are three separate experiments. If an operational rollout requires all three, create three run records and order them explicitly. Compare the observed rows, not a private score. This method lets a reviewer distinguish a stable compatibility result from a transient page race or a negotiation response that was never requested.

Use explicit categories in the JSON. declared contains the inputs the application chose. observed contains bounded categories such as recorded, reduced, absent, or fallback. differences names the first changed surface. Add a phase when the value was read, for example request, document, worker, or account. Do not include raw headers or personal data when a category answers the product question. A compact record is easier to review and safer to retain than a full browser trace.

Give support a reproducible bundle. A useful handoff includes the run ID, fixture version, browser release, profile class, declared locale and timezone, first changed surface, and the redacted JSON. Add the expected result and actual result as separate sentences. A receiving operator can then rerun the same page and compare one row without receiving credentials or account history. If the result is unavailable, state whether that was expected for the context. If the result is fallback, link the application rule that permits it. The handoff should describe what was observed, not speculate about why a third-party service made a decision.

Automate the review without overclaiming. A CI job can load the fixture, record the declared inputs, and publish the bounded artifact. Fail the job only when the page-owned acceptance rule is violated, such as a required hint being absent or an accessible fallback not appearing. Do not fail because an unrelated service returned an unknown label. Keep the run date and browser release in the artifact so a later job can compare a release update with a profile update. Automation makes a difference visible; it does not turn a small fixture into a universal browser statement.

Include accessibility in the fixture. A visual check should have a non-visual status message or accessible name. If a client hint or navigator capability is unavailable, the page should leave the user with a documented fallback rather than blocking the task. The artifact can record whether the fallback was reached without collecting the content a person entered. This keeps the review about application compatibility and prevents a presentation dependency from being mistaken for an identity property.

Plan redaction and retention. Keep only the fields needed to repeat the declared decision. Use a redacted profile label, category values, and a short fixture version instead of account data or complete request material. Store the evidence in the approved location with an owner and a retention date. Remove it when the support or release decision is complete. A dated, bounded record is enough to explain a browser update and gives another operator a clear starting point without preserving a person's browsing history.

Review after a meaningful change. Re-run the map when the browser release, client-hints policy, locale support, navigator contract, profile assignment, or account workflow changes. Update testedOn and the observation evidence for the new run instead of silently replacing an old result. A dated observation explains which inputs produced it and prevents a reader from applying it to every future release. The public standards and linked cluster articles remain the source for capability definitions; this hub records the controlled compatibility decision made by the application team.

For a release check, begin with a clean baseline page and record the request signals before reading page properties. Wait for the document to reach its documented checkpoint, then read the navigator and locale rows in the same context. If the page uses an iframe or worker, record that surface explicitly because its global object and lifecycle can differ from the top-level page. A reset between rows should be visible in the run record. Otherwise a page that changed its own state can look like a browser change. The goal is a stable sequence that another operator can repeat, not a large collection of values.

A server-side response can also change the available observations. The server may request a high-entropy hint, omit a hint, or select content for a negotiated locale. Record the response class and the page version when that happens. Do not treat a different response as evidence that the browser profile identifies a person. If the application needs a fixed response for a compatibility test, use an owned endpoint with a pinned fixture version. That makes the server decision an explicit input and leaves unrelated production traffic outside the artifact.

When a team supports several locales, compare the same application rule in each language rather than comparing translated text byte for byte. A locale can legitimately change labels, date formatting, or fallback copy. The browser observation should still use the same categories and the same first-difference field. Keep the public sources and the JSON field names stable so a reviewer can compare records without translating the schema. Localized explanations can describe the reader's language while the bounded observation remains consistent.

Profile assignment deserves its own review. A fresh temporary profile is useful for a baseline because it excludes extensions, stored permissions, service workers, and cached application state. An operational profile can then be tested as a second run when the product requires it. Record whether those inputs were present, but do not export their contents. If the operational profile changes a navigator or locale row, that is a profile-state observation. It is not evidence about the person or team that owns the profile.

An application can choose a compatibility policy for each surface. It might require a user-agent category, accept reduced client hints, allow a missing navigator capability, or provide a locale fallback. Put that rule beside the expected result in the fixture contract. A browser observation is useful only when the reader knows what action it triggers. The contract can say accept, fallback, or stop without exposing a private detector rule or a personal decision. This makes a support handoff actionable and lets product owners change their policy without rewriting the browser evidence.

For a controlled account workflow, run the browser comparison before the account decision. First confirm that the declared profile and page inputs produce the expected compatibility categories. Then let the service or application record its own acceptance result. Keep the two records linked by run ID but stored under their respective ownership rules. A service can reject a compatible browser for policy, capacity, or account reasons, and a browser artifact cannot explain that private decision. Separating the records protects the user and prevents a compatibility check from becoming an account judgment.

The review can be lightweight enough for continuous integration. A job loads the pinned fixture, records the declared release and profile class, and publishes the redacted categories. Fail only the rule the page owner documented, such as a required request hint being absent or an accessible fallback not rendering. Do not fail the build because a third-party response is unknown. Keep the command and output with the artifact so a later operator can run one baseline row before changing a profile. A small, repeatable job is easier to audit than a full browser trace.

When a difference is stable, compare release and profile inputs in that order. A browser update can change reduction or capability availability. A profile update can change locale or permission state. A page update can change the timing or the fallback rule. If all inputs match, compare the phase and the first changed surface. If only one locale fails, inspect the translated application rule before changing the browser. If only an iframe or worker fails, inspect its context ownership. This ordering gives each owner a concrete next check and avoids treating every difference as a global identity problem.

Retain the baseline and changed records together for the support window, then remove them from the approved store when the decision is complete. A short retention period is sufficient because the purpose is to explain a bounded compatibility result. Keep the public standards and product documentation links in the contract, not in the personal data record. When the browser release or application policy changes, create a new dated record rather than editing the old observation. That history lets a team see which input changed while keeping the collected data minimal.

Triage disagreement

If the user-agent and client hints differ, check negotiation and reduction before changing the profile. If navigator values differ from the declared locale, determine whether the application intentionally uses a fallback. If a team account needs isolation, follow the account-boundary article rather than treating a browser value as a person.

Preserve the first observation, name the owning layer, and change one declared input per retry. A service can apply its own policy after these observations; that decision remains outside the browser artifact.

Conclusion

Identity consistency is a relationship among request signals, page-visible values, and presentation choices. Use this hub to order the review, use the cluster for details, and keep conclusions limited to the controlled profile and page that produced them.

Public sources

Next reading

Start with User-agent reduction and client hints, then follow the four surface links that match your compatibility question.

#Identity#User Agent#Client Hints#Navigator#Consistency

Take BotBrowser from research to production

The guides cover the model first, then move into cross-platform validation, isolated contexts, and scale-ready browser deployment.