- Tests automatizados
- 375
- Cobertura de tests
- 92%
- Fuentes de empleo
- 3

Vagas Tech PT reúne en una sola API las ofertas tech en Portugal publicadas en LinkedIn, itjobs.pt y net-empregos. Cada oferta se normaliza al mismo formato: ciudad, modalidad de trabajo, rango salarial anual en euros y las tecnologías que menciona. Después, un fingerprint hecho con la empresa, el puesto y la ciudad junta la misma oferta publicada en sitios distintos en una sola entrada, con todas las fuentes donde apareció.
El backend corre en Python 3.15 con FastAPI, PostgreSQL 18, SQLAlchemy 2 y Alembic. Los scrapers usan Parsel para HTML y RSS y Playwright para LinkedIn, detrás de un cliente HTTP con reintentos, backoff exponencial, respeto del Retry-After y un intervalo mínimo por sitio. Los upserts son idempotentes y corren dentro de un savepoint, así que un lote con error nunca pierde el registro de la ejecución.
Los scrapers se rompen cada vez que un sitio cambia su HTML, así que el proyecto lo trata como algo a testear y monitorizar. Los parsers fallan de forma visible en vez de devolver nada, cada ejecución se guarda con su estado, los fallos alertan a un administrador y un canary semanal en GitHub Actions visita los sitios reales y abre una issue cuando alguno cambia.
Los usuarios se suscriben a alertas con sus propios filtros, incluida la seniority, por correo, Discord o Telegram tras una confirmación opt-in. Después gestionan las alertas con slash commands en Discord o comandos del bot en Telegram, y cada resumen incluye un enlace para darse de baja. Los tokens se guardan solo como hash, los webhooks de Discord se validan contra SSRF y todas las rutas están documentadas en una referencia de API con Scalar. Todo el proyecto se hizo con tests primero: 375 tests automatizados con 92% de cobertura, mypy en modo strict y seis comprobaciones obligatorias en el CI, incluida la detección de cambios no documentados en la API y un bloqueo de migraciones destructivas.