A customer taps their card and your form fills in under a second, in English and Arabic, with photo. No re-typing, no browser plugins, no per-PC installer pain.
Anywhere staff re-type Emirates ID details today.
Fill visa, residency and government forms from the card in one tap.
Register patients at reception using the Emirates ID as the patient key.
Capture resident guests at check-in, ready for tourism and police reporting.
Auto-fill tenancy and rental contracts with the correct legal name.
Self check-in kiosks, badges, and access logs with masked IDs.
An allowed / not-allowed answer that stores nothing.
Start building in two minutes. You don't need a reader: the mock bridge speaks the exact same protocol.
npx @elephantclock/eid-connect-mock # press c to send a synthetic Emirates ID card
npm install @elephantclock/eid-connect
import { connect } from '@elephantclock/eid-connect';
connect({
onCard: (card) => {
form.name.value = card.nameEnglish;
form.nameArabic.value = card.nameArabic;
form.emiratesId.value = card.idNumber;
form.dob.value = card.dateOfBirth; // ISO yyyy-MM-dd
photo.src = card.photoDataUrl;
},
});
React: import { useEidReader } from '@elephantclock/eid-connect/react'. More in the client library and the examples.
The service is a small local HTTP server. Any language that can read Server-Sent Events can integrate: JavaScript, C#, Python, Flutter, Java.
| Endpoint | Description |
|---|---|
GET /events | SSE stream. Each message is data: {json} with a type field. A : heartbeat comment every 30 s keeps proxies open. |
GET /status | {"status":"running","clients":1,"timestamp":"…"}, for health checks. |
Default address http://localhost:8080.
connection{ "type": "connection", "status": "connected", "timestamp": "2026-10-26T10:15:02.114", "clientId": "1077432858" }
card_read{
"type": "card_read",
"timestamp": "2026-10-26T10:15:09.552",
"id": "784-0000-0000001-0",
"cardNumber": "000000001",
"cardSerialNumber": "0000000000000001",
"nfcUid": "0000000000000001",
"status": "SUCCESS",
"fullNameEnglish": "SAMPLE CARDHOLDER ONE",
"fullNameArabic": "حامل بطاقة تجريبي واحد",
"nationality": "United Arab Emirates",
"nationalityArabic": "الإمارات العربية المتحدة",
"gender": "M",
"dateOfBirth": "01/01/1990",
"issueDate": "01/01/2024",
"expiryDate": "01/01/2029",
"photo": "<base64 image>",
"photoSize": 18432,
"cardCount": 1,
"readerState": "CONNECTED"
}
Dates are typically dd/MM/yyyy. The client library converts them to ISO yyyy-MM-dd.
nfc_card_readA non-Emirates-ID NFC tag (staff badge, membership card), or UID-only mode when a full read isn't available.
{ "type": "nfc_card_read", "timestamp": "…", "uid": "04A1B2C3", "cardType": "MIFARE_CLASSIC_1K", "sak": "0x08",
"readerType": "NFC", "readerState": "CONNECTED", "cardCount": 2 }
UID-only reads also carry "fallback": true, nfcUid, cardSerialNumber and readerName.
error{ "type": "error", "message": "Card data conversion failed", "timestamp": "…" }
Emirates ID data is personal data under UAE PDPL. EID Connect listens on the local PC only, and you choose which apps may receive card data.
| Setting | Default | Purpose |
|---|---|---|
EID_BIND_ADDRESS | 127.0.0.1 | Listens on this PC only. Set 0.0.0.0 only when tablets or kiosks on the LAN must connect, and firewall the port. |
EID_ALLOWED_ORIGINS | unset = any origin, with a warning logged | Comma-separated list of the web app origins allowed to receive card data, e.g. https://app.example.ae. Every other website is refused. Always set this in production. |
Free to learn with. Licensed for business.
A 20-minute live demo in Abu Dhabi, Dubai or online.