Selo
An identity verification service that receives media straight from the user, analyses it in three stages, sends every refusal to human review, and returns a signed verdict to your company.
Last updated October 2026.
Stages of the analysis
The analysis starts when the user confirms the upload and runs in three stages, in this order: document authenticity, liveness and face comparison. If a stage fails, the following ones do not run. After them Selo checks uniqueness, which links the document to a single account.
Media is opened with the session key in memory only, during the analysis, and is never written in the clear. Scores and face models exist only while the analysis runs.
Document
Accepts Brazilian ID cards (RG), driving licences (CNH) and passports. For passports the photo page is used; for the others, front and back. The stage checks printed features visible in a photo, the machine-readable zone (check digits and consistency with the visual zone), validity, legibility, and whether front and back belong to the same document.
Only three data points leave the document:
| Data point | Use |
|---|---|
| Date of birth | Checks age of majority. Does not appear in the verdict, logs or audit trail. |
| Document number | Becomes a pseudonym (HMAC-SHA256 with a secret kept in the KMS). The plaintext number is discarded right after the computation. |
| Expiry | Fails an expired document. Discarded together with the session. |
The sex field on the document is masked when it is read. The system cannot read it, and no schema, table or message in Selo has a sex or gender field.
Liveness
The user receives a challenge on camera, valid for two minutes. The validity is checked on confirmation, and an expired challenge does not pass. The liveness engine must come, by contract, with an accredited lab test under ISO/IEC 30107-3, level 1 at minimum and level 2 as the target.
Face comparison
The face from the liveness check is compared with the face on the document. The operating point is at most 1 false match in 100,000 comparisons, per the engine calibration, and the false non-match rate is monitored on every release. The score does not go into the verdict, the logs or the database.
Fairness is tracked per group, in aggregate and with groups of at least 20 people, with a monthly review of refusal and reversal rates.
Uniqueness
Once the three stages pass, the document pseudonym is linked to the account in a single transaction. If the same document is already linked to another active account, the images are destroyed immediately and the case goes to review without media.
Selo does not compare faces across accounts, because it stores no face models. That kind of deduplication is ruled out in the specification. The pseudonym is kept while the linked account exists, and velocity signals for 90 days.
Human review
Every automated refusal becomes a case for a trained person. The review console sits on a separate origin from the API, requires a second factor and keeps the session for eight hours. Each case is delivered to one person at a time, and the system enforces that rule.
The decision is approve or deny, within 48 hours of the case being created. An appeal is answered in writing within 48 hours, by a different person from the one who decided the original case. No role, including administrator, can export media.
Verdict and webhook
The verdict is approved, refused with a technical reason, or under review. When a session ends without a decision on the merits, your company receives the closure: expired, review not completed, or document already linked, with a flag saying the user earned a free new attempt.
{
"sessaoId": "ses_01J9K3MV7QX2",
"versaoDoLaudo": 1,
"versaoDoContrato": "2",
"laudo": "aprovada",
"motivo": null,
"emitidoEm": "2026-10-03T14:21:07Z",
"assinatura": { "kid": "2026-09", "nonce": "c6f1…" }
}The webhook is signed with Ed25519, identifies the key by kid so it can be rotated, carries a timestamp with a 5 minute tolerance and a unique identifier, and is idempotent per session and verdict version. Status polling exists as a fallback. Every route has a closed response schema.
| Refusal reason | Meaning |
|---|---|
| imagem_borrada | The capture is not good enough for the checks. |
| reflexo | Glare covers part of the document. |
| documento_vencido | The document has expired. |
| rosto_coberto | The face is not visible enough for the comparison. |
| idade_nao_confirmada | Age of majority was not confirmed by the document. |
Gender, appearance and name mismatch do not exist as a reason, criterion or field. The reason returned is always technical.
Service parameters
| Parameter | Value |
|---|---|
| Upload credential | Single use, 15 minutes, limited to one session. Media goes from the device straight to Selo. |
| Device integrity | Play Integrity (Android) and App Attest (iOS) when the session opens. |
| Attempts | Up to 3 per 24 hours per account, with the remaining time shown to the user. |
| Media per upload | Up to 40 MB. The format is validated by the file bytes and the image is re-encoded before analysis, which removes EXIF and GPS. |
| Automated verdict | p95 of up to 60 seconds after the last upload. Operational target. |
| Engine unavailable | The session is kept until the 72 hour limit. After that it closes without a decision on the merits and with a free new attempt. |
| Session API availability | 99.5% per month. Operational target. |
| Human review | 48 hours to decide and 48 hours to answer an appeal. |
| Image retention | Approval: immediate destruction. Refusal: until the decision, with a limit of 72 hours from the session opening. |
Integration
Your application talks to Selo over mTLS at two moments. It opens the session, supplying a pseudonymous account reference, the consent record, the declared date of birth and the document type. And it receives the verdict through the webhook, with status polling as a fallback. Name, chosen name, gender and email are not sent to Selo, which has no field for them.
Capture is done by your application, and the user uploads the media straight to Selo with the session credential. The integration documentation, the versioned contract and the staging environment are delivered at the start of the pilot.
Under development
| Item | Status |
|---|---|
| Deepfake and video-injection detection in liveness | Under development. Without a lab test, it is not presented as a Selo feature. |
| Verification of the physical security features of the document | Not done by the in-house document reader. The gap is covered by human review. |
| Query to an official database (Serpro Datavalid, gov.br) | Phase 2. Requires new specific consent and a revised impact assessment. It does not exist yet. |
| Biometric deduplication across accounts | Ruled out: it would require storing face models. |
Questions about this page: contato@lassotech.com.br