Politika privatnosti
Verzija 2026-04-12-v3 · Poslednje azuriranje: 12. april 2026. · v3: ZZPL uskladjenost (cl. 23, 38, 52), kontakt email, automatizovano odlucivanje, data breach procedura, legitimni interes, cookie consent V2.
1. Ko smo mi
Web Security Scanner je besplatan online alat za pasivnu analizu bezbednosti veb sajtova. Operater sajta je Toske-Programer. Ova politika privatnosti objasnjava detaljno sta konkretno radimo sa vasim podacima, koliko dugo ih cuvamo, i kako ostvarujete svoja prava.
2. Sta tacno cuvamo u bazi
Za razliku od ranijih verzija ovog servisa koje su podatke drzale samo u memoriji, aktuelna verzija cuva svaki scan u nasoj persistent bazi podataka (PostgreSQL preko Supabase-a) zbog audit traga, zastite od zloupotrebe, i omogucavanja korisniku da kasnije pregleda svoje skeniranje. Konkretni podaci koje cuvamo:
- URL koji skenirate i normalizovani domen
- Ceo rezultat skeniranja (JSONB polje: grade, score, counts, lista pronalazaka, kategorije)
- Hash IP adrese (SHA-256 sa server-side salt-om) — NE raw IP
- Hash User-Agent stringa (SHA-256 sa istim salt-om) — NE raw UA
- Opcioni session_id (browser session iz frontend-a, UUID, nikad personalno)
- Opcioni fingerprint_hash (canvas/WebGL fingerprint ako ga frontend proslijedi)
- Verzija pristanka (
consent_version) i flag da ste eksplicitno prihvatili Uslove koriscenja - Vremenski pecati (kreiranje, zavrsetak)
Svaki scan dodatno generise 3 do 10 zapisa u audit_log tabeli (jedan po dogadjaju: scan_request, scan_start, scan_complete, scan_blocked_*, scan_error). Audit_log cuva istu pseudonimizovanu identitetsku informaciju plus context u details JSONB polju.
Ono sto NE cuvamo: imena, email adrese (osim u dva slucaja — vidi ispod), lozinke, sadrzaj skeniranog sajta osim metadata-e (header-i, score), raw IP adrese, raw User-Agent stringove, istoriju bilo cega povezano sa vasom identitetskom iz spoljnih izvora.
Izuzeci za email: Cuvamo vasu email adresu u dva konteksta:
- Abuse report — ako dobrovoljno ostavite email prilikom podnosenja prijave zloupotrebe, cuvamo ga da bismo vam odgovorili na ishod
- Pro pretplata — ako kupite Pro plan, email koji ste koristili kod Lemon Squeezy checkout-a se sinhronizuje u nasu
subscriptionstabelu kako bismo znali kome pripada koji license_key. Ovaj email se cuva samo dok traje pretplata plus 10 godina pravnog retention-a za porez/racunovodstvo (srpska zakonska obaveza)
3. Pseudonimizacija PII (kako funkcionise hashovanje)
Umesto da cuvamo vasu IP adresu i User-Agent u izvornom obliku, propuzamo ih kroz SHA-256 hash funkciju sa tajnim server-side salt-om koji postoji samo u nasem deployment env-u i nikad ne ide u bazu:
ip_hash = SHA-256(vasa_ip + ":" + server_salt)
Ovo se po GDPR Art. 4(5) kvalifikuje kao pseudonimizacija. Efekti:
- Ako napadac ikad exfiltrira nasu bazu, dobija samo hash-eve, ne IP adrese. Bez salt-a hashovi se ne mogu brute-force-ovati (salt nam je 256-bitni random string)
- Mi i dalje mozemo da koreliramo vase skeniranje ("koliko ste scan-ova uradili sa ove IP") jer isti IP uvek daje isti hash
- Ne mozemo da enumeriramo sve IP adrese koje su ikad koristile servis (jer hash je jednosmeran). Ovo je namerno ograniceno da bismo zastitili vas anonimitet
- Kad trazite GDPR brisanje, moracete nam dostaviti vasu IP adresu i priblizno vreme — mi onda racunamo hash i brisemo podudarajuce redove. Bez tih informacija ne mozemo pouzdano da identifikujemo "vase" redove (videti sekciju 8)
4. Kako koristimo podatke
- Izvrsavanje bezbednosne analize URL-a koji ste uneli
- Cuvanje rezultata skeniranja tako da ga mozete pregledati kasnije (bez verifikacije vlasnistva, vidite samo osnovne statistike; sa verifikovanim vlasnistvom — pun sadrzaj)
- Rate limiting — zastita od zloupotrebe servisa (5 scan-ova po 30 minuta po IP hash-u)
- Audit trail za forenzicki odgovor na eventualne zloupotrebe
- Omogucavanje vlasniku skeniranog sajta da podnese abuse report i dokaze koji scan-ovi su ga ticali
- Prikazivanje reklama putem Google AdSense
Pravna osnova obrade (GDPR Art. 6): legitimni interes za forenzicki audit i zastitu servisa, plus saglasnost koju dajete na svakom scan-u kroz checkbox pre pokretanja analize.
5. Retention — koliko dugo cuvamo podatke
Svaka tabela u nasoj bazi ima sopstveni retention period, automatizovan kroz dnevne pg_cron zadatke:
- scans (rezultati skeniranja): cuvaju se dok korisnik ne trazi brisanje ili dok vi, kao operater, ne pokrenete veci cleanup. Nema automatskog brisanja.
- audit_log (forenzicki trag): 90 dana za redovne zapise, zatim automatsko brisanje. Flagovani redovi (povezani sa abuse report-om) se cuvaju zauvek kao pravni dokaz.
- verified_domains (grantovi za punu vidljivost): 30 dana po kombinaciji (domen, IP hash), zatim istice.
- verification_tokens (pending challenge-i): 1 sat za pending, zatim istice automatski.
- scan_requests (wizard za puni sken): cuva samo created_date kao DATE (NE timestamp) — privacy-by-design, ne moze da otkrije tacno vreme klika na consent. Wizardi koji nisu izvrseni u 24 sata automatski se brisu cron-om. Zavrseni wizardi cuvaju samo state machine flag-ove (consent dat: da/ne, verifikacija prosla: da/ne) bez timestamp-a.
- rate_limits: rolling prozor, cisti se automatski kad prodje vremenski interval.
- abuse_reports: zauvek, kao pravni trag, osim ako reporter ne povuce prijavu.
- Backup-ovi: dnevni enkriptovani backup se cuva na Cloudflare R2 90 dana po R2 lifecycle pravilu. Metadata o backup-ima se cuva 180 dana.
6. Bezbednost podataka
Ova sekcija opisuje konkretne mere zastite koje primenjujemo:
- Transport: svi podaci se prenose kroz HTTPS (TLS 1.2+) koji obezbedjuje Cloudflare i HF Spaces
- Enkripcija u mirovanju: Supabase obezbedjuje AES-256 enkripciju na nivou diska za celu bazu
- Row-Level Security: svaka tabela ima RLS ukljucen sa default-deny politikom. Public anon kljuc ne vidi nista — sve citanje i pisanje ide preko service_role kljuca koji je samo na backend-u
- Append-only audit_log:
UPDATEiDELETEsu revocirani cak i za service_role. Audit istoriju je namerno nemoguce prepisati iz aplikacije — zahteva eksplicitnu migraciju baze - Pseudonimizacija PII: sve licne informacije (IP, UA) su hashovane sa server-side salt-om pre upisa (videti sekciju 3)
- Backup enkripcija: dnevni backup-ovi su AES-256-GCM enkriptovani pre upload-a na Cloudflare R2. Kljuc za dekripciju postoji samo u nasem password manager-u i Supabase Vault-u
- Offsite storage: backup-ovi su na R2 (Cloudflare), odvojenom provajderu od primarne baze — data loss zbog Supabase incident-a ne brise backup-e
- Tested recovery: kvartalno testiramo restore backup-a na izolovani staging projekat da bismo dokazali da backup-ovi rade (a ne samo da se prave)
7. Kolacici, oglasavanje, i trece strane
Koristimo granularni cookie consent (GDPR/ePrivacy compliant) sa tri kategorije:
- Neophodni (uvek aktivni, ne mogu se iskljuciti):
cookie_consent_v2(localStorage — vasa saglasnost),wss-lang(izbor jezika), scan session ID - Analiticki (opcioni): Google Analytics (
_ga,_gid) — trajanje do 2 godine. Ovi kolacici se NE postavljaju dok eksplicitno ne odobrite - Reklamni (opcioni): Google AdSense (
_gcl_*,IDE,NID,DSID,FLC,AID,TAID) — trece lice: Google LLC, trajanje do 2 godine. Ovi kolacici se NE postavljaju dok eksplicitno ne odobrite
AdSense skripta se ne ucitava dok ne kliknete "Prihvati sve" ili "Sacuvaj izbor" sa cekiranimreklamnim kolacicima. Ako odbijete, nikakvi tracking kolacici se ne postavljaju i nikakvi podaci se ne salju Google-u.
Mozete u svakom trenutku promeniti svoju odluku klikom na "Podesavanja kolacica" u footer-u bilo koje stranice. Vise informacija na Google Ads politika.
Koristimo sledece servise trecih strana:
- Supabase (EU region) — primarna PostgreSQL baza + Edge Functions + Vault
- Cloudflare R2 — offsite backup storage (enkriptovano)
- Hugging Face Spaces — backend API hosting
- Vercel — frontend hosting
- Google AdSense — prikazivanje oglasa
- Google Fonts — ucitavanje fontova
- Lemon Squeezy (USA, Merchant of Record) — obrada placanja za Pro pretplate. Ako kupite Pro plan, vasa kartica i personalna placanja se salju direktno Lemon Squeezy-ju, ne nama. Mi od njih primamo samo: email adresu, iznos, status pretplate, i license_key. Lemon Squeezy je registrovan u Delaware (SAD) i radi kao formalni prodavac za nas — oni izdaju racune, obracunavaju VAT u 100+ zemalja, i hendluju chargeback-ove. Njihova politika privatnosti: lemonsqueezy.com/privacy
Napomena o prenosu podataka u SAD: Lemon Squeezy je jedini provajder u nasem stack-u koji je van EU. Oni deklarise usaglasenost sa GDPR-om i imaju Standard Contractual Clauses (SCCs) kao osnovu za prenos podataka iz EU u SAD. Ako ne zelite da vasi podaci prolaze kroz SAD, ne kupujte Pro plan — besplatni tier ostaje potpuno EU-only.
Svi ostali provajderi su odabrani tako da primarno cuvaju podatke u EU/EEA regionu. Ako imate specificna pitanja o prenosu podataka, kontaktirajte nas.
8. Vasa prava pod GDPR-om
Ako se nalazite u Evropskom ekonomskom prostoru, imate sledeca prava:
- Art. 15 — pravo pristupa: da zatrazite kopiju podataka koje imamo o vama
- Art. 16 — pravo na ispravku: netacnih podataka
- Art. 17 — pravo na brisanje: "pravo da se bude zaboravljen"
- Art. 18 — pravo na ogranicavanje obrade
- Art. 20 — pravo na prenosivost podataka
- Art. 21 — pravo na prigovor protiv obrade na osnovu legitimnog interesa
- Pravo da podnesete zalbu nadleznom organu za zastitu podataka u vasoj zemlji
Kako da ostvarite svoja prava: posto cuvamo samo pseudonimizovane (hash-ovane) identifikatore, bez vase pomoci ne mozemo da identifikujemo "vase" redove u bazi. Da biste poslali zahtev, kontaktirajte nas i navedite:
- IP adresu koju ste koristili u trenutku skeniranja
- Priblizno vreme (dan i sat)
- Eventualno domen koji ste skenirali ako znate
Uz te informacije mozemo da izracunamo vas hash i pronadjemo podudarajuce redove u scans i audit_log tabelama. Brisanje se vrsi u roku od 30 dana od prijema zahteva (GDPR Art. 12). Napomena o audit_log-u: audit log je namerno append-only i cuva se 90 dana kao forenzicki trag pod pravnom osnovom legitimnog interesa (GDPR Art. 6(1)(f) — dokumentovanje potencijalnih sigurnosnih incidenata). Vasi zapisi se nece fizicki obrisati iz audit_log-a, ali ce se markirati kao "izuzeti od operativne statistike" i ionako ce biti automatski obrisani nakon 90 dana ako nisu flagovani.
9. Prava vlasnika skeniranog sajta (abuse report)
Ako ste vlasnik domena koji je neko skenirao preko naseg servisa bez vase dozvole, mozete podneti prijavu preko link-a "Prijavi zloupotrebu" u footer-u ili direktno na ./index.html#abuse. Pregledamo svaku prijavu u roku od 72 sata. Ako potvrdimo zloupotrebu:
- Dodajemo vas domen na listu blokade — svi buduci scan-ovi tog domena vracaju HTTP 403
- Povezani
audit_logredovi se flaguju kao pravni dokaz i cuvaju zauvek (umesto 90 dana) - Ako ste ostavili email, obavestavamo vas o ishodu
Za vise detalja o tome kako funkcionisu uslovi koriscenja i ownership verifikacija, pogledajte Uslove koriscenja.
10. Izmene politike, deca, i kontakt
Trenutna verzija politike: 2026-04-12-v3 — ovo je ista verzija koja se belezi u sistemu kada pokrenete skeniranje. Zadrzavamo pravo da azuriramo ovu politiku. Verzija se menja sa svakim azuriranjem i svaki novi scan ce traziti od vas da potvrdite aktuelnu verziju. Vase prethodne saglasnosti ostaju vazece u audit_log-u ali se ne primenjuju retroaktivno na nove odredbe.
Deca: Ovaj servis nije namenjen osobama mladjim od 16 godina. Ne prikupljamo svesno podatke od maloletnika. Ako saznamo da je maloletnik nevoljno dostavio podatke, brisemo ih.
Kontakt rukovaoca (cl. 23 ZZPL):
- Opsta pitanja: kontakt@gradovi.rs
- Sigurnosni propusti: security@gradovi.rs
- Abuse prijave: abuse@gradovi.rs ili online forma
- Pro plan i refundacije: pro@gradovi.rs
- Rok za odgovor: 30 dana od prijema zahteva (cl. 21 ZZPL / GDPR Art. 12)
11. Automatizovano odlucivanje (cl. 38 ZZPL)
Ovaj servis NE koristi automatizovano odlucivanje koje proizvodi pravne posledice po korisnika ili znacajno utice na njegov polozaj. Skeniranje je tehnicka analiza koja ne donosi odluke o korisnicima. Risk score (A-F ocena) je informativni alat, ne automatizovana odluka.
12. Pravni osnov obrade — legitimni interes (cl. 12 st. 1 tac. 6 ZZPL)
Pravni osnov za obradu podataka u audit_log tabeli je legitimni interes rukovaoca za:
- Forenzicki audit — zastita servisa od zloupotrebe
- Pravna odbrana — dokaz da je korisnik dao saglasnost pre skeniranja
- Bezbednost — detekcija zlonamernih obrazaca (mass-scanning, SSRF pokusaji)
Procena: interes rukovaoca (zastita besplatnog servisa od zloupotrebe) preteze nad pravima lica jer se obradjuju samo pseudonimizovani podaci (SHA-256 hash IP-a i User-Agent-a), nikad sirovi podaci. Korisnik ima pravo da podnese prigovor na ovu obradu (cl. 37 ZZPL) putem email-a gore.
13. Povreda podataka o licnosti (cl. 52 ZZPL)
U slucaju povrede zastite podataka o licnosti (data breach), rukovalac ce:
- Obavestiti Poverenika u roku od 72 sata od saznanja o povredi
- Obavestiti lica na koja se podaci odnose bez nepotrebnog odlaganja ako povreda moze da prouzrokuje visok rizik za njihova prava
- Dokumentovati svaku povredu u internom registru (PRIRUCNIK.md §17)
Kontakt Poverenika: poverenik.rs
14. Istorija verzija politike privatnosti
2026-04-12-v3
AKTIVNA
12. april 2026.
ZZPL uskladjenost: kontakt email rukovaoca (cl. 23), automatizovano odlucivanje (cl. 38), legitimni interes dokumentovan (cl. 12), procedura za povredu podataka (cl. 52), cookie consent V2 sa 3 kategorije, kontakt Poverenika sa adresama.
2026-04-10-v2
zamenjeno v3
10. april 2026.
Dodat Lemon Squeezy kao sub-processor (Merchant of Record za Pro pretplate, Delaware SAD). Email se cuva i za Pro korisnike pored abuse report-a. Dodata scan_requests tabela (gate-before-scan wizard).
2026-04-10-v1
zamenjeno v2
10. april 2026.
Prva verzija politike privatnosti. PII hashovanje (SHA-256), audit_log (append-only, 90 dana), verified_domains (30 dana), rate_limits, abuse_reports, backup (AES-256-GCM, R2). Supabase kao jedini sub-processor.
Svaka verzija je trajno sacuvana u audit_log tabeli — consent koji ste dali vazi za verziju koja je bila aktivna u tom trenutku.
Privacy Policy
Version 2026-04-12-v3 · Last updated: April 12, 2026 · v3: ZZPL compliance (Art. 23, 38, 52), controller email, automated decision-making, data breach procedure, legitimate interest, cookie consent V2.
1. Who we are
Web Security Scanner is a free online tool for passive security analysis of websites. The site operator is Toske-Programer. This privacy policy explains in detail what we do with your data, how long we keep it, and how to exercise your rights.
2. What we actually store in our database
Unlike earlier versions of this service that kept data only in memory, the current version stores every scan in our persistent database (PostgreSQL via Supabase) for audit trail, abuse protection, and letting users review their own scans later. The specific data we store:
- The URL you scan and the normalized domain
- The full scan result (JSONB field: grade, score, counts, list of findings, categories)
- Hash of your IP address (SHA-256 with a server-side salt) — NOT the raw IP
- Hash of your User-Agent (SHA-256 with the same salt) — NOT the raw UA
- Optional session_id (browser session from frontend, UUID, never personal)
- Optional fingerprint_hash (canvas/WebGL fingerprint if the frontend passes it)
- Consent version (
consent_version) and a flag that you explicitly accepted the Terms of Service - Timestamps (creation, completion)
Each scan additionally generates 3 to 10 entries in the audit_log table (one per event: scan_request, scan_start, scan_complete, scan_blocked_*, scan_error). The audit_log stores the same pseudonymized identity information plus context in a details JSONB field.
What we do NOT store: names, email addresses (except in two cases — see below), passwords, contents of the scanned site beyond metadata (headers, score), raw IP addresses, raw User-Agent strings, or any history tied to your identity from external sources.
Email exceptions: We store your email address in two contexts:
- Abuse reports — if you voluntarily leave an email when filing an abuse report, we store it so we can reply with the outcome
- Pro subscriptions — if you buy a Pro plan, the email you used at Lemon Squeezy checkout is synced into our
subscriptionstable so we know which license_key belongs to whom. This email is kept for the duration of the subscription plus a 10-year legal retention period for tax/accounting purposes (Serbian statutory requirement)
3. PII pseudonymization (how the hashing works)
Instead of storing your IP address and User-Agent in their original form, we pass them through a SHA-256 hash function with a secret server-side salt that lives only in our deployment environment and is never written to the database:
ip_hash = SHA-256(your_ip + ":" + server_salt)
Under GDPR Art. 4(5) this qualifies as pseudonymization. The effects:
- If an attacker ever exfiltrates our database, they get hashes, not IP addresses. Without the salt, the hashes cannot be brute-forced (the salt is a 256-bit random string)
- We can still correlate your scans ("how many scans from this IP") because the same IP always produces the same hash
- We cannot enumerate all IP addresses that have ever used the service (hashing is one-way). This is a deliberate limitation to protect your anonymity
- When you request GDPR erasure, you will need to provide us with your IP and an approximate time — we then compute the hash and delete the matching rows. Without that information we cannot reliably identify "your" rows (see section 8)
4. How we use data
- Performing security analysis of the URL you entered
- Storing scan results so you can review them later (without ownership verification you only see basic statistics; with verified ownership you see the full content)
- Rate limiting — protecting the service from abuse (5 scans per 30 minutes per IP hash)
- Audit trail for forensic response to potential abuse
- Letting the owner of a scanned site file an abuse report and prove which scans affected them
- Displaying ads via Google AdSense
Legal basis for processing (GDPR Art. 6): legitimate interest in forensic audit and service protection, plus the consent you give on every scan through the checkbox before starting the analysis.
5. Retention — how long we keep what
Each table in our database has its own retention period, automated via daily pg_cron jobs:
- scans (scan results): retained until the user requests deletion or until a bulk cleanup is initiated by the operator. No automatic deletion.
- audit_log (forensic trail): 90 days for regular entries, then automatic deletion. Flagged entries (linked to an abuse report) are kept indefinitely as legal evidence.
- verified_domains (full-visibility grants): 30 days per (domain, IP hash) combination, then expires.
- verification_tokens (pending challenges): 1 hour for pending, then expires automatically.
- scan_requests (full-scan wizard): stores only created_date as DATE (NOT timestamp) — privacy-by-design, cannot reveal the exact time you clicked consent. Wizards not executed within 24 hours are auto-deleted by cron. Completed wizards keep only state-machine flags (consent given: yes/no, verify passed: yes/no) without any timestamp.
- rate_limits: rolling window, auto-pruned when the interval passes.
- abuse_reports: indefinitely, as legal evidence, unless the reporter withdraws the report.
- Backups: daily encrypted backups are stored on Cloudflare R2 for 90 days per the R2 lifecycle rule. Backup metadata is kept 180 days.
6. Data security
This section describes the concrete protections we apply:
- Transport: all data travels over HTTPS (TLS 1.2+) provided by Cloudflare and HF Spaces
- Encryption at rest: Supabase provides AES-256 disk-level encryption for the entire database
- Row-Level Security: every table has RLS enabled with a default-deny policy. The public anon key sees nothing — all reads and writes go through the service_role key which is backend-only
- Append-only audit_log:
UPDATEandDELETEare revoked even for service_role. The audit history is intentionally impossible to rewrite from the application — it requires an explicit database migration - PII pseudonymization: all personal information (IP, UA) is hashed with a server-side salt before being written (see section 3)
- Backup encryption: daily backups are AES-256-GCM encrypted before upload to Cloudflare R2. The decryption key exists only in our password manager and Supabase Vault
- Offsite storage: backups are on R2 (Cloudflare), a separate provider from the primary database — data loss due to a Supabase incident does not wipe out the backups
- Tested recovery: we test restore from backup on an isolated staging project quarterly to prove the backups actually work (not just that they are being created)
7. Cookies, advertising, and third parties
We use a granular cookie consent system (GDPR/ePrivacy compliant) with three categories:
- Essential (always active, cannot be disabled):
cookie_consent_v2(localStorage — your consent choice),wss-lang(language preference), scan session ID - Analytics (optional): Google Analytics (
_ga,_gid) — duration up to 2 years. These cookies are NOT set until you explicitly approve them - Advertising (optional): Google AdSense (
_gcl_*,IDE,NID,DSID,FLC,AID,TAID) — third party: Google LLC, duration up to 2 years. These cookies are NOT set until you explicitly approve them
The AdSense script does not load until you click "Accept All" or "Save Choices" with the advertising category checked. If you reject, no tracking cookies are set and no data is sent to Google.
You can change your decision at any time by clicking "Cookie Settings" in the footer of any page. More information at Google Ads Policy.
We use the following third-party services:
- Supabase (EU region) — primary PostgreSQL database + Edge Functions + Vault
- Cloudflare R2 — offsite backup storage (encrypted)
- Hugging Face Spaces — backend API hosting
- Vercel — frontend hosting
- Google AdSense — ad display
- Google Fonts — font loading
- Lemon Squeezy (USA, Merchant of Record) — payment processing for Pro subscriptions. If you buy a Pro plan, your card and personal payment information goes directly to Lemon Squeezy, not to us. From them we receive only: email address, amount, subscription status, and license_key. Lemon Squeezy is incorporated in Delaware (USA) and acts as the legal seller on our behalf — they issue invoices, calculate VAT in 100+ countries, and handle chargebacks. Their privacy policy: lemonsqueezy.com/privacy
Note on data transfer to the USA: Lemon Squeezy is the only provider in our stack outside the EU. They declare GDPR compliance and rely on Standard Contractual Clauses (SCCs) as the legal basis for EU-to-US data transfers. If you prefer that your data not pass through the USA, do not purchase a Pro plan — the free tier remains entirely EU-only.
All other providers are chosen to primarily store data in the EU/EEA region. If you have specific questions about data transfers, contact us.
8. Your rights under GDPR
If you are located in the European Economic Area, you have the following rights:
- Art. 15 — right of access: to request a copy of the data we hold about you
- Art. 16 — right to rectification of inaccurate data
- Art. 17 — right to erasure: the "right to be forgotten"
- Art. 18 — right to restriction of processing
- Art. 20 — right to data portability
- Art. 21 — right to object to processing based on legitimate interest
- Right to file a complaint with the data protection authority in your country
How to exercise your rights: because we store only pseudonymized (hashed) identifiers, we cannot identify "your" rows in the database without your help. To submit a request, contact us and provide:
- The IP address you used at the time of scanning
- An approximate time (day and hour)
- Optionally, the domain you scanned, if you remember
With that information we can compute your hash and find matching rows in the scans and audit_log tables. Deletion is performed within 30 days of receiving the request (GDPR Art. 12). Note about audit_log: the audit log is intentionally append-only and retained for 90 days as a forensic trail under the legal basis of legitimate interest (GDPR Art. 6(1)(f) — documenting potential security incidents). Your entries will not be physically deleted from audit_log but will be marked as "excluded from operational statistics" and will in any case be automatically pruned after 90 days unless flagged.
9. Rights of scanned site owners (abuse report)
If you are the owner of a domain that someone has scanned through our service without your permission, you can file a report via the "Report abuse" link in the footer or directly at ./index.html#abuse. We review every report within 72 hours. If we confirm abuse:
- We add your domain to the block list — all future scans of that domain will be refused with HTTP 403
- Related
audit_logentries are flagged as legal evidence and retained indefinitely (instead of 90 days) - If you left an email, we notify you of the outcome
For more details on how the terms of service and ownership verification work, see the Terms of Service.
10. Policy changes, children, and contact
Current policy version: 2026-04-12-v3 — this is the same version recorded in the system when you run a scan. We reserve the right to update this policy. The version changes with each update and every new scan will ask you to confirm the current version. Your prior consents remain valid in the audit_log but do not retroactively apply to new terms.
Children: this service is not intended for persons under 16 years of age. We do not knowingly collect data from minors. If we learn that a minor has involuntarily submitted data, we delete it.
Controller contact (Art. 23 ZZPL):
- General inquiries: kontakt@gradovi.rs
- Security vulnerabilities: security@gradovi.rs
- Abuse reports: abuse@gradovi.rs or online form
- Pro plan and refunds: pro@gradovi.rs
- Response time: within 30 days of receiving the request (Art. 21 ZZPL / GDPR Art. 12)
11. Automated decision-making (Art. 38 ZZPL)
This service does NOT use automated decision-making that produces legal effects or significantly affects the user. Scanning is a technical analysis that does not make decisions about users. The risk score (A-F grade) is an informational tool, not an automated decision.
12. Legal basis — legitimate interest (Art. 12(1)(6) ZZPL)
The legal basis for processing data in the audit_log table is the controller's legitimate interest in:
- Forensic audit — protecting the service from abuse
- Legal defense — proving that the user gave consent before scanning
- Security — detecting malicious patterns (mass-scanning, SSRF attempts)
Assessment: the controller's interest (protecting a free service from abuse) outweighs the rights of data subjects because only pseudonymized data is processed (SHA-256 hash of IP and User-Agent), never raw data. Users have the right to object to this processing (Art. 37 ZZPL) via the email above.
13. Personal data breach (Art. 52 ZZPL)
In the event of a personal data breach, the controller will:
- Notify the Commissioner within 72 hours of becoming aware of the breach
- Notify affected data subjects without undue delay if the breach is likely to result in a high risk to their rights
- Document every breach in an internal register
Commissioner contact: poverenik.rs
14. Privacy policy version history
2026-04-12-v3
ACTIVE
April 12, 2026
ZZPL compliance: controller email (Art. 23), automated decision-making (Art. 38), legitimate interest documented (Art. 12), data breach procedure (Art. 52), cookie consent V2 with 3 categories, Commissioner contact with addresses.
2026-04-10-v2
replaced by v3
April 10, 2026
Added Lemon Squeezy as sub-processor (Merchant of Record for Pro subscriptions, Delaware USA). Email now stored for Pro subscribers in addition to abuse reports. Added scan_requests table (gate-before-scan wizard).
2026-04-10-v1
replaced by v2
April 10, 2026
First version of privacy policy. PII hashing (SHA-256), audit_log (append-only, 90 days), verified_domains (30 days), rate_limits, abuse_reports, backup (AES-256-GCM, R2). Supabase as sole sub-processor.
Each version is permanently recorded in the audit_log table — the consent you gave applies to the version that was active at that moment.