Educación

Un aula online más segura, con una persona donde hace falta

Chats de clase, comentarios en los deberes, foros y mensajes privados, revisados en el momento en que se escriben. ToxicFilter aplica umbrales más estrictos a una plataforma con menores, lee la conversación entera para ver la forma de un acercamiento, tapa el teléfono que un alumno escribe sin pensar y retiene para una persona el mensaje sobre autolesiones en lugar de borrarlo.

Lo que falla en plataformas como la tuya

Acoso que sigue a los alumnos hasta casa

El insulto en el chat de clase, el comentario debajo del trabajo de un compañero, el mensaje a las diez de la noche. Lo que antes se quedaba en el patio ahora llega a una pantalla, y una plataforma que primero publica y luego mira ya ha dejado que haga daño.

Acercamientos que ningún mensaje muestra

Un adulto que le pide a alguien de doce años que no cuente nada y que sigan hablando en otra app no ha escrito ninguna frase mala. Cada mensaje suena amable. Lo que lo delata es la secuencia, y un filtro que lee los mensajes de uno en uno nunca la ve.

Los niños comparten más de la cuenta

Un teléfono para quedar para un trabajo en grupo, un correo para pasarse los apuntes. Los alumnos lo escriben en sitios públicos sin pensarlo dos veces, y rechazar el mensaje entero por eso tira a la basura la pregunta que estaban haciendo.

Alumnos que lo están pasando mal

Un alumno que escribe que quiere morirse no incumple ninguna norma, y borrar su mensaje silencia la única señal visible de que necesita ayuda. Necesita a una persona que sepa responder, y rápido.

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 a un compañero
  2. 02 Un acercamiento a un menor
  3. 03 Un alumno comparte su teléfono y su correo
  4. 04 Un alumno que lo está pasando mal
  5. 05 Una duda de deberes

Acoso a un compañero POST /v1/text

Nadie de clase te quiere en el grupo. Todos se ríen de ti a tus espaldas, eres un pringado y un inútil.

block 9 ms
  • Contains 1 insult(s), aimed at the reader.

Un insulto dirigido a quien lee es acoso, no una palabrota sobre una situación. El mismo insulto sobre un examen de mates no lo sería.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.8
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.8,
      "reason": "Contains 1 insult(s), aimed at the reader.",
      "evidence": [
        "pringado"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 9
}

Un acercamiento a un menor POST /v1/conversation

alumna ¡hola! tengo 12 años y acabo de entrar en el club de dibujo

visitante qué bien. dibujas genial, de verdad

alumna ¡gracias!

visitante no les digas a tus padres que hablamos, ¿vale? pásame tu snap, que es más fácil

block 26 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. This needs a person now.

Otra persona del hilo ha dicho que tiene 12 años, y el último mensaje pide secreto y llevarse la charla a otra app. Los mensajes del propio menor nunca se leen en su contra, y decir una edad, por sí solo, nunca es un hallazgo.

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. This needs a person now.",
      "evidence": []
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 26
}

Un alumno comparte su teléfono y su correo POST /v1/text con redact: true

¿Alguien me ayuda con el trabajo? Escríbeme al +44 7700 900123 o a maya@example.com después de clase.

review 7 ms
  • Contains an email address.
  • Contains what looks like a phone number.

Queda retenido en lugar de rechazado, y el mensaje vuelve con el teléfono y el correo tapados, así que la pregunta se puede publicar igual.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "personal_data"
  ],
  "scores": {
    "personal_data": 0.6
  },
  "signals": [
    {
      "category": "personal_data",
      "score": 0.6,
      "reason": "Contains an email address.",
      "evidence": [
        "maya@example.com"
      ]
    },
    {
      "category": "personal_data",
      "score": 0.5,
      "reason": "Contains what looks like a phone number.",
      "evidence": [
        "447•••••••23"
      ]
    }
  ],
  "redacted": "¿Alguien me ayuda con el trabajo? Escríbeme al [redacted] o a [redacted] después de clase.",
  "model": {
    "read": false
  },
  "took_ms": 7
}

Un alumno que lo está pasando mal POST /v1/text

Me odio. No quiero vivir y nadie se daría cuenta.

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. Borrarlo apartaría al alumno que está pidiendo ayuda, y por eso las autolesiones van a revisión 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": [
        "no quiero vivir"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Una duda de deberes POST /v1/text

