> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# API Verifikasi Lokasi: Geofencing dan Jarak IP

> Konfirmasi posisi pengguna saat verifikasi dengan Didit: geofencing, jarak IP & dokumen, serta deteksi spoofing. $0.05 per pemeriksaan.

Langkah verifikasi Lokasi Didit mengonfirmasi keberadaan seseorang saat mereka melakukan verifikasi, dengan membaca posisi perangkat satu kali (browser atau SDK native) atau lokasi IP koneksi, dan memeriksanya terhadap area yang diizinkan dan diblokir, lokasi IP, serta alamat pada dokumen mereka.
Dalam alur kerja dan API, fitur ini adalah `GEOLOCATION`, pengaturannya menggunakan kunci `geolocation_*`, dan hasilnya berupa `geolocation_checks[]` pada keputusan sesi.

## Kapan menggunakannya

* Anda memegang lisensi hanya untuk beberapa yurisdiksi (perjudian, pialang, pinjaman) dan harus membuktikan bahwa orang tersebut berada di dalamnya saat mereka mendaftar.
* Anda harus mencegah orang masuk dari tempat yang diblokir, seperti wilayah yang terkena sanksi atau negara bagian yang tidak Anda layani.
* Anda menginginkan satu sinyal penipuan tambahan: posisi perangkat yang jauh dari lokasi IP atau dari alamat pada ID, posisi yang dipalsukan, VPN, atau emulator.
* Anda tidak memerlukan pergerakan atau riwayat orang tersebut, hanya satu pembacaan yang diambil selama sesi.

## Cara kerjanya

**1. Pemberitahuan dan izin**

Orang tersebut melihat alasan lokasi mereka diperlukan dan bahwa lokasi hanya dibaca satu kali, untuk verifikasi ini.
Browser atau ponsel mereka kemudian meminta izin.
Didit mencatat pemberitahuan yang mereka setujui (versi, bahasa, dan waktu) sebagai `consent` dalam hasil.

**2. Satu posisi per upaya**

Klien mempertahankan pembacaan terbaik hingga cukup akurat atau batas waktu per upaya (default 20 detik) habis.
Setiap upaya membawa tantangan sekali pakai yang valid selama 5 menit dan terikat pada sesi, sehingga kiriman yang direkam tidak dapat diputar ulang.

**3. Pemeriksaan**

Didit menilai akurasi, kebaruan, izin lokasi perkiraan, sinyal spoofing, area, jarak ke lokasi IP dan ke alamat dokumen, temuan VPN, proxy, Tor, dan emulator, serta pemeriksaan orang tersebut sebelumnya.

**4. Hasil**

