285 lines
5.6 KiB
TypeScript
285 lines
5.6 KiB
TypeScript
import { usePrisma } from "../../utils/prisma";
|
|
|
|
/**
|
|
* GET /api/providers
|
|
* Liefert die Liste der in Deutschland lizenzierten Glücksspiel-Anbieter (GGL-Whitelist).
|
|
* Quelle: Gemeinsame Glücksspielbehörde der Länder (ggl-behoerde.de)
|
|
* Diese Daten werden statisch gepflegt + aus der DB ergänzt.
|
|
*/
|
|
|
|
// Statische GGL-lizenzierte Anbieter (Stand: 2026)
|
|
// Kategorie: sportwetten | casino | poker | slots
|
|
const GGL_PROVIDERS = [
|
|
// Sportwetten-Lizenzen
|
|
{
|
|
name: "bet365",
|
|
domain: "bet365.com",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "hoch",
|
|
},
|
|
{
|
|
name: "Tipico",
|
|
domain: "tipico.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "hoch",
|
|
},
|
|
{
|
|
name: "bwin",
|
|
domain: "bwin.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "hoch",
|
|
},
|
|
{
|
|
name: "Betano",
|
|
domain: "betano.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "hoch",
|
|
},
|
|
{
|
|
name: "Betway",
|
|
domain: "betway.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "hoch",
|
|
},
|
|
{
|
|
name: "ODDSET",
|
|
domain: "oddset.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "mittel",
|
|
},
|
|
{
|
|
name: "Interwetten",
|
|
domain: "interwetten.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "mittel",
|
|
},
|
|
{
|
|
name: "Unibet",
|
|
domain: "unibet.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "hoch",
|
|
},
|
|
{
|
|
name: "888sport",
|
|
domain: "888sport.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "hoch",
|
|
},
|
|
{
|
|
name: "Betsson",
|
|
domain: "betsson.com",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "mittel",
|
|
},
|
|
{
|
|
name: "NEObet",
|
|
domain: "neobet.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "mittel",
|
|
},
|
|
{
|
|
name: "AdmiralBet",
|
|
domain: "admiralbet.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "mittel",
|
|
},
|
|
{
|
|
name: "Winamax",
|
|
domain: "winamax.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "mittel",
|
|
},
|
|
{
|
|
name: "Merkur Sports",
|
|
domain: "merkursports.de",
|
|
category: "sportwetten",
|
|
license: "GGL-SW",
|
|
risk: "mittel",
|
|
},
|
|
// Virtuelle Automatenspiele
|
|
{
|
|
name: "Merkur Slots",
|
|
domain: "merkur-slots.de",
|
|
category: "slots",
|
|
license: "GGL-VA",
|
|
risk: "sehr hoch",
|
|
},
|
|
{
|
|
name: "Jackpotpiraten",
|
|
domain: "jackpotpiraten.de",
|
|
category: "slots",
|
|
license: "GGL-VA",
|
|
risk: "sehr hoch",
|
|
},
|
|
{
|
|
name: "Jokerstar",
|
|
domain: "jokerstar.de",
|
|
category: "slots",
|
|
license: "GGL-VA",
|
|
risk: "sehr hoch",
|
|
},
|
|
{
|
|
name: "BingBong",
|
|
domain: "bingbong.de",
|
|
category: "slots",
|
|
license: "GGL-VA",
|
|
risk: "sehr hoch",
|
|
},
|
|
{
|
|
name: "Slotmagie",
|
|
domain: "slotmagie.de",
|
|
category: "slots",
|
|
license: "GGL-VA",
|
|
risk: "sehr hoch",
|
|
},
|
|
{
|
|
name: "Drückglück",
|
|
domain: "drueckglueck.de",
|
|
category: "slots",
|
|
license: "GGL-VA",
|
|
risk: "sehr hoch",
|
|
},
|
|
{
|
|
name: "Hyperino",
|
|
domain: "hyperino.de",
|
|
category: "slots",
|
|
license: "GGL-VA",
|
|
risk: "sehr hoch",
|
|
},
|
|
{
|
|
name: "Löwen Play",
|
|
domain: "loewenplay.de",
|
|
category: "slots",
|
|
license: "GGL-VA",
|
|
risk: "sehr hoch",
|
|
},
|
|
{
|
|
name: "Sunmaker",
|
|
domain: "sunmaker.de",
|
|
category: "slots",
|
|
license: "GGL-VA",
|
|
risk: "sehr hoch",
|
|
},
|
|
// Poker
|
|
{
|
|
name: "PokerStars",
|
|
domain: "pokerstars.de",
|
|
category: "poker",
|
|
license: "GGL-PK",
|
|
risk: "hoch",
|
|
},
|
|
{
|
|
name: "GGPoker",
|
|
domain: "ggpoker.de",
|
|
category: "poker",
|
|
license: "GGL-PK",
|
|
risk: "hoch",
|
|
},
|
|
{
|
|
name: "888poker",
|
|
domain: "888poker.de",
|
|
category: "poker",
|
|
license: "GGL-PK",
|
|
risk: "hoch",
|
|
},
|
|
// Illegale / häufig genutzte ohne DE-Lizenz
|
|
{
|
|
name: "Stake",
|
|
domain: "stake.com",
|
|
category: "casino",
|
|
license: "keine (Curaçao)",
|
|
risk: "extrem",
|
|
},
|
|
{
|
|
name: "Rollbit",
|
|
domain: "rollbit.com",
|
|
category: "casino",
|
|
license: "keine",
|
|
risk: "extrem",
|
|
},
|
|
{
|
|
name: "Roobet",
|
|
domain: "roobet.com",
|
|
category: "casino",
|
|
license: "keine (Curaçao)",
|
|
risk: "extrem",
|
|
},
|
|
{
|
|
name: "Gamdom",
|
|
domain: "gamdom.com",
|
|
category: "casino",
|
|
license: "keine (Curaçao)",
|
|
risk: "extrem",
|
|
},
|
|
{
|
|
name: "CSGORoll",
|
|
domain: "csgoroll.com",
|
|
category: "casino",
|
|
license: "keine",
|
|
risk: "extrem",
|
|
},
|
|
{
|
|
name: "Duelbits",
|
|
domain: "duelbits.com",
|
|
category: "casino",
|
|
license: "keine (Curaçao)",
|
|
risk: "extrem",
|
|
},
|
|
];
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const query = getQuery(event);
|
|
const category = query.category as string | undefined;
|
|
|
|
let providers = [...GGL_PROVIDERS];
|
|
|
|
// Optionale DB-Erweiterung: community-gemeldete Anbieter
|
|
try {
|
|
const db = usePrisma();
|
|
const data = await db.blocklistDomain.findMany({
|
|
where: { isActive: true, reportCount: { gt: 5 } },
|
|
select: { domain: true, source: true },
|
|
take: 50,
|
|
});
|
|
|
|
for (const d of data) {
|
|
if (!providers.find((p) => p.domain === d.domain)) {
|
|
providers.push({
|
|
name: d.domain.replace(/\.\w+$/, ""),
|
|
domain: d.domain,
|
|
category: "casino",
|
|
license: "unbekannt",
|
|
risk: "hoch",
|
|
});
|
|
}
|
|
}
|
|
} catch {
|
|
// DB nicht erreichbar → nur statische Daten
|
|
}
|
|
|
|
// Filter nach Kategorie
|
|
if (category && category !== "all") {
|
|
providers = providers.filter((p) => p.category === category);
|
|
}
|
|
|
|
return {
|
|
total: providers.length,
|
|
providers,
|
|
source: "GGL Whitelist + Community Reports",
|
|
lastUpdated: "2026-04-01",
|
|
};
|
|
});
|