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

lemonsqueezy-license-manager

v1.0.1

Published

Lightweight TypeScript client for activating and validating Lemon Squeezy license keys across frontend frameworks.

Readme

Lemon Squeezy License Manager

📘 Overview

Lemon Squeezy License Manager is a lightweight TypeScript client for managing LemonSqueezy licenses. It provides simple methods for:

  • Activating a license
  • Validating a license
  • Deactivating a license

This package is perfect for use in Next.js (App or Pages Router), Astro, or any Node-based frontend/backend app.


🚀 Getting Started

Installation

To get started, install the package via npm:

npm install lemonsqueezy-license-manager

🧠 Core Functions

1. activateLicense(licenseKey, instanceName)

Description: Activates a license for a specific app instance.

Parameters:

  • licenseKey (string): Your LemonSqueezy license key
  • instanceName (string): The name of the device or app instance

Usage:

import { activateLicense } from 'lemonsqueezy-license-manager';

const response = await activateLicense('YOUR-LICENSE-KEY', 'MyApp');
console.log(response);

2. validateLicense(licenseKey, instanceId?)

Description: Validates whether a license is still active/valid.

Parameters:

  • licenseKey (string): The license key to check
  • instanceId (optional string): A unique identifier for the instance

Usage:

import { validateLicense } from 'lemonsqueezy-license-manager';

const response = await validateLicense('YOUR-LICENSE-KEY', 'INSTANCE-ID');
console.log(response);

3. deactivateLicense(licenseKey, instanceId)

Description: Deactivates a license from a specific instance.

Parameters:

  • licenseKey (string): The license key to check
  • instanceId (string): A unique identifier for the instance

Usage:

import { deactivateLicense } from 'lemonsqueezy-license-manager';

const response = await deactivateLicense('YOUR-LICENSE-KEY', 'INSTANCE-ID');
console.log(response);

🌐 Using in Next.js API Route (App Router)

You can integrate the functions into your Next.js API route like so:

// app/api/license/route.ts
import { NextRequest } from 'next/server';
import { activateLicense, validateLicense, deactivateLicense } from 'lemonsqueezy-license-manager';

export async function POST(req: NextRequest) {
  const { action, licenseKey, instanceName, instanceId } = await req.json();

  try {
    switch (action) {
      case 'activate':
        return Response.json(await activateLicense(licenseKey, instanceName));
      case 'validate':
        return Response.json(await validateLicense(licenseKey, instanceId));
      case 'deactivate':
        return Response.json(await deactivateLicense(licenseKey, instanceId));
      default:
        return Response.json({ error: 'Invalid action' }, { status: 400 });
    }
  } catch (err: any) {
    return Response.json({ error: err.message }, { status: 500 });
  }
}

🧪 Testing in Frontend

You can test the API by sending requests from the frontend:

const res = await fetch('/api/license', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    action: 'activate', // or 'validate' or 'deactivate'
    licenseKey: 'YOUR-LICENSE-KEY',
    instanceName: 'MyApp',
    instanceId: 'INSTANCE-ID',
  }),
});

const data = await res.json();
console.log(data);

🔄 Error Handling

All functions throw clear messages if something goes wrong (e.g., invalid key, failed network request, etc).

Example:

try {
  const data = await activateLicense('INVALID', 'MyApp');
} catch (error) {
  console.error('Activation failed:', error);
}