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

@sentinelsup/sdk

v0.1.0

Published

Official Node.js SDK for Sentinel — real-time fraud detection, VPN/residential-proxy/antidetect-browser detection in under 40ms.

Readme

@sentinelsup/sdk

Official Node.js SDK for Sentinel — real-time fraud detection that flags VPNs, residential proxies, antidetect browsers, and AI bots in under 40 ms.

npm license

Install

npm install @sentinelsup/sdk

Zero dependencies. Works on Node 14+, Bun, Deno, Cloudflare Workers, and Vercel Edge (wherever fetch exists).

Quick start

const Sentinel = require('@sentinelsup/sdk');

const sentinel = new Sentinel({ apiKey: process.env.SENTINEL_KEY });

const result = await sentinel.evaluate({
  token: req.body.sentinelToken  // from the frontend SDK
});

if (result.isSuspicious) {
  return res.status(403).json({ error: 'blocked' });
}

// Safe — let the request through

Get a free API key (no credit card) at sntlhq.com/signup.

What you get back

{
  isSuspicious: boolean,     // combined network + device verdict
  details: {
    ip: '45.33.32.156',
    cc: 'US',
    vpn: false,
    proxied: true,          // residential proxy detected
    dch: false,             // datacenter
    anon: false,
    service: 'BrightData'
  },
  deviceIntel: {            // null unless you pass fingerprintEventId
    visitorId: 'abc123...',
    browserTampering: true, // antidetect browser detected
    botDetected: false,
    incognito: false,
    virtualMachine: false,
    emulator: false
  }
}

Frontend setup

Add the client-side SDK to your frontend so Sentinel can collect the token:

<script async src="https://fp.sntlhq.com/agent"></script>

Read the token from the rendered form field and send it to your backend:

const token = document.querySelector('input[name="monocle"]').value;
fetch('/checkout', { method: 'POST', body: JSON.stringify({ sentinelToken: token }) });

Examples

Stripe Checkout — block card testing

const Sentinel = require('@sentinelsup/sdk');
const stripe = require('stripe')(process.env.STRIPE_KEY);
const sentinel = new Sentinel({ apiKey: process.env.SENTINEL_KEY });

app.post('/checkout', async (req, res) => {
  const { isSuspicious } = await sentinel.evaluate({ token: req.body.sentinelToken });
  if (isSuspicious) return res.status(403).json({ error: 'declined' });

  const intent = await stripe.paymentIntents.create({ /* ... */ });
  res.json({ clientSecret: intent.client_secret });
});

Signup — block fake Google sign-ins

app.post('/auth/google', async (req, res) => {
  const { credential, sentinelToken } = req.body;
  const ticket = await googleClient.verifyIdToken({ idToken: credential });

  const result = await sentinel.evaluate({ token: sentinelToken });
  if (result.isSuspicious) return res.status(403).json({ error: 'signup_blocked' });

  await createUser(ticket.getPayload().email, result.deviceIntel?.visitorId);
});

Custom policy with shouldBlock

// Only block when we see both residential proxy AND browser tampering
const blocked = await sentinel.shouldBlock(
  { token },
  r => r.details.proxied && r.deviceIntel?.browserTampering
);

API

new Sentinel({ apiKey, endpoint?, timeoutMs? })

| Option | Type | Default | Description | |--------|------|---------|-------------| | apiKey | string | required | Your key starting with sk_live_ | | endpoint | string | https://sntlhq.com | Override base URL | | timeoutMs | number | 5000 | Per-request timeout |

sentinel.evaluate({ token, fingerprintEventId? })

Returns EvaluateResult. Throws SentinelError on network/API failure — the error carries .status and .body.

sentinel.shouldBlock({ token, fingerprintEventId? }, predicate?)

Convenience: runs evaluate() and returns a boolean. Default predicate is r => r.isSuspicious. Pass your own to build custom policies.

Rate limits

Free tier: 1,000 requests/hour per API key. No monthly cap, no credit card. Upgrade at sntlhq.com when you need more.

TypeScript

Full types ship with the package. Importing Sentinel gives you the class plus EvaluateResult, DeviceIntel, EvaluateDetails, and SentinelError types.

import Sentinel, { EvaluateResult } from '@sentinelsup/sdk';

License

MIT © Sentinel Edge Networks LTD

Links