При автодополнении адресов в мобильных приложениях для России Google Places часто ошибается на корпусах, строениях и СНТ. Типовой кейс: клиент логистической компании терял 3–5% заказов из-за некорректного адреса при оформлении. После внедрения DaData количество ошибок сократилось в 4 раза. Еще один пример: интернет-магазин снизил возвраты из-за неверного адреса с 12% до 2% за месяц. DaData — стандарт де-факто: база на основе ФИАС и КЛАДР покрывает 99% адресов. Мы внедряем DaData в iOS, Android и Flutter — с дебаунсом, кэшированием и контролем квот. Имеем опыт внедрения DaData для логистики, доставки и ритейла — более 80 проектов. Это позволило клиентам сократить количество ошибок ввода адресов в 3–4 раза и ускорить оформление заказов.
Почему DaData лучше Google Places для России?
Сравним по ключевым параметрам:
| Критерий | DaData | Google Places Autocomplete |
|---|---|---|
| База адресов | ФИАС/КЛАДР, включает корпуса, строения, СНТ | OpenStreetMap + Google Maps, часто неполные |
| Геокодинг | POST /geolocate с radius_meters | Reverse Geocoding, неточный для РФ |
| Скорость ответа | 100–200 мс | 200–400 мс |
| Квота бесплатно | 10 000 запросов/день | 150 000 запросов/мес (Android) |
| Стоимость за 1000 запросов | от $2 (платные тарифы) | от $5 (Places API) |
DaData выигрывает по точности для российских адресов в 2–3 раза — меньше пользовательских ошибок и отказов. Дополнительный плюс — геокодинг с привязкой к контуру здания, а не к центру улицы.
Что мы интегрируем
Основной эндпоинт — POST https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address. Тело запроса — JSON с полем query (введённая строка) и опциональным locations для ограничения по региону. Ответ — массив suggestions, каждый с value, data.geo_lat, data.geo_lon, data.house, data.street, data.city_with_type. Второй эндпоинт — геокодирование по координатам: POST .../geolocate/address с lat/lon и radius_meters. Используем как fallback к Google Reverse Geocoding. DaData также позволяет стандартизировать адреса — привести их к единому формату ФИАС. Это полезно для баз данных и отчетности.
Реализация DaData на iOS, Android и Flutter
iOS
Создаём DaDataService с URLSession или Alamofire. Авторизация через заголовок Authorization: Token . Ключ храним в xcconfig — не хардкодим в коде. Подсказки показываем в UITableView под текстовым полем. Запросы дебаунсируем через Combine: searchSubject.debounce(for: .milliseconds(300), scheduler: RunLoop.main). Без дебаунса при быстром вводе отправляется запрос на каждый символ.
Пример обработки ответа:
struct DaDataSuggestion: Decodable { let value: String let data: DaDataAddress } struct DaDataAddress: Decodable { let geoLat: String? let geoLon: String? let city: String? let street: String? let house: String? enum CodingKeys: String, CodingKey { case geoLat = "geo_lat" case geoLon = "geo_lon" case city, street, house } } Важно: geo_lat и geo_lon приходят как String, не Double. Конвертируем через Double(geoLat ?? "") с проверкой на nil.
Android
Retrofit-интерфейс с @POST и @Header("Authorization"). Корутина в ViewModel, StateFlow<List<DaDataSuggestion>> для UI. Дебаунс через Flow.debounce(300) в collectLatest. В compose-проекте LazyColumn под TextField с DropdownMenuItem. При выборе подсказки убираем фокус через LocalFocusManager.current.clearFocus() и скрываем клавиатуру через LocalSoftwareKeyboardController.
Flutter
Пакета под DaData нет — пишем свой DaDataRepository с Dio. Подсказки отдаём через StreamController с дебаунсом Timer(Duration(milliseconds: 300)). Для UI — ListView.builder в Overlay или пакет flutter_typeahead с кастомным suggestionsCallback.
Когда нужна миграция с Google Places?
Если текущее приложение уже использует Google Places Autocomplete, замена на DaData — это замена одного HTTP-запроса на другой, но с другой моделью данных. Мы адаптируем существующий код под ответ DaData, сохраняя логику отображения и выбора адреса. Типовой кейс: клиент с 50 000 ежемесячных запросов платил $250 за Google Places, а с DaData — $100. Срок миграции — 1 день на платформу.
Как контролировать квоты?
Бесплатный тариф DaData — 10 000 запросов/день. Для коммерческих проектов рекомендуем платный план. Настраиваем:
- Минимальная длина запроса — 3 символа (не отправляем запросы на "М")
- Дебаунс 300 мс — исключаем лишние вызовы при быстром вводе
- Кэширование результатов: повторные запросы идентичной строки не уходят в сеть
Это снижает количество запросов до 40% от числа нажатий клавиш. Контроль реализован на уровне сервиса и UI.
Сравнение подходов интеграции по платформам
| Параметр | iOS | Android | Flutter |
|---|---|---|---|
| HTTP-клиент | URLSession / Alamofire | Retrofit | Dio |
| Дебаунс | Combine .debounce | Flow.debounce | Timer |
| UI | UITableView + делегат | LazyColumn | ListView / flutter_typeahead |
| Сериализация | Codable | Gson / Moshi | json_serializable |
Объем и сроки работ
В состав работ входит:
- Клиентский сервис для iOS/Android/Flutter с авторизацией и дебаунсом
- UI-компонент автодополнения (кастомный или адаптированный)
- Обработка выбора адреса и маппинг координат
- Контроль квот: минимальная длина запроса — 3 символа, нет запросов на пустую строку
- Документация по интеграции и код с комментариями
Интеграция на одну платформу занимает 1–2 дня. Стоимость рассчитывается индивидуально — зависит от сложности UI и дополнительных требований (например, геокодинг или стандартизация ФИО). Экономия бюджета на геоданные после миграции может достигать 60%.
Свяжитесь с нами для аудита текущего решения. Закажите интеграцию DaData и получите консультацию по оптимизации бюджета.
Источник: DaData API документация