¿Alguien sabe hacer el ejercicio 4 de mates? Me sale 36 y en las soluciones pone 42.

allow 7 ms

Así son casi todos los mensajes. 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 a un compañero POST /v1/text

Nadie de clase te quiere en el grupo. Todos se ríen de ti a tus espaldas, eres un pringado y un inútil.

block 9 ms
  • Contains 1 insult(s), aimed at the reader.

Un insulto dirigido a quien lee es acoso, no una palabrota sobre una situación. El mismo insulto sobre un examen de mates no lo sería.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.8
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.8,
      "reason": "Contains 1 insult(s), aimed at the reader.",
      "evidence": [
        "pringado"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 9
}

Un acercamiento a un menor POST /v1/conversation

alumna ¡hola! tengo 12 años y acabo de entrar en el club de dibujo

visitante qué bien. dibujas genial, de verdad

alumna ¡gracias!

visitante no les digas a tus padres que hablamos, ¿vale? pásame tu snap, que es más fácil

block 26 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. This needs a person now.

Otra persona del hilo ha dicho que tiene 12 años, y el último mensaje pide secreto y llevarse la charla a otra app. Los mensajes del propio menor nunca se leen en su contra, y decir una edad, por sí solo, nunca es un hallazgo.

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. This needs a person now.",
      "evidence": []
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 26
}

Un alumno comparte su teléfono y su correo POST /v1/text con redact: true

¿Alguien me ayuda con el trabajo? Escríbeme al +44 7700 900123 o a maya@example.com después de clase.

review 7 ms
  • Contains an email address.
  • Contains what looks like a phone number.

Queda retenido en lugar de rechazado, y el mensaje vuelve con el teléfono y el correo tapados, así que la pregunta se puede publicar igual.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "personal_data"
  ],
  "scores": {
    "personal_data": 0.6
  },
  "signals": [
    {
      "category": "personal_data",
      "score": 0.6,
      "reason": "Contains an email address.",
      "evidence": [
        "maya@example.com"
      ]
    },
    {
      "category": "personal_data",
      "score": 0.5,
      "reason": "Contains what looks like a phone number.",
      "evidence": [
        "447•••••••23"
      ]
    }
  ],
  "redacted": "¿Alguien me ayuda con el trabajo? Escríbeme al [redacted] o a [redacted] después de clase.",
  "model": {
    "read": false
  },
  "took_ms": 7
}

Un alumno que lo está pasando mal POST /v1/text

Me odio. No quiero vivir y nadie se daría cuenta.

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. Borrarlo apartaría al alumno que está pidiendo ayuda, y por eso las autolesiones van a revisión 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": [
        "no quiero vivir"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Una duda de deberes POST /v1/text

¿Alguien sabe hacer el ejercicio 4 de mates? Me sale 36 y en las soluciones pone 42.

allow 7 ms

Así son casi todos los mensajes. 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.

  • Acercamiento a menores retiene desde 0,20 · rechaza desde 0,70
  • 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
  • Contenido sexual retiene desde 0,30 · rechaza desde 0,60
  • Datos personales retiene desde 0,30 · rechaza desde 0,80
  • Autolesiones retiene desde 0,15 · nunca rechaza

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="Nadie de clase te quiere en el grupo. Todos se ríen de ti a tus espaldas, eres un pringado y un inútil." \
  -d surface=comment
La referencia completa →

Un mes de ejemplo, en cifras

Elementos revisados
120.000
Leídos por el modelo
8.000
Imágenes
3.000
Créditos, aproximadamente
206.000

Entra en el plan Max. Ver los planes →

Guía para moderar una plataforma para menores

Qué revisar, cuándo hacerlo y cómo fijar las reglas, en chats de clase, comentarios y mensajes.

Cómo moderar una plataforma educativa para menores

Llama a la API antes de publicar un mensaje, un comentario o una entrada y actúa según una de tres respuestas: publicarlo, retenerlo para que lo vea una persona o rechazarlo. Casi todo lo que escriben los alumnos es una duda de deberes o una respuesta a un compañero, y eso lo resuelven las comprobaciones gratuitas en torno a un milisegundo. 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 plataforma cuando un profesor o un moderador decide.

Umbrales más estrictos para una plataforma con menores

