npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@tap-payments/browser-info

v3.0.1

Published

Browser fingerprinting SDK for Tap Payments — collects device, browser, and location headers in Tap's required format

Downloads

12,417

Readme

@tap-payments/browser-info

Collects device, browser, and location data in the browser and returns it in three forms: encrypted short keys, plain-text short keys, or a full snake_case device profile. The output is purpose-neutral — you decide whether to send it as headers, a request body, or an event payload.

Install

yarn add @tap-payments/browser-info
npm install @tap-payments/browser-info

Quick start

One class, three methods. The constructor takes only the app basics; everything else is per-method.

import { BrowserInfo, getClientIpv4, getGeoLocation } from "@tap-payments/browser-info"

const browserInfo = new BrowserInfo({
  name: "MyApp",
  language: "en",
  version: "1.0.0"
})

// `location` is required — obtain it from `getGeoLocation()`, or supply your own object
const location = await getGeoLocation()

// 1. Short keys, encrypted — every value except `authorization` passes through `encrypt`
const encrypted = await browserInfo.getEncrypted({
  credentials: { pk: "pk_...", mdn: "example.com" },
  encrypt: (key, value) => encryptValue(key, value),
  location
})

// 2. Short keys, plain text — same keys, no encryption
const plain = await browserInfo.getPlain({
  credentials: { pk: "pk_...", mdn: "example.com" },
  location
})

// 3. Full snake_case device profile — no credentials needed
const info = await browserInfo.getDeviceInfo({
  location,
  device: { brand: "Apple", model: "iPhone 15 Pro" }
})

// Client public IPv4 address — standalone helper
const ip = await getClientIpv4()

Constructor

new BrowserInfo(app: AppConfig)

| Field | Type | Description | |-------|------|-------------| | app.name | string | Application name | | app.language | string | Application locale (e.g. ar, en) | | app.version | string? | Application version |

Short-key methods

getEncrypted(options) → Promise<ShortBrowserInfo>

The compact short-key object with every value encrypted through your encrypt callback (except authorization).

getPlain(options) → Promise<ShortBrowserInfo>

The same short-key object as plain text.

| Option | Type | Description | |--------|------|-------------| | credentials.pk | string | Authorization public key | | credentials.mdn | string | Merchant domain or bundle ID | | encrypt | (key, value) => string | Per-field encryption (required by getEncrypted only) | | location | LocationData | IP and coordinates — required |

Short-key output (ShortBrowserInfo)

| Key | Description | |-----|-------------| | authorization | Authorization public key | | mdn | Merchant domain name or bundle ID | | cu | Current page URL | | al | Application locale | | at | Application type ("browser") | | aid | Application identifier (reserved, "") | | an | Application name | | av | Application version | | rn | Device name (reserved, "") | | rt | Device type (desktop, smartphone, tablet) | | rb | Device brand | | rm | Device model | | ro | Device OS name | | rov | Device OS version | | bn | Browser name | | bb | Third-party browser brand ("") | | bv | Browser version | | bua | User agent string (truncated to 80 chars) | | bi | Browser fingerprint ID | | ci | Client IP address | | cm | MAC address (not available in browsers, "") | | l | Location as "latitude-longitude" |

Device-info method

getDeviceInfo(options) → Promise<DeviceInfo>

The full device/browser/geo/network picture in snake_case names. No credentials or encryption involved.

| Option | Type | Description | |--------|------|-------------| | location | LocationData | IP/coordinates + optional geo/ASN enrichment — required | | device | DeviceOverride? | Fallback for device fields the browser can't collect |

Device output (DeviceInfo)

| Field | Description | |-------|-------------| | app_name / app_language / app_version | Application basics from the constructor | | app_type | Application type ("browser") | | browser_name / browser_version | Browser name and version | | browser_id | Browser fingerprint ID | | user_agent_name / user_agent_os / user_agent_version | User agent attributes | | device_type | Device type (desktop, smartphone, tablet) | | device_brand | Device manufacturer/brand | | device_model | Device model | | device_os_name / device_os_version | Operating system name and version | | browser_width / browser_height | Viewport size | | client_ip | Client public IP address | | city / country_code / region_code | IP geo enrichment — set only when supplied via location | | asn / asn_latitude / asn_longitude / asn_organization | Network/ASN enrichment — set only when supplied via location | | isp / timezone / ip_version | ISP, IANA timezone, and IP version of the client IP — from location | | hostname | Site hostname (no path) | | page_url | Full page URL | | referrer_url | Referrer URL |

Safari and Firefox expose less device detail than Chromium browsers — pass device there if you need brand/model.

Location input

Pass an object with any of these fields:

| Field | Type | Description | |-------|------|-------------| | ip | string | Client IP address | | latitude | string | Latitude | | longitude | string | Longitude | | city | string? | IP city (feeds getDeviceInfo only) | | country_code | string? | IP country (feeds getDeviceInfo only) | | region_code | string? | IP region (feeds getDeviceInfo only) | | asn | string? | Autonomous system number (feeds getDeviceInfo only) | | asn_latitude | string? | ASN latitude (feeds getDeviceInfo only) | | asn_longitude | string? | ASN longitude (feeds getDeviceInfo only) | | asn_organization | string? | ASN organization (feeds getDeviceInfo only) | | isp | string? | ISP / network operator (feeds getDeviceInfo only) | | timezone | string? | IANA timezone of the IP (feeds getDeviceInfo only) | | ip_version | string? | IPv4 or IPv6 (feeds getDeviceInfo only) |

location is required on every method. Obtain a LocationData via getGeoLocation() or build your own. The values are passed through as-is — the SDK does not look location up itself. Only the fields listed as getDeviceInfo-only are optional; ip, latitude, and longitude are required.

getClientIpv4() → Promise<string>

Standalone helper (exported beside the class) that returns the client's public IPv4 address.

getGeoLocation(ip?) → Promise<LocationData>

Standalone helper that resolves a location (IP, coordinates, city, country, ASN/network, ISP, timezone) from free public geo-IP services. Called with no argument it looks up the caller's own IP; pass an explicit ip string to look that one up. Returns a LocationData, or "n/a" defaults for ip/latitude/longitude if the lookup fails. Results are cached per lookup for the page's lifetime — pass one as location to any method.

Caching

Fingerprinting, getGeoLocation(), and getClientIpv4() cache their results for the page's lifetime: calling the methods repeatedly (e.g. from a React component) reuses the cached values instead of re-fetching. A failed lookup is retried on the next call.

TypeScript

import type {
  ShortBrowserInfo,
  DeviceInfo,
  AppConfig,
  LocationData,
  Credentials,
  DeviceOverride,
  EncryptedOptions,
  PlainOptions,
  DeviceInfoOptions
} from "@tap-payments/browser-info"

Browser support

Modern browsers with ES2018+, window, navigator, and fetch.

License

ISC