Technical audit · 06.09.2026

kv.ee

Real Estate Listings Portal

A real-estate classifieds portal — a single capture across ten pages, 1469 requests, 282 nodes. The site has the OneTrust consent platform and Google Consent Mode installed, defaulting to denied storage, and the user never grants consent: they open and close the preference center, and the consent state across all analytics pings stays 'denied'. Even so, the Adform advertising pixel and the Google DoubleClick creative fire within the first ~900 ms — before the consent banner even loads at +1735 ms — and GA4 transmits the visitor's behaviour to Google in cookieless mode throughout the session. Moreover, the IP address and a referer pointing to kv.ee reach more than 240 IAB TCF advertising nodes, some of them outside the EU — before and without any consent. Yet the binding data-protection terms state that the operator does not transfer data to third parties and does not transfer it outside the EU.

Request timeline

+0 ms · homepage load
Served via Cloudflare. Security headers are in place: HSTS with preload, Content-Security-Policy, Referrer-Policy strict-origin-when-cross-origin, Permissions-Policy, X-Content-Type-Options nosniff.
+371 ms · tag container
www.googletagmanager.com/gtag/js?id=G-XSSYYGNPKF — Google Tag Manager is pulled straight from the page markup (initiator — parser).
+645 ms · analytics
region1.google-analytics.com — a GA4 page_view with consent state gcs=G100 (both storages denied). The ping is cookieless, yet it carries the page URL, the title 'KV.EE — Kinnisvara pakkumised', language, screen resolution 1536x864, browser client hints (Chromium 152) and a DMA flag.
+821…+960 ms · advertising pixel
track.adform.net/adfserve/?bn=90091642;1x1inv=1;srctype=3 — an invisible Adform beacon. A 302 response, then a 1x1 gif at +960 ms. The consent macros gdpr=${GDPR} and gdpr_consent=${GDPR_CONSENT_50} are unpopulated.
+866 ms · ad creative
s0.2mdn.net — a Google DoubleClick creative pulled from the ad image r1-delivery.kv.ee/ad_images. code.createjs.com (the creative's animation library) is added to it later.
~229,000 ms · vendor list in the preference center
With the OneTrust preference center open, the browser requests deviceStorage.json / disclosure.json files from 240–264 IAB TCF nodes (270 GET, not a single POST). This is vendor disclosure inside the CMP, not a data transmission of a payload: these requests contain no user data of their own.
+288,853 ms · error monitoring
sentry.allepal.ee/api/19/envelope/ — an error report goes to the operator AllePal's own Sentry endpoint. Functional telemetry, not advertising tracking.

Declared versus actual

✓ Controller — AllePal OÜ, registry code 12209337, Pärnu mnt 141, Tallinn 11314 (section 'Mõisted') — declared
✓ Processing bases: consent 6(1)(a), contract 6(1)(b), legal obligation 6(1)(c), legitimate interest 6(1)(f) — declared
✓ Use of the website (viewing listings, navigation) via cookies — basis IKÜM artikkel 6 (1) (b), performance of a contract (the 'Ülevaade' table) — declared
✓ Consent 6(1)(a) is stated for newsletters, offers and queries — declared
✓ 'Me ei edasta isikuandmeid kolmandatele isikutele' — data is not transferred to third parties, except on a legal basis (data-transfer section) — declared
✓ 'Me ei edasta isikuandmeid Euroopa Liidust väljapoole' — data is not transferred outside the EU (same section) — declared
✓ Processors are described by category: accounting, IT solutions and others; none is named — declared
✓ Data collected via cookies — 'see the separate chapter on cookie use' (the 'Küpsised' declaration) — declared
✓ Supervisory authority — Andmekaitse Inspektsioon, Tatari 39, 10134 Tallinn — declared
+ Google Analytics and Google Tag Manager — not named in the binding data-protection terms — not declared
+ Adform — the advertising pixel is not named in the binding terms — not declared
+ Google DoubleClick / 2mdn — the advertising delivery is not named in the terms — not declared
+ The fact that the IP address and browsing data are transferred to Google (US) — directly contradicts the clause 'we do not transfer outside the EU' — not declared
+ The IAB TCF framework with 240–264 advertising partners — absent from the binding terms (present only in the cookie declaration and the banner) — not declared
+ That analytics starts before consent in denied mode, and that the Adform advertising pixel is not conditioned on consent at all, is not described in the document — not declared

Transfer timings

+371 ms www.googletagmanager.com

GTM, container G-XSSYYGNPKF, inserted into the page markup.

+645 ms region1.google-analytics.com

GA4 page_view, gcs=G100. Page URL and title, language, screen resolution, browser client hints.

+821 ms track.adform.net

Adform 1x1inv=1 pixel, before the consent banner, consent macros unpopulated. 302 response.

+866 ms s0.2mdn.net

Google DoubleClick ad creative, pulled from ad_images.

+960 ms track.adform.net

Repeat Adform request, 1x1 gif response.

+1735 ms cdn.cookielaw.org

The OneTrust platform loads only after the advertising requests.

+288,853 ms sentry.allepal.ee

Error report to the operator's own endpoint.

No exact timing

~229,000 ms IAB TCF (240–264 nodes)deviceStorage.json / disclosure.json on opening the vendor list in the OneTrust panel. 270 GET, 0 POST. Each request carries the IP and Referer: kv.ee.

Detected trackers

Show data recipients (62)
  • OneTrust (cdn.cookielaw.org, privacyportal-eu.onetrust.com) — consent management platform; 124 requests, the CMP script loads at +1735 ms, already after the first advertising requests
  • Google Analytics 4 (region1.google-analytics.com, G-XSSYYGNPKF) — analytics, loaded by the GTM container; 46 pings, consent state gcs=G100 (both storages denied), pings are cookieless, yet Google receives the IP address, the full page URL and title, language, screen resolution, browser client hints and click events
  • Google Tag Manager (www.googletagmanager.com) — the container from which GA4 starts; 10 requests
  • Google DoubleClick / 2mdn (s0.2mdn.net) together with code.createjs.com — ad creative in the page's ad slot, served before consent
  • Google Fonts (fonts.googleapis.com, fonts.gstatic.com) — web fonts; 69 requests, the IP address goes to Google
  • Google APIs (storage.googleapis.com, www.gstatic.com) — static-content delivery network
  • Adform (track.adform.net, site.adform.com) — advertising network; an invisible 1x1 pixel (bn=90091642, 1x1inv=1) fires at +838 ms, before the consent banner, with unpopulated macros gdpr=${GDPR} and gdpr_consent=${GDPR_CONSENT_50}
  • Sentry (browser.sentry-cdn.com — SDK; sentry.allepal.ee — the operator AllePal's own endpoint) — functional error monitoring
  • IAB TCF (tcf.adtech.app) — service endpoint of the Transparency and Consent Framework; 4 requests
  • Quantcast (www.quantcast.com) — analytics and consent platform
  • Index Exchange (cdn.indexexchange.com) — ad exchange
  • Beeswax (beeswax.com) — DSP, real-time bidding (RTB)
  • Adikteev (tcf-registrationprocess.adikteev.com) — advertising, retargeting
  • RTB House (www.rtbhouse.com) — advertising (RTB)
  • Yahoo (meta.legal.yahoo.com) — advertising
  • TripleLift (cdn.3lift.com) — advertising
  • Xandr / AppNexus (acdn.adnxs.com) — ad exchange
  • Taboola (accessrequest.taboola.com) — native advertising
  • Equativ / Smart (apps.smartadserver.com) — ad server
  • Adman (static.adman.gr) — advertising
  • Magnite / Rubicon (gdpr.rubiconproject.com) — ad exchange (SSP)
  • GumGum (marketing.gumgum.com) — advertising
  • OpenX (www.openx.com) — ad exchange (SSP)
  • Yieldlab (ad.yieldlab.net) — ad exchange (SSP)
  • PubMatic (cdn.pubmatic.com) — ad exchange (SSP)
  • Sharethrough (assets.sharethrough.com) — native advertising
  • Criteo (privacy.criteo.com) — advertising, retargeting
  • Lotame (tags.crwdcntrl.net) — data management platform (DMP)
  • LiveRamp (tcf.ats.rlcdn.com) — identity / DMP
  • Rich Audience (cdnj.richaudience.com) — advertising / DMP
  • IPONWEB (www.bidswitch.com, www.iponweb.com) — RTB infrastructure
  • AdRoll (s.adroll.com) — advertising, retargeting
  • ID5 (id5-sync.com) — cross-site identity (RTB)
  • Teads (iab-cookie-disclosure.teads.tv) — advertising
  • Media.net (www.media.net) — advertising network
  • Connatix (connatix.com) — video advertising (native)
  • ADman Media (admanmedia.com) — advertising
  • Seedtag (tcf.seedtag.com) — contextual advertising
  • Outbrain (www.outbrain.com) — native advertising
  • YieldMo (devicestoragedisclosureurl.yieldmo.com) — advertising
  • remerge (assets.remerge.io) — advertising, retargeting
  • Improve Digital (cdn.360yield.com, sellers.improvedigital.com) — ad exchange (SSP)
  • RevContent (sothebys.revcontent.com) — native advertising
  • OneTag (onetag-cdn.com) — advertising (RTB)
  • Yieldlove (cdn-a.yieldlove.com) — ad exchange
  • Bounce Exchange (assets.bounceexchange.com) — advertising, behavioural signals
  • BannerFlow (shared.bannerflow.com) — ad creative production
  • Integral Ad Science (static.adsafeprotected.com) — ad verification
  • Weborama (cstatic.weborama.fr) — advertising / DMP
  • FreeWheel (iab.fwmrm.net) — video advertising
  • Jivox (cdn.jivox.com) — dynamic advertising
  • Roq.ad (zd.rqtrk.eu) — cross-device identity
  • Gemius (gemius.com) — audience measurement
  • InMobi (publisher.inmobi.com) — mobile advertising
  • Kantar Operations (secure.insightexpressai.com) — audience measurement
  • MGID (www.mgid.com) — native advertising
  • AudienceProject (sak.userreport.com) — measurement / DMP
  • Adtelligent (adtelligent.com) — advertising (RTB)
  • Cxense (cdn.cxense.com) — data management platform (DMP)
  • Verve Group (resources.verve.com) — advertising
  • Dailymotion (statics.dmcdn.net) — video / advertising
  • OnAudience (www.onaudience.com) — data management platform (DMP)

Indicators of GDPR non-compliance

Context

kv.ee is a real-estate classifieds portal operated by AllePal OÜ, registry code 12209337, Pärnu mnt 141, Tallinn 11314. Under its own terms, AllePal acts as the controller (vastutav töötleja). Contact details are info@kv.ee, +372 6718 103; the document does not name a dedicated data-protection officer. The site is served via Cloudflare and sets a full set of security headers: HSTS with preload, Content-Security-Policy, Referrer-Policy strict-origin-when-cross-origin, Permissions-Policy, X-Content-Type-Options nosniff — at the header level there is nothing to object to.

The capture is a single recording across ten pages: the Estonian homepage, the Russian version, a search, and several price-statistics pages. In total 1469 requests, 282 nodes, about twelve minutes, recorded on 6 September 2026, in a browser with language ru. The site runs the OneTrust consent management platform and Google Consent Mode, which defaults to denying the advertising and analytics storages.

Processing is described by two of the operator’s documents: the binding data-protection terms (andmekaitsetingimused, revision of 02.05.2024) and a separate OneTrust-based cookie declaration with the full IAB TCF list.

Who receives data directly

Google (Analytics, Tag Manager, DoubleClick/2mdn, Fonts), Adform. Functionally — the operator’s own Sentry (sentry.allepal.ee).

Declared vs. actual

AllePal’s document is tidy: definitions, processing bases, a purpose table, data-subject rights, the supervisory authority. It says little about the site, but what it says is definite — and it is precisely in those definite places that the discrepancies arise.

First — advertising requests go out before a consent that is never given. The consent infrastructure is in place: OneTrust and Google Consent Mode, defaulting to denied storage. But the load order bypasses that infrastructure. The tag container starts at +371 ms straight from the page markup, analytics goes out at +645 ms, the Adform pixel at +821 ms, the DoubleClick creative at +866 ms. The consent platform’s own script does not load until +1718 ms — that is, after the advertising beacon has already fired. Across the whole session, consent was never given: the OneTrust events show only the opening and closing of the preference center, and the consent state across all forty-six analytics pings stays denied. The Adform request meanwhile contains unpopulated consent macros gdpr=${GDPR} and gdpr_consent=${GDPR_CONSENT_50} — meaning not even a consent string is passed to the advertising partner. The platform exists, but this beacon is not conditioned on it.

Second — the terms deny what actually happens. The data-transfer section is categorical: data is not transferred to third parties, not transferred outside the EU. The wording is reproduced on the live site as well. In fact GA4 and DoubleClick transmit the IP address and browsing data to Google — a recipient in the United States. A direct contradiction: the document denies exactly the kind of transfer that the capture records.

Third — recipients are named in one document and denied in another. The binding terms name no web recipient explicitly: the list of processors is reduced to categories. The same operator’s own cookie declaration and the IAB TCF banner, by contrast, disclose data-sharing with 240–264 advertising partners and name Google, Adform, DoubleClick and Facebook directly. So the operator’s recipients are disclosed — but in a document that contradicts the main one. A user reading the binding terms is told ‘we do not transfer to third parties’; a user opening the cookie declaration sees an advertising stack of more than two hundred partners.

And this contradiction does not stay on paper. In the recording, each of the 240–264 IAB TCF nodes received a GET request, and with it the visitor’s IP address and the header Referer: https://www.kv.ee/; the IP address is personal data, and among the nodes are recipients outside the EU. Consent was never given throughout the session. So the clauses ‘we do not transfer to third parties’ and ‘we do not transfer outside the EU’ are refuted not by a discrepancy between documents, but by data actually delivered: connection metadata reached more than two hundred advertising nodes before and without any consent. A profile assembled from behaviour is a separate matter — in this capture it goes to Google and Adform — but the very fact of transferring the IP address to third-party recipients, which the terms deny, is recorded at the scale of the entire advertising list.

Fourth — cookies for viewing listings are assigned to performance of a contract. In the purpose table, the row on using the site via cookies is based on Article 6(1)(b) — contract — whereas consent in the document is tied only to newsletters. The OneTrust panel, meanwhile, honestly splits cookies into strictly necessary, functional, statistics and advertising, and describes the last two categories as operating on consent. Assigning analytics and advertising cookies to ‘contractual necessity’ diverges both from the site’s actual scheme and from the operator’s own consent panel.

Separately, note that Google analytics behaves correctly as far as storage is concerned: the consent state is denied, the pings are cookieless, the client identifier is new on each page. This does not remove the transfer of the IP address and behaviour to Google, but the reading or writing of storage by analytics is not recorded in this capture — unlike the advertising pixel, which fires unconditionally.

Proven: consent was not given during the session. Across ten pages and 1469 requests, the OneTrust events record only ‘Preference Center Opened From Banner’ and ‘Preferences Close Button’. There is no Accept/Reject choice at any point, and the consent state across all forty-six analytics pings is gcs=G100 (both storages denied).

Proven: the advertising requests are not conditioned on consent. The Adform pixel goes out at +821 ms, the DoubleClick creative at +866 ms, whereas the consent platform’s script does not load until +1718 ms. The Adform request carries unpopulated consent macros. There is no condition before these requests in the load order.

Proven: analytics honours the storage denial. The GA client identifier is stable within a page and changes ten times across the ten pages — there is no persistent cookie binding, consistent with the denied consent state. At the same time, Google receives the page URL, title, language, screen resolution and browser client hints.

Proven: recipients are disclosed in the cookie declaration but not in the binding terms. Google, Adform, DoubleClick, Facebook and the IAB TCF list are present in the ‘Küpsised’ declaration and absent from the main document, which additionally denies transfers to third parties.

Not proven: reading or writing of storage by the advertising pixel. Whether Adform sets a cookie via the 302 chain is not established from the published (redacted) headers. What is recorded is the beacon firing before consent and the delivery of a response; the finding rests on that, not on a presumed cookie write.

Observation boundaries

The capture covers ten pages of the portal and records browser behaviour, not the services’ internal workings: server-side processing, contracts with recipients and their own settings are not verified by a browser-level capture.

The tail of 240–264 IAB TCF nodes needs to be stated precisely. Each of them received a GET request, and with it the visitor’s IP address, User-Agent and the header Referer: https://www.kv.ee/. The IP address is personal data, so by the very fact of the request these nodes are recipients (har-check recognised 67; the rest are classified as third-party domains of undetermined purpose). What the recording does not contain is a payload sent to them: all the requests are GETs for static device-disclosure files (deviceStorage.json, disclosure.json), 270 requests and not a single POST; a profile assembled from behaviour is not transmitted to these nodes in this capture. They fired when the vendor list was opened in the OneTrust preference center — which explains why the requests occurred, but does not undo the fact that the IP address and referer reached those nodes. In other words, ‘addressed and delivered’ here refers to connection metadata (the IP address, a referer pointing to kv.ee), whereas the transfer of a behavioural profile in this capture is recorded to Google and Adform.

The file is published redacted of personal data: cookie values in requests have been removed. Response bodies and markup are preserved, so tag insertion, load order and request parameters are verified directly against the published file. The full client identifier is not reproduced in the analysis; its cookieless nature is established from the Google requests themselves. The operator’s own Sentry (sentry.allepal.ee) is functional error monitoring, unrelated to advertising tracking, and is not recorded as a violation.

The legal assessment is made by the competent authority — Andmekaitse Inspektsioon, whose supervision is named in the terms themselves.

Conclusion

The real-estate classifieds portal has an outwardly correct consent infrastructure — OneTrust and Google Consent Mode with storage denied by default — but it does not cover everything that loads on the page. The Adform advertising pixel and the Google DoubleClick creative fire within the first ~900 ms, before the consent banner even appears at +1718 ms, and consent is never given for the whole session. Google analytics honours the storage denial, but still transmits the IP address and the visitor’s behaviour to the United States.

At the same time the binding data-protection terms state plainly that the operator does not transfer data to third parties and does not transfer it outside the EU — whereas the same operator’s own cookie declaration discloses an advertising stack of more than 240 partners and names Google, Adform and DoubleClick explicitly. The operator’s two documents say different things about one and the same matter.

Remediation: condition the advertising requests (Adform, DoubleClick) and the loading of analytics on actual consent, so that no advertising beacon fires before the user’s choice; pass advertising partners a valid TCF consent string instead of unpopulated macros; bring the binding data-protection terms into line with the facts — either name Google, Adform and the advertising partners as recipients and disclose the transfer to the US under Chapter V, or stop those transfers; and reconcile the basis for analytics and advertising cookies between the terms (where they are assigned to contract) and the consent panel (where they are consent-based).

Evidence

How to verify: download the file and compute its checksum — sha256sum file.har (Linux, macOS) or certutil -hashfile file.har SHA256 (Windows); it must match the one shown. The conclusions apply to the scope of this measurement — see the limitations of the method.

Original (audit)
HAR file: ee/kv-ee-2026-09-06.har
SHA-256: 0bf3ca6e939680ab3443e0813eac8184b3ea6c9a6b579323422aad789557dc4f
Re-check snapshot
Awaiting changes
HAR files are stored on EU infrastructure (Proton Drive). SHA-256 is published for integrity verification.