Moderación de imágenes

Revisa una foto antes de que nadie la vea

Mándanos el archivo o su dirección. El modelo mira lo que aparece y transcribe todo lo que hay escrito, y ese texto pasa por los mismos filtros que un comentario: el teléfono de un cartel, la cartera de un falso sorteo, la lista de precios de réplicas. Si una foto ya se rechazó, la próxima vez se reconoce sin volver a mirarla.

Cómo funciona

  1. Envías la imagen

    POST /v1/image con una url, los bytes en data o un archivo multipart: uno solo de los tres. No hace falta subir la foto a ningún sitio para saber si se puede publicar.

  2. Se comprueba antes de descargarla

    Solo http y https, y se resuelve el host: una dirección que apunta a nuestra red interna se rechaza antes de bajar un solo byte. El tamaño y las dimensiones tienen tope, así que un archivo pequeño no puede acabar ocupando un montón de memoria.

  3. El modelo mira y lee

    En una sola lectura puntúa contenido sexual, violencia explícita, odio, publicidad, estafas y documentos personales, y transcribe el texto que se ve. Ese texto pasa después por los filtros gratuitos y por tus propias listas de palabras, sin coste añadido.

  4. Una foto rechazada se recuerda

    La huella de una foto bloqueada se guarda una semana en ese proyecto. Si llega otra vez, aunque esté guardada en otro formato o más comprimida, se rechaza sin consultar al modelo y se cobra como una comprobación.

Míralo en acción

  1. 01 Captura de un sorteo con una cartera
  2. 02 Un teléfono en el cartel de un gato perdido
  3. 03 Foto de una lista de precios de réplicas
  4. 04 El cartel de un mercadillo

Captura de un sorteo con una cartera POST /v1/text

¡Sorteo de Bitcoin! Envía 0,1 BTC a bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh y recibe 0,2 BTC de vuelta, garantizado.

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

Aquí se juzga como texto, porque esta página no puede ejecutar el modelo. En /v1/image las mismas palabras salen de la foto, y el motivo empieza por "In the text visible in the image".

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "scam"
  ],
  "scores": {
    "scam": 0.85
  },
  "topics": {
    "crypto": 0.683
  },
  "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 teléfono en el cartel de un gato perdido POST /v1/text

Se ha perdido un gato, se llama Miso. Si lo ves, llama al +44 7700 900456

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

Se retiene para que lo mire una persona, sin rechazarlo. En /v1/image el número se lee del cartel y se señala con su motivo; las posiciones para taparlo vuelven con el texto que tú envías.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "personal_data"
  ],
  "scores": {
    "personal_data": 0.5
  },
  "signals": [
    {
      "category": "personal_data",
      "score": 0.5,
      "reason": "Contains what looks like a phone number.",
      "evidence": [
        "447•••••••56"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 7
}

Foto de una lista de precios de réplicas POST /v1/text

Rolex Submariner réplica 1:1, calidad AAA. Precios al por mayor, envío a todo el mundo. Más modelos en mi álbum de yupoo.

block 7 ms

Las falsificaciones son un tema, no un daño, y solo actúan donde una regla lo dice; la plantilla de marketplace lo dice. En /v1/image esto es lo que dice la foto de una lista de precios una vez transcrita.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "topic:counterfeit"
  ],
  "topics": {
    "counterfeit": 0.98
  },
  "signals": [],
  "model": {
    "read": false
  },
  "took_ms": 7
}

El cartel de un mercadillo POST /v1/text

Mercadillo este sábado desde las 10:00. Libros, juguetes y una bici.

allow 7 ms

La mayoría de las fotos dicen algo normal, o nada. En /v1/image el texto pasa y lo que decide es lo que ha visto el modelo.

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

Míralo en acción

Captura de un sorteo con una cartera POST /v1/text

¡Sorteo de Bitcoin! Envía 0,1 BTC a bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh y recibe 0,2 BTC de vuelta, garantizado.

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

Aquí se juzga como texto, porque esta página no puede ejecutar el modelo. En /v1/image las mismas palabras salen de la foto, y el motivo empieza por "In the text visible in the image".

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "scam"
  ],
  "scores": {
    "scam": 0.85
  },
  "topics": {
    "crypto": 0.683
  },
  "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 teléfono en el cartel de un gato perdido POST /v1/text

Se ha perdido un gato, se llama Miso. Si lo ves, llama al +44 7700 900456

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

Se retiene para que lo mire una persona, sin rechazarlo. En /v1/image el número se lee del cartel y se señala con su motivo; las posiciones para taparlo vuelven con el texto que tú envías.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "personal_data"
  ],
  "scores": {
    "personal_data": 0.5
  },
  "signals": [
    {
      "category": "personal_data",
      "score": 0.5,
      "reason": "Contains what looks like a phone number.",
      "evidence": [
        "447•••••••56"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 7
}

Foto de una lista de precios de réplicas POST /v1/text

Rolex Submariner réplica 1:1, calidad AAA. Precios al por mayor, envío a todo el mundo. Más modelos en mi álbum de yupoo.

block 7 ms

Las falsificaciones son un tema, no un daño, y solo actúan donde una regla lo dice; la plantilla de marketplace lo dice. En /v1/image esto es lo que dice la foto de una lista de precios una vez transcrita.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "topic:counterfeit"
  ],
  "topics": {
    "counterfeit": 0.98
  },
  "signals": [],
  "model": {
    "read": false
  },
  "took_ms": 7
}

El cartel de un mercadillo POST /v1/text

Mercadillo este sábado desde las 10:00. Libros, juguetes y una bici.

allow 7 ms

La mayoría de las fotos dicen algo normal, o nada. En /v1/image el texto pasa y lo que decide es lo que ha visto el modelo.

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

Cómo moderar las imágenes de tus usuarios

Qué lee el modelo, qué añaden los filtros gratuitos en cada llamada y qué pasa con el archivo.

Cómo moderar las imágenes que suben los usuarios

Revisa la foto antes de publicarla, no cuando llegue una denuncia. POST /v1/image acepta una url, los bytes en base64 en data o un file multipart, así que no tienes que publicar una foto para saber si se puede publicar.

Qué ve el modelo en una foto

Nada en los bytes de una imagen dice lo que aparece en ella, así que con las fotos el modelo no es un paso extra sino el único que ve. Puntúa seis categorías: sexual, violence, hate, spam (una lista de precios o un teléfono sobre una foto de banco de imágenes), scam y personal_data (un DNI, un extracto bancario, la captura de un chat privado). Un desnudo por sí solo no es contenido sexual, y una foto de prensa no es violencia explícita.

Texto en imágenes: el truco más viejo contra un filtro de texto

La oferta, el teléfono y la cartera llegan en píxeles porque una lista de palabras no los ve. La misma lectura transcribe el texto visible, que pasa por los filtros gratuitos de texto y por las palabras de tu política, así que una regla escrita para los comentarios vale también para las capturas. Cada motivo empieza por "In the text visible in the image".

Reconocer una foto que vuelve

Cuando se bloquea una imagen, su huella perceptual (un dHash de 64 bits) se guarda en ese proyecto durante una semana. La misma foto guardada en PNG y luego en JPEG queda a unos 3 bits de distancia, dos fotos distintas a 25 o más, y el límite está en 8. Si coincide, se rechaza antes de preguntar al modelo, y la huella vuelve en facts.image.hash.

Si el archivo dice que lo hizo un modelo

ToxicFilter lee el manifiesto de Content Credentials (C2PA) y su generador, el tipo de origen digital de IPTC, una herramienta de IA nombrada en XMP y los parámetros de generación que dejan en los bloques de texto de un PNG la interfaz web de Stable Diffusion, ComfyUI o NovelAI. La respuesta va en facts.image.provenance con ai (generated, edited o null), la herramienta en tool y si hay content_credentials. Una foto firmada por una cámara tiene credenciales y no tiene ai.

Descargar con seguridad la foto de un desconocido

La URL de una imagen se comprueba antes de descargarla: solo http y https, el host resuelto, cualquier dirección privada o interna rechazada antes de abrirla y sin seguir redirecciones. La descarga se lee por partes y se corta al pasar de 5 MB, no se decodifica nada de más de 40 megapíxeles y los bloques de texto de un PNG se descomprimen dentro de un único presupuesto de 1 MB para todo el archivo.

Cómo se reparte el trabajo

Las comprobaciones instantáneas resuelven los casos claros en torno a un milisegundo, el modelo lee lo que depende del contexto, y tus reglas y tu equipo tienen la última palabra.

  • El que mira es el modelo

    Con una foto el modelo no es un paso extra, es el que mira los píxeles y lee las palabras que hay en ellos. A su alrededor, la comprobación de la dirección, la huella y la procedencia se ejecutan gratis en cada llamada, también con claves de prueba y con effort en low.

  • La procedencia es un dato, nunca un veredicto

    Lo que el archivo declara sobre su origen vuelve en facts.image.provenance para que lo use tu código. Si no hay declaración, el archivo no lo dice, y una imagen generada nunca se rechaza por serlo.

  • Tu proyecto recuerda lo que rechazó

    La huella reconoce copias cercanas de fotos ya rechazadas en el mismo proyecto y las rechaza antes de preguntar al modelo, al precio de la comprobación. Nunca sale del proyecto de cada cliente.

Preguntas frecuentes

¿Cómo modero las imágenes que suben los usuarios?

Llama a POST /v1/image antes de que la foto se publique, con su URL, sus bytes en base64 o el propio archivo. La respuesta es allow, review o block, con el motivo de cada hallazgo en una frase.

¿Marcará como desnudo una imagen médica o un cuadro clásico?

Al modelo se le indica que un desnudo por sí solo no es contenido sexual: un esquema médico, un cuadro clásico, una foto de lactancia o una imagen documental no deberían puntuar como sexuales. Una foto de guerra o un fotograma de película puntúan más bajo que la violencia real.

¿Lee el texto que hay dentro de las imágenes?

Sí, cuando el modelo lee la foto. Transcribe todas las palabras legibles, hasta 2.000 caracteres, y ese texto pasa por los mismos filtros gratuitos que un comentario: datos personales, patrones de estafa, enlaces, temas y tus propias palabras. Lo que pone en una foto se clasifica, nunca se obedece.

¿Sabe si una imagen está hecha con IA?

Solo si el archivo lo dice. Las Content Credentials (C2PA), el tipo de origen de IPTC, una herramienta de IA nombrada en XMP y los parámetros de generación que algunas herramientas escriben en un PNG vuelven en facts.image.provenance. Es un dato para tu código, nunca un motivo para bloquear.

¿Cuánto cuesta revisar una imagen?

Una comprobación cuesta un crédito. Cuando el modelo lee la foto se suman los tokens que ha usado, unos 10 créditos en total por imagen. Una copia de una foto ya rechazada en el proyecto se reconoce sin el modelo y cuesta solo la comprobación.

¿Guardáis las imágenes?

Una imagen enviada en bytes no se guarda nunca, ni siquiera con una política que conserve el contenido retenido. Con esa política sí se puede guardar una URL, porque es una referencia y no la foto. El registro de cada veredicto guarda un hash del contenido, nunca el contenido.

Sigue leyendo

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.