Cargando…
Cargando…
Fichas de licitación de la API REST de Mercado Público, más los indicadores por unidad de compra derivados del volcado OCDS y el mapeo de unidad de compra a organismo comprador.
Tuwün (2026). Licitaciones públicas de Mercado Público, v2. Conjunto de datos.
https://twun.cl/archivo/datos/compras-licitaciones/v2 — sha256 be675e8c…
El texto de arriba muestra el sha256 truncado; el botón copia el hash completo de 64 caracteres.
Descripción vigente del dataset, tal como lo declara el catálogo hoy. Lo que publicó v2 lo acredita su propio snapshot: sus archivos, sus filas y su cobertura están más abajo, en «Cobertura y volumen».
| Recurso | Archivo | Cobertura | Filas |
|---|---|---|---|
| licitaciones | licitaciones.csv | 2024–2026Medido sobre las filas con fecha: 87.426 filas quedan fuera del rango por no traer ninguna. | 91.748 |
| unidades | unidades.csv | 2025–2026 | 15.337 |
| organismos | organismos.csv | —El recurso no tiene cobertura temporal: sus filas no se fechan. | 5.591 |
Cobertura medida sobre las filas publicadas en v2. El total de la versión es 112.676 filas, con cobertura 2024–2026.
Cada versión publicada es inmutable: el bucket de almacenamiento no permite sobrescribir ni borrar un snapshot ya citado. Toda versión queda descargable, con su fecha y su checksum.
Un sha256 por archivo, además del sha256 del ZIP completo que aparece en la cita. Verificarlos reproduce exactamente los bytes citados.
| Archivo | Tamaño | sha256 |
|---|---|---|
| compras-licitaciones-v2.zip | 2,5 MB | be675e8cacb678cfef3a1df1939a1c345ad93653946030b7a551bff3932f3a26 |
| licitaciones.csv | 12,5 MB | 3d539d26ef41de27f729de3c1b63147620c4840de87a3eedb3c916f4a75cced5 |
| unidades.csv | 3,2 MB | 9d6d58d16f671a6490f240b7a70e0c620ab3cc73902633d83c2fdd79a6691bab |
| organismos.csv | 1,2 MB | 2fc4bf03d16ab3cdc21420b27b45944afd7af3053e8afb70dd93a587f630832b |
| datapackage.json | — | 07ee97a4188ca20ef81cd628c34f7763d2b26ecb64cb572b43c8be6ba0de9de7 |
Fuentes que el catálogo declara hoy. Las que se atribuyeron a v2 al publicarla viajan en el datapackage.json de su ZIP.
v2 se publicó bajo CC-BY-4.0, que es la licencia que registró esa versión y la que rige para sus archivos. El catálogo declara hoy CC BY 4.0, así que el enlace al texto de la licencia del catálogo no corresponde a esta versión.
La semántica de cada columna la escribe el diccionario de datos que valida el catálogo. Es la descripción vigente del dataset: el snapshot de v2 acredita sus archivos y sus cifras, no el esquema con que se publicaron. El esquema exacto de esa versión viaja en el datapackage.json de su ZIP. Despliega cada recurso para ver sus columnas.
Una fila por licitación, con los campos de su ficha en la API REST de Mercado Público. La fila es el ESTADO ACTUAL de la licitación, no una versión fechada: cada nueva lectura la actualiza en lugar de agregar una fila. Quien necesite series históricas debe comparar snapshots publicados, que es para lo que existe el versionado de este catálogo.
Cuatro columnas —codigo_estado, estimacion, estado_publicidad_ofertas y modalidad— son CÓDIGOS OPACOS: la API los entrega como enteros sin glosa y así se publican, sin traducir. La equivalencia vive en skill/chilecompra/codigos.py, que además declara cuál tabla es oficial (transcrita del diccionario de datos de ChileCompra) y cuál fue medida contra la propia API. Se publica el código crudo para que un cambio de vocabulario de la fuente no reescriba el dato histórico.
Ninguna tabla de glosas es un conjunto cerrado, y esto vale también para las oficiales. Una tabla oficial describe lo que la fuente DOCUMENTA, no lo que la fuente ENTREGA, y las dos cosas ya se midieron distintas: tipo trae O1 y O2, y modalidad trae 0, 11 y 12, ninguno de los cinco presente en el diccionario de ChileCompra. Por eso todo recorte por una columna de código debe enumerar los valores presentes en los datos y no los de la tabla, y todo código fuera de tabla debe tratarse como desconocido y nunca sustituirse por una etiqueta genérica. El caso de tipo es el más costoso, porque O1 es el tramo del contrato que domina la distribución de montos: su entrada lo detalla.
La excepción es estado en el recurso organismos, que sí es un conjunto cerrado: lo garantiza una restricción de la base de datos, no una transcripción de un documento.
| Columna | Tipo | Unidad | Qué significa |
|---|---|---|---|
| codigo_externo | string | identificador | Código público de la licitación en Mercado Público, por ejemplo El sufijo alfabético repite el valor de |
| nombre | string | texto | Título con que el organismo publicó la licitación. Texto libre redactado por el comprador, sin catálogo ni normalización: dos licitaciones del mismo objeto pueden nombrarlo de forma distinta. No sirve como criterio de clasificación por rubro; para eso está el código UNSPSC de los productos, que la ficha del portal declara. |
| codigo_estado | integer | código | Estado del proceso, como entero opaco: el número no se traduce en este CSV. La tabla de glosas no es oficial. No aparece en el diccionario de datos de ChileCompra: se dedujo consultando la propia API, que entrega el código y su glosa al mismo tiempo en el detalle de cada licitación. Intervienen dos fechas distintas. El listado base se capturó el 21-jul-2026 y trae 1.108 licitaciones; sobre ese mismo listado, el 25-jul-2026 se tomó un representante de cada código distinto y se leyó su glosa. Los valores resueltos fueron cinco: 5 publicada, 6 cerrada, 7 desierta (o artículo 3 o 9 de la Ley 19.886), 8 adjudicada, 15 revocada. La lista no es exhaustiva. El diccionario oficial menciona además el estado "suspendida", que en ese listado no apareció. Un código fuera de la tabla se trata como desconocido y no se le asigna una etiqueta genérica. |
| estimacion | integer | código | Declara qué es el valor de Es imprescindible para leer |
| estado_publicidad_ofertas | integer | código | Indica si la oferta técnica es pública, como entero opaco. Su tabla de glosas es oficial, del diccionario de ChileCompra, sección 2, campo 31: 0 no muestra la publicidad de la oferta técnica, 1 la muestra. Se publica como entero y no como booleano porque la fuente lo declara así y porque un valor distinto de 0 o 1 debe poder viajar sin que este dataset lo reinterprete. |
| modalidad | integer | código | Plazo de pago comprometido por el organismo, como entero opaco. Su tabla de glosas es oficial, del diccionario de ChileCompra, sección 3.4, con diez valores que van desde pago al día hasta pago anual, pasando por pagos por estado de avance. El código 1 significa "pago a 30 días"; no hay ninguna relación aritmética entre el número y la cantidad de días, así que interpretarlo como una escala ordenada es incorrecto. La columna no se limita a los diez valores de la tabla. Es oficial pero no exhaustiva respecto de lo que la fuente entrega: medido en producción, |
| tipo | string | código | Tipo de procedimiento, en código alfabético de dos caracteres. A diferencia de las cuatro columnas opacas de esta tabla, este código sí es legible: distingue licitación pública de privada y declara el tramo de monto en UTM. La tabla de glosas se transcribe del diccionario de ChileCompra, sección 3.1, y trae once valores: LA COLUMNA NO SE LIMITA A ESOS ONCE VALORES. La tabla es oficial pero no exhaustiva respecto de lo que la fuente entrega: medido en producción, Esto importa más que cualquier otra salvedad de este recurso. El tramo acota el monto por reglamento, con una excepción que importa para cualquier análisis de montos: |
| visibilidad_monto | integer | código | Declara si el organismo eligió mostrar el monto estimado en la ficha pública: 0 oculto, 1 visible. Su tabla de glosas es oficial, del diccionario de ChileCompra, sección 2, campos 57 y 73. Es una de las dos razones por las que |
| monto_estimado | number | CLP | Monto que el organismo declara al publicar la licitación, en pesos chilenos. Es una declaración previa del comprador: no es un pago, no es una adjudicación y no es ejecución presupuestaria. Nada garantiza que la licitación se adjudique, ni que se adjudique por ese monto. Su naturaleza exacta la fija Muchas licitaciones no declaran monto. La columna queda nula en al menos dos situaciones distintas y ninguna equivale a cero: cuando el organismo oculta el monto en la ficha ( LA SUMA DE ESTOS MONTOS NO REPRESENTA EL GASTO DEL ESTADO. Hay tres razones independientes, y cada una basta por sí sola: 1. Cobertura parcial por construcción, por lo recién descrito. 2. Lo declarado no es lo pagado. Entre la publicación y el pago median la adjudicación, las órdenes de compra y la ejecución presupuestaria, que este dataset no cubre. 3. La distribución está dominada por un caso único. En el volcado OCDS de 2025, un solo contrato de obras —de un tramo sin techo reglamentario— concentra el 98,98 % del monto adjudicado. Esa concentración está medida sobre OCDS y no sobre esta columna, que es de otra fuente; lo que traslada es la forma de la distribución del gasto en compras, no una cifra de este recurso. Un total, un promedio o una comparación entre compradores describen ese contrato, no el sistema de compras. Por eso este dataset publica el monto declarado a nivel de licitación individual y NO publica ningún agregado de monto. Quien investigue montos debe reportar, junto a cualquier cifra derivada, la cobertura de la columna y el efecto del caso dominante. |
| toma_razon | string | código | Declara si el proceso requiere toma de razón de la Contraloría General de la República: 0 no requiere, 1 con toma de razón. Tabla oficial del diccionario de ChileCompra, sección 2, campo 30. Se publica como texto y no como entero. La API entrega el valor entrecomillado ( |
| obras | string | código | Declara si el proceso es una licitación de obra. Su tabla de glosas es oficial, del diccionario de ChileCompra, sección 2, campo 34. TRAMPA DE CODIFICACIÓN: el "sí" es 2, no 1. Un valor 1 no aparece en la tabla. Una comparación del estilo Se publica como texto por el mismo motivo que La columna importa para leer montos: las obras llevan los contratos de mayor magnitud del sistema — obras como la que, en el volcado OCDS de 2025, concentra el 98,98 % del monto adjudicado. Ese contrato NO está medido en esta columna. Es un award de OCDS de tramo |
| extension_plazo | integer | código | Declara si el organismo extendió el plazo de cierre: 0 no lo extendió, 1 lo extendió por dos días hábiles. Su tabla de glosas es la única de esta columna que no declara su procedencia: a diferencia de las demás, no está marcada como transcrita del diccionario de ChileCompra ni como medida contra la API. La equivalencia de arriba se usa igual, pero sin respaldo documental declarado, así que conviene tratarla con más reserva que al resto. La extensión ya está reflejada en |
| fecha_publicacion | string | fecha y hora local, sin desfase | Momento en que la licitación se publicó, con la forma Se publica como texto a propósito, y su tipo declarado es cadena y no fecha. La API entrega el valor en hora local SIN indicar el desfase horario, así que convertirlo a un instante con zona obligaría a suponer una zona horaria que la fuente nunca declara — suposición que se rompe dos veces al año con el cambio de hora chileno. Declararlo como fecha invitaría a interpretarlo como un instante bien definido, y no lo es. Quien necesite aritmética de fechas usa |
| fecha_cierre | string | fecha y hora local, sin desfase | Momento en que se cierra la recepción de ofertas, con la forma Si el organismo extendió el plazo, esta fecha refleja el cierre extendido, no el original; |
| plazo_dias | integer | días | Días entre la publicación y el cierre de recepción de ofertas, calculado por el conector como No proviene del campo Queda NULO en tres situaciones distintas, y ninguna es un cero: falta alguna de las dos fechas, alguna no se puede interpretar, o el cierre resulta anterior a la publicación. Ese último caso es un dato implausible de la fuente y el conector no le inventa un reemplazo. |
| periodo | string | fecha ISO | Día en que la corrida de ingesta pidió esta ficha, en formato No es una fecha de la licitación. No es cuándo se publicó, ni cuándo cierra, ni cuándo se adjudicó: es cuándo Tuwün la leyó. Se actualiza en cada re-lectura, así que indica cuán fresca está la fila, y filtrar por esta columna recorta por corrida de captura, no por actividad del proceso. Para eso están |
| fuente_ref | string | texto | Referencia al origen exacto de la fila —típicamente la URL de la consulta a la API REST que la devolvió—, para que el dato se pueda auditar hasta la fuente sin reconstruir la llamada. La referencia describe de dónde salió el dato en el momento de la captura. La API sirve el estado actual de cada licitación, así que repetir hoy esa consulta puede devolver valores distintos de los publicados en este snapshot; el snapshot versionado es lo que preserva los bytes citados. |
| actualizado_en | datetime | marca de tiempo con zona | Momento en que la fila se escribió o reescribió por última vez, con zona horaria. A diferencia de Es una marca del pipeline de Tuwün, no un hecho de la licitación. |
| codigo_organismo | string | identificador | Código del organismo comprador que declara el bloque Comprador de la ficha REST, por ejemplo No sirve para cruzar con OCDS. Se midieron seis cruces contra Tampoco es único por fila en el sentido institucional: la relación con la unidad de compra es de muchos a uno, es decir varias unidades pertenecen al mismo organismo. Agrupar por esta columna es precisamente lo que permite pasar de unidad a organismo. |
| nombre_organismo | string | texto | Nombre del organismo comprador, tal como lo entrega la ficha REST. Texto libre, sin catálogo de glosas asociado: la misma institución puede aparecer escrita de formas distintas según la ficha. Para agrupar de forma estable conviene usar |
| codigo_unidad | string | identificador | Código de la unidad de compra que declara el bloque Comprador de la ficha REST, por ejemplo Es la llave de cruce con OCDS: este valor es el Es una unidad de compra y no un organismo. Nunca se deriva partiendo |
| nombre_unidad | string | texto | Nombre de la unidad de compra —el equivalente de |
| region_unidad | string | texto | Región de la unidad de compra, en texto libre tal como lo entrega la ficha REST. No hay catálogo de códigos oficiales de región asociado, así que la grafía puede variar entre fichas y no corresponde a los códigos del INE ni a la numeración romana de regiones. Es la región de la unidad compradora, no la del lugar donde se ejecuta el contrato. Un ministerio con unidad en la Región Metropolitana licita obras en todo el país, y esas licitaciones aparecen acá como metropolitanas. Leer esta columna como distribución territorial del gasto es un error frecuente. |
Indicadores por unidad de compra y período, derivados del volcado OCDS de Mercado Público. Una fila por par unidad-período.
La unidad de análisis es la unidad de compra y no el organismo: OCDS trae 5.591 unidades mientras el balance oficial de ChileCompra informa 1.165 entidades. Para llegar al organismo hay que unir con el recurso organismos, cuya cobertura es parcial y declarada.
| Columna | Tipo | Unidad | Qué significa |
|---|---|---|---|
| codigo_unidad | string | identificador | Identificador Atención al prefijo: en los recursos Es una unidad de compra y no un organismo público. No agregar por esta columna suponiendo que cada fila es una institución. |
| periodo | string | período | Período sobre el que se calcularon los indicadores de la fila. A diferencia de Dos filas de la misma unidad en períodos distintos no se suman sin antes verificar que los períodos no se solapan. |
| nombre_unidad | string | texto | Nombre de la unidad de compra según OCDS ( |
| oferentes_promedio | number | oferentes | Promedio de oferentes de las licitaciones abiertas de la unidad en el período, contando solo aquellas con al menos un oferente. El denominador es esa subpoblación, no todas las licitaciones de la unidad: las licitaciones sin ningún oferente quedan fuera del promedio en vez de entrar como cero. Por eso el indicador mide "con cuántos oferentes compite quien recibe ofertas", no "cuánta competencia hay en total", y no puede leerse como si las desiertas estuvieran incorporadas. Queda NULO si ninguna licitación de la unidad en el período tuvo oferentes. Un nulo acá significa que el indicador no se pudo calcular, y no debe imputarse como cero. |
| proporcion_trato_directo | number | proporción de 0 a 1 | Fracción del monto adjudicado de la unidad en el período que se adjudicó por trato directo, en escala de 0 a 1. Es una proporción de monto y no de cantidad de procesos, y las dos lecturas dan resultados muy distintos: el trato directo es cerca del 78 % de los procesos de 2025 pero una fracción bastante menor del monto. Describir esta cifra como "porcentaje de compras por trato directo" confunde ambos conceptos. En unidades cuyo monto está dominado por uno o pocos contratos grandes, este indicador describe esos contratos y no el comportamiento habitual de la unidad. Conviene leerlo junto con la cantidad de procesos, que este recurso no publica. Queda NULO cuando la unidad no tiene monto en pesos en el período. |
| indice | number | puntaje de 0 a 100 | Promedio de los componentes disponibles, en escala de 0 a 100. Se calcula con dos componentes y no con cuatro. El índice de diseño contempla cuatro componentes, pero dos de ellos —plazo para ofertar y monto declarado— solo existen en la API REST y no en el volcado OCDS del que sale este recurso. Los dos que sí se calculan son competencia efectiva (porcentaje de licitaciones con tres o más oferentes) y procedimiento abierto (porcentaje del monto fuera de trato directo). El valor no es comparable con un índice de cuatro componentes calculado en otra parte. Queda NULO si no entró ningún componente, en vez de reportar un cero que se leería como un mal resultado y no como un dato ausente. Esa distinción es deliberada: un nulo acá jamás debe imputarse como cero. El recuento de componentes que entraron al cálculo ( |
| fuente_ref | string | texto | Referencia al volcado OCDS del que salieron los indicadores de la fila, para auditar el origen del cálculo. |
| updated_at | datetime | marca de tiempo con zona | Momento en que la fila se escribió o reescribió por última vez, con zona horaria. Es una marca del pipeline de Tuwün, no un hecho de las compras del período. |
Columna presente en compras_unidad_compra que este dataset no publica. Es la suma de los montos adjudicados de la unidad en el período, o sea un agregado de monto, y los agregados de monto de compras públicas chilenas no son defendibles con estos datos.
El motivo es la distribución, no la aritmética. En el volcado anual 2025 un solo contrato de obras —de tipo O1, un tramo sin techo reglamentario— concentra el 98,98 % del monto total. Publicar esta columna es publicar, fila por fila, un ranking de compradores cuyo primer lugar es ese contrato: cualquier lector construye de inmediato la comparación entre organismos que la cifra no soporta.
Se suma un segundo problema de concepto: este monto es ADJUDICADO, derivado de sumar awards de OCDS, y NO es el monto transado del balance oficial de ChileCompra, que cuenta órdenes de compra. La relación medida sobre 2025 es de 0,51x, es decir son conceptos distintos y no dos mediciones del mismo.
La exclusión se declara acá, y no se omite en silencio, para que sea auditable y para que reincorporarla sea una decisión explícita acompañada de una regla sobre cómo reportar la concentración.
Mapeo de unidad de compra a organismo comprador: una fila por unidad, con el organismo al que pertenece y el estado de esa resolución.
La cobertura es parcial por construcción, y la columna estado existe para decirlo. De 2.143 unidades medidas sobre el volcado 2025, solo 905 (42,2 %) aparecen alguna vez en una licitación de los tipos que sirve el endpoint de licitaciones de la API REST, que es la única vía de resolución. Esas 905 RESOLUBLES cubren el 85,1 % del monto, así que la vista es construible. El resto es irresoluble por esta vía y se registra como tal. Tratarlo como un pendiente prometería una cobertura que no va a llegar.
Ese 85,1 % es el techo del mapeo y no su cobertura actual. Mide lo que se podría resolver, no lo que ya está resuelto: el proceso se acota por presupuesto de llamadas a la API y corre parcial, así que una parte de las unidades resolubles queda en pendiente_de_consulta. La cobertura efectivamente alcanzada se cuenta sobre las filas en estado resuelto de este mismo recurso.
Un análisis que una este recurso con los otros dos debe reportar la cobertura alcanzada, porque la unión deja fuera a las unidades sin resolver y ese descarte no es aleatorio.
| Columna | Tipo | Unidad | Qué significa |
|---|---|---|---|
| codigo_unidad | string | identificador | Código de la unidad de compra SIN el prefijo Atención al prefijo: el recurso El valor sale del campo |
| codigo_organismo | string | identificador | Código del organismo al que pertenece la unidad, tomado del bloque Comprador de la ficha REST. Es la columna por la que se agrupa para pasar de unidad a organismo. La relación es de muchos a uno: las unidades 1996, 1997 y 1998 pertenecen todas al organismo 7248. Contar filas de este recurso cuenta unidades, no organismos. Queda nulo en todo estado distinto de |
| nombre_organismo | string | texto | Nombre del organismo comprador según la ficha REST. Texto libre, sin catálogo de glosas. Nulo en las filas no resueltas, por el mismo criterio que |
| nombre_unidad | string | texto | Nombre de la unidad de compra según la ficha REST. Texto libre, sin catálogo. Nulo en las filas no resueltas. |
| region_unidad | string | texto | Región de la unidad de compra en texto libre, sin catálogo de códigos oficiales de región. Igual que en el recurso |
| estado | string | código | Resultado del intento de resolver el organismo de la unidad. Es un valor de un conjunto cerrado, garantizado por una restricción de la base de datos, y nunca una ausencia. Es la columna que hace honesta la cobertura parcial del recurso, así que ningún análisis debería filtrar filas sin mirarla. Cinco valores:
Fundir los tres reintentables con lo irresoluble borraría la diferencia entre "no se puede" y "todavía no", que es exactamente la distinción que esta columna existe para preservar. No confundir resoluble con resuelto. El 85,1 % de cobertura de monto citado en la descripción del recurso es de las 905 unidades resolubles, es decir el techo que este mapeo puede alcanzar. No es la cobertura de las filas efectivamente en estado |
| licitacion_referencia | string | identificador | Código de la licitación cuya ficha se usó —o se iba a usar— para resolver esta unidad, por ejemplo Se pide UNA ficha por unidad y no una por licitación, porque resolver las unidades resolubles debe caber en el presupuesto diario de llamadas a la API. Por eso esta columna nombra a un representante y no al conjunto de licitaciones de la unidad. Queda nula cuando la unidad no tuvo ninguna licitación de tipo resoluble en el volcado. |
| fuente_ref | string | texto | Referencia al origen de la resolución, típicamente la URL de la consulta a la ficha REST, para auditar la atribución de organismo hasta la fuente. |
| resuelto_en | datetime | marca de tiempo con zona | Momento en que la unidad quedó resuelta, con zona horaria. Nulo mientras la unidad no se haya resuelto, así que su ausencia es informativa y coherente con Es distinto de |
| actualizado_en | datetime | marca de tiempo con zona | Momento en que la fila se escribió o reescribió por última vez, con zona horaria. Marca del pipeline de Tuwün, no un hecho institucional: cambia cada vez que se reintenta la resolución, tenga o no éxito. |