Redes sociales

Que la gente hable, y frena el acoso en grupo antes de que llegue

Publicaciones, comentarios, respuestas y mensajes privados, revisados en el momento en que se escriben. ToxicFilter lee el hilo además del mensaje, así que ve a cuatro personas lanzándose contra una, el insulto escrito para colarse por una lista de palabras y el sorteo que en realidad es una dirección de cartera, y manda a quien está en crisis a una persona en lugar de borrarle.

Lo que falla en plataformas como la tuya

Acoso en grupo que ningún mensaje muestra

Treinta cuentas escriben cada una una frase borde debajo de la publicación de alguien. Leídas de una en una, todas son mal humor normal; juntas son acoso en grupo, y quien lo recibe se va de tu plataforma. Un filtro que lee los mensajes uno a uno nunca lo ve pasar.

Insultos escritos para burlar el filtro

"eres un put0 1d10ta", una letra cirílica en mitad de una palabra, un espacio invisible entre otras dos. Quien quiere insultar aprende en un día qué busca una lista de palabras, y un filtro que compara el texto tal cual solo pilla a los que no lo intentaban.

Campañas de estafa y spam en las respuestas

El sorteo de cripto con una dirección de cartera, los "seguidores gratis" con tres enlaces acortados, el mismo mensaje reescrito cien veces por la misma red de cuentas. Llegan a los hilos con más movimiento, porque es donde está el público.

Personas en crisis, y menores

Una publicación en la que alguien dice que quiere acabar con su vida no incumple ninguna norma, y borrarla es la peor respuesta posible. Un adulto que se lleva a otra app una conversación con alguien de trece años tampoco es un mensaje malo suelto. Las dos cosas necesitan a una persona, rápido, y ninguna es una palabra de una lista.

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 Acoso en grupo
  2. 02 Un insulto camuflado
  3. 03 Alguien en crisis
  4. 04 Un sorteo de cripto
  5. 05 Un comentario normal

Acoso en grupo POST /v1/conversation

bob no sabes dibujar, idiota, tú no vales

cris jaja eres un inútil

dan deberías dejarlo, eres idiota

eve en serio, deja de publicar

review 18 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 contra la misma en cuatro mensajes. La última respuesta, sola, es una frase borde y pasa; el hilo es lo que la retiene para que la vea una persona, y con una cuarta persona la plantilla de comunidad ya la rechaza.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.638
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.638,
      "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": 18
}

Un insulto camuflado POST /v1/text

eres un put0 1d10ta

block 1 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 21% of the letters are not the letters they appear to be.

