Data safety

Play Data safety answers

Your answers for the AdHedge SDK in Play Console's Data safety form. Combine them with your own app's answers.

Does the SDK collect or share user data?

Yes.

Data types

Play category and data typeCollectedSharedEphemeralRequiredPurposes
Device or other IDs: Device or other IDsYesNoNoYesFraud prevention, security, and compliance; Analytics
App activity: App interactions (touch counts and timing)YesNoNoYesFraud prevention, security, and compliance; Analytics
App info and performance: DiagnosticsYesNoNoYesFraud prevention, security, and compliance; Analytics
Location: Approximate location (country, derived on our server from the request IP; the SDK reads no location)YesNoNoYesFraud prevention, security, and compliance; Analytics

Fields the SDK sends

Once per install, after a configuration answer, the SDK builds one signals request and sends it. The request is collected again only when it has gone unanswered for seven days. While a Play Integrity token is still to be asked for, the SDK sends the same bytes again before each ask. Behavior is the one group sent apart from it; its own table says when.

A value the device's API level cannot provide, or whose read fails, is sent as null. None of these fields needs a runtime permission.

App and install

FieldWhat it isAndroid source
Install IDA random UUID the SDK creates once. Built from no device identifier.UUID in the SDK's preferences
Play App Set IDIn the developer scope. Read only when your app already includes Google's App Set library; the SDK ships none of it. Null otherwise. Our server hashes it on receipt and never stores it raw.AppSetIdClient
Package nameYour app's package.Context.getPackageName
Signing certificate hashSHA-256 of your app's signing certificate.PackageInfo.signingInfo
First install timeWhen your app was first installed on the device.PackageInfo.firstInstallTime
Last update timeWhen your app was last updated.PackageInfo.lastUpdateTime
App version codeThe running build.PackageInfo.longVersionCode
SDK versionThe AdHedge SDK version.SDK constant
Android API levelThe device's Android version.Build.VERSION.SDK_INT
Config versionThe version number of the configuration the service sent.SDK config
Attestation sample flagWhether the install falls within the share of installs the configuration's sampling rate selects for a Play Integrity token, by a number the SDK draws at random once per install.SDK config
Existing-user flagWhether the app had been updated since its install and more than 48 hours had passed since that install when the SDK first recorded this.Install and update times
Request hashA SHA-256 digest of the request, which the SDK repeats to Play Integrity so that the token is bound to the request.Computed by the SDK

Install facts

FieldWhat it isAndroid source
Installer packageThe package that installed your app.installingPackageName
Package that started the installAndroid 11 and up.initiatingPackageName
Install source typeThe install's source as the system classifies it. Android 13 and up.packageSource
Play Install Referrer stringThe referral text of the store link the install came from, cut to 1,024 bytes: whatever the link's author put in it, which can name a campaign and an ad click, and, for your own referral or invite links, whatever those carry. The only free-text field.installReferrer
Referrer click timeThe time of that click.referrerClickTimestampSeconds
Install start timeThe time of the install's start.installBeginTimestampSeconds
App version at installThe version installed.installVersion
Referrer availabilityWhether the Play Store could answer.InstallReferrerClient response
Debuggable build flagWhether the app is debuggable.FLAG_DEBUGGABLE
USB debugging settingWhether USB debugging (ADB) is enabled.Settings.Global.ADB_ENABLED
Test-keys buildWhether the system was built with test keys.Build.TAGS
Work profileWhether the app runs in a work profile. Android 11 and up.isManagedProfile

Device checks

FieldWhat it isAndroid source
Emulator build markersWhich of a fixed list of patterns the build values match.Build.*
Root markersWhether a path of a fixed list exists, checked for existence and never opened, and whether the file system holding /system is mounted writable. No app lookups.File and mount checks
Network transport typeThe active network's transport. No SSID, BSSID or IP address.NetworkCapabilities
VPN activeWhether the active network is a VPN.TRANSPORT_VPN
Proxy setWhether a proxy is set, never its address.http.proxyHost
Battery levelPercent.BatteryManager
Charging stateWhether the device is charging.BatteryManager
Time since bootThe time since the device started.SystemClock.elapsedRealtime
Sensor countThe number of sensors. No sensor readings.SensorManager.getSensorList

SIM state and phone type are fields of the request that are always null: the SDK reads no telephony.

Build values

The device's build values as Android gives them to any app. Each string goes out only as 1 to 64 characters of printable ASCII, 256 for the fingerprint. One that is empty, longer or holds another character is sent as null, never cut and never changed.

FieldWhat it isAndroid source
Device brandThe brand name.Build.BRAND
Device manufacturerThe manufacturer name.Build.MANUFACTURER
Device modelThe model name.Build.MODEL
Device nameThe device name of the build.Build.DEVICE
Product nameThe product name of the build.Build.PRODUCT
Hardware nameThe hardware name.Build.HARDWARE
Board nameThe board name.Build.BOARD
Chip makerThe maker of the chip. Android 12 and later.Build.SOC_MANUFACTURER
Chip modelThe model of the chip. Android 12 and later.Build.SOC_MODEL
Build fingerprintNames a firmware build. See the note under Data types.Build.FINGERPRINT
Build typeThe build type.Build.TYPE
Android releaseThe Android release.Build.VERSION.RELEASE
Security patch dateThe security patch date.Build.VERSION.SECURITY_PATCH
Processor ABIsThe list of processor ABIs. A name outside the contract's list is sent as OTHER, and a list of more than eight is sent as null.Build.SUPPORTED_ABIS

