Videojuegos

Que se pique quien quiera, pero sin faltar

Chat de partida, lobbies, canales de clan y servidores de la comunidad, revisados en torno a un milisegundo mientras se escribe. ToxicFilter lee por debajo de los ceros y los asteriscos, ve a un equipo entero contra un jugador, retiene el enlace acortado del que vende oro y reconoce a un adulto tanteando a un crío, y mientras tanto "gg, nos han destrozado" pasa sin más.

Lo que falla en plataformas como la tuya

Un chat que no puede esperar

Un mensaje de partida se lee un segundo después de enviarse. Si moderarlo tarda más que eso, nadie usa el chat, así que muchos equipos acaban filtrando a posteriori, cuando el jugador al que iba dirigido ya lo ha leído y ha salido de la partida.

Insultos escritos para burlar el filtro

"eres un put0 1d10ta", una letra cirílica en mitad de una palabra, un espacio entre cada letra. Los jugadores aprenden en una tarde qué busca una lista de palabras, y un filtro que compara el texto tal cual solo pilla a los que no lo intentaban.

Todo el equipo contra uno

Cuatro compañeros escriben cada uno una frase borde al que ha fallado el tiro. Leídos de uno en uno, son frustración normal; juntos son acoso en grupo, y es el motivo por el que ese jugador no vuelve a entrar en cola.

Vendedores de oro, tiendas de trampas y adultos que no deberían estar ahí

Los bots llenan los canales con más gente de oro barato, cuentas subidas y trampas detrás de enlaces acortados. Y en plataformas llenas de críos, un adulto que se lleva la charla a otra app con regalos y secretos no es un mensaje malo suelto: es una secuencia que tiene que llegar a una persona.

Qué decide con contenido como el tuyo

Juzgado ahora mismo por el mismo motor que usa la API, con la plantilla de este tipo de plataforma y sin intervención del modelo.

  1. 01 Pique después de una partida
  2. 02 Un insulto camuflado
  3. 03 Un equipo contra un jugador
  4. 04 El enlace de un vendedor de oro
  5. 05 Un adulto y un crío en el chat

Pique después de una partida POST /v1/text

gg, nos han destrozado. La próxima ronda os mato a todos, jaja

allow 10 ms

Perder una ronda y prometer venganza es como hablan los jugadores. No hay insulto, ni frase de amenaza, ni nada dirigido a una persona, así que las comprobaciones gratuitas lo dejan pasar en torno a un milisegundo.

La respuesta, resumida
{
  "decision": "allow",
  "flagged": [],
  "signals": [],
  "model": {
    "read": false
  },
  "took_ms": 10
}

Un insulto camuflado POST /v1/text

eres un put0 1d10ta, desinst4la

block 5 ms
  • Contains 1 profanity, aimed at the reader. On its own this says the tone is casual, not that the content is abusive.
  • Contains 1 insult(s), aimed at the reader.
  • About 17% of the letters are not the letters they appear to be.

