Mi-am construit un agent AI care îmi caută vacanțe ieftine — într-o singură seară

Costin Pietraru la birou, seara, lucrând la laptop; deasupra laptopului plutește o hartă holografică a Europei cu rute de zbor și pinuri colorate

Într-o seară de august am construit, împreună cu un agent AI, un scanner personal de vacanțe: trei scripturi care caută cel mai ieftin zbor din București către aproximativ 270 de destinații, îmi propun escapade de 2–5 zile într-o țară aleasă și culeg pachetele zbor+cazare de la Wizz Holidays — totul într-un raport cu linkuri directe de cumpărare. Costul total: 0 lei în abonamente. Prima probă a găsit un București–Bergamo la 23,59 €.

Pe scurt:

Ce face agentul, concret?

Unealta Ce îmi aduce De unde ia datele
Scanner de zboruri Cel mai ieftin zbor din OTP către ~270 de destinații, cu istoric de prețuri și filtre pe țară, lună și companie Două surse, etichetate cinstit: cache-ul Aviasales (acoperire largă, prețuri „văzute recent”) și API-ul public Ryanair (acoperire îngustă, prețuri live)
Escapadă într-o țară Zboruri către o singură țară aleasă, cu până la 12 variante de date per oraș, împerecheate în city break-uri de 2–5 zile Trei API-uri de calendar, combinate după cât de bogată e ruta
Pachete Wizz Holidays 68 de oferte zbor+cazare, fiecare cu poză, preț vechi/nou, reducere și linkul direct al pachetului Chiar site-ul holidays.wizzair.com, citit de un browser automatizat

Fiecare raport e un fișier HTML local. Prețul e link de cumpărare, iar fiecare zbor are alături un link Booking pre-completat pe exact acele date. Rapoartele reale, generate la scanarea de azi, sunt mai jos în articol, lângă promptul fiecărui script — le poți deschide și proba.

De unde iei datele, dacă API-urile clasice au murit?

Le verifici pe toate, azi, cu mâna ta — nu din memorie și nu din articole de acum un an. Piața arăta așa în seara aceea: Amadeus Self-Service, ani de zile varianta gratuită clasică, s-a închis pe 17 iulie 2026. Kiwi Tequila — doar pe invitație. Xotelo — răspundea cu erori la propriile exemple din documentație. API-ul de cazare Hotellook — mort de-a binelea, deși documentația oficială încă îl descrie: 404 la orice cerere, cu orice autentificare.

Ce a mers, testat pe loc: fare-finderul public al Ryanair — fără cont, fără cheie, fără site. Prima interogare a întors OTP–Bergamo la 23,59 €. A doua lecție: API-uri publice ascunse există peste tot; se găsesc cu răbdare, nu cu abonamente.

O nuanță pe care raportul o afișează explicit: prețul din cache e semnal, nu promisiune. Cache înseamnă „văzut recent”, nu „valabil acum” — de aceea prețul e link, iar clickul duce la adevărul zilei.

Ce faci când site-ul nu are API deloc?

Wizz Holidays a fost cazul greu. Site-ul e un white-label peste altă platformă, căutarea e asincronă, cu rezultatele livrate pe WebSocket — se poate reproduce, dar fragil. Decizia cinstită: un browser automatizat (Playwright cu Chromium, gratuit, local), care lasă pagina să-și facă treaba și citește cardurile gata randate. Un click pe fiecare card culege linkul pachetului; imaginile care se încarcă leneș sunt forțate înainte de extracție.

A treia lecție: când API-ul e prea complicat, browserul automatizat e răspunsul cinstit. Pentru uz personal nu ai nevoie de niciun serviciu plătit de scraping.

Cât a costat și cât a durat?

Zero lei și o seară — dar seara a inclus și capcanele, care sunt partea cu adevărat utilă a poveștii:

  1. API-ul Ryanair respinge tăcut orice cerere cu mai mult de 20 de rezultate — eroare 400, fără explicație. Plafonul l-am găsit prin încercări: 16 merge, 20 merge, 25 nu.
  2. Cardurile din caruseluri se amestecau între ele — „Cipru–Budapesta” nu e o rută, e un container prost definit. Un card = cel mai mic element cu exact un titlu și un preț.
  3. Ofertele de pe site se rotesc între încărcări — tot ce culegi trebuie cules într-o singură trecere, altfel pozele nu se mai potrivesc cu prețurile.
  4. Consola Windows strică diacriticele dacă scriptul nu-și declară singur codificarea.

Niciuna dintre aceste probleme nu apare în vreun tutorial. Toate au apărut în prima oră de folosire reală.

Prompturile, gata de copiat: construiește-ți propriul scanner

Mai jos sunt cele trei prompturi cu care oricine își poate construi același scanner. Le dai, pe rând, unui agent AI care scrie și rulează cod pe calculatorul tău — eu am folosit Claude Code. Îți trebuie Python instalat. Fiecare prompt stă pliat într-o casetă — apasă pe numele lui ca să-l vezi — iar deasupra casetei e captura raportului real pe care l-a produs, cu link spre raportul întreg.

