For developers

The Sentinel API

Query the public threat registry straight from your bot, dashboard, FiveM server or Roblox game. No key required for public endpoints, no cost, no rate-limit games.

Base URL https://thompsonjs.net
  • 25Accounts in registry
  • 25Active flags
  • 138Lookups served
  • 60sResponse cache
Read-onlyNothing you call can change our data.
Privacy preservingEvidence is never returned — categories only.
Cached & fast60 second cache, CORS open for browsers.

Basics

Everything you need before the first request.

Base URLhttps://thompsonjs.net
Format

JSON, UTF-8. Every response includes an ok boolean.

Rate limits

60 single lookups & 10 bulk requests per minute per client.

Errors

400 bad input · 429 rate limited · 503 lookup disabled.

Auth

Not required for public endpoints. Staff endpoints use X-API-Key.

GET /api/lookup.php
Try it

Check a single Discord user ID against the registry.

Query parameters

id string required

A Discord user ID (17–19 digits).

Request

curl "https://thompsonjs.net/api/lookup.php?id=175731434651254784"

Response 200

{
  "ok": true,
  "flagged": true,
  "discord_id": "175731434651254784",
  "username": "example",
  "severity": "High",
  "flags": [
    {
      "reference": "FLG-4821",
      "code": "SCAMMING",
      "name": "Scamming",
      "severity": "High",
      "added_at": "2026-02-11 18:04:22"
    }
  ]
}
POST /api/bulk.php

Check up to 50 accounts in one round trip — ideal for auditing a member list on join or during a raid.

Body

Send JSON {"ids": ["…", "…"]}, a form field ids, or a comma-separated ?ids= query string.

Request

curl -X POST "https://thompsonjs.net/api/bulk.php" \
  -H "Content-Type: application/json" \
  -d '{"ids":["175731434651254784","216773147126038528"]}'

Response 200

{
  "ok": true,
  "checked": 2,
  "flagged_count": 1,
  "results": [
    { "discord_id": "175731434651254784", "flagged": true,  "severity": "High", "flags": 2, "categories": ["Scamming"] },
    { "discord_id": "216773147126038528", "flagged": false, "severity": null,   "flags": 0, "categories": [] }
  ]
}
GET /api/stats.php
Try it

Public registry counters and bot coverage — the same numbers shown on our homepage.

curl "https://thompsonjs.net/api/stats.php"
GET /api/health.php
Try it

Component-level service state, suitable for your own status board.

Request

curl "https://thompsonjs.net/api/health.php"

Response 200

{
  "ok": true,
  "state": "operational",
  "components": [
    { "key": "database", "name": "Registry database", "state": "operational", "detail": "3.2 ms response time" }
  ]
}

Flag categories

Stable code values you can switch on in your own logic.

CodeNameDefault severityMeaning
CONFIDENTIAL Confidential Critical Confidential Flags are to be applied only in extreme circumstances.
LEAKING Leaking High Sharing private or confidential material without consent.
MALCOMS Malicious Comms Critical Malicious, threatening or abusive communications.
SCAMMING Scamming High Fraud, scams or financial deception.
RAIDING Raiding Medium Participating in or organising server raids.
IMPERSONATION Impersonation Medium Impersonating staff, brands or other members.
OTHER Other Low Does not fit an existing category.

Drop-in recipes

Copy, paste, ship.

JavaScript · discord.js join gate

client.on('guildMemberAdd', async (member) => {
  const res = await fetch(`https://thompsonjs.net/api/lookup.php?id=${member.id}`);
  const data = await res.json();
  if (data.flagged && ['High', 'Critical'].includes(data.severity)) {
    await modLog.send(`⚠️ ${member.user.tag} is flagged: ${data.flags.map(f => f.name).join(', ')}`);
  }
});

Python

import requests

r = requests.get("https://thompsonjs.net/api/lookup.php", params={"id": user_id}, timeout=5)
data = r.json()
if data.get("flagged"):
    print(data["severity"], [f["name"] for f in data["flags"]])

Bulk audit · shell

curl -s -X POST "https://thompsonjs.net/api/bulk.php" \
  -H "Content-Type: application/json" \
  -d "{\"ids\": $(jq -c '.' member_ids.json)}" | jq '.results[] | select(.flagged)'

Game integrations

Server-side join gates that screen every player against the registry before they load in.

FiveM Lua · server side

sentinel_gate

Drop sentinel_gate into your resources folder, add ensure sentinel_gate to server.cfg, then set your API base URL in config.lua.

  • No dependencies — pure Lua
  • Configurable severity threshold & kick message
  • Fails open if the API is unreachable
Download sentinel_gate.zip

Latest build · ZIP archive · setup guide

Roblox Luau · ServerScriptService

SentinelGate

Drop the SentinelGate script into ServerScriptService, or drag in the included .rbxmx model, then set your API base URL and Discord server ID in Config.

  • Resolves Discord accounts via RoVer or Bloxlink
  • Same severity thresholds as the FiveM resource
  • Fails open, with five minute result caching
Download sentinel_gate_roblox.zip

Latest build · ZIP archive · setup guide

FiveM setup

Players with a High or Critical risk are refused connection.

  1. 1

    Copy fivem/sentinel_gate into your server's resources directory.

  2. 2

    Set Config.ApiBaseUrl in config.lua to https://thompsonjs.net.

  3. 3

    Add ensure sentinel_gate to server.cfg and restart the resource.

Connection logic

if data.flagged and Config.BlockedSeverities[data.severity] then
  deferrals.done(('Connection refused: Sentinel risk level %s.'):format(data.severity))
else
  deferrals.done()
end
FiveM must expose a discord: player identifier for the lookup to run. By default, missing identifiers or a temporary API outage do not block players; set Config.FailClosed = true to deny connections when Sentinel cannot be reached.

Roblox setup

Screening runs on the server, before the player spawns.

  1. 1

    Place SentinelGate.server.lua in ServerScriptService alongside its Config module.

  2. 2

    Set the API base URL to https://thompsonjs.net and add your Discord server ID.

  3. 3

    Enable Allow HTTP Requests in Game Settings → Security, then publish.

Currently tracking 25 active flags

Spotted something we have missed? Reports from the community keep the registry accurate.

Submit a report