La plantilla para menores mueve los umbrales que usaría una comunidad cualquiera. Rechaza antes el acoso, el odio, las amenazas y el contenido sexual, retiene las palabrotas para que alguien las mire sin rechazar nunca un mensaje solo por eso, retiene antes los datos personales y pone delante de una persona los mensajes sobre autolesiones con una puntuación mucho más baja. Todos los números son tuyos, y cualquier cambio puede probarse antes como una segunda política junto a la que está activa, para ver qué habría hecho con tu propio tráfico antes de que decida nada.

Acoso entre alumnos

Un insulto dirigido a quien lee se puntúa como harassment; la misma palabra sobre un examen o un juego, no. Los insultos escritos para colarse por una lista de palabras (pr1ngado, una letra de otro alfabeto, un espacio en medio) se convierten otra vez en letras normales antes de buscar nada. Cuando varios alumnos se lanzan contra uno en el mismo hilo, mándalo a /v1/conversation: el número de personas distintas que están siendo hostiles pasa a formar parte del veredicto.

Cómo proteger a los menores en chats y mensajes

Un acercamiento a un menor no es un mensaje, así que ToxicFilter solo lo busca a lo largo de una conversación, y con reglas estrictas. Decir una edad nunca es un hallazgo. Solo cuenta lo que dicen los demás participantes sobre su edad, nunca las palabras del propio menor. Los motivos describen formas, como pedir secreto o llevarse la charla a otra app, y nunca lo que es nadie. Un acercamiento junto a un menor declarado se rechaza y es trabajo de 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.

Datos personales que comparte un niño: taparlos

Un alumno que escribe su teléfono para quedar para un trabajo en grupo no ha hecho nada malo. Con redact, la respuesta trae el mismo texto con el teléfono, el correo o la tarjeta tapados, y el resto se puede publicar. El nombre de tu colegio, o cualquier otra cosa propia de tu plataforma, va en una regla con tus propias palabras, y a partir de ahí se encuentra como todo lo demás.

Autolesiones: retener, nunca borrar

Un alumno que dice que quiere morirse puede estar pidiendo ayuda, y retirar su mensaje 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 sepa responder. Lo que escriben los alumnos no se guarda: un veredicto conserva una huella del contenido, nunca el contenido.

Preguntas frecuentes

¿Cómo se detecta a un adulto que se acerca a un menor en un chat?

Manda la conversación a /v1/conversation con el autor de cada mensaje. ToxicFilter busca la forma de un acercamiento en quien ha escrito el último mensaje: pedir secreto, llevarse la charla a otra app, pedir fotos, ofrecer regalos o dinero, preguntar si el menor está solo. Si otro participante ha dicho que es menor, por su edad o por su curso, eso se rechaza y debería llegar a una persona de inmediato. Sin una edad declarada, dos de esas cosas juntas quedan retenidas para revisión con la plantilla para menores.

¿Marca a un niño por decir cuántos años tiene?

No. Decir una edad nunca es un hallazgo: vuelve como un dato, para que tu plataforma lo sepa, y no se marca nada. Solo cuentan las edades que dicen los demás participantes, así que las palabras de un menor nunca se usan en su contra. Los motivos describen lo que se ha encontrado en el texto, como una petición de secreto, y nunca dicen lo que es nadie.

¿Qué significa una respuesta limpia en una conversación?

Que las comprobaciones instantáneas no han encontrado en esas palabras ninguna de las formas de un acercamiento, en ninguno de los ocho idiomas que llevan. Lo que depende del contexto lo lee el modelo, que entra con effort high, y tu cola de revisión y tus propias reglas cubren el resto. Un mensaje suelto nunca basta por sí solo: hace falta una conversación.

¿Qué pasa con un mensaje sobre autolesiones?

Queda retenido para revisión y nunca se rechaza, porque borrarlo hace daño al alumno que lo ha escrito. La plantilla para menores lo retiene antes que el umbral por defecto, la respuesta dice que puede ser alguien pidiendo ayuda y un webhook puede avisar a quien en tu equipo esté preparado para responder.

¿Guardáis lo que escriben los alumnos?

No. Cada veredicto guarda una huella del contenido, nunca el contenido, y las pruebas se quitan de lo que se almacena. Una política puede conservar unas horas lo que queda retenido para que alguien lo lea, cifrado y desactivado por defecto.

¿Tengo que explicar por qué he retirado un mensaje?

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 mensaje bloqueado, en el idioma del usuario.

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.