Los ceros, los unos y el cuatro vuelven a ser letras antes de buscar nada, así que el disfraz no cambia el resultado. Lo que lo rechaza es el insulto dirigido a quien lee; cuánto del texto iba camuflado se informa aparte, como evasión.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment",
    "toxicity"
  ],
  "scores": {
    "harassment": 0.8,
    "toxicity": 0.55,
    "evasion": 0.233
  },
  "signals": [
    {
      "category": "toxicity",
      "score": 0.55,
      "reason": "Contains 1 profanity, aimed at the reader. On its own this says the tone is casual, not that the content is abusive.",
      "evidence": [
        "puto"
      ]
    },
    {
      "category": "harassment",
      "score": 0.8,
      "reason": "Contains 1 insult(s), aimed at the reader.",
      "evidence": [
        "idiota"
      ]
    },
    {
      "category": "evasion",
      "score": 0.233,
      "reason": "About 17% of the letters are not the letters they appear to be.",
      "evidence": [
        "eres un puto idiota desinstala"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 5
}

Un equipo contra un jugador POST /v1/conversation

ana gg, qué igualado

bob eres un inútil, idiota, desinstala

cris jaja eres idiota, das pena

dan eres un manco, idiota

eve en serio, sal de la partida

review 19 ms
  • 3 different people in this conversation are being hostile. Each message on its own is ordinary bad temper; together they are a pile-on, and that is not visible in any one of them.

Tres personas distintas van a por el mismo jugador en cinco mensajes. La última frase, sola, pasa; el hilo es lo que la retiene para una persona, porque un compañero cabreado es una discusión y tres son acoso en grupo.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.6
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.6,
      "reason": "3 different people in this conversation are being hostile. Each message on its own is ordinary bad temper; together they are a pile-on, and that is not visible in any one of them.",
      "evidence": []
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 19
}

El enlace de un vendedor de oro POST /v1/text

Oro barato, skins raras y cuentas subidas, entrega al momento: https://bit.ly/oro-barato

review 8 ms
  • Uses a link shortener, which hides where the link goes.

Lo que lo retiene es el enlace acortado, que oculta adónde lleva; el mismo mensaje publicado una y otra vez en un mismo proyecto se cuenta por separado, como repetición.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "spam"
  ],
  "scores": {
    "spam": 0.7
  },
  "signals": [
    {
      "category": "spam",
      "score": 0.7,
      "reason": "Uses a link shortener, which hides where the link goes.",
      "evidence": [
        "https://bit.ly/oro-barato"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 8
}

Un adulto y un crío en el chat POST /v1/conversation

niño gg! tengo 12 años, mi madre me deja jugar hasta las 9

max qué bien juegas para tener 12. agrégame en snapchat y te regalo skins

max no se lo digas a tus padres, es nuestro secreto

block 7 ms
  • Somebody in this conversation has said they are 12. The other participant asked for it to be kept secret, asked to move to another app, offered money or gifts. This needs a person now.

Que el crío diga que tiene doce años nunca es un hallazgo por sí solo. Que después otro jugador le pida secreto y le ofrezca regalos es la forma de un acercamiento, y se rechaza para que lo vea una persona ya.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "minor_safety"
  ],
  "scores": {
    "minor_safety": 0.9
  },
  "signals": [
    {
      "category": "minor_safety",
      "score": 0.9,
      "reason": "Somebody in this conversation has said they are 12. The other participant asked for it to be kept secret, asked to move to another app, offered money or gifts. This needs a person now.",
      "evidence": []
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 7
}

Qué decide con contenido como el tuyo

Juzgado ahora mismo por el mismo motor que usa la API, con la plantilla de este tipo de plataforma y sin intervención del modelo.

Pique después de una partida POST /v1/text

gg, nos han destrozado. La próxima ronda os mato a todos, jaja

allow 10 ms

Perder una ronda y prometer venganza es como hablan los jugadores. No hay insulto, ni frase de amenaza, ni nada dirigido a una persona, así que las comprobaciones gratuitas lo dejan pasar en torno a un milisegundo.

La respuesta, resumida
{
  "decision": "allow",
  "flagged": [],
  "signals": [],
  "model": {
    "read": false
  },
  "took_ms": 10
}

Un insulto camuflado POST /v1/text

eres un put0 1d10ta, desinst4la

block 5 ms
  • Contains 1 profanity, aimed at the reader. On its own this says the tone is casual, not that the content is abusive.
  • Contains 1 insult(s), aimed at the reader.
  • About 17% of the letters are not the letters they appear to be.

Los ceros, los unos y el cuatro vuelven a ser letras antes de buscar nada, así que el disfraz no cambia el resultado. Lo que lo rechaza es el insulto dirigido a quien lee; cuánto del texto iba camuflado se informa aparte, como evasión.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment",
    "toxicity"
  ],
  "scores": {
    "harassment": 0.8,
    "toxicity": 0.55,
    "evasion": 0.233
  },
  "signals": [
    {
      "category": "toxicity",
      "score": 0.55,
      "reason": "Contains 1 profanity, aimed at the reader. On its own this says the tone is casual, not that the content is abusive.",
      "evidence": [
        "puto"
      ]
    },
    {
      "category": "harassment",
      "score": 0.8,
      "reason": "Contains 1 insult(s), aimed at the reader.",
      "evidence": [
        "idiota"
      ]
    },
    {
      "category": "evasion",
      "score": 0.233,
      "reason": "About 17% of the letters are not the letters they appear to be.",
      "evidence": [
        "eres un puto idiota desinstala"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 5
}

Un equipo contra un jugador POST /v1/conversation

ana gg, qué igualado

bob eres un inútil, idiota, desinstala

cris jaja eres idiota, das pena

dan eres un manco, idiota

eve en serio, sal de la partida

review 19 ms
  • 3 different people in this conversation are being hostile. Each message on its own is ordinary bad temper; together they are a pile-on, and that is not visible in any one of them.

Tres personas distintas van a por el mismo jugador en cinco mensajes. La última frase, sola, pasa; el hilo es lo que la retiene para una persona, porque un compañero cabreado es una discusión y tres son acoso en grupo.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.6
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.6,
      "reason": "3 different people in this conversation are being hostile. Each message on its own is ordinary bad temper; together they are a pile-on, and that is not visible in any one of them.",
      "evidence": []
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 19
}

El enlace de un vendedor de oro POST /v1/text

Oro barato, skins raras y cuentas subidas, entrega al momento: https://bit.ly/oro-barato

review 8 ms
  • Uses a link shortener, which hides where the link goes.

Lo que lo retiene es el enlace acortado, que oculta adónde lleva; el mismo mensaje publicado una y otra vez en un mismo proyecto se cuenta por separado, como repetición.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "spam"
  ],
  "scores": {
    "spam": 0.7
  },
  "signals": [
    {
      "category": "spam",
      "score": 0.7,
      "reason": "Uses a link shortener, which hides where the link goes.",
      "evidence": [
        "https://bit.ly/oro-barato"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 8
}

Un adulto y un crío en el chat POST /v1/conversation

niño gg! tengo 12 años, mi madre me deja jugar hasta las 9

max qué bien juegas para tener 12. agrégame en snapchat y te regalo skins

max no se lo digas a tus padres, es nuestro secreto

block 7 ms
  • Somebody in this conversation has said they are 12. The other participant asked for it to be kept secret, asked to move to another app, offered money or gifts. This needs a person now.

Que el crío diga que tiene doce años nunca es un hallazgo por sí solo. Que después otro jugador le pida secreto y le ofrezca regalos es la forma de un acercamiento, y se rechaza para que lo vea una persona ya.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "minor_safety"
  ],
  "scores": {
    "minor_safety": 0.9
  },
  "signals": [
    {
      "category": "minor_safety",
      "score": 0.9,
      "reason": "Somebody in this conversation has said they are 12. The other participant asked for it to be kept secret, asked to move to another app, offered money or gifts. This needs a person now.",
      "evidence": []
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 7
}

Qué busca

Cada cosa con su propia puntuación y sus propios umbrales, y el motivo explicado en una frase cada vez que actúa.

La plantilla con la que empiezas

Elígela al crear una política y estas reglas se escriben por ti, listas para editar. Todo lo que no menciona sigue nuestros valores por defecto.

  • Toxicidad retiene desde 0,30 · nunca rechaza
  • Acoso retiene desde 0,30 · rechaza desde 0,65
  • Discurso de odio retiene desde 0,25 · rechaza desde 0,55
  • Violencia retiene desde 0,25 · rechaza desde 0,60
  • Acercamiento a menores retiene desde 0,20 · rechaza desde 0,70
  • Elusión del filtro retiene desde 0,50 · rechaza desde 0,85
  • Spam retiene desde 0,50 · rechaza desde 0,80

Lo fija la plantilla

Una llamada antes de publicar

Envía el texto indicando dónde va a aparecer y actúa según la decisión.

La petición

curl https://toxicfilter.com/api/v1/text \
  -H "Authorization: Bearer $TOXICFILTER_KEY" \
  -d content="gg, nos han destrozado. La próxima ronda os mato a todos, jaja" \
  -d surface=comment
La referencia completa →

Un mes de ejemplo, en cifras

Elementos revisados
600.000
Leídos por el modelo
15.000
Imágenes
3.000
Créditos, aproximadamente
735.000

Entra en el plan Max. Ver los planes →

Guía para moderar el chat de un juego

Qué revisar, con qué rapidez y dónde poner los umbrales, en el chat de partida, los lobbies y los servidores de la comunidad.

Cómo moderar el chat de un juego en tiempo real

Llama a la API cuando un jugador envía un mensaje y actúa según una de tres respuestas antes de que llegue a los demás: mostrarlo, retenerlo o rechazarlo. Las comprobaciones gratuitas resuelven una línea corta de chat en torno a un milisegundo, que es casi todo lo que se escribe en una partida, así que moderar no añade una espera que se note. En los canales con más tráfico, deja fuera el modelo con effort: low; en el resto, el valor por defecto solo le pasa lo que ellas dejan en duda, y lo decides en cada llamada. Lo que llega como review espera en una cola, en tu panel o por la API, y un webhook firmado avisa a tu juego cuando alguien decide.

Pique o acoso: dónde está la línea

El chat de un juego está lleno de palabras que parecen violentas y no lo son. "Nos han destrozado", "la próxima ronda os mato a todos" y "gg" son parte del juego. ToxicFilter actúa sobre el insulto que apunta a quien lee, como harassment ("eres idiota" no es "este mapa es una mierda"), sobre una amenaza reconocida, como violence ("sé dónde vives", "te voy a encontrar"), y sobre los ataques a colectivos, como hate. Una palabrota suelta se puntúa como toxicity, que nunca bloquea. La plantilla de comunidad la retiene para que alguien la mire; en el chat de un juego conviene subir ese umbral, para que un "qué jugada, joder" no espere a nadie.

Insultos camuflados: por qué no basta con una lista de palabras

Los jugadores escriben put0, 1d10ta, una letra griega en lugar de una latina o un espacio invisible en mitad de una palabra. ToxicFilter lo convierte todo otra vez en letras normales antes de buscar, e informa de cuánto del mensaje iba camuflado como un hallazgo propio, en evasion. Una lista de palabras permitidas las tapa antes de que nada las busque, así que una palabra inocente que contiene otra fea no cae nunca. Los insultos de odio no vienen en las listas públicas; cargas la tuya.

Acoso en grupo en el chat de partida

El acoso en grupo no se ve en ningún mensaje suelto. Manda el chat reciente a /v1/conversation con el identificador del jugador en cada línea, y ToxicFilter cuenta cuántos jugadores distintos están siendo hostiles con alguien en segunda persona. Un compañero furioso que escribe diez líneas es una persona; tres o más personas distintas son acoso en grupo, y el motivo dice cuántas eran. Del hilo no se guarda nada, solo el veredicto sobre la última línea.

Menores en plataformas de juegos

El detector busca la forma de un acercamiento a lo largo de una conversación: secretos, irse a otra app, fotos, regalos, aislar a alguien, y la edad que dice otro participante. Que un crío diga "tengo 12 años" nunca se usa en su contra, y una edad declarada sola nunca es un hallazgo. Con un menor declarado, el acercamiento se rechaza como minor_safety y debería llegar a una persona de inmediato. Las comprobaciones instantáneas leen estas formas en ocho idiomas y, con effort: high, el modelo lee la conversación entera buscando lo que las palabras dejan al contexto.

Cómo elegir los umbrales de tu juego

Empieza por la plantilla de comunidad: rechaza antes que los umbrales por defecto el acoso, el odio, las amenazas y los acercamientos a menores. Después ajusta lo que necesiten tus jugadores, casi siempre el umbral de toxicity, y prueba el cambio como una segunda política que funciona junto a la que está activa. Se calculan los dos veredictos sobre tu propio chat, solo uno decide, y el panel te enseña en qué no coinciden antes de que cambies.

Preguntas frecuentes

¿Es lo bastante rápido para el chat de una partida en tiempo real?

En torno a un milisegundo por mensaje corto cuando lo resuelven las comprobaciones gratuitas, contando la petición entera, y eso es casi todo el chat. El modelo solo lee lo que ellas dejan abierto, y decides en cada llamada si puede hacerlo, así que en el chat de partida puedes dejarlo apagado y mandar solo los dudosos a una persona o a una segunda pasada más lenta.

¿Va a borrar el pique normal entre jugadores?

Por sí solo, no. "gg, nos han destrozado" o "la próxima ronda os mato a todos" no llevan un insulto dirigido a nadie ni una frase de amenaza, y pasan. Lo que se frena es el insulto que apunta a quien lee, una amenaza reconocida como "sé dónde vives" o varias personas lanzándose contra un jugador. La plantilla de comunidad sí retiene las palabrotas para que alguien las mire; en el chat de un juego seguramente querrás subir ese umbral.

¿Se puede burlar escribiendo con números o símbolos?

Mucho menos que una lista de palabras. Números en lugar de letras, asteriscos de censura, letras de otros alfabetos que se parecen a las latinas, caracteres de ancho completo, letras separadas por espacios y caracteres invisibles se normalizan antes de buscar, y cuánto del mensaje iba camuflado se informa aparte, como evasión.

¿Detecta los insultos racistas, homófobos y similares?

Las listas de palabras del repositorio abierto no los incluyen a propósito, porque una lista completa de ellos solo tiene otro uso. Puedes apuntar ToxicFilter a tu propia lista, guardada fuera del control de versiones, y cuando lee el modelo, los ataques a colectivos van a odio, que la plantilla de comunidad rechaza antes que el umbral por defecto.

¿Cómo protege a los menores en una plataforma de juegos?

Lee la conversación buscando la forma de un acercamiento: pedir secreto, llevarse la charla a otra app, pedir fotos, ofrecer regalos o dinero, aislar a alguien, junto a la edad que dice otro participante. Que un menor diga su propia edad nunca es un hallazgo. Un acercamiento junto a un menor declarado se rechaza y debería llegar a una persona de inmediato. Los patrones cubren ocho idiomas y, con effort high, el modelo lee la conversación entera buscando lo que las palabras dejan al contexto.

¿Y los bots que venden oro, cuentas o trampas?

Su forma: enlaces acortados, un mensaje que es casi todo enlaces, y el mismo texto, o el mismo texto retocado, llegando muchas veces a un mismo proyecto, algo que se cuenta entre llamadas. Las palabras que usan tus vendedores (oro, subir cuentas, el nombre del cheat) van en una regla con tus propias palabras, y la oferta en sí la lee el modelo cuando entra con effort high.

Pruébalo con tu tráfico real

2.000 créditos al mes en el plan gratuito, sin tarjeta. Suficiente para pasarle una semana de tu propio contenido y ver qué opina de él.