Pawtect

Jouw trouwe waakhond voor jouw community

Pawtect beschermt jouw community tegen bots, spam en ongewenste accounts. Stel je regels in en wij zorgen voor de rest

Waarom kiezen voor Pawtect?

🐾 Slimme regels

Detecteer verdachte accounts met checks op account leeftijd, profielfoto en aangepaste regex-regels.

🚫 Geavanceerde anti-spam

Beperk berichten per gebruiker, filter spam over meerdere kanalen en gebruik kant-en-klare spamwoordenlijsten.

⚙️ Volledig aanpasbaar

Stel regels flexibel in per community, haal woordenlijsten op (zoals toxic of reclame), en integreer via onze API of bot.

Beschikbare regels

  • min_account_age: Minimale account leeftijd in dagen
  • must_have_avatar: Vereist een profielfoto
  • username_regex: Blokkeer verdachte namen
  • min_message_length, max_message_length
  • max_messages_per_user: Spam limiter
  • max_channels_in_window: Flood control

API Endpoint

Alle verzoeken verlopen via het onderstaande endpoint:

https://api.pawtect.nl

API Routes

Route Method Beschrijving
/health GET Basisgezondheidscontrole
/metrics GET Krijg het totaal aantal requests te zien
/event/message POST Controleer bericht tegen ingestelde regels
/event/join POST Controleer nieuw lid tegen ingestelde regels
/words/spam GET Haal een lijst met spam-gerelateerde woorden op
/words/toxic GET Haal een lijst met toxische woorden op (scheldwoorden, beledigingen, etc.)

API Documentatie

POST /event/join

Controleert of een gebruiker mag joinen op basis van regels.

Request Body:
{
  "username": "string",
  "account_age_days": number,
  "has_avatar": boolean,
  "rules": {
    "min_account_age"?: number,
    "username_regex"?: string,
    "must_have_avatar"?: boolean
  }
}
Response:
  • 200 OK: Join event OK
  • 403 Forbidden: Account te jong, verdachte naam of geen avatar

POST /event/message

Valideert berichten op basis van lengte, gedrag en inhoud.

Request Body:
{
  "username": "string",
  "author_id": "string",
  "channel_id": "string",
  "message_content": "string",
  "message_length": number,
  "message_count": number,
  "rules": {
    "min_message_length"?: number,
    "max_message_length"?: number,
    "max_messages_per_user"?: number,
    "message_content_regex"?: string,
    "max_channels_in_window"?: number,
    "time_window_seconds"?: number
  }
}
Response:
  • 200 OK: Message event OK
  • 403 Forbidden: Bericht voldoet niet aan regels

GET /health

Controleer of de API bereikbaar is.

Response:
Wiggle wiggle

GET /metrics

Geeft uptime en aantal verzoeken terug.

Response:
{
  "status": "ok",
  "uptime": number,
  "total_requests": number
}

POST /words/toxic

Haal toxische woorden op op basis van level(s) en optioneel taal.

Request Body:
{
  "level": number | number[],
  "language": string | null
}
Response:
{
  "status": 200,
  "levels": number[],
  "badWords": string[]
}

POST /words/spam

Haal spamwoorden op op basis van level(s) en optioneel taal.

Request Body:
{
  "level": number | number[],
  "language": string | null
}
Response:
{
  "status": 200,
  "levels": number[],
  "badWords": string[]
}

Voorbeeld: integratie met Discord.js (TypeScript)

Gebruik dit fragment om berichten automatisch te controleren met Pawtect:


this.client.on(discordEvents.MessageCreate, async (message: Message): Promise<void> => {
  if (message.author.id === this.client.user?.id || message.author.bot) return;

  const payload = {
    username: message.author.username,
    author_id: message.author.id,
    channel_id: message.channel.id,
    message_content: message.content,
    message_length: message.content.length,
    message_count: 0,
    rules: {
      min_message_length: 1,
      max_message_length: 1024,
      max_messages_per_user: 25,
      max_channels_in_window: 3,
      time_window_seconds: 10,
    },
  };

  try {
    const res = await fetch("https://api.pawtect.nl/event/message", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(payload),
    });

    if (res.status !== 200) {
      const reason = await res.text();
      console.warn(`AntiBot event triggered for ${message.author.username}#${reason}`);
      await message.delete();
    }
  } catch (err) {
    console.error("API error:", err);
  }
});