Setiap temuan memunculkan [peringatan](https://docs.didit.me/id/core-technology/location-verification/warnings-location-verification.md) yang tindakan terkonfigurasinya (`NO_ACTION`, `REVIEW`, atau `DECLINE`) menentukan status langkah.
Tindakan yang paling kuat berlaku.

## Sumber posisi

Anda memilih dari mana posisi berasal menggunakan `geolocation_position_source`.

| Nilai | Apa yang terjadi |
| - | - |
| `device_and_ip` | Posisi perangkat diperiksa terhadap lokasi IP dari koneksi asalnya. |
| `device_only` | Hanya posisi perangkat. Posisi ini tidak pernah dibandingkan dengan lokasi IP. |
| `ip_only` | Orang tersebut tidak pernah dimintai izin. Lokasi IP koneksi (tingkat kota, radius 50 km) dinilai sebagai gantinya, tanpa aturan akurasi, kebaruan, atau izin lokasi perkiraan. |
| tidak diatur | Lokasi perangkat diminta, dan posisinya dibandingkan dengan lokasi IP yang diamati oleh langkah Analisis Perangkat & IP sesi. Node yang bertindak berdasarkan temuan VPN, proxy, atau Tor memeriksa koneksi tersebut dan berperilaku seperti `device_and_ip`. |

Pada node yang meminta lokasi perangkat, upaya tanpa posisi dinilai sebagai penolakan atau kegagalan yang sebenarnya: lokasi IP tidak pernah menggantikannya.

## Default dan batas konfigurasi

Semua kunci bersifat opsional.
Daftar lengkap ada di [referensi konfigurasi fitur alur kerja](https://docs.didit.me/id/management-api/workflows/feature-configs.md#verifikasi-lokasi).

| Pengaturan | Default | Batas |
| - | - | - |
| `geolocation_max_accuracy_radius_m` | 250 m | 10 hingga 50.000 m |
| `geolocation_max_age_seconds` | 120 s | 5 hingga 3.600 s |
| `geolocation_timeout_seconds` | 20 s | 5 hingga 120 s |
| `geolocation_max_attempts` | 3 | 1 hingga 5 |
| `geolocation_accuracy_mode` | `precise` | `precise` atau `approximate_allowed` |
| `geolocation_low_accuracy_behavior` | `ask_again` | `ask_again` atau `fail` |
| `geolocation_allow_qr_handoff` | aktif | aktif atau nonaktif |
| `geolocation_allow_skip` | nonaktif | aktif atau nonaktif |
| `geolocation_refusal_path` | `retry_then_handoff` | `retry_then_handoff`, `continue_without_location`, `end_session` |
| `is_geolocation_geofencing_enabled` | nonaktif | aktif atau nonaktif |
| `geolocation_ip_distance_km` | 200 km | 0 atau lebih, `null` menonaktifkan perbandingan |
| `geolocation_document_distance_km` | nonaktif | 0 atau lebih |
| `geolocation_travel_tolerance_enabled` | nonaktif | area biasa 10 hingga 500 km (default 100), 1 hingga 90 hari (default 14) |
| `geolocation_consecutive_mismatch_count` | nonaktif | 2 hingga 10 |

### Preset

`geolocation_preset` menetapkan default dari setiap tindakan yang tidak Anda atur.
`licensing` menolak posisi di luar area yang diizinkan, di dalam area yang diblokir, di balik VPN atau Tor, atau pada emulator, dan meninjau proxy.
`fraud_screening` menerapkan temuan yang sama tetapi mengirimkan semua yang akan ditolak oleh `licensing` ke peninjauan.
Tindakan yang Anda atur secara eksplisit selalu menang.

## Geofencing

Aktifkan `is_geolocation_geofencing_enabled` dan buat daftar `geolocation_areas`.
Area dapat berupa seluruh negara, wilayah (ISO 3166-2) dari satu negara, lingkaran (1 hingga 500 km), atau poligon (3 hingga 200 titik).
Hanya posisi di dalam area yang diizinkan yang lolos, dan area yang diblokir selalu menang atas area yang diizinkan.
Sebuah daftar dapat memuat hingga 50 area dan membutuhkan setidaknya satu area yang diizinkan.

Didit menilai seluruh lingkaran akurasi posisi, bukan hanya titik tengahnya:

* Lingkaran yang sepenuhnya berada di luar setiap area yang diizinkan adalah `LOCATION_OUTSIDE_GEOFENCE`.
* Lingkaran yang melintasi batas yang menentukan jawaban adalah `LOCATION_GEOFENCE_UNDETERMINED`, tidak pernah dianggap "di luar".
* Lingkaran yang sepenuhnya berada di dalam area yang diblokir adalah `LOCATION_IN_BLOCKED_AREA`, dan ini dimunculkan selain putusan area yang diizinkan.

Suatu negara atau wilayah berakhir di tempat daratan lain dimulai, bukan di garis pantainya.
Kepada orang tersebut ditunjukkan di mana layanan tersedia, tetapi tidak pernah diperlihatkan area mana saja yang diblokir.
Aturan area juga berfungsi pada langkah `ip_only`, yang dinilai dari lokasi IP.
Pengaturan `geolocation_geofencing_by_country` yang lebih lama masih berfungsi tetapi tidak dapat digabungkan dengan `geolocation_areas`.

## Pemeriksaan jarak

| Pemeriksaan | Diukur antara | Pengaturan |
| - | - | - |
| Jarak IP | Posisi perangkat dan lokasi IP, setelah mengurangi kedua radius ketidakpastian (0 berarti saling tumpang tindih). | `geolocation_ip_distance_km`, `geolocation_ip_distance_action` |
| Jarak dokumen | Posisi dan alamat, yang di-geocode secara kasar, sehingga ini merupakan sinyal yang lemah. | `geolocation_document_distance_km`, `geolocation_document_distance_basis`, `geolocation_document_distance_action` |
| Runtunan | Pemeriksaan orang tersebut sebelumnya (`vendor_data` yang sama) yang berada di luar area yang diizinkan, di area yang diblokir, atau terlalu jauh dari alamat. | `geolocation_consecutive_mismatch_count` |

`geolocation_document_distance_basis` memilih alamat: `document` (dokumen identitas, lalu Bukti Alamat), `proof_of_address`, atau `declared` (`expected_details.address` dari pembuatan sesi).
Dengan `geolocation_travel_tolerance_enabled`, seseorang yang terlihat di dekat alamatnya dalam `geolocation_travel_max_days` hari terakhir tidak akan ditandai karena berada jauh dari alamat tersebut saat ini.
Toleransi perjalanan tidak pernah mentolerir VPN, posisi spoofing, area yang diblokir, atau posisi di luar area yang diizinkan.

## Sinyal integritas dan spoofing

* **Penyedia mock**: Android dan iOS melaporkan ketika suatu posisi disimulasikan alih-alih diukur.
* **Atestasi perangkat**: SDK native dapat menyertakan atestasi perangkat. Atestasi yang gagal selalu ditolak. Atestasi yang tidak ada dicatat dan secara default tanpa tindakan. Browser tidak dapat melakukan atestasi dan dicatat sebagai `unsupported`, bukan sebagai kegagalan.
* **VPN, proxy, dan Tor**: ditemukan pada koneksi yang membagikan lokasi. Jika tindakan Anda untuk salah satunya bukan `NO_ACTION`, orang tersebut diminta untuk mematikannya dan memeriksa ulang selama kesempatan mencoba masih ada.
* **Emulator**: dilaporkan oleh aplikasi native saja. Emulator mengakhiri langkah pada percobaan tersebut karena mencoba lagi tidak akan mengubah perangkat.
* **Replay**: tantangan yang ditampilkan pada sesi lain selalu ditolak.

## Hasil

Percobaan yang diterima untuk langkah ini memiliki satu `outcome`:

| Hasil | Arti |
| - | - |
| `verified` | Posisi yang memenuhi setiap aturan. |
| `low_accuracy` / `accuracy_undetermined` | Radius lebih lebar dari batas, atau perangkat tidak melaporkan radius sama sekali. |
| `stale` | Posisi lebih lama dari `geolocation_max_age_seconds`. |
| `approximate` | Hanya posisi perkiraan yang diberikan padahal posisi presisi diwajibkan. |
| `denied` / `restricted` | Orang tersebut menolak, atau sistem memblokir lokasi. |
| `unavailable` / `timeout` | Perangkat tidak menemukan posisi, atau tidak tepat waktu. |
| `mock_detected` | Sistem melaporkan posisi sebagai simulasi. |
| `outside_geofence` / `in_blocked_area` | Posisi berada di luar semua area yang diizinkan, atau berada di area yang diblokir. |
| `anonymizer_detected` | VPN, proxy, node keluar Tor, atau emulator ditemukan dan alur kerja Anda menindaklanjutinya. |
| `skipped` | Orang tersebut melanjutkan tanpa membagikan lokasi. |
| `replay_rejected` | Tantangan tersebut milik sesi lain. |
| `unsupported_client` | Aplikasi atau SDK terlalu lama untuk menampilkan langkah ini. |

Selama kesempatan mencoba masih ada, temuan radius lebar, usang, perkiraan, penolakan, atau area meminta orang tersebut untuk mencoba lagi, dan hanya percobaan terakhir yang memunculkan peringatan.
Posisi tiruan (mock), atau emulator yang ditindaklanjuti oleh alur kerja Anda, mengakhiri langkah pada percobaan yang melaporkannya.

## Pengalaman pengguna

### Persetujuan dan izin

Tidak ada data yang dibaca sebelum orang tersebut menyetujui pemberitahuan dan menjawab prompt sistem.
Pemberitahuan tersebut menyatakan bahwa lokasi dibaca satu kali, untuk verifikasi ini, dan bukan merupakan catatan pergerakan mereka.
Seseorang yang menolak akan diperlakukan sesuai dengan `geolocation_refusal_path`:

* `retry_then_handoff` meminta kembali selama kesempatan mencoba masih ada dan kemudian menawarkan untuk melanjutkan di ponsel.
* `continue_without_location` menawarkan untuk melanjutkan tanpa lokasi, dan mencatat penolakan sebagai hasilnya.
* `end_session` mengakhiri langkah dan sesi pada penolakan pertama. Opsi ini mewajibkan `geolocation_permission_denied_action` bernilai `REVIEW` atau `DECLINE`, dan sesi tidak akan pernah disetujui.

Dengan `geolocation_allow_skip` aktif, orang tersebut dapat melanjutkan tanpa lokasi kapan saja, dan langkah ini dinilai berdasarkan `geolocation_unavailable_action`.

### Browser

Alur yang di-hosting meminta browser memberikan posisi dan menampilkan bantuan langkah demi langkah untuk Chrome dan Safari saat lokasi dinonaktifkan untuk situs tersebut.
Browser tidak dapat membedakan izin presisi dari perkiraan, sehingga hasil web tidak pernah memunculkan `LOCATION_APPROXIMATE_ONLY`, dan tidak pernah melaporkan penyedia mock, emulator, atau atestasi.
Komputer tidak dapat membagikan posisi yang presisi, sehingga alur ini menawarkan kode QR untuk melanjutkan verifikasi yang sama di ponsel orang tersebut (`geolocation_allow_qr_handoff`, aktif secara default), dan komputer akan melanjutkan sendiri saat ponsel selesai.
Saat Anda menyematkan alur ini dalam iframe, sertakan `geolocation` dalam atribut `allow`, lihat [in-context iframe](https://docs.didit.me/id/integration/web-sdks/incontext-iframe.md).
Halaman yang memblokir kebijakan izin geolokasi diperlakukan sebagai keputusan situs, bukan penolakan dari orang tersebut.

### SDK native

SDK iOS dan Android meminta posisi kepada sistem operasi dan dapat menyertakan atestasi perangkat serta tanda mock-location.
Pada iOS tambahkan `NSLocationWhenInUseUsageDescription` ke `Info.plist`, dan pada Android SDK mendeklarasikan `ACCESS_FINE_LOCATION` serta `ACCESS_COARSE_LOCATION` dan memintanya saat runtime hanya ketika sebuah alur kerja memiliki langkah ini.
Lihat [SDK native](https://docs.didit.me/id/integration/native-sdks/overview.md).
Pemberian izin perkiraan pada iOS atau Android memunculkan `LOCATION_APPROXIMATE_ONLY` kecuali jika `geolocation_accuracy_mode` bernilai `approximate_allowed`.
Build aplikasi atau SDK yang dibuat sebelum adanya langkah ini diselesaikan dengan status `unsupported_client` alih-alih membiarkan sesi macet.

## Apa yang dikembalikan oleh keputusan

[Keputusan sesi](https://docs.didit.me/id/sessions-api/retrieve-session.md) dan webhook `status.updated` memuat dua daftar:

* `geolocation_checks[]`: satu item per langkah Lokasi, yang menyimpan percobaan yang diterima untuk langkah tersebut, beserta `warnings` miliknya.
* `geolocation_attempts[]`: setiap percobaan dari setiap langkah Lokasi, diurutkan dari yang paling lama.

Lihat [laporan verifikasi lokasi](https://docs.didit.me/id/core-technology/location-verification/report-location-verification.md) untuk setiap kolom.
Koordinat, akurasi, kota, dan negara merupakan data pribadi pengguna akhir, sehingga atribut respons alur kerja dapat membatasi kolom `geolocation_checks` mana saja yang dikembalikan oleh keputusan Anda.

## Harga

Verifikasi lokasi berbiaya **\$0.05 per pemeriksaan**, dan ini bukan bagian dari paket gratis.
Didit menagih biaya satu kali per langkah Lokasi dalam sebuah sesi, apa pun hasilnya, karena pemeriksaan telah berjalan dan memberikan jawaban.
Percobaan ulang dalam langkah yang sama tidak dikenakan biaya.
Pengiriman ulang yang kembali menyelesaikan langkah tersebut akan ditagih kembali.

## Sandbox

Sesi sandbox menjalankan langkah yang sama di alur yang di-hosting yang sama, dan perangkat atau browser tetap melaporkan posisi sebenarnya.
Sesi sandbox tidak pernah menghubungi layanan pencarian IP, sehingga perbandingan IP hanya menggunakan apa yang sudah tersimpan di sesi tersebut.
Penggunaan dicatat dengan harga 0, sehingga sesi sandbox tidak pernah dikenakan biaya.
Tidak ada input ajaib untuk langkah ini.

## Terkait

* [Laporan verifikasi lokasi](https://docs.didit.me/id/core-technology/location-verification/report-location-verification.md) - setiap kolom dari `geolocation_checks[]` dan `geolocation_attempts[]`.
* [Peringatan verifikasi lokasi](https://docs.didit.me/id/core-technology/location-verification/warnings-location-verification.md) - setiap kode `LOCATION_*` beserta tindakannya.
* [Konfigurasi fitur alur kerja](https://docs.didit.me/id/management-api/workflows/feature-configs.md#verifikasi-lokasi) - setiap kunci `geolocation_*`.
* [Analisis Perangkat & IP](https://docs.didit.me/id/core-technology/ip-analysis/overview.md) - geolokasi IP dan pemeriksaan VPN untuk sesi tersebut.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.