Los ceros, los unos y el asterisco se convierten otra vez en letras antes de buscar nada, así que el disfraz no cambia el resultado. Cuánto del texto iba camuflado se informa por separado, como evasión.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment",
    "toxicity"
  ],
  "scores": {
    "harassment": 0.8,
    "toxicity": 0.55,
    "evasion": 0.295
  },
  "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.295,
      "reason": "About 21% of the letters are not the letters they appear to be.",
      "evidence": [
        "eres un puto idiota"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Alguien en crisis POST /v1/text

No puedo más. Quiero acabar con mi vida.

review 1 ms
  • Contains 1 phrase(s) about self-harm. This may be someone asking for help rather than breaking a rule.

Queda retenido para una persona, nunca se rechaza. A quien más daño hace borrar esta publicación es a quien la ha escrito, y por eso las autolesiones van a revisión por defecto y no se bloquean.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "self_harm"
  ],
  "scores": {
    "self_harm": 0.7
  },
  "signals": [
    {
      "category": "self_harm",
      "score": 0.7,
      "reason": "Contains 1 phrase(s) about self-harm. This may be someone asking for help rather than breaking a rule.",
      "evidence": [
        "acabar con mi vida"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Un sorteo de cripto POST /v1/text

Sorteo de cripto gratis en mi perfil 🚀🚀 envía 0,1 BTC y te devuelvo 1 BTC: bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh

block 8 ms
  • Contains a cryptocurrency wallet address, with an instruction to send to it or beside another scam shape.

Una dirección de cartera junto a la promesa de devolverte más es una estafa digan lo que digan los emojis de alrededor. Lo resuelven las comprobaciones gratuitas, sin que intervenga el modelo.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "scam"
  ],
  "scores": {
    "scam": 0.85
  },
  "topics": {
    "crypto": 0.5
  },
  "signals": [
    {
      "category": "scam",
      "score": 0.85,
      "reason": "Contains a cryptocurrency wallet address, with an instruction to send to it or beside another scam shape.",
      "evidence": [
        "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 8
}

Un comentario normal POST /v1/text

¡Qué foto tan bonita! ¿Dónde está hecha? La luz sobre el agua es preciosa.

allow 7 ms

Así son casi todos los comentarios. Lo resuelven las comprobaciones gratuitas en torno a un milisegundo, sin pagar nada más.

La respuesta, resumida
{
  "decision": "allow",
  "flagged": [],
  "signals": [],
  "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.

Acoso en grupo POST /v1/conversation

bob no sabes dibujar, idiota, tú no vales

cris jaja eres un inútil

dan deberías dejarlo, eres idiota

eve en serio, deja de publicar

review 18 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 contra la misma en cuatro mensajes. La última respuesta, sola, es una frase borde y pasa; el hilo es lo que la retiene para que la vea una persona, y con una cuarta persona la plantilla de comunidad ya la rechaza.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.638
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.638,
      "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": 18
}

Un insulto camuflado POST /v1/text

eres un put0 1d10ta

block 1 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 21% of the letters are not the letters they appear to be.

Los ceros, los unos y el asterisco se convierten otra vez en letras antes de buscar nada, así que el disfraz no cambia el resultado. Cuánto del texto iba camuflado se informa por separado, como evasión.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment",
    "toxicity"
  ],
  "scores": {
    "harassment": 0.8,
    "toxicity": 0.55,
    "evasion": 0.295
  },
  "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.295,
      "reason": "About 21% of the letters are not the letters they appear to be.",
      "evidence": [
        "eres un puto idiota"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Alguien en crisis POST /v1/text

No puedo más. Quiero acabar con mi vida.

review 1 ms
  • Contains 1 phrase(s) about self-harm. This may be someone asking for help rather than breaking a rule.

Queda retenido para una persona, nunca se rechaza. A quien más daño hace borrar esta publicación es a quien la ha escrito, y por eso las autolesiones van a revisión por defecto y no se bloquean.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "self_harm"
  ],
  "scores": {
    "self_harm": 0.7
  },
  "signals": [
    {
      "category": "self_harm",
      "score": 0.7,
      "reason": "Contains 1 phrase(s) about self-harm. This may be someone asking for help rather than breaking a rule.",
      "evidence": [
        "acabar con mi vida"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Un sorteo de cripto POST /v1/text

Sorteo de cripto gratis en mi perfil 🚀🚀 envía 0,1 BTC y te devuelvo 1 BTC: bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh

block 8 ms
  • Contains a cryptocurrency wallet address, with an instruction to send to it or beside another scam shape.

Una dirección de cartera junto a la promesa de devolverte más es una estafa digan lo que digan los emojis de alrededor. Lo resuelven las comprobaciones gratuitas, sin que intervenga el modelo.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "scam"
  ],
  "scores": {
    "scam": 0.85
  },
  "topics": {
    "crypto": 0.5
  },
  "signals": [
    {
      "category": "scam",
      "score": 0.85,
      "reason": "Contains a cryptocurrency wallet address, with an instruction to send to it or beside another scam shape.",
      "evidence": [
        "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 8
}

Un comentario normal POST /v1/text

¡Qué foto tan bonita! ¿Dónde está hecha? La luz sobre el agua es preciosa.

allow 7 ms

Así son casi todos los comentarios. Lo resuelven las comprobaciones gratuitas en torno a un milisegundo, sin pagar nada más.

La respuesta, resumida
{
  "decision": "allow",
  "flagged": [],
  "signals": [],
  "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
  • Autolesiones retiene desde 0,30 · nunca rechaza
  • Elusión del filtro retiene desde 0,50 · rechaza desde 0,85
  • Estafa retiene desde 0,45 · rechaza desde 0,75

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="no sabes dibujar, idiota, tú no vales" \
  -d surface=comment
La referencia completa →

Un mes de ejemplo, en cifras

Elementos revisados
300.000
Leídos por el modelo
20.000
Imágenes
10.000
Créditos, aproximadamente
540.000

Entra en el plan Max. Ver los planes →

Guía para moderar una red social

Qué revisar, cuándo hacerlo y cómo fijar las reglas, en publicaciones, comentarios, respuestas y mensajes.

Cómo moderar comentarios y publicaciones en tiempo real

Llama a la API antes de publicar una publicación, un comentario o un mensaje y actúa según una de tres respuestas: publicarlo, retenerlo para que lo vea una persona o rechazarlo. Casi todo el tráfico de una comunidad es alguien diciéndole algo normal a otra persona, y eso lo resuelven las comprobaciones gratuitas en torno a un milisegundo, así que moderar no añade una espera que se note al publicar. El modelo solo lee lo que ellas dejan abierto. Lo que llega como review espera en una cola, en tu panel o por la API, y un webhook firmado avisa a tu web cuando alguien lo aprueba.

Cómo detectar el acoso, también en grupo

El acoso son dos problemas distintos. Una persona insultando a otra se ve en un solo mensaje, y ToxicFilter lo puntúa como harassment cuando el insulto va dirigido a quien lee y no a una situación ("este juego es una mierda" no es "eres idiota"). El acoso en grupo no se ve en ningún mensaje suelto: son muchas personas distintas haciéndole lo mismo a una. Manda el hilo a /v1/conversation con el autor de cada mensaje y el número de personas hostiles distintas pasa a formar parte del veredicto, con un motivo que dice cuántas eran.

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

Una lista de palabras prohibidas pilla a los que no lo intentaban. Todos los demás escriben put*, p u t o, una letra griega en lugar de una latina o un espacio invisible en medio. ToxicFilter convierte todo eso 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 Scunthorpe, cockpit o shiitake no caen nunca.

Amenazas, odio y violencia

Una amenaza dirigida a quien lee ("sé dónde vives") se rechaza como violence. Los ataques a colectivos van a hate, sobre todo a través del modelo: las listas de palabras públicas no llevan insultos de odio a propósito, porque una lista completa de ellos solo tiene otro uso, y puedes apuntar ToxicFilter a tu propia lista. Un buen historial en tu plataforma nunca rebaja el umbral de ninguna de las dos.

Autolesiones y suicidio: retener, nunca borrar

Una publicación de alguien que dice que quiere morir puede ser alguien pidiendo ayuda, y retirarla es apartarle. self_harm retiene para revisión y nunca bloquea salvo que tú lo decidas, la respuesta explica el motivo con palabras, y el webhook moderation.review puede avisar a quien en tu equipo esté preparado para responder. Es la única categoría en la que lo correcto por defecto es lo más suave.

Cómo elegir los umbrales de tu comunidad

Empieza por la plantilla de comunidad, que retiene antes las palabrotas para que alguien las mire y aun así nunca rechaza un mensaje solo por eso, y que rechaza antes que los umbrales por defecto el acoso, el odio, las amenazas y los acercamientos a menores. Después, prueba cualquier cambio como una segunda política que funciona en paralelo con la que está activa: se calculan los dos veredictos sobre tu propio tráfico, solo uno decide, y el panel te enseña en qué no coinciden antes de que cambies.

Preguntas frecuentes

¿Cómo se detecta el acoso en grupo o coordinado?

Manda el hilo a /v1/conversation con un identificador de autor en cada mensaje. ToxicFilter cuenta cuántas personas distintas están siendo hostiles con alguien en segunda persona, y qué parte del hilo representan. Una persona furiosa que escribe quince mensajes es una discusión y no cuenta como acoso en grupo; cuatro personas distintas contra la misma sí, y la puntuación dice cuántas eran.

¿Se puede burlar con números, símbolos o letras que se parecen?

Mucho menos que una lista de palabras. Todo se normaliza antes de buscar: números en lugar de letras, asteriscos de censura, letras cirílicas y griegas que parecen latinas, caracteres de ancho completo, tildes, letras separadas por espacios y caracteres invisibles. Una palabra solo se considera camuflada cuando mezcla alfabetos, así que un texto de verdad en ruso o en griego no se toca.

¿Qué pasa con las publicaciones sobre autolesiones o suicidio?

Quedan retenidas para revisión y por defecto nunca se rechazan, porque borrarlas hace daño a quien las ha escrito. La respuesta dice que puede ser alguien pidiendo ayuda, y un webhook puede avisar a quien en tu equipo sepa responder. Un buen historial nunca rebaja la atención que recibe una publicación así.

¿Protege a los menores que usan la plataforma?

Busca la forma de un acercamiento a lo largo de una conversación: llevarse la charla a otra app, pedir secreto, pedir fotos, regalos, aislar a alguien, y 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 y, con effort high, el modelo lee la conversación entera buscando lo que las palabras dejan al contexto.

¿Qué rapidez tiene en un feed con mucho tráfico?

En torno a un milisegundo por comentario corto cuando lo resuelven las comprobaciones gratuitas, que es casi todo el tráfico. El modelo solo lee lo que ellas dejan abierto, y decides en cada llamada si puede hacerlo. Las repeticiones, como el mismo spam publicado cien veces, se responden desde una caché.

¿Tengo que explicarle a un usuario por qué he retirado su publicación?

En la UE, sí: el artículo 17 del Reglamento de Servicios Digitales exige una declaración de motivos por cada retirada o restricción, sea cual sea el tamaño de la plataforma. ToxicFilter puede redactarla con cada publicación bloqueada, en el idioma del usuario, y recoger su recurso.

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.