kyc-ai / laravel
Laravel KYC: extract identity documents with AI and verify with country-specific validators.
v1.0.0
2026-06-12 19:10 UTC
Requires
- php: ^8.2
- illuminate/bus: ^10.0|^11.0|^12.0|^13.0
- illuminate/contracts: ^10.0|^11.0|^12.0|^13.0
- illuminate/database: ^10.0|^11.0|^12.0|^13.0
- illuminate/events: ^10.0|^11.0|^12.0|^13.0
- illuminate/http: ^10.0|^11.0|^12.0|^13.0
- illuminate/queue: ^10.0|^11.0|^12.0|^13.0
- illuminate/routing: ^10.0|^11.0|^12.0|^13.0
- illuminate/support: ^10.0|^11.0|^12.0|^13.0
- illuminate/validation: ^10.0|^11.0|^12.0|^13.0
- symfony/process: ^6.4|^7.0
- validators/sa: ^1.0
Requires (Dev)
- orchestra/testbench: ^9.0|^10.0
- phpunit/phpunit: ^11.5
- validators/ae: ^1.0
- validators/eg: ^1.0
Suggests
- ext-fileinfo: Better MIME detection for uploaded documents
- filament/filament: Admin UI for manual KYC review (^3.0)
- validators/ae: UAE Emirates ID internal verification
- validators/eg: Egyptian national ID internal verification
README
Laravel package for KYC workflows: extract identity fields from documents (AI/OCR), verify with country-specific validators packages, and optionally call external providers.
v1.0 · SA / AE / EG · fake · OpenAI · Tesseract · Queue · API · Demo UI · Filament review
Install
composer require kyc-ai/laravel
# Optional countries
composer require validators/ae validators/eg
php artisan vendor:publish --tag=kyc-config
Quick start
Internal only (no AI)
use KycAi\Laravel\Facades\Kyc; use KycAi\Laravel\KycLevel; $result = Kyc::number('1001244084') ->country('sa') ->level(KycLevel::Internal) ->verify();
Document + extraction + internal verify
$result = Kyc::document($request->file('id_front')) ->country('sa') ->extractWith('fake') // fake | tesseract | openai ->matchAgainst($request->input('national_id')) ->verify(); $result->approved(); $result->needsManualReview(); $result->toArray();
Async queue
Kyc::document($file) ->country('sa') ->forUser($user->id) ->dispatch();
Validation rule
use KycAi\Laravel\Rules\KycDocument; 'id_front' => ['required', 'image', new KycDocument(country: 'sa', matchField: 'national_id')],
Verification levels
| Level | Extraction | Internal | External |
|---|---|---|---|
internal |
No | Yes | No |
standard |
Yes | Yes | No |
full |
Yes | Yes | Yes (opt-in) |
Drivers
| Extraction | Sends data outside? |
|---|---|
fake |
No |
tesseract |
No |
openai |
Yes |
| External | Sends data outside? |
|---|---|
shufti |
Yes (requires API keys) |
KYC_EXTRACTION_DRIVER=fake OPENAI_API_KEY= TESSERACT_BINARY=tesseract KYC_EXTERNAL_ENABLED=false KYC_EXTERNAL_DRIVER=shufti
Demo UI
KYC_ROUTES_DEMO=true
See demo/README.md.
API
KYC_ROUTES_API=true
POST /api/kyc/verify with country, optional national_id, optional document.
Audit log + Filament
php artisan vendor:publish --tag=kyc-migrations php artisan migrate
KYC_AUDIT_ENABLED=true
use KycAi\Laravel\Filament\KycFilamentPlugin; $panel->plugin(KycFilamentPlugin::make());
Development
composer install composer test # 119 tests
Monorepo setup: docs/TESTING.md.
Architecture: docs/DESIGN.md.
Disclaimer
Internal validation checks format and checksum only — not government registry verification.
License
MIT — see LICENSE.