Un singur cont e necesar, și doar pentru sursa-cache de zboruri: cont gratuit pe travelpayouts.com, apoi din secțiunea Tools → API access generezi un token de Data API. Tokenul îl pui într-un fișier config.json, lângă script — nu în prompt, nu în cod, nu într-un loc public. Sursa Ryanair funcționează fără niciun cont.

O limitare cinstită: prompturile descriu ce funcționa pe 5 august 2026. API-urile se schimbă — dacă ceva nu răspunde, cere-i agentului să verifice endpointul cu o cerere de probă înainte de a construi pe el. E chiar una dintre lecțiile articolului.

Toate trei, într-un singur fișier de descărcat: prompt-scanner-vacante.txt.

Promptul 1 — scanerul de zboruri

Raportul de zboruri generat de agent: 26 de chilipiruri din OTP, cu preț-link, perioadă, companie și link de cazare pe fiecare rând

Captura e din raportul real, generat la scanarea de azi — apasă pe ea ca să deschizi raportul întreg: 26 de chilipiruri sub 60 €, cu Bologna la 33 € dus-întors în frunte.

Vezi promptul — scanerul de zboruri
Construiește-mi un script Python numit zboruri.py care găsește cele mai
ieftine zboruri dus-întors dintr-un oraș de plecare (implicit OTP —
București Otopeni) către toate destinațiile posibile, și scrie un raport
HTML local.

Surse de date, amândouă:
1. Travelpayouts Data API, endpointul v1/prices/cheap — cache-ul Aviasales,
   acoperă toate companiile; prețurile sunt „văzute recent", nu live.
   Tokenul se citește din fișierul config.json aflat lângă script (câmpul
   "token") sau din variabila de mediu TRAVELPAYOUTS_TOKEN. Nu scrie
   tokenul în cod.
2. Fare-finderul public Ryanair:
   services-api.ryanair.com/farfnd/v4/roundTripFares — nu cere cont, nu
   cere cheie, prețurile sunt live. Atenție: respinge tăcut, cu eroare 400
   fără mesaj, orice cerere cu limit mai mare de 20 — paginează cu offset,
   în pași de 16. Caută plecări în următoarele 45 de zile, cu durata
   sejurului între 2 și 5 zile.

Reguli pentru raport (HTML, fond alb, culori vii):
- fiecare rând: destinația (cu țara, în română), datele zborului, compania,
  prețul;
- prețul e link de cumpărare: la Ryanair spre selectorul de zbor
  precompletat pe acea rută și acele date; la Aviasales spre căutarea pe
  rută + date;
- lângă fiecare zbor, un link Booking.com precompletat pe exact acele date;
- eticheta sursei pe fiecare rând: „cache" sau „live" — nu le amesteca fără
  etichetă;
- filtre combinabile: țară, destinație, lună, companie;
- praguri configurabile în config.json: sub 60 EUR = chilipir, sub
  120 EUR = preț bun;
- ține un istoric al prețurilor per rută în istoric.json (ultimele 30 de
  citiri) și marchează scăderile cu peste 30% sub mediana istorică.

Detalii tehnice: primul lucru în script să fie reconfigurarea ieșirii pe
UTF-8 (sys.stdout.reconfigure), altfel consola Windows strică diacriticele.
Două comenzi: scan (interoghează sursele și scrie raportul) și raport
(rescrie raportul din ultimul scan salvat, fără interogări noi).

Promptul 2 — escapada într-o țară

Raportul de escapadă în Olanda: 12 variante de date pentru Eindhoven și Amsterdam, cu prețul dus-întors și cazarea pe acele date

Raportul real, de azi: Eindhoven de la 112 € dus-întors, cu 12 variante de date din care aleg — iar avertismentul „prețurile din cache se verifică înainte de cumpărare” e scris chiar în antet. Apasă pe captură ca să-l deschizi.

Vezi promptul — escapada într-o țară
Extinde scanerul cu un al doilea script, escapada.py: zboruri către O
SINGURĂ țară aleasă (parametru --tara, nume românesc sau cod de două
litere), grupate pe orașe, cu până la 12 variante de date per oraș, ca să
am de unde alege.

Sursele variantelor, în ordinea încercării:
1. Travelpayouts v1/prices/calendar — prețul pe fiecare zi de plecare,
   pentru rutele cu calendar bogat;
2. pentru rutele cu calendar sărac: v2/prices/month-matrix întoarce
   segmente doar-dus pe ambele sensuri — împerechează-le în dus-întors de
   2–5 zile, profil de city break; compania aeriană nu e garantată la
   variantele împerecheate — dedu-o din cine operează ruta și marcheaz-o
   „probabil";
3. la Ryanair: endpointul cheapestPerDay.

Fiecare variantă: preț-link de cumpărare + link Booking precompletat pe
acele date, cu numărul de adulți din parametrul --adulti (implicit 2).
Același stil de raport HTML ca la primul script.

Promptul 3 — pachetele Wizz Holidays

