Sin licencia no es dominio público

Para ampliar mi librería de direcciones revisé más de 800 fuentes de datos abiertos en 31 estados. La mayoría no declaraba licencia, en varias la licencia del publicador no coincidía con la del agregador, y solo nueve estados pasaron. Así se verifica una licencia de verdad.

random-address es una librería de Python que entrega direcciones reales de Estados Unidos para usar como datos de prueba. Hace una sola promesa: todas las direcciones son de dominio público. No “abiertas”, no “gratis”: de dominio público, para que quien las use no herede ninguna obligación.

Hace poco quise ampliar la cobertura. El dataset tenía 20 estados y faltaban 31. Los datos existen: OpenAddresses recopila las direcciones que publican gobiernos estatales, condados y ciudades, y tiene fuentes para casi todo el país. Parecía un trabajo de importar y listo.

Terminó siendo una auditoría de licencias, y la mayoría de lo que encontré no se podía usar.

La regla que hace difícil todo lo demás

Antes de los números, la regla, porque es lo que vuelve lento este trabajo:

La ausencia de licencia no es dominio público. Es desconocido.

Un dataset publicado en un portal gubernamental sin ninguna declaración de licencia no te da permiso de nada. Puede que el gobierno no reclame derechos, puede que sí, puede que los datos vengan de un proveedor privado con su propio contrato. Si no lo dice, no lo sabes, y si no lo sabes no lo puedes redistribuir prometiendo que es de dominio público.

Con esa regla, la revisión de cada fuente se reduce a una pregunta: ¿el publicador dice, en algún lugar verificable, que esto es de dominio público?

Qué encontré

Revisé, con ayuda de agentes en paralelo, el archivo de configuración de cada fuente de OpenAddresses en los 31 estados que faltaban: más de 800 fuentes. Para las prometedoras fui al publicador original a leer sus términos.

El resultado, a grandes rasgos:

  • La mayoría no declara licencia. Ni en OpenAddresses ni en el portal de origen. A veces hay un descargo de responsabilidad (“los datos se entregan tal cual”), que no es una licencia.
  • Muchas exigen atribución (CC BY) o compartir bajo la misma licencia (ODbL). Son abiertas, pero no son dominio público: imponen una obligación a quien las use.
  • Algunas restringen el uso de formas que no esperarías de datos públicos: “uso interno o personal”, “no se permite vender sin un acuerdo por escrito”.
  • Nueve estados pasaron: Illinois, Idaho, Louisiana, Indiana, Ohio, Pennsylvania, South Carolina, New Mexico y Minnesota.

Nueve de 31. Y lo más interesante no es la proporción, sino dónde estaba la licencia en los que pasaron.

El agregador no es la fuente

En seis de los nueve casos, la licencia válida no estaba en la copia que usa OpenAddresses, o directamente no había copia. El publicador sí había dedicado los datos al dominio público, pero en otro lugar:

  • Ada County, Idaho. La fuente que usa OpenAddresses es la de la ciudad de Boise, con licencia CC BY 4.0. Pero el propio condado publica sus puntos de dirección en otro servicio, con licencia CC0. Mismos datos, distinto publicador, distinta licencia.
  • Cook County, Illinois. OpenAddresses apunta a un servidor de mapas sin licencia. El mismo condado publica el dataset en su portal de datos abiertos, marcado como dominio público, con 1.38 millones de direcciones que incluyen Chicago.
  • Columbus, Ohio. La fuente de OpenAddresses apunta a un servicio de la ciudad sin licencia. La misma ciudad publica otra capa de puntos de dirección con una línea que no deja dudas: “This data is dedicated to the public domain under the Creative Commons Universal License (CC0).”

Y al revés también pasa. Para New Mexico, OpenAddresses marca la fuente estatal como attribution: true, más conservador que lo que dice el publicador: los metadatos declaran Use Constraints: None y la política del sitio dice que la información es de dominio público salvo indicación contraria; la cita “se agradece”, no se exige.

En Iowa pasó lo contrario, y es el caso que más miedo da. OpenAddresses etiqueta decenas de fuentes de condados como “Public Domain”, pero no encontré nada del lado de los condados que lo respalde: o el campo de licencia está vacío, o el servidor de origen ya no responde. La etiqueta existe solo en el agregador. No las usé.

La lección es que el resumen de un agregador es un punto de partida, no evidencia. La licencia es lo que dice el publicador.

Dónde mirar

Casi todos los gobiernos locales de Estados Unidos publican con una de tres tecnologías, y cada una guarda la licencia en un lugar distinto. Saber dónde mirar convierte una tarde de navegar portales en una consulta.

ArcGIS (Esri), el más común. Cada dataset es un “item” con un campo licenseInfo:

