Skip to main content

Verify (License System)

If you own and use the license system within Shadow Store, then you can use this api route.

The verification API returns data about the license and product based on the input license key via the request header.
You will be using a POST method to make a request to /api/verify and putting the license key inside the header.

Responses

Success

{
"success": true,
"data": {
"id": 1,
"user": "291528890931871744",
"product": { "id": 1, "name": "Product" }
}
}

Failure

Invalid Key
{
"success": false,
"msg": "Invalid Key Provided. | The key you are looking for doesn't exist within the database."
}
Disabled
{
"success": false,
"msg": "Disabled Key | The key is currently disabled and unable to be authorized."
}
Wrong IP
{
"success": false,
"msg": "Mismatch IP | The provided IP doesn't match the IP linked to the key."
}

Examples

NodeJs Fetch

Please note that the Fetch API was added to native Node.Js in version 18; however, you can use the NPM package node-fetch for older versions.

const response = await fetch('https://example.com/api/verify', {
method: 'POST',
headers: {
'content-type': 'application/json',
key: 'LICENSE_KEY', // Should be a string
},
signal: AbortSignal.timeout(10000), // 10 second timeout
});

if (!response.ok) {
console.log(
`HTTP ${response.status}: ${response.statusText || 'Internal Server Error'}`
);
process.exit(); // Stop application from running
}
const licenseData = await response.json();

if (!licenseData.success) {
console.log(`Invalid Site License Key | Error Message:\n${licenseData.msg}`);
process.exit();
}
if (licenseData.data.product.id !== PRODUCT_ID) {
// PRODUCT_ID must be a number, not a string!
console.log(
`Invalid Site License Key | Error Message: Using license key for a different product.`
);
process.exit();
}

NodeJs Native HTTP

Note: Using fetch is recommended over this for applications that allow it!

const http = require('http');

const options = {
hostname: 'example.com',
port: 443,
path: '/api/verify',
method: 'POST',
headers: {
'content-type': 'application/json',
key: 'LICENSE_KEY', // Should be a string
},
};

const req = http.request(options, (res) => {
let data = '';

res.on('data', (chunk) => {
data += chunk;
});

res.on('end', () => {
if (res.statusCode !== 200) {
console.log(
`HTTP ${res.statusCode}: ${
res.statusMessage || 'Internal Server Error'
}`
);
process.exit();
}

const licenseData = JSON.parse(data);

if (!licenseData.success) {
console.log(
`Invalid Site License Key | Error Message:\n${licenseData.msg}`
);
process.exit();
}
if (licenseData.data.product.id !== PRODUCT_ID) {
// PRODUCT_ID must be a number, not a string!
console.log(
`Invalid Site License Key | Error Message: Using license key for a different product.`
);
process.exit();
}
});
});

req.on('error', (error) => {
console.error('Error:', error);
process.exit();
});

// Add timeout of 10 seconds
req.setTimeout(10000, () => {
req.destroy();
console.log('Request timeout');
process.exit();
});

req.end();

LUA

local http = require("http")
local https = require("https")
local json = require("json")

local req = https.request{
url = "https://example.com/api/verify",
method = "POST",
headers = {
["content-type"] = "application/json",
["key"] = "LICENSE_KEY" -- Should be a string
},
timeout = 10
}

local response_body, status_code, headers = req:send()

if status_code ~= 200 then
print(string.format("HTTP %d: %s", status_code, "Internal Server Error"))
os.exit()
end

local licenseData = json.decode(response_body)

if not licenseData.success then
print(string.format("Invalid Site License Key | Error Message:\n%s", licenseData.msg))
os.exit()
end

if licenseData.data.product.id ~= PRODUCT_ID then
-- PRODUCT_ID must be a number, not a string!
print("Invalid Site License Key | Error Message: Using license key for a different product.")
os.exit()
end

PHP

<?php
$ch = curl_init();

curl_setopt_array($ch, [
CURLOPT_URL => 'https://example.com/api/verify',
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'key: LICENSE_KEY' // Should be a string
]
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode !== 200) {
die("HTTP $httpCode: Internal Server Error\n");
}

$licenseData = json_decode($response, true);

if (!$licenseData['success']) {
die("Invalid Site License Key | Error Message:\n" . $licenseData['msg'] . "\n");
}

if ($licenseData['data']['product']['id'] !== PRODUCT_ID) {
// PRODUCT_ID must be a number, not a string!
die("Invalid Site License Key | Error Message: Using license key for a different product.\n");
}

Python using http.client

import http.client
import json
import sys

conn = http.client.HTTPSConnection("example.com", timeout=10)

headers = {
'content-type': 'application/json',
'key': 'LICENSE_KEY' # Should be a string
}

try:
conn.request("POST", "/api/verify", headers=headers)
response = conn.getresponse()

if response.status != 200:
print(f"HTTP {response.status}: {response.reason or 'Internal Server Error'}")
sys.exit()

licenseData = json.loads(response.read().decode())

if not licenseData['success']:
print(f"Invalid Site License Key | Error Message:\n{licenseData['msg']}")
sys.exit()

if licenseData['data']['product']['id'] != PRODUCT_ID:
# PRODUCT_ID must be a number, not a string!
print("Invalid Site License Key | Error Message: Using license key for a different product.")
sys.exit()

finally:
conn.close()

Python using requests

import requests
import sys

try:
response = requests.post(
'https://example.com/api/verify',
headers={
'content-type': 'application/json',
'key': 'LICENSE_KEY' # Should be a string
},
timeout=10
)

if response.status_code != 200:
print(f"HTTP {response.status_code}: {response.reason or 'Internal Server Error'}")
sys.exit()

licenseData = response.json()

if not licenseData['success']:
print(f"Invalid Site License Key | Error Message:\n{licenseData['msg']}")
sys.exit()

if licenseData['data']['product']['id'] != PRODUCT_ID:
# PRODUCT_ID must be a number, not a string!
print("Invalid Site License Key | Error Message: Using license key for a different product.")
sys.exit()

except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
sys.exit()

Powershell

$headers = @{
'content-type' = 'application/json'
'key' = 'LICENSE_KEY' # Should be a string
}

try {
$response = Invoke-WebRequest -Uri 'https://example.com/api/verify' `
-Method 'POST' `
-Headers $headers `
-TimeoutSec 10

if ($response.StatusCode -ne 200) {
Write-Host "HTTP $($response.StatusCode): Internal Server Error"
exit
}

$licenseData = $response.Content | ConvertFrom-Json

if (-not $licenseData.success) {
Write-Host "Invalid Site License Key | Error Message:`n$($licenseData.msg)"
exit
}

if ($licenseData.data.product.id -ne $PRODUCT_ID) {
# $PRODUCT_ID must be a number, not a string!
Write-Host "Invalid Site License Key | Error Message: Using license key for a different product."
exit
}
}
catch {
Write-Host "Request failed: $_"
exit
}