▸ Gana dineroPaso 1 gratis

Mira qué compra tu ayuntamiento sin concurso (webs, redes, formación) y preséntate antes del próximo

Los ayuntamientos encargan cada año miles de trabajos pequeños sin concurso: los contratos menores. Por ley se publican en la Plataforma de Contratación, con qué se compró, a quién y por cuánto. Con un script de Python lees esos datos, ves qué encargó tu ayuntamiento el año pasado y llegas con tu oferta antes de que lo vuelva a pedir.

El negocio en 30 segundos

Un contrato menor (menos de 15.000 € sin IVA en servicios y suministros, 40.000 € en obras) se puede encargar sin concurso. Muchos ayuntamientos piden 2 o 3 presupuestos a quien conocen. Los datos dicen qué compran, cuándo y a quién: quien los lee llega primero.

Lo que enseñas
Llegas a la concejalía con una hoja: «El año pasado el ayuntamiento encargó 4 vídeos de fiestas y 2 cursos de redes. Esto es lo que yo haría este año y por cuánto».
Dónde están los clientes
Tu ayuntamiento y los de los pueblos de alrededor, diputaciones, mancomunidades y empresas municipales. Los nombres salen en la columna «organo» de tu hoja.
Lo que recibe el cliente
El trabajo encargado (web, vídeo, curso…) con su factura electrónica al ayuntamiento.
Se cobra
Lo que pague cada encargo, siempre por debajo del límite legal: tu hoja dice cuánto pagó tu ayuntamiento por lo mismo el año pasado (orientativo)

Los precios son orientativos: lo que se suele cobrar en España, no lo que vas a ganar. Depende de tu zona, tu oferta y de cuántos clientes contactes.

Al terminar tendrás

  • Una hoja con los contratos menores de tu provincia y tu sector: qué, quién lo ganó, cuánto y cuándo.
  • El calendario de lo que compra tu ayuntamiento cada año (fiestas, verano, Navidad).
  • Tu empresa registrada en la Plataforma con una alerta de tu sector.
  • Una presentación de una página para la concejalía y un precio dentro del límite legal.

En esta misión · 8 pasos · 1 h 45 min

  1. 1Instala Python y saca los últimos contratos menores5 min
  2. 2El mercado: qué es un contrato menor10 min
  3. 3Baja un año entero de tu provincia15 min
  4. 4Regístrate como empresa en la Plataforma15 min
  5. 5Haz la demo para tu ayuntamiento20 min
  6. 6Ponle precio10 min
  7. 7Preséntate sin saltarte la ley15 min
  8. 8Repite y escala15 min

1 h 45 min €0 4 GB RAM · sin GPU macOS · Windows