import json
import urllib.request

def arcgis_license(item_id: str) -> str:
    url = f"https://www.arcgis.com/sharing/rest/content/items/{item_id}?f=json"
    with urllib.request.urlopen(url) as response:
        item = json.load(response)
    return item.get("licenseInfo") or "(vacío)"

Un licenseInfo vacío es la respuesta más frecuente, y significa lo que parece: no hay licencia.

Socrata (portales data.<ciudad>.gov). Cada vista tiene metadatos con un campo license:

def socrata_license(domain: str, view_id: str) -> object:
    url = f"https://{domain}/api/views/{view_id}.json"
    with urllib.request.urlopen(url) as response:
        return json.load(response).get("license")

socrata_license("datacatalog.cookcountyil.gov", "78yw-iddh")
# {'name': 'Public Domain'}

Metadatos FGDC, el estándar federal, que suele venir como XML junto a los shapefiles. Los campos que importan son useconst (restricciones de uso) y distliab (responsabilidad de distribución), y la declaración de dominio público a veces está escondida en el segundo, en medio de un párrafo legal.

Frases que parecen dominio público y no lo son

La parte más difícil no fue encontrar las licencias sino leerlas. Varias fuentes casi pasan, y el “casi” está en la redacción:

Lo que diceLo que significa
”No restrictions”Que no te restringen el uso. No es una dedicación al dominio público.
”Free for public consumption”Que el acceso es gratis. No dice nada sobre redistribuir.
”Citation requested, but not required”Permisivo en la práctica, pero sigue sin ser una dedicación.
”Acknowledgement would be appreciated”Junto a una dedicación explícita, está bien. Sin ella, no alcanza.
Un descargo de responsabilidadProtege al publicador de reclamos; a ti no te da ningún permiso. No es licencia.

New Jersey, Maine, Wisconsin, Indiana estatal, Ohio estatal, New York City y Seattle quedaron en esta zona. Probablemente se puedan usar, pero “probablemente” no es la promesa que hace la librería. Para cualquiera de ellos, la salida correcta es escribirle al publicador y pedir que lo confirme por escrito.

Por qué no tomar el atajo

Existe un camino mucho más rápido. Hay agregadores con decenas de millones de direcciones, listos para descargar, que cubren todo el país. Un fork de mi librería hizo justamente eso: un millón de direcciones, los 50 estados, decenas de miles de códigos postales.

Revisé sus datos. Incluye 12,699 direcciones de Utah, un estado para el que no encontré ninguna fuente de dominio público: la estatal es CC BY 4.0, que exige atribución, y el resto no declara licencia. Vengan de donde vengan esas direcciones, no son de dominio público, y el paquete no da ninguna atribución concreta; su registro solo dice que incluye “términos específicos de cada fuente listados por el agregador”. Quien las use en un producto hereda obligaciones que no conoce.

No es una crítica al tamaño. Un millón de direcciones es útil. Es que una librería de datos de prueba se mete en las suites de tests de otros, en sus repositorios, a veces en sus productos, y la licencia viaja con los datos. Si no puedes decir con certeza qué licencia tienen, no puedes decir nada.

Cómo quedó en el código

Dos cambios chicos hacen que la regla no dependa de mi memoria.

El script con el que agrego direcciones exige declarar la licencia de la fuente, y solo acepta tres valores:

LICENSES = ("CC0-1.0", "PDDL-1.0", "public-domain")

parser.add_argument("--license", required=True, choices=LICENSES)

No tiene valor por defecto a propósito. Declararla es el momento de ir a mirar los términos del publicador, y un CC BY o una fuente sin licencia simplemente no se puede importar.

Y la atribución de cada fuente queda en el README, marcando cuáles vinieron directo del portal del publicador y no de la copia del agregador, para que cualquiera pueda repetir la verificación.

Lo que me llevo

Los datos abiertos de gobiernos parecen de dominio público por naturaleza, y no lo son. Cada condado, ciudad y estado decide, y la mayoría no decide nada.

Si vas a redistribuir datos abiertos, en una librería, un dataset o un producto, tres preguntas antes de importar:

  1. ¿Dónde dice la licencia el publicador, no el agregador?
  2. ¿Es una dedicación (CC0, PDDL, “public domain”) o solo un permiso de acceso?
  3. Si no dice nada, ¿estoy dispuesto a tratarlo como desconocido?

La tercera es la que cuesta. Significa dejar fuera datos buenos, completos y probablemente libres. En mi caso fueron 22 estados. Pero la alternativa es prometer algo que no puedes respaldar, y en una librería que existe precisamente para ser confiable, esa promesa es todo lo que hay.

Comentarios