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

# defaultTapSources

> The tap sources a browser page wants by default: the redirect the tap landed on, then an in-page scan where the device supports one.

```ts theme={null}
defaultTapSources(): TapSource[]
```

Returns a fresh array of [`TapSource`](/sdks/core/reference/browser/registerTapSource) objects to register on a core client. Register them through the `tapSources` config option or `registerTapSource()`; `captureTap()` then runs the highest-priority source that can capture here.

The array holds two sources, in priority order:

* **redirect** (`redirectTapSource()`, priority `20`) - the tap that opened this page, read from its URL. Primary on every platform.
* **web-nfc** (`webNfcTapSource()`, priority `0`) - an in-page scan with the device's own reader, where one is supported. A progressive enhancement over the redirect, not a replacement.

A tap already in the URL wins: the redirect source runs at higher priority than the scanner, so a page opened by a tap resolves from its own URL before any scan starts.

## Example

```ts theme={null}
import { EndstatePublicClient } from "@endstate-sdk/core";
import { defaultTapSources } from "@endstate-sdk/web";

const client = new EndstatePublicClient({
  publishableKey: "end_pk_live_...",
  tapSources: defaultTapSources(),
});

// At page load, read only the redirect - a tap that opened this page.
const tap = await client.captureTap({ only: ["redirect"] });
if (tap) await client.verify(tap);
```

The in-page scan needs a user gesture, so run the unrestricted capture from a control the user pressed - never at page load - so the permission prompt can appear:

```ts theme={null}
scanButton.onclick = async () => {
  const scanned = await client.captureTap();
  if (scanned) await client.verify(scanned);
};
```

## Returns

<ResponseField name="[0]" type="TapSource" required>
  `redirectTapSource()` - priority `20`. See
  [redirectTapSource](/sdks/web/reference/tap-sources/redirectTapSource).
</ResponseField>

<ResponseField name="[1]" type="TapSource" required>
  `webNfcTapSource()` - priority `0`. In-page scanning on Android Chrome, where
  supported.
</ResponseField>

To collect taps your own interface captures (a pasted link, a scanned code), add [`manualTapSource`](/sdks/web/reference/tap-sources/manualTapSource) with `client.registerTapSource(...)`; it is not part of the default set.
