Privacy and Data
What the SDK and the chat send and when, for your app's privacy details in App Store Connect, its Data safety form in Play Console and any consent your app asks for. It describes what the SDK does and is not legal advice
What leaves the device
What | Sent to | From |
|---|---|---|
Kindly, at otlp.kindly.ai | start | |
Kindly's project on Sentry | start, while crash reporting is on | |
The chatīģŋ | Kindly's chat service at bot.kindly.ai | The first time the chat is shown |
All of it goes over HTTPS. The SDK reads no advertising identifier (the IDFA or the Android advertising ID), no IDFV or Android ID, no location and no contacts, and nothing it sends is used for tracking, as its privacy manifestīģŋ declares
Usage metrics
The SDK counts how the chat is used: the SDK starting, the chat being shown, messages sent and received, counted by sender and never with their text, link taps, downloads, language changes, feedback, sign-in outcomes, errors loading the chat, your app moving to the foreground and background, and each chat ending, with how long it lasted. Android also counts button taps by type and attachment picks, and iOS records at start your app's memory use and whether VoiceOver is on. Every metric carries:
- a random device ID, kept in the Keychain on iOS, where it can outlive a reinstall of your app, and in your app's private preferences on Android
- the device model and maker, the OS version and your app's version
- the bot key, the bot name and, once the chat has one, the chat id, which identifies the conversation in Kindly
- the SDK version, and flutter or react-native when the SDK runs inside one of those packages
Error reports
Errors in the SDK's own code go to Kindly with the error's type and stack, the SDK, app and OS versions, your app's bundle id or package name, the device model and maker, and the bot key, bot name, market and language, plus the chat id on iOS. They never carry chat content, the errors' own messages, breadcrumbs or the device ID. Crash reporting is on by default. Turn it off before start and no error report is sent, see Logging and Crash Reportingīģŋ
The chat
The chat is Kindly's web chat, loaded from chat.kindlycdn.com each time a chat page is created, so what it sends follows Kindly's web chat. Once shown, it sends Kindly's chat service what the user writes and taps, their form answers and the files they attach, the Contextīģŋ your app sets, the chat language and the device's time zone, and for a signed-in user the token your Authenticationīģŋ returns. It also connects to Pusher, the real-time messaging service the web chat uses. When a message holds a YouTube or Vimeo video or an image from another site, the web view loads it from that site
Requests to the chat service carry the kindly-host-app-package header with your app's bundle id or package name, so that a bot that only allows listed domains recognises your app, see Configurationīģŋ. The SDK adds the header to those requests and to no others
The conversation, and a random browser id the web chat keeps, are stored in the web view's storage for chat.kindlycdn.com. End Chatīģŋ and Kill SDKīģŋ delete the stored conversation
Consent
Nothing leaves the device before start. From start the SDK sends usage metrics, and error reports while crash reporting is on, and the chat sends nothing until it is first shown. If your app needs the user's consent first, call start once the user has given it, and at every launch after that, with crash reporting set to match their choice:
KindlyWebViewSDK.enableCrashReporting = allowsErrorReports
KindlyWebViewSDK.start(botKey: "YOUR_BOT_KEY", languageCode: "en", market: "general")allowsErrorReports stands for your app's record of that choice. The usage metrics have no switch of their own, so a user who declines them cannot use the chat, which needs start. When a user withdraws consent later, call Kill SDKīģŋ: from then on the SDK sends no usage metrics or error reports until the next start
Generative AI
If your bot answers with generative AI from a third-party provider, what the user writes in the chat reaches that provider through Kindly. Apple's App Review Guideline 5.1.2(i) says "You must clearly disclose where personal data will be shared with third parties, including with third-party AI, and obtain explicit permission before doing so", and Google Play's User Data policy applies its disclosure and consent requirements to third-party AI integrations too. Show your own disclosure and ask for that permission before your app first shows the chat
The bot's compliance message, set per language in the Kindly platform, can also ask for agreement. When it requires agreement, the chat asks the user to accept before they can write, so it can be that permission if its text names the AI provider. It can come after the chat has connected, and it does not hold back the context your app sets, a signed-in user's token, or the messages and dialogues your app sends itself
App Store privacy details
Your app's privacy details in App Store Connect cover the SDK, whether your app uses it directly or through Flutter or React Native. What the SDK and the chat collect falls under these data types:
Data type | What it is | Purpose |
|---|---|---|
Identifiers, Device ID | The random device ID on the usage metrics | Analytics, App Functionality |
Usage Data, Product Interaction | The usage metrics | Analytics |
Diagnostics, Other Diagnostic Data | Error reports, and the errors the usage metrics count. The iOS SDK installs no crash handler, so it sends no Crash Data | App Functionality, Analytics |
Diagnostics, Performance Data | Your app's memory use, recorded at start | Analytics |
User Content, Customer Support | The conversation. Choose Other User Content instead when the chat is not for customer support | App Functionality |
User Content, Photos or Videos | Photos and videos people attach, when the bot accepts attachments | App Functionality |
Identifiers, User ID | Who the user is, when your app signs users in to the chat | App Functionality |
Contact Info | The name, email address or phone number the bot asks for, if it asks | App Functionality |
Mark each type as linked to the user: the usage metrics carry the device ID and the chat id, error reports carry the chat id, and the chat id leads to the conversation, which can name the user. Mark none of them as used for tracking
Apps in Apple's Kids Category may not send device information to third parties (guideline 1.3), and the usage metrics send it from start
Privacy manifest on iOS
KindlyWebView.framework carries its own privacy manifest, PrivacyInfo.xcprivacy, whichever way you install it, because the Flutter and React Native packages embed the same framework. Xcode adds it to your app's privacy report: choose Product > Archive, then Control-click the archive in the Organizer and choose Generate Privacy Report
The manifest declares no tracking and no tracking domains, the data types the SDK collects, and the one API from Apple's required reason list that the SDK calls: the system boot time (NSPrivacyAccessedAPICategorySystemBootTime, reason 35F9.1), which it reads only to measure time between events in the app, for timeouts and rate limits. Version 1.0.1 is the first to declare that API, so with 1.0.0 App Store Connect may report ITMS-91053 when you upload
Google Play Data safety
Your app's Data safety form in Play Console covers the SDK, whether your app uses it directly or through Flutter or React Native. What the SDK and the chat collect falls under these data types:
Data type | What it is | Purpose |
|---|---|---|
Device or other IDs | The random device ID on the usage metrics | Analytics |
App activity, App interactions | The usage metrics | Analytics |
App info and performance, Crash logs and Diagnostics | Error reports, and the errors the usage metrics count | Analytics |
Messages, Other in-app messages | The conversation | App functionality |
Photos and videos, and Files and docs | Files people attach, when the bot accepts attachments | App functionality |
Personal info, User IDs | Who the user is, when your app signs users in to the chat | App functionality |
Personal info, Name, Email address or Phone number | What the bot asks for, if it asks | App functionality |
The SDK's and the chat's data counts as encrypted in transit. Google does not count data that a service provider processes on your behalf and on your instructions as shared, so whether Kindly's collection is shared for your app depends on your agreement with Kindly
Permissions
The chat uses no location and cannot reach the camera or microphone from the page: people attach photos, videos and files through the system pickers. On iOS the picker can also take a photo or record a video, so iOS asks the user for the camera, and for the microphone when recording, using the Installationīģŋ in your app's Info.plist. On Android the SDK adds only the INTERNET permission, see Installationīģŋ. The camera app takes the photo there, so the SDK asks for the camera permission only when your app itself declares android.permission.CAMERA, see Uploads and Downloadsīģŋ
If your app limits its web views with App-Bound Domains, list chat.kindlycdn.com in WKAppBoundDomains, see Installationīģŋ