Inapp Spy
detect in-app browsers
#InAppSpy 🔎
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
facebookgsainstagramlinelinkedinredditsnapchattelegramthreadstiktoktwitterwechatwhatsappmessenger
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
#Changelog
See CHANGELOG.md for the full release history.
#Related
- InAppDebugger - Debug in-app browsers. Uses both
bowserandinapp-spylibraries. - Bowser - Browser + OS detection