API Reference
Complete VeroID API documentation
Base URLs
| Environment | Base URL | Key |
|---|---|---|
| Test hub | https://test-api.veroid.com.au | sk_test_* |
| Production | https://api.veroid.com.au | sk_live_* |
Live keys are only issued after VeroID approves your account for live production verification, and return 403 on every endpoint until then. See Authentication.
All requests must include the X-API-Key header.
Verify Document
Verify an identity document by checking details with the document issuer or official record holder.
POST /v1/verify
Embedded document session
Developer accounts only. Creates a consent-first iframe session (typed fields, no SMS or biometrics). See Embedded document form for mounting the SDK and webhooks.
POST /v1/verify/embed-sessions
Optional prefill object: givenName, familyName, dateOfBirth (YYYY-MM-DD), middleName (driver's licence only), and gender (M, F, or X; passport only). Non-empty values hide the matching field in the iframe and are merged at submit (never returned to the browser or webhook). For givenName, familyName, and dateOfBirth, null or "" means not provided. For middleName, null or "" means the person has no middle name: hide the field and run the check without a middle name; omit the key to show the field. For gender on passport sessions, null or "" hides the field and runs the check without gender; omit the key to show the optional field. On other document types, gender in prefill is ignored. Invalid prefill returns 400 / INVALID_PREFILL with a field-specific message.
{
"consentVersion": "1.0",
"documentType": "drivers_licence",
"allowedOrigins": ["https://app.example.com"],
"prefill": {
"givenName": "Jane",
"middleName": null,
"familyName": "Public",
"dateOfBirth": "1985-06-20"
}
}Request Headers
| Header | Required | Description |
|---|---|---|
Content-Type | Yes | Must be application/json |
X-API-Key | Yes | Your API key |
Common Request Fields
Every request requires documentType, consentAttestedAt, and consentVersion, plus the document-specific fields - see Document Types for per-document schemas. Design consent flows using Consent & IVS obligations and official IDMatch guidance.
| Field | Type | Required | Description |
|---|---|---|---|
documentType | string | Yes | One of: drivers_licence, passport, medicare, visa, birth_certificate, citizenship, immicard, marriage_certificate, change_of_name_certificate, death_certificate, centrelink, asic_msic |
consentAttestedAt | string | Yes | ISO 8601 datetime recording when the subject gave consent to their identity being verified (e.g. 2026-05-19T10:30:00Z). Required by IVS terms and conditions clause 19.2. |
consentVersion | string | Yes | Version of the privacy disclosure shown to the subject at the time of consent (e.g. "1.0"). Required by IVS terms and conditions clause 19.3. |
givenName | string | Most types | Given name. Field limits vary by document type. Not used for Medicare (use fullName instead), Centrelink (use name), or ASIC/MSIC (use nameOnCard). |
familyName | string | Most types | Family name. Field limits vary by document type. Not used for Medicare, Centrelink, or ASIC/MSIC. |
dateOfBirth | string | Most types | Full date YYYY-MM-DD (day, month, and year) whenever dateOfBirth is sent. Optional for Medicare and Centrelink; required on all other document types that include date of birth. |
Response (POST /v1/verify)
The real-time verification result is returned in the response body. The status and match fields reflect the verification outcome and are only available here - they are not stored or retrievable via the GET endpoints.
{
"success": true,
"verificationId": "ver_abc123xyz",
"documentType": "drivers_licence",
"status": "success",
"match": true,
"responseCode": "Y",
"message": "The details matched the document issuer's record.",
"timestamp": "2024-01-15T10:30:00.000Z",
"environment": "live",
"requestId": "req_xyz789"
}Primary result codes are Y, N, D, and S. The status field maps those codes to success, failed, invalid_input (request failed validation before reaching the issuer), or error (system error). Field-level hints may appear on some no-match results. See Expanded Responses.
Result codes
responseCode | status | Meaning |
|---|---|---|
Y | success | The details matched the document issuer's record. |
N | failed | The details did not match the issuer record (identity no-match). |
N | invalid_input | The request failed validation (for example a field length rule). Not an identity mismatch and not billed on live. |
D | failed | The check could not be completed. Ask the subject to review the details and try again. |
S | error | A system error occurred. Safe to retry later. |
test verification environment records
For integration testing against the real test verification hub (not the simulated sandbox), use the confirmed IVS/Fujitsu test records published on the Sandbox page. Each case includes the full request body and the expected responseCode: only records where both verification cycles matched the expected outcome are listed.
Requires a sk_test_* key and an account approved for the test verification hub. Send requests to https://test-api.veroid.com.au/v1/verify. sk_live_* keys only work on https://api.veroid.com.au.
Expanded Responses (field-level hints)
When the issuer supports expanded responses, VeroID may return an errors array with optional field-level hints on no-match results (responseCode N with status failed, or status invalid_input for validation failures). Hints are free-text messages that vary by issuer; not every no-match includes them. D responses do not include hints.
GET /v1/verify/:id or GET /v1/verify, per IVS terms and conditions 12.5 - the same rule that applies to match and responseCode.When hints appear
statusisfailedwithresponseCodeNand the issuer provides a hintstatusisinvalid_input(validation failure before the issuer match)- At most one hint entry is returned per request when present
Y (match) and D responses do not include errors. S (system error) responses typically do not either.
errors entry schema
| Field | Type | Description |
|---|---|---|
source | string | validation (request validation) or issuer (document issuer or record holder) |
field | string | Optional. The request field that failed to match (e.g. FamilyName, BirthDate, LicenceNumber) |
message | string | Human-readable explanation from the issuer (e.g. "Name does not match", "Date of birth does not match.") |
Example - match (Y)
{
"success": true,
"verificationId": "ver_abc123xyz",
"documentType": "drivers_licence",
"status": "success",
"match": true,
"responseCode": "Y",
"message": "The details matched the document issuer's record.",
"timestamp": "2024-01-15T10:30:00.000Z",
"environment": "live",
"requestId": "req_xyz789"
}Example - no match with issuer hint (N)
{
"success": true,
"verificationId": "ver_abc123xyz",
"documentType": "drivers_licence",
"status": "failed",
"match": false,
"responseCode": "N",
"message": "The details did not match the document issuer's record.",
"errors": [
{ "source": "issuer", "field": "GivenName", "message": "Given name not matched" }
],
"timestamp": "2024-01-15T10:30:00.000Z",
"environment": "live",
"requestId": "req_xyz789"
}Example - validation failure (invalid_input)
{
"success": true,
"verificationId": "ver_abc123xyz",
"documentType": "drivers_licence",
"status": "invalid_input",
"match": false,
"responseCode": "N",
"message": "Licence Number must not exceed 10 characters",
"errors": [
{ "source": "validation", "field": "LicenceNumber", "message": "Licence Number must not exceed 10 characters" }
],
"timestamp": "2024-01-15T10:30:00.000Z",
"environment": "live",
"requestId": "req_xyz789"
}Example - could not complete (D)
{
"success": true,
"verificationId": "ver_abc123xyz",
"documentType": "drivers_licence",
"status": "failed",
"match": false,
"responseCode": "D",
"message": "The check could not be completed. Please review the details and try again.",
"timestamp": "2024-01-15T10:30:00.000Z",
"environment": "live",
"requestId": "req_xyz789"
}On the test endpoint, use confirmed IVS test records for predictable outcomes. Legacy in-memory family-name triggers (dvsmatch, dvsnomatch, dvsdata, dvssystem) apply only to local package tests, not test-api.veroid.com.au. See Test environment.
POST response fields
| Field | Type | Description |
|---|---|---|
success | boolean | Always true when the issuer returned a result (including N and D) |
verificationId | string | VeroID verification ID for audit and GET lookups |
status | string | success (Y), failed (N/D), invalid_input (validation N), or error (S) |
match | boolean | true only when responseCode is Y |
responseCode | string | Primary result code: Y, N, D, or S |
message | string | Human-readable description of the primary result code |
errors | array | Optional. Expanded field-level detail when present (see above) |
timestamp | string | ISO 8601 datetime of the verification |
environment | string | sandbox or live |
requestId | string | Echo of your X-Request-Id header, if provided |
vrn | string | Live only. Verification Request Number (VRN) |
Verification response codes
These are the only four codes returned by the live verification hub (per the IVS interface specification):
| Code | Status | Meaning |
|---|---|---|
Y | success | The data in the request matches data held by the issuer |
N | failed | The data in the request does not match data held by the issuer |
D | failed | A data error occurred at the issuer (e.g. record not held at source) |
S | error | A system error occurred at the issuer or in the verification hub - safe to retry |
GET Endpoint Status Values
The GET /v1/verify/:id and GET /v1/verify endpoints return a status field representing the processing state of the request - not the match outcome, which is only in the real-time POST response.
| Status | Meaning |
|---|---|
pending | Verification in progress |
completed | The issuer processed the request and returned a result (Y, N, or D) |
error | System error occurred (The hub returned S, or network/timeout failure) |
Get Verification
Retrieve the processing state of a previous verification. The match result (match, responseCode, errors) is not stored and will not appear here - it is only available in the real-time POST response. See IVS terms and conditions 12.5.
GET /v1/verify/:id
Response (GET /v1/verify/:id)
{
"verificationId": "ver_abc123xyz",
"documentType": "drivers_licence",
"status": "completed",
"environment": "live",
"requestedAt": "2026-05-19T10:30:00.000Z",
"completedAt": "2026-05-19T10:30:01.200Z"
}If the verification encountered a system error, an error object is included:
{
"verificationId": "ver_abc123xyz",
"documentType": "drivers_licence",
"status": "error",
"environment": "live",
"requestedAt": "2026-05-19T10:30:00.000Z",
"completedAt": "2026-05-19T10:30:01.200Z",
"error": {
"code": "HUB_SYSTEM_ERROR",
"message": "A system error occurred at the issuer or in the Hub"
}
}List Verifications
List your recent verifications.
GET /v1/verify
Query Parameters
| Parameter | Default | Description |
|---|---|---|
limit | 20 | Max results (1-100) |
offset | 0 | Pagination offset |
Screening
Screen persons and organisations against sanctions, PEP, and optional adverse media. See Screening API for full documentation.
POST /v1/screening
Optional Idempotency-Key header (same rules as verify session create). List with GET /v1/screening?limit= and optional externalReference= (exact match, account-scoped).
Live screening is available after the developer onboarding fee is paid. Live verification approval is not required for screening endpoints.
Health Check
Check API status. No authentication required.
GET /health