Raportul de pachete Wizz Holidays: oferte zbor+cazare cu poza hotelului, durata, perioada, prețul per persoană și reducerea

Scanarea de azi a cules 63 de pachete — cel mai ieftin: Budapesta, 611 lei de persoană, zbor și cazare. Apasă pe captură ca să deschizi raportul.

Vezi promptul — pachetele Wizz Holidays
Al treilea script, wizz_holidays.py: pachetele zbor+cazare de pe
holidays.wizzair.com. Nu încerca să reproduci API-ul lor — căutarea e
asincronă, cu rezultatele livrate pe WebSocket, fragil de imitat.
Folosește Playwright cu Chromium headless (pip install playwright, apoi
python -m playwright install chromium): lasă pagina să se încarce complet
și citește cardurile de ofertă gata randate.

Reguli obligatorii, învățate din greșeli:
- un card de ofertă = cel mai mic element care conține EXACT un titlu și
  un preț; orice definiție mai largă amestecă ofertele din caruseluri
  între ele;
- imaginile se încarcă leneș — derulează și forțează încărcarea lor
  înainte de extracție;
- feed-ul se rotește între încărcări — tot ce culegi (poză, preț, link)
  se culege într-o singură trecere, nu în treceri separate;
- linkul direct al pachetului se obține cu un click pe card;
- deduplică ofertele care apar în mai multe secțiuni.

Culege din secțiunile: recomandate, weekend, beach, single-city. Per
ofertă: poză, țară/oraș, stele, perioadă, preț nou/vechi, reducere în
procente, linkul pachetului. Raport HTML în același stil. Scanul complet
durează câteva minute — afișează progresul pe parcurs.

Alte prompturi gata de folosit, pentru firme de data aceasta, sunt pe pagina de prompturi.

Ce NU face agentul

Ce legătură are vacanța mea cu firma ta?

Drumul e identic. O automatizare de firmă — facturile descărcate din SPV, alerta la factură nouă, extragerea datelor în Sheets — trece prin aceleași etape: verifici sursele azi, nu din memorie; refuzi dependențele care cer prea mult; alegi calea care funcționează, nu calea la modă; și spui cinstit ce nu face unealta. Diferența e doar că pe ale firmei le construiesc pentru clienți — un flux simplu e gata în 2–5 zile lucrătoare și costă sub 400 €.

Iar dacă vrei ca oamenii tăi să poată construi singuri unelte de felul acesta, cursul de AI pentru firme exact lucrul acesta îl predă: 4 ședințe a câte 2 ore, grupe de maximum 8, 95 € de persoană, cu garanția banilor înapoi după primele două ședințe. Ce am făcut eu într-o seară pentru vacanțe am construit de zeci de ori pentru facturi, clienți și rapoarte.

Întrebări frecvente

Cu ce a fost construit agentul?

Cu Claude Code — un agent AI care scrie și rulează cod — plus Python și un browser automatizat gratuit (Playwright). Eu am descris ce vreau, am verificat rezultatele și am luat deciziile; agentul a scris uneltele. O seară de lucru, zero abonamente.

Prețurile din rapoarte sunt exacte?

Cele din sursa live (Ryanair) da, la momentul scanării. Cele din cache sunt prețuri văzute recent de alți călători — semnal bun pentru „unde e ieftin”, nu bilet garantat. De aceea fiecare preț e link direct spre pagina de cumpărare, unde vezi prețul zilei.

Pot să-mi construiesc și eu unul, fără să fiu programator?

Da — cele trei prompturi din articol sunt scrise chiar pentru situația aceasta: le copiezi într-un agent AI care scrie și rulează cod, iar capcanele sunt deja rezolvate în text. Condiția cinstită: verifici tu, pas cu pas, ce iese. Partea grea nu e codul, ci deciziile — ce surse folosești, ce refuzi, cum îți dai seama că un rezultat e greșit.

De ce nu folosești pur și simplu site-urile de căutare existente?

Le folosesc — la final, pentru cumpărare. Agentul rezolvă altceva: se uită în fiecare zi la 270 de destinații deodată, ține istoricul prețurilor și îmi arată doar ce merită atenție. Munca pe care n-aș face-o manual în fiecare dimineață.

Rulează singur?

Deocamdată la comandă. Pasul următor din plan e rularea automată în fiecare dimineață la 8:00, cu alertă când apare o ofertă sub pragul stabilit — aceeași mecanică pe care o folosesc automatizările de firmă pentru facturile din SPV.

#agenți AI
Costin Pietraru
Scris de

Costin Pietraru

Inginer cu 30+ ani în sisteme, fondator SimpluSPV. Livrează cursul de AI pentru firme și scrie despre automatizare aplicată — fără teorie, doar sisteme care lucrează.

Vezi profilul complet →

Vrei firma pregătită pentru AI, corect și legal?

4 ședințe aplicate, echipa pleacă cu sisteme reale și documentele de conformitate. Garanție bani înapoi după 2 ședințe.

Înscrie echipa la curs →