Hardware figures

FieldWhat it isAndroid source
Screen short sideThe smaller figure of the default display's active mode, in pixels: the display's own, never the app's window.Display.Mode
Screen long sideThe larger figure of that resolution. On a folding device it is the display in use.Display.Mode
Stable densityThe screen's density as built: the platform's stable density, read in place of the current one, which the display-size setting changes. Null below Android 7.DENSITY_DEVICE_STABLE
Memory rounded down to 256 MiBThe device's memory, never the exact figure.ActivityManager.MemoryInfo
Processor coresThe number of processor cores.Runtime.availableProcessors
Sensor type numbersThe type number of each sensor, never a sensor's name or readings. Null when a device lists more than 128 sensors.SensorManager.getSensorList

A screen, density, memory or core figure outside the contract's bound is sent as null.

Behavior

This is the App activity group. For a new install the SDK observes touches on the day it first runs and the day after, by the device's clock in UTC, and at no other time. Installs the SDK first met through an app update are not observed. What is observed is the same for every observed install, whatever its verdict.

FieldWhat it isSent
Touches in a sessionThe number of touches, for each session from the first activity shown to the last one hidden.Per session
Session lengthThe session's length.Per session
Interval sumsTwo sums over the times between one touch and the next: their total and the total of their squares. The service computes from them how much those times vary.Per session
First-touch delayThe delay from the SDK's start to the first touch, with the time of that touch.Once per install
Day-after returnWhether a session began on the day after the first run.Once per install
Event timeThe device's clock at the event. Our server also records when it arrived.Per event

It never records coordinates, which view or screen was touched, screen names, content, or the time of any other touch.

One request follows each observed session, sent in batches of at most 20 events. An unsent batch is removed at the first launch that starts the SDK after seven days by the device's clock, or with the app's data. At most 20 sessions are reported per app process. Nothing counted is stored or sent unless the app's configuration has behavior on and the SDK is not paused. Kept 90 days from when each arrives.

How touches are observed: one Application.ActivityLifecycleCallbacks registration, and a wrapper around the Window.Callback of each Activity created after the SDK starts. Touches in a dialog's or a popup's own window are not seen. No View.OnTouchListener on your views, no accessibility service, no input injection. On the dispatch path the wrapper reads the event's action and nothing else of it; when a touch begins it reads a clock and adds to a count and two sums; then it calls the callback that was there before. It allocates nothing per event, keeps no reference to the event, takes no lock and does no I/O. More in the docs.

Seen by our server

The SDK doesn't send these. Our server reads them from each request.

FieldWhat it isKept
IP addressThe address each request comes from. Never stored with install data; our proxy's access log holds it, for operations.14 days
Network prefixThe IP address with its host part removed.13 months
Network operatorThe network the request came from and whether it is a hosting provider. Derived from the IP address.13 months
CountryDerived from the IP address and kept with the install.13 months

Purposes

Fraud prevention, security, and compliance. Analytics. Never advertising or marketing, personalization, account management or developer communications.

Shared

No. AdHedge processes the data on your behalf as a service provider, and Google's Data safety guidance does not count transfers to a service provider as sharing. AdHedge does not sell the data, does not combine it across apps into a device identity, and does not join it to advertising identifiers or personal information.

Handling

Tell your users

Your app's privacy policy covers what your app collects, the SDK's part included. Say that the app uses Install Trust to verify installs, and link the SDK privacy policy. Your Data safety answers for the SDK are the table under Data types and the notes below it; combine them with your own app's. This is guidance for filling in the form and no legal advice.

Never collected

Permissions

The SDK declares no runtime permission. Three permissions merge into your manifest: INTERNET and ACCESS_NETWORK_STATE, which most apps already declare, and com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE, which Google's Install Referrer library merges so that the app can ask the Play Store for its own install referrer. Everything else the manifest gains is listed in the docs.

Play Integrity

The SDK sends at most one Play Integrity token per install, requested under a Google Cloud project linked to your app in Play Console. It is requested on the device, bound to the signals request's SHA-256 digest, and sent with the install ID, that digest and how long the request took. Our server decodes it, keeps the decoded fields and the token's hash, and drops the token.

Play is asked at most three times for an install, inside seven days. Each time there is no token the SDK sends a report: the install ID, the time by the device's clock, and Play's error code or one of timed out, no Cloud project configured, the Play Integrity library missing from the app, interrupted, other.

Play Integrity Terms prohibit using the API to fingerprint or track individual users or devices. AdHedge keeps no cross-app device identity and uses a verdict for the single app that requested it.