Skip to content

shalanah/inapp-spy

Repository files navigation

InAppSpy 🔎

npm version Changelog npm downloads last commit changesets maintenance license GitHub Repo stars

inapp-spy detects in-app browsers when a website is opened inside an app (e.g. Instagram, Facebook, TikTok, Telegram).

It’s a maintained and refactored alternative to detect-inapp, with TypeScript support and regular updates – and it powers inappdebugger.com, a live testing tool for in-app browser detection.

Installation

npm install inapp-spy

Or via CDN

<script src="https://cdn.jsdelivr.net/npm/inapp-spy@latest/dist/index.global.min.js"></script>

Code Examples

Basic

import InAppSpy from "inapp-spy";

const { isInApp, appKey, appName } = InAppSpy();

API Reference

Return Properties

isInApp

True if in-app browser has been detected

appKey

Machine-friendly key

All except telegram use UA detection strategies - server or client friendly. telegram can only be detected client-side

  • facebook
  • gsa
  • instagram
  • line
  • linkedin
  • snapchat
  • telegram
  • threads
  • tiktok
  • twitter
  • wechat
  • whatsapp
  • messenger

Can be undefined if isInApp is true.

appName

Human-readable name (e.g. "TikTok")

ua

Resolved or provided user agent string.

skipped

True if detection was bypassed via skip.

Optional Parameters

InAppSpy({
  // Provide a UA string (server-side detection). Leave blank on client for better accuracy.
  ua?: string;
  // Exclude certain apps or platforms from detection.
  skip?: {
    appKey: AppKey;
    platform?: "apple" | "android";
  }[];
})

SFSafariViewController Detection (Experimental)

Detect when a page is opened inside SFSafariViewController (helps with issues like awkward download UX).

⚠️ SFSVCExperimental may return false positives (e.g. Safari itself) and could change with future iOS updates. Make sure to be on the latest inapp-spy to avoid issues and always test on real devices.

💡 Tip: If you use escape links, add a query string — if present, skip detection to avoid false positives.

Usage

JavaScript

import InAppSpy, { SFSVCExperimental } from "inapp-spy";

const { isInApp } = InAppSpy(); // normal detection

// Detects in Safari 17+ - requires async
SFSVCExperimental().then((isSFSVC) => {
  /* ... */
});

React

import InAppSpy, { SFSVCExperimental } from "inapp-spy";

export const App = () => {
  const [{ isInApp }] = useState(() => InAppSpy());
  const [isSFSVC, setIsSFSVC] = useState(false);

  useEffect(() => {
    // Detects in Safari 17+ - requires async
    SFSVCExperimental().then(setIsSFSVC);
  }, []);

  ...
};

Debugging Options

If detection fails on your app (but not on InAppDebugger), try adjusting options:

SFSVCExperimental({
  debug?: boolean; // log details (default: false)
  maxTime?: number; // ms before assuming Safari (default: 300)
  maxVersion?: string; // e.g. "21.5.1" (default: none)
});

License

MIT

Changelog

See CHANGELOG.md for the full release history.

Related

  • InAppDebugger - Debug in-app browsers. Uses both bowser and inapp-spy libraries.
  • Bowser - Browser + OS detection

About

Detect in-app browsers

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages