# vendor

> The browser vendor string from navigator.vendor: Google Inc., Apple Computer, Inc., or empty in Firefox.

Source: https://whiskerjs.com/signals/vendor/ (last updated 2026-10-26)

**vendor at a glance (from the library code, signalsVersion 9)**

| Field | Value |
| --- | --- |
| Component name | `vendor` |
| In the visitorId | yes |
| structuredId group | [browser (engine and build)](https://whiskerjs.com/docs/identifiers/#structuredid) |
| Hashing | plain value; a digest only when longer than 128 characters or not printable ASCII |
| Excluded under | no browser class |
| Inner timeout | 1000 ms |
| Added in | [signalsVersion 1](https://whiskerjs.com/whats-new/) |

> **In plain words:**
>
> Browsers report a vendor name to web pages. Chromium-based browsers say Google, Safari and every browser on iPhone say Apple, and Firefox says nothing. WhiskerJS records that short string. On its own it only splits browsers into three big families, but it is stable and is checked against other values for signs of spoofing.

## What it reads

`navigator.vendor`, a string.

## How the technique works

The property is read once. An empty string is reported as the word `empty`; any other string as it is; a non-string gives `unavailable`. A throwing getter reaches the runner and gives `blocked`.

## Why it helps

It is one of the clearest engine hints a page can read: `Google Inc.` for Chromium browsers, `Apple Computer, Inc.` for WebKit, empty for Gecko. It feeds [`browser_class`](https://whiskerjs.com/signals/browser-class/), and because it is in the id, a tool that changes it changes the id.

Its most useful role on your server is as a cross-check. A result whose `vendor` is `Google Inc.` while the request’s user agent header names Safari, or whose `vendor` is `empty` while [`ua_client_hints`](https://whiskerjs.com/signals/ua-client-hints/) is available (only Chromium offers it), describes a browser that is not what it claims. WhiskerJS never draws that conclusion itself; it gives you the values.

## Stability

Fixed per engine family. It changes only when the browser changes engine, or a user agent switcher changes it.

## Browser support and what blocks it

| Browser | Typical value |
| --- | --- |
| [Chrome](https://whiskerjs.com/browsers/chrome-desktop/), [Edge](https://whiskerjs.com/browsers/edge/), [Brave](https://whiskerjs.com/browsers/brave/), [Samsung Internet](https://whiskerjs.com/browsers/samsung-internet/) | `Google Inc.` |
| [Safari](https://whiskerjs.com/browsers/safari-macos/) and [every iOS browser](https://whiskerjs.com/browsers/safari-ios/) | `Apple Computer, Inc.` |
| [Firefox](https://whiskerjs.com/browsers/firefox/) | `empty` |

No browser class excludes it.

## Privacy

A family name shared by every user of that engine. Nothing personal.

## How WhiskerJS handles noise and failures

| Status | ruleId | When |
| --- | --- | --- |
| `ok` |   | the vendor string, or `empty` |
| `unavailable` | `no_api` | not a string |
| `blocked` | `threw`, `security_error` | the getter throws |
| `excluded` | `caller_excluded` | you excluded it |
| `timed_out` | `timeout`, `aborted` | budget or abort |

`vendor` is also compared with a clean iframe by [`iframe_mismatch`](https://whiskerjs.com/docs/integrity/#iframe_mismatch) and watched by [`navigator_own_property`](https://whiskerjs.com/docs/integrity/#navigator_own_property). The [`engine_mismatch`](https://whiskerjs.com/docs/integrity/#engine_mismatch) flag checks whether the class it helped pick matches how the engine behaves.

## Example value

In the container test: headless Chromium `Google Inc.`, Firefox `empty`, WebKit `Apple Computer, Inc.`.

## Questions and answers

### Why does Firefox report empty?

Firefox returns an empty string for navigator.vendor. WhiskerJS writes it as the word empty so that it is a visible, ok value rather than looking like a missing one.

### Why do all iPhone browsers say Apple Computer, Inc.?

They all run on WebKit, which reports that vendor. It is one reason WhiskerJS classes every iOS browser as safari.

## Related pages

- [browser_class](https://whiskerjs.com/signals/browser-class/): vendor is one input to the class.
- [vendor_flavors](https://whiskerjs.com/signals/vendor-flavors/): Browser-specific globals that tell builds apart.
- [iframe_mismatch flag](https://whiskerjs.com/docs/integrity/#iframe_mismatch): Compares vendor with a fresh iframe.
- [navigator_own_property flag](https://whiskerjs.com/docs/integrity/#navigator_own_property): Fires when vendor is overridden on navigator itself.
