The Contact Picker API lets web apps on supported mobile browsers open the device’s native contact chooser so users can quickly share specific contact details—like name, phone, email, address, and avatar—without granting blanket access to their entire address book.
Important
As of today, the API is available on Chrome for Android (and some Chromium-based browsers on Android). It won’t work on desktop browsers.
Key benefits
- User-driven sharing: The system picker appears only after a user action (like a tap), and users explicitly choose which contact(s) to share.
- Field-level consent: Apps request specific fields, and only those approved are returned.
- Privacy-first: No background scanning or persistent access—just a one-time, scoped result.
- Mobile-native UX: Leverages the familiar contacts interface for fewer typos and faster form filling.
- Lower friction: Ideal for autofilling invite flows, shipping forms, emergency contacts, and referral features.
Availability and constraints
- Platform support is currently limited to Chrome for Android and some Chromium-based Android browsers.
- Not available on desktop browsers or iOS Safari at this time.
- Must be triggered by a user gesture (e.g., button click).
Contact Picker API Demo
Contact Picker API Demo
Note: This demo only works on Chrome for Android (or compatible browsers on Android).
It will not work on desktop browsers.
Selected Contact:
(none yet)
body {
font-family: sans-serif;
margin: 2em;
}
button {
font-size: 1.2em;
padding: 0.5em 1em;
}
pre {
background: #f4f4f4;
padding: 1em;
border-radius: 5px;
}
// Get references to the button and output area
const pickContactBtn = document.querySelector('#pickContactBtn');
const output = document.querySelector('#output');
// Function to handle contact picking
const pickContact = async () => {
// Check if the Contact Picker API is available in this browser
if ('contacts' in navigator && 'ContactsManager' in window) {
try {
// Define which fields you want to request from the contact
const props = ['name', 'email', 'tel', 'address', 'icon'];
// Options: allow picking only one contact (multiple: false)
const opts = { multiple: false };
// Open the contact picker and wait for the user's selection
const contacts = await navigator.contacts.select(props, opts);
// Display the selected contact(s) in the output area
if (contacts.length > 0) {
output.textContent = JSON.stringify(contacts[0], null, 2);
} else {
output.textContent = '(No contact selected)';
}
} catch (err) {
// Handle errors (e.g., user cancels, permission denied)
output.textContent = 'Error: ' + err.message;
}
} else {
// API not supported in this browser
output.textContent =
'Contact Picker API not supported on this browser/device.';
}
};
// Attach the function to the button's click event
pickContactBtn.addEventListener('click', pickContact);
In short, the Contact Picker API brings a secure, consent-based bridge between the web and a user’s contacts, dramatically improving mobile form UX while respecting privacy.