Antes de empezar

  • Saber abrir la terminal y copiar y pegar órdenes.
  • Ofrecer un servicio que un ayuntamiento compra: webs, redes, vídeo, formación, diseño, mantenimiento…
  1. 1Paso 01 de 08 · ~5 min

    Instala Python y saca los últimos contratos menores

    Premio en 5 minutos: tu primera lista.

    1. 1

      Abre la terminal. En Mac: pulsa Cmd+Espacio, escribe Terminal y pulsa Enter. En Windows: pulsa la tecla Windows, escribe PowerShell y pulsa Enter.

      TerminalmacOS
      $brew install [email protected]
      TerminalmacOS
      $mkdir ~/contratos-menores
      $cd ~/contratos-menores
    2. 2

      Crea dentro de esa carpeta un archivo llamado menores.py, pega esto y guárdalo:

      menores.py
      1# Contratos menores de un ayuntamiento o provincia, sacados de los archivos .atom de la Plataforma de Contratación. Solo usa Python.
      2import csv, pathlib, re, sys
      3import xml.etree.ElementTree as ET
      4
      5CARPETA = pathlib.Path(sys.argv[1] if len(sys.argv) > 1 else ".")
      6DONDE = (sys.argv[2] if len(sys.argv) > 2 else "españa").lower() # ayuntamiento o provincia; «españa» = todos
      7DONDE = "" if DONDE == "españa" else DONDE
      8PALABRAS = [p.lower() for p in sys.argv[3:]] or ["web", "redes sociales", "formación", "diseño", "vídeo", "aplicación"]
      9EMPRESA = re.compile(r"\b(S\.?L\.?U?|S\.?A\.?U?|S\.?COOP|SLL|SLP|C\.?B)\b\.?", re.I)
      10
      11nombre = lambda e: e.tag.rsplit("}", 1)[-1]
      12def primero(raiz, *ruta):
      13 # Busca por nombre de etiqueta sin fijarse en el espacio de nombres (cac:, cbc:…)
      14 nodos = [raiz]
      15 for paso in ruta:
      16 nodos = [h for n in nodos for h in n.iter() if nombre(h) == paso and h is not n]
      17 return (nodos[0].text or "").strip() if nodos else ""
      18
      19filas = []
      20for archivo in sorted(CARPETA.rglob("*.atom")):
      21 for entrada in ET.parse(archivo).getroot():
      22 if nombre(entrada) != "entry":
      23 continue
      24 titulo = primero(entrada, "title")
      25 organo = primero(entrada, "LocatedContractingParty", "PartyName", "Name")
      26 lugar = primero(entrada, "CountrySubentity")
      27 if DONDE and DONDE not in f"{organo} {lugar}".lower():
      28 continue
      29 if not any(p in titulo.lower() for p in PALABRAS):
      30 continue
      31 ganador = primero(entrada, "WinningParty", "PartyName", "Name")
      32 enlace = next((l.get("href") for l in entrada if nombre(l) == "link"), "")
      33 filas.append({
      34 "fecha": primero(entrada, "updated")[:10], "organo": organo, "provincia": lugar, "que": titulo[:300],
      35 "importe_sin_iva": primero(entrada, "BudgetAmount", "TaxExclusiveAmount"), "estado": primero(entrada, "ContractFolderStatusCode"),
      36 # Si el ganador es un autónomo su nombre es un dato personal: solo copiamos empresas
      37 "ganador": ganador if EMPRESA.search(ganador) else ("(autónomo)" if ganador else ""),
      38 "adjudicado": primero(entrada, "AwardDate"), "cpv": primero(entrada, "ItemClassificationCode"), "enlace": enlace,
      39 })
      40
      41salida = f"menores-{DONDE or 'españa'}.csv".replace(" ", "-")
      42with open(salida, "w", newline="", encoding="utf-8-sig") as f:
      43 w = csv.DictWriter(f, fieldnames=["fecha", "organo", "provincia", "que", "importe_sin_iva", "estado", "ganador", "adjudicado", "cpv", "enlace"])
      44 w.writeheader(); w.writerows(filas)
      45print(f"{len(filas)} contratos menores con {', '.join(PALABRAS)} → {salida}")
    3. 3

      Ahora abre en el navegador https://contrataciondelestado.es/sindicacion/sindicacion_1143/contratosMenoresPerfilesContratantes.atom y guárdalo con Archivo › Guardar como, con el nombre ultimos.atom, dentro de una carpeta nueva llamada atom en contratos-menores. Lo bajamos con el navegador porque así no hay que pelearse con certificados.

      TerminalmacOS
      $python3 menores.py atom españa

      Así debería verse

      El archivo es un Atom con unas 500 entradas, las últimas publicadas. Cada una lleva el título del encargo, un resumen («Id licitación…; Órgano de Contratación…; Importe… EUR; Estado…»), el enlace a la ficha y, dentro, el órgano, la provincia, el importe sin IVA y el ganador.

      Truco

      🎉 Si sale «N contratos menores con web, redes sociales…» y aparece menores-españa.csv, ¡nivel 1 superado! Ábrelo con Excel, Numbers o LibreOffice y pulsa un enlace: te lleva a la ficha oficial.

    ¿Tu Mac dice «brew: command not found»? Instala Homebrew una vez

    Homebrew es el instalador de programas que usamos en todas las misiones de Mac. Pega esto en la Terminal (es el comando oficial de brew.sh). Te pedirá la contraseña del Mac: al escribirla no se ve nada, es normal.

    Instala HomebrewmacOS
    $/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

    Al terminar, copia y ejecuta las líneas que salen bajo «Next steps», cierra la Terminal y ábrela de nuevo. Comprueba con brew --version.

    Comprueba que funcionaTienes menores-españa.csv con encargos reales de toda España.

    Si algo falla (4)
    Sale «brew: command not found»
    Te falta Homebrew. Instálalo con el comando de su web oficial, brew.sh, cierra la terminal, ábrela otra vez y repite.
    En Windows dice que no reconoce el comando nuevo
    Cierra PowerShell y ábrelo otra vez: la ventana vieja no sabe que acabas de instalar algo. Si lo que no reconoce es winget, actualiza «Instalador de aplicación» desde Microsoft Store.
    Sale «0 contratos menores»
    Ese archivo solo trae lo último publicado. Prueba con otras palabras de tu sector al final (py menores.py atom españa vídeo fotografía) o baja un año entero en el paso 3.
    Sale «ParseError» o «syntax error»
    El navegador guardó la página como HTML en vez del archivo. Vuelve a guardarlo eligiendo «Fuente de la página» o «Todos los archivos», o haz clic derecho › Guardar enlace como.

    ¿Sigues atascado? Pregunta en la comunidad Avisar de un error en este paso

  2. Lo que desbloqueas

    7 pasos · 2 comandos · 1 errores típicos resueltos

    1. 2El mercado: qué es un contrato menor~10 min

      Las reglas que juegan a tu favor.

    2. 3Baja un año entero de tu provincia~15 min

      El calendario de compras de tu ayuntamiento.

      2 comandos · 1 error resuelto · comprobación incluida

    3. 4Regístrate como empresa en la Plataforma~15 min

      Que te puedan pedir presupuesto.

    4. 5Haz la demo para tu ayuntamiento~20 min

      Una página con datos suyos.

    5. 6Ponle precio~10 min

      Dentro del límite y comparado con lo que ya pagaron.

    6. 7Preséntate sin saltarte la ley~15 min

      Concejalía, registro o visita, no correo masivo.

    7. 8Repite y escala~15 min

      De un ayuntamiento a la comarca.

    Pasos 2–8 con el plan Anual

Primeros logros

Ya lo tienes funcionando. Pruébalo con esto:

Resume lo que compró

Del CSV a 5 frases.

Prompt para tu IA

Te paso una tabla de contratos menores de un ayuntamiento (qué, importe sin IVA, fecha, ganador). Resúmeme en 5 frases qué tipo de servicios compra, en qué meses, cuánto paga de media y qué se repite cada año: [pega las filas].

Tu presentación para la concejalía

Una página, sin vender humo.

Prompt para tu IA

Soy [tu oficio] en [tu pueblo o ciudad]. Escríbeme una presentación de una página para la concejalía de [área] del ayuntamiento: quién soy, 3 trabajos parecidos que he hecho, qué puedo hacerles y que estoy dado de alta en la Plataforma de Contratación para que me pidan presupuesto. Tono formal y breve.

Siguiente nivel: ayudas que nadie pide

Lo mismo, al revés: el dinero público que tus clientes podrían pedir.

Siguiente misión

Cómo deshacerlo

Borra la carpeta contratos-menores. Si te registraste en la Plataforma y no la vas a usar, puedes darte de baja desde tu perfil.

Borrar la carpetamacOS
$rm -rf ~/contratos-menores

Haciendo esta misión juntos

Sé de los primeros en terminarla. Si te atascas, pregunta: quien ya la hizo te puede ayudar.

Logros recientes

Preguntas

Siguiente misión · Gana dinero con IA · 25 de 33Encuentra la ayuda pública que tu cliente no sabe que existe y prepárale la solicitud
Tu progreso 0/8Paso 1 →