Etiquetar contenido IA en la UE: lo que el artículo 50 te obliga de verdad y cómo hacerlo con C2PA e IPTC (probado)

Foto de Marco Orta | 11 min de lectura
Portada tipográfica: C2PA sobre un diff, en rojo gd → imagejpeg sin manifiesto y en verde c2patool -m ai.json con la firma válida
Tabla de Contenidos

    El artículo 50 del AI Act aplica desde el 2 de agosto de 2026, pero no obliga a poner «hecho con IA» en todo. Obliga a dos cosas distintas a dos actores distintos: el proveedor del sistema (OpenAI, Google) tiene que marcar lo que genera en un formato legible por máquina, y quien lo usa solo tiene que poner una etiqueta visible en deepfakes y en texto de interés público sin revisión humana. El Digital Omnibus dio una prórroga, pero solo al marcado técnico y solo hasta el 2 de diciembre de 2026 para sistemas que ya estaban en el mercado. Abajo va quién hace qué, los comandos de IPTC y C2PA que probé, qué herramientas borran esas marcas sin avisar (mi propio backend lo hacía) y los dos flags de API que casi nadie manda.

    Aviso: esto es la lectura de un desarrollador sobre textos públicos, no asesoría legal. Todas las fechas y cifras llevan su fuente.

    Qué dice el artículo 50, en tres obligaciones

    El artículo 50 del Reglamento (UE) 2024/1689 reparte la transparencia así:

    ApartadoQuiénQué
    50(1)Proveedor de un chatbotQue la persona sepa que habla con una IA, salvo que sea obvio
    50(2)Proveedor de un sistema generativoQue lo generado esté «marcado en un formato legible por máquina» y sea detectable como artificial
    50(4)Quien lo despliega (deployer)Etiqueta visible en deepfakes, y en texto publicado para informar sobre asuntos de interés público, salvo que haya pasado revisión humana con responsabilidad editorial

    Tres matices que cambian la lectura:

    • El marcado técnico es del proveedor. Si generas imágenes con la API de OpenAI o de Google, el 50(2) lo cumplen ellos. Pasas a ser proveedor si construyes y ofreces con tu nombre un sistema generativo, por ejemplo un generador de imágenes para tus clientes.
    • Una ilustración no es un deepfake. Las directrices de la Comisión (C(2026) 5054, 20 de julio de 2026) piden tres criterios a la vez: que se parezca a personas, lugares o hechos existentes o plausibles, y que aparente falsamente ser auténtico. Una infografía o una portada ilustrada no los cumple.
    • Aplica fuera de la UE. El artículo 2(1)(c) alcanza a proveedores y deployers de terceros países «where the output produced by the AI system is used in the Union». Una empresa mexicana con usuarios en España está dentro.

    Las multas del artículo 50 llegan a 15 millones de euros o el 3 % de la facturación mundial anual, la cifra mayor (art. 99(4)(g)). Para pymes cuenta la menor. Si lees «7,5 millones o el 1 %», esa es la multa por dar información incorrecta a las autoridades, no la del artículo 50.

    Lo que sí cambió el Omnibus

    El Reglamento (UE) 2026/1744, publicado el 24 de julio de 2026, aplazó sobre todo las obligaciones de alto riesgo. Al artículo 50 solo le dio una prórroga estrecha: los sistemas ya en el mercado antes del 2 de agosto de 2026 tienen hasta el 2 de diciembre de 2026 para cumplir el 50(2). En palabras de la FAQ de la Comisión del 24 de julio: «Content generated prior to 2 August 2026 does not need to be labelled retroactively.»

    El 50(1) y el 50(4) no tienen prórroga.

    Qué pide el Código de buenas prácticas

    La Comisión dio por adecuado el 8 de julio de 2026 el Código de buenas prácticas sobre transparencia del contenido generado por IA, cuya versión final es del 10 de junio. Es voluntario, pero dice qué considera la Comisión un marcado suficiente:

    • Al menos dos capas. Metadatos firmados digitalmente y con sello de tiempo, más una marca de agua imperceptible. IPTC lo resume así: la única tecnología que hoy cumple lo primero es C2PA.
    • No quitar marcas existentes al transformar un contenido.
    • Un detector gratuito por proveedor, e interoperabilidad de detección antes del 2 de febrero de 2027.
    • Para los deployers, los iconos de la UE en las etiquetas visibles.

    Las dos marcas que existen: IPTC y C2PA

    • IPTC Digital Source Type es un campo XMP con un valor de vocabulario controlado. Para contenido generado íntegramente por IA es http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia, y si solo una parte es IA, compositeWithTrainedAlgorithmicMedia. Es declarativo: cualquiera puede escribirlo o borrarlo.
    • C2PA (Content Credentials, especificación 2.4) es un manifiesto firmado con un certificado X.509 dentro del archivo, con un hash del contenido. Si alguien cambia un píxel, la firma ya no cuadra.

    Hay un motivo práctico para escribir las dos: según un estudio que recoge IPTC (marzo de 2026), Instagram lee IPTC pero no C2PA, y LinkedIn lee C2PA pero no IPTC.

    IPTC con exiftool

    Probado con exiftool 12.76 sobre JPEG, PNG y MP4:

    exiftool -overwrite_original \
      -XMP-iptcExt:DigitalSourceType="http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia" \
      imagen.jpg
    
    exiftool -G1 -XMP-iptcExt:DigitalSourceType imagen.jpg
    # [XMP-iptcExt] Digital Source Type : http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia
    

    C2PA con c2patool

    Probado con c2patool 0.27.22, el binario del release de contentauth/c2pa-rs. El manifiesto declara la acción de creación y su tipo de origen:

    {
      "alg": "es256",
      "private_key": "es256_private.key",
      "sign_cert": "es256_certs.pem",
      "ta_url": "http://timestamp.digicert.com",
      "claim_generator_info": [{ "name": "mi-app", "version": "1.0" }],
      "assertions": [
        {
          "label": "c2pa.actions",
          "data": {
            "actions": [
              {
                "action": "c2pa.created",
                "digitalSourceType": "http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia",
                "softwareAgent": { "name": "gpt-image-1" }
              }
            ]
          }
        }
      ]
    }
    
    c2patool src.jpg -m ai.json -o signed.jpg -f   # firma
    c2patool signed.jpg                             # lee: "validation_state": "Valid"
    

    Con el certificado de prueba del repositorio la firma valida, pero aparece marcada como signingCredential.untrusted. En producción necesitas un certificado de una autoridad que esté en la lista de confianza de C2PA. Firmó igual un MP4 en H.264.

    C2PA desde Node

    El paquete actual es @contentauth/c2pa-node (el c2pa-node sin scope es el viejo). Probado con la 0.9.8:

    import { Builder, LocalSigner } from '@contentauth/c2pa-node';
    import { readFile } from 'node:fs/promises';
    
    const signer = LocalSigner.newSigner(await readFile('certs.pem'), await readFile('private.key'), 'es256');
    const builder = await Builder.withJsonAsync({
      claim_generator_info: [{ name: 'mi-app', version: '1.0' }],
      assertions: [],
    });
    builder.setIntent({ create: 'http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia' });
    builder.sign(signer, { path: 'src.jpg' }, { path: 'signed.jpg' });
    

    Dos trampas que me encontré: si le pasas a LocalSigner.newSigner una URL de sello de tiempo y firmas con el sign síncrono, revienta con «the sync http resolver is not implemented»; y signAsync exige un CallbackSigner, no un LocalSigner. Sin sello de tiempo funciona y valida. En PHP no encontré SDK oficial: desde Laravel lo razonable es llamar a c2patool con Process.

    Qué borra las marcas sin avisar

    Aquí está la parte que ninguna guía cuenta. Hice pasar una imagen marcada con IPTC y C2PA por las transformaciones de cualquier pipeline:

    TransformaciónIPTCC2PA
    sharp por defecto (resize().toFile())se pierdese pierde
    sharp con withMetadata()se conservase pierde
    sharp a WebP—se pierde
    PHP GD (imagecreatefromstring → imagejpeg)se pierdese pierde
    ImageMagick -resizese conservase queda, pero inválido («Hashes do not match»)
    ffmpeg -c copy (remux de MP4)—se pierde
    ffmpeg recodificandose pierde—

    Y el canvas.toBlob() del navegador recodifica de cero, así que tampoco conserva nada. Las herramientas de imagen de este sitio funcionan así.

    La regla que sale de la tabla: el C2PA se firma al final, sobre el archivo exacto que vas a publicar. Un manifiesto roto por un redimensionado es peor que no tener ninguno, porque un verificador lo muestra como inválido. Si necesitas transformar un archivo ya firmado, lo correcto es un manifiesto nuevo con el original como ingredient y la acción c2pa.resized. Cloudflare Images lo hace con la opción Preserve Content Credentials.

    Mi backend las borraba

    El backend que publica las redes de este sitio genera imágenes con Gemini y con OpenAI, que ya las entregan con C2PA. Lo primero que hace con ellas es recortarlas a 1080×1350 y ponerles el logo con GD: imagecreatefromstring, pintar, imagejpeg. Esa línea tira el manifiesto del proveedor antes de subir nada. Lo único que puede sobrevivir es la marca de agua en los píxeles (SynthID en el caso de Google), y no he medido si aguanta el recorte, el logo y el JPEG al 85 %.

    Legalmente no me obliga nada: soy deployer, son ilustraciones y no deepfakes, y el 50(2) es del proveedor. Pero el Código pide no quitar marcas existentes, y las redes usan esos metadatos para poner su propia etiqueta. El arreglo es el orden: escribir IPTC compositeWithTrainedAlgorithmicMedia (lleva logo y texto encima) y firmar C2PA después de GD, como último paso antes de subir el archivo.

    Los flags de las redes

    Además de los metadatos, dos plataformas aceptan una declaración explícita por API:

    • YouTube Data API: status.containsSyntheticMedia (booleano) en videos.insert y videos.update, disponible desde octubre de 2024. YouTube lo pide solo para contenido realista; un vídeo de motion graphics no lo necesita.
    • TikTok Content Posting API: post_info.is_aigc (booleano) en la publicación directa, que etiqueta el vídeo como contenido generado por IA.

    En la Graph API de Instagram y Facebook no encontré un parámetro documentado: Meta infiere la etiqueta de los metadatos del archivo.

    Y el chatbot

    El 50(1) es el que más fácil se incumple sin querer. Mi agente de soporte tenía en el prompt «hablas como una persona real del equipo», buscando un tono cercano. El widget avisaba de que era un asistente con IA, pero si alguien preguntaba «¿eres una persona?», nada en el prompt le impedía decir que sí. El arreglo fue cambiar esa frase por el tono de alguien del equipo y añadir una regla que no se negocia: «Eres una inteligencia artificial. Si te preguntan si hablan con una persona o con un bot, dilo con claridad y ofrece pasar con una persona del equipo.» Y un test que falla si esa regla desaparece del prompt.

    ¿Y en México?

    No hay obligación de etiquetar. La reforma publicada en el DOF del 14 de mayo de 2026 a la Ley Federal del Trabajo y a la Ley Federal del Derecho de Autor trata otra cosa: el consentimiento y el pago por usar la imagen o la voz de artistas con IA (arts. 305 Bis de la LFT y 87, 118 y 121 de la LFDA). No hay ley general de IA aprobada, y la iniciativa de etiquetado que hay en el Senado no se ha votado. Si usas voz clonada en México, lo que te toca es el consentimiento de la persona dueña de la voz, no una etiqueta.

    Checklist

    • Averigua si eres proveedor o deployer de cada sistema. Casi siempre eres lo segundo.
    • Si ofreces un chatbot, que diga que es una IA y que nunca lo niegue.
    • Etiqueta visible solo en deepfakes y en texto informativo sin revisión humana, con los iconos de la UE.
    • Escribe IPTC y C2PA, porque cada red lee uno.
    • Firma al final, sobre el archivo que se publica, y revisa qué borra cada paso de tu pipeline.
    • En YouTube y TikTok, manda el flag cuando el contenido sea realista.

    Preguntas frecuentes

    ¿Desde cuándo es obligatorio etiquetar contenido generado por IA en la UE?

    El artículo 50 del AI Act aplica desde el 2 de agosto de 2026. El Reglamento 2026/1744 (Omnibus) dio una prórroga hasta el 2 de diciembre de 2026 solo para el marcado técnico del 50(2) y solo para sistemas que ya estaban en el mercado antes del 2 de agosto. El contenido generado antes del 2 de agosto no hay que etiquetarlo de forma retroactiva.

    ¿Tengo que poner «hecho con IA» en todas las imágenes que genero?

    No. La etiqueta visible es obligación del que despliega el sistema solo en deepfakes (contenido que aparenta falsamente ser real) y en texto publicado para informar sobre asuntos de interés público que no haya pasado revisión humana. El marcado técnico legible por máquina es obligación del proveedor del sistema generativo, como OpenAI o Google.

    ¿Cuál es la multa por incumplir el artículo 50 del AI Act?

    Hasta 15 millones de euros o el 3 % de la facturación mundial anual, la cifra mayor, según el artículo 99(4)(g). Para pymes se aplica la menor de las dos. La cifra de 7,5 millones o el 1 % que circula corresponde a dar información incorrecta a las autoridades.

    ¿El AI Act aplica a una empresa de México?

    Sí, si lo que produce su sistema de IA se usa en la Unión Europea (artículo 2(1)(c)). Por ejemplo, un chatbot que atiende a usuarios en España o contenido generado que se publica para público europeo. En México no existe una obligación de etiquetado propia.

    ¿Por qué desaparece el C2PA de mis imágenes?

    Porque casi cualquier recodificación lo borra: sharp por defecto, sharp con withMetadata, PHP GD, ffmpeg al remuxear un MP4 y el canvas del navegador. ImageMagick lo conserva pero invalidado. La solución es firmar el C2PA como último paso, sobre el archivo exacto que se publica.

    ¿Te sirvió? Compártelo

    ¿Te sirvió? Recibe la próxima por correo

    Una vez por semana: qué se rompe al actualizar, IA para desarrolladores y lo que estoy construyendo, con fuentes. Sin spam.

    Al suscribirte aceptas nuestro aviso de privacidad.

    Buscar

    Etiquetas

    IA Migración PHP Laravel JavaScript Tutorial Desarrollo Web Seguridad Upgrade Buenas Prácticas OpenAI SEO Backend Claude Laravel 13