TrustWixDocs
Handle results

Applicant data

Reading the identity behind a verdict, and the images it was read from

A verdict tells you whether to let someone in. It does not tell you who they are. When you need the name, the date of birth or the document number that the verification actually established, ask for it explicitly when you retrieve the verification.

curl "https://api.trustwix.com/v1/verifications/vs_2f8a1c9b4e7d?include=applicant,documents" \
  -H "Authorization: Bearer TWK_..."

include takes a comma-separated list. applicant adds the identity read from the document, documents adds the captured images, and values we do not recognise are ignored. Ask for only what you will use.

This needs a permission you do not have by default

Both expansions require the applicant:read scope, and that scope is in neither environment's default permission set, on purpose. It is the only scope that returns a real person, so it is granted per key on request rather than inherited by every key you have ever created. Ask us and we enable it on one specific key, which you can then revoke on its own without disturbing the rest of your integration.

Requesting an expansion without the scope returns 403 rather than quietly dropping the field from the response. That is deliberate, and it is the property you want: a missing applicant always means the verification has no applicant data, never that your key was not allowed to see it. You will never silently write an empty name into your own database.

Only read this if you need to store it

Every field here is personal data, and most of it is special-category data under most privacy regimes. If your product only needs to know whether the person passed, use the verdict and do not request the expansion at all. That is the cheapest compliance posture available to you.

The applicant object

{
  "applicant": {
    "object": "applicant_data",
    "fields": {
      "full_name": "Ana Beatriz Silva",
      "date_of_birth": "1991-04-17",
      "nationality": "BRA",
      "document_number": "FX1234567",
      "expiry_date": "2031-04-16"
    }
  }
}

fields is a flat map of name to string value, and every field is optional. This is not hedging: the document decides what exists. A passport carries no licence class, some national cards carry a father's name, and plenty of documents omit a field you might assume is universal. Write your code to handle each field being absent, and never index into this map assuming a key is there.

Common names are full_name, first_name, last_name, date_of_birth, sex, nationality, document_number, personal_number, expiry_date, issue_date, address and email. New names can appear, so treat the map as open.

A name ending in _native carries the same value in the script printed on the document rather than transliterated into Latin characters. If you serve applicants whose documents are in Arabic, Persian, Cyrillic or any non-Latin script, these are the values to show back to the person, and the transliterated form is the one to match against your existing records.

The documents array

{
  "evidence": [
    {
      "id": "ev_3c81f0a2",
      "object": "evidence",
      "kind": "passport",
      "side": null,
      "url": "https://…",
      "url_expires_in": 900,
      "mrz_valid": true,
      "barcode_consistent": null,
      "country": "BRA",
      "captured_at": "2026-07-26T16:30:14.000Z"
    }
  ]
}
FieldNotes
kindpassport, id_card, drivers_license, residence_permit, selfie or liveness_frame.
sidefront or back on a document with two, null otherwise.
urlShort-lived download url. See below.
url_expires_inSeconds the url stays valid, counted from when the response was built.
mrz_validWhether the machine-readable zone checksums passed. null means the document has none, which is not a failure.
barcode_consistentWhether the barcode agrees with the printed fields. null means there was no barcode to read.
countryThe issuing country, when we could establish it.

The url expires, and then it goes away

url is presigned and short-lived. Fetch it promptly and store the bytes yourself if you need to keep them, because a url you cached will stop working long before the image does.

url is also null once the image has passed our retention window and been deleted. The evidence record stays, so you keep the fact that a passport was captured and that its MRZ checked out, but the image itself is gone and no call will bring it back. Treat null as final rather than as an error to retry.

A note on where this belongs

The point of the hosted flow is that biometric data never touches your infrastructure. Requesting documents reverses that for the images you fetch: from the moment you download one, it is in your logs, your backups and your compliance scope. Plenty of teams need exactly that, for a regulator or a manual review desk of their own. Just make it a decision rather than a default.

On this page