Romanian eID & Passport NFC Reader SDK for React Native
npm install react-native-romanian-eid-sdkRomanian eID & Passport NFC Reader SDK for React Native. Read Romanian electronic identity documents (ePassports and ID cards) using NFC technology.


- ✅ NFC Passport Reading - Read Romanian ePassports using BAC/PACE protocols
- ✅ NFC ID Card Reading - Read Romanian electronic ID cards using PACE
- ✅ MRZ Scanning - Camera-based MRZ (Machine Readable Zone) scanning
- ✅ OCR Scanning - Extract data from old non-NFC ID cards using OCR
- ✅ CSCA Validation - Validate document authenticity with CSCA certificates
- ✅ Biometric Extraction - Extract photos and signatures from documents
- ✅ ICAO 9303 Compliant - Full compliance with international standards
- ✅ License Management - Secure JWT-based license system
- ✅ TypeScript Support - Full TypeScript definitions included
``bash`
npm install react-native-romanian-eid-sdkor
yarn add react-native-romanian-eid-sdk
1. Install CocoaPods dependencies:
`bash`
cd ios && pod install
2. Add required capabilities to your Info.plist:
`xml
`
3. Enable NFC capability in Xcode:
- Open your project in Xcode
- Select your target → Signing & Capabilities
- Click "+ Capability" → Near Field Communication Tag Reading
4. Add the RomanianEIDSDK.xcframework to your project (already included in the pod).
1. Add permissions to AndroidManifest.xml:
`xml
android:required="false" />
android:required="false" />
`
2. TODO for Android developer: Complete the native Android implementation in android/src/main/java/com/rnromanianeidsdk/RNRomanianEIDSDKModule.java. See inline comments for detailed instructions.
`typescript
import EIDReader from 'react-native-romanian-eid-sdk';
// Initialize with your license key
await EIDReader.initialize('YOUR_LICENSE_KEY_JWT');
`
`typescript
// Scan MRZ first (optional, or enter manually)
const mrzResult = await EIDReader.startMRZScanning();
// Read passport via NFC
const result = await EIDReader.readPassport(mrzResult.mrzKey, {
enableCSCAValidation: true,
timeout: 60,
});
console.log('Name:', result.fullName);
console.log('Document:', result.documentNumber);
console.log('Photo:', result.facialImageBase64); // base64 encoded image
`
`typescript
// Read electronic ID card via NFC
const result = await EIDReader.readIDCard(
'123456', // CAN (6 digits)
'1234', // PIN (4-8 digits)
{
enableCSCAValidation: true,
readPhoto: true,
readSignature: true,
timeout: 90,
}
);
console.log('CNP:', result.cnp);
console.log('Name:', result.fullName);
console.log('Address:', result.permanentAddress);
`
`typescript
// For old non-NFC ID cards
const result = await EIDReader.startOCRScanning();
if (result.isReliable) {
console.log('CNP:', result.cnp);
console.log('Name:', result.fullName);
console.log('Confidence:', result.confidence);
} else {
console.warn('Low confidence:', result.validationIssues);
}
`
#### initialize(license: string): Promise
Initialize SDK with license key.
`typescript`
await EIDReader.initialize('eyJhbGciOiJIUzI1NiIs...');
#### readPassport(mrzKey: string, options?: PassportReadOptions): Promise
Read Romanian ePassport via NFC.
Parameters:
- mrzKey - MRZ key (format: DocumentNumber+DOB+Expiry with check digits)options
- - Optional configuration
Options:
`typescript`
{
enableCSCAValidation?: boolean; // Default: true
timeout?: number; // Default: 60 seconds
}
Returns: PassportResult with document data and biometrics.
#### readIDCard(can: string, pin: string, options?: IDCardReadOptions): Promise
Read Romanian electronic ID card via NFC.
Parameters:
- can - Card Access Number (6 digits printed on card)pin
- - Personal PIN (4-8 digits)options
- - Optional configuration
Options:
`typescript`
{
enableCSCAValidation?: boolean; // Default: true
readPhoto?: boolean; // Default: true
readSignature?: boolean; // Default: true
timeout?: number; // Default: 90 seconds
}
Returns: IDCardResult with personal data, addresses, and biometrics.
#### startMRZScanning(): Promise
Open camera to scan MRZ from passport.
Returns: MRZScanResult with parsed MRZ data and mrzKey for NFC reading.
#### startOCRScanning(): Promise
Open camera to scan old non-NFC ID card using OCR.
Returns: OCRScanResult with extracted data and confidence scores.
#### isNFCAvailable(): Promise
Check if NFC is available and SDK is initialized.
#### getLicenseInfo(): Promise
Get current license information.
`typescript${event.percentage}%: ${event.message}
// Progress updates during NFC reading
const subscription = EIDReader.onReadProgress((event) => {
console.log();
});
// Remember to unsubscribe
subscription.remove();
// or
EIDReader.removeAllListeners();
`
#### PassportResult
`typescript`
{
success: boolean;
documentNumber: string;
fullName: string;
dateOfBirth: string;
nationality: string;
sex: string;
dateOfExpiry: string;
cnp?: string;
placeOfBirth?: string;
residenceAddress?: string;
phoneNumber?: string;
facialImageBase64?: string; // JPEG base64
signatureImageBase64?: string; // PNG base64
cscaValidated: boolean;
cscaCountry?: string;
errorMessage?: string;
}
#### IDCardResult
`typescript`
{
success: boolean;
documentNumber: string;
cnp: string;
fullName: string;
dateOfBirth: string;
sex: string;
dateOfExpiry: string;
issuingAuthority?: string;
placeOfBirth?: string;
citizenship?: string;
permanentAddress?: string;
temporaryAddress?: string;
foreignAddress?: string;
facialImageBase64?: string;
signatureImageBase64?: string;
cscaValidated: boolean;
errorMessage?: string;
}
`typescript`
try {
const result = await EIDReader.readPassport(mrzKey);
} catch (error) {
switch (error.code) {
case 'NFC_NOT_AVAILABLE':
console.error('NFC not available on this device');
break;
case 'INVALID_MRZ':
console.error('Invalid MRZ key');
break;
case 'USER_CANCELLED':
console.log('User cancelled the operation');
break;
case 'READ_TIMEOUT':
console.error('Reading timed out');
break;
case 'LICENSE_INVALID':
console.error('Invalid or expired license');
break;
default:
console.error('Error:', error.message);
}
}
A complete example app is included in the example/ directory. To run it:
`bashInstall dependencies
cd example
yarn install
The example app demonstrates:
- Passport reading with MRZ scanning
- ID card reading with CAN/PIN input
- OCR scanning for old cards
- License status display
This SDK is commercial software. A valid license key is required for use.
For licensing information, contact: office@up2date.ro
- Email: office@up2date.ro
- Documentation: Full API Docs
- Issues: GitHub Issues
- All NFC communication is encrypted (BAC/PACE protocols)
- No data is sent to external servers
- CSCA validation performed locally
- Biometric data never leaves the device
- License validation done via JWT
Developed by Up2Date Software
© 2025 Up2Date. All rights reserved.