VerityProAPI

Overview

VerityPro provides KYC identity verification, address verification, enhanced due diligence (EDD), and transaction monitoring (AML) as modular APIs and SDKs. Each product is independently activatable — your integration only calls the services your compliance programme requires.

KYC
Document capture + biometric liveness with PEP/sanctions screening.
Address Verification
Proof-of-address with geocoding and document matching.
Enhanced Due Diligence
Deep customer risk profiling triggered by TM or rule conditions.
Transaction Monitoring
Real-time AML scoring, velocity rules, and case management.

Base URL

https://api.skylinefare.com

Request format

All requests are JSON (Content-Type: application/json). Authentication uses two headers present on every call.

Authentication

VerityPro uses API key authentication. Every request must include both headers below. Retrieve your keys from the Integrations page in the VerityPro portal.

ParameterTypeRequiredDescription
x-api-keystringRequiredYour integration API key. Treat this as a secret — never expose it in client-side code.
IntegrationidUUIDRequiredYour integration UUID. Safe to embed in mobile SDKs (public identifier).

Key rotation

Rotate keys from the portal under Settings → Integration → Keys → Rotate. When the rotation runs immediately, the new key is displayed once — copy it into your secrets manager before you close the dialog. If your organisation requires approval for key rotation, the request is queued instead and the new key is not shown in that dialog; ask your approver how it will be delivered before you rotate.

Never put your API key in client code
The x-api-key header must only be sent from your server. Mobile and web SDK calls use a short-lived session token minted by your server.

Environments

EnvironmentBase URLNotes
Productionhttps://api.skylinefare.comReal verifications, billing applies
Sandboxhttps://sandbox.api.skylinefare.comNo billing, test documents accepted

Pass sandbox: true in SDK options to target the sandbox automatically. Server-side calls set the base URL manually.

Create KYC Session

Before launching the SDK on the user's device, your server creates a KYC session. The response contains a sessionToken that you pass to the SDK. This keeps your API key server-side only.

POST/integration/api/integration/kyc/session
ParameterTypeRequiredDescription
userIdstringRequiredYour internal user identifier — returned unchanged in every webhook.
firstNamestringRequiredUser's legal first name.
lastNamestringRequiredUser's legal last name.
emailstringOptionalUsed for communications and duplicate detection.
dateOfBirthYYYY-MM-DDOptionalPre-fills the document verification step.
streetAddressstringOptionalPre-fills address verification if enabled.
countryISO 3166-1 alpha-2RequiredUser's country of residence.
requiredModulesstring[]RequiredModules to run: 'DOCUMENT', 'BIOMETRIC', 'ADDRESS'.
localestringOptionalSDK UI locale. Default: 'en-AU'.

Response

{ "sessionToken": "vt_sess_...", "sessionId": "sess_abc123", "expiresAt": "2024-01-15T11:30:00Z" }

Pass sessionToken to the SDK. Sessions expire in 60 minutes.

Hosted Web Page (v2)

The recommended integration for web. Your backend creates a KYC session and VerityPro returns a sessionUrl. Redirect your user to that URL — the hosted page runs the full verification flow with your branding applied — or embed it in an iframe and listen for the completion postMessage.

POST/kycintegration/kyc-verification/add-kyc-verification

Create the session server-side with your secret key — never in the browser. The response contains data.sessionUrl.

Redirect (full-page)

window.location.href = data.sessionUrl;

Iframe embed + postMessage

<iframe id="vp-frame" src={data.sessionUrl} allow="camera; microphone" style="width:100%;height:100%;border:none" /> <script> window.addEventListener('message', (e) => { if (e.data?.type === 'veritypro:complete') { const { status, verificationId } = e.data; // status: 'approved' | 'declined' | 'pending' document.getElementById('vp-frame').remove(); } }); </script>

iOS SDK

Install via Swift Package Manager: https://github.com/VerityPro/verity-pro-ios

Requirements

  • iOS 17.0+ deployment target
  • Camera and FaceID usage descriptions in Info.plist
  • Session token minted by your server (see Create Session)

Info.plist entries required

<key>NSCameraUsageDescription</key> <string>Required for document capture and liveness check.</string> <key>NSFaceIDUsageDescription</key> <string>Used for biometric authentication.</string>

Result handling

The VerityResult returned in the completion block contains the outcome, completed steps, and any error details including whether the error is recoverable.

Android SDK

Add to your build.gradle or build.gradle.kts:

dependencies { implementation("com.veritypro:sdk:1.0.0") }

Manifest permissions

<uses-permission android:name="android.permission.CAMERA" />

Activity result launcher

Register the launcher in onCreate before the activity is started. Use VerityPro.extractResult(result) to get the typed result.

Flutter SDK

Dart plugin bridging to the native iOS/Android SDKs — same product coverage. Installed via git dependency (not published to pub.dev).

pubspec.yaml

dependencies: verity: git: url: https://github.com/TopRateTransfer-Pty-Ltd/verity_flutter_sdk.git ref: "fa28fbcf808c16a349d48fa96fb9f78da8c2ad29"

v2 — server-driven (recommended): pass serverSessionId from your backend and mode: VerityMode.serverDriven. The full Dart example is in the code panel.

v1 — legacy: use mode: VerityMode.biometric (or .address / .edd) with preCreatedSessionId.

Web SDK

Install: npm install @veritypro/web-sdk

Presentation modes

ModeDescription
modalOverlay on top of your page
embedMounted into a container element you provide
hostedFull-page redirect to VerityPro hosted URL

Use the embedToken from your server session call. Do not pass your API key to the web SDK.

KYC Webhooks

VerityPro delivers a webhook to your registered endpoint when a KYC session reaches a terminal state. Configure the URL in Settings → Integration → Webhooks.

Payload fields

ParameterTypeRequiredDescription
eventstringRequiredEvent type, e.g. 'kyc.completed'
statusstringRequiredOutcome: approved | pendingManualReview | rejected | cancelled | failed
userIdstringRequiredYour userId passed at session creation
sessionIdstringRequiredVerityPro session identifier
completedStepsstring[]OptionalModules completed: ['DOCUMENT', 'BIOMETRIC']
timestampISO 8601RequiredUTC time of the event

Verify the X-VerityPro-Signature header on every webhook before processing. See Verify Signature for details.

Address SDK

Address verification is triggered through the same SDK as KYC — set mode: .address (iOS) or mode = VerityMode.ADDRESS.name (Android). No separate SDK install is needed.

SDK options for address verification

ParameterTypeRequiredDescription
streetAddressstringRequiredUser's street address to verify
citystringOptionalCity / suburb
stateOrProvincestringOptionalState or province code
postalCodestringOptionalPostcode / ZIP
countrystringRequiredCountry of the address (full name or ISO code)

Address Server API

You can also verify addresses directly from your server without launching the mobile SDK — useful for document-based proof-of-address flows.

POST/integration/api/integration/address/verify
ParameterTypeRequiredDescription
userIdstringRequiredYour internal user identifier
firstNamestringRequiredUser's first name
lastNamestringRequiredUser's last name
streetAddressstringRequiredStreet address
citystringOptionalCity
statestringOptionalState or province
postalCodestringOptionalPostcode / ZIP
countrystringRequiredCountry (ISO 3166-1 alpha-2)
dateOfBirthYYYY-MM-DDOptionalUsed for cross-verification

Trigger EDD

Enhanced Due Diligence (EDD) is triggered when your risk programme identifies a customer requiring deeper scrutiny — typically after a high-risk transaction flag or on a scheduled review cycle.

POST/integration/api/integration/edd
ParameterTypeRequiredDescription
userIdstringRequiredYour internal user identifier
triggerReasonenumRequiredHIGH_RISK_TRANSACTION | PERIODIC_REVIEW | MANUAL | SANCTIONS_PROXIMITY | PEP_IDENTIFIED
firstNamestringRequiredUser's first name
lastNamestringRequiredUser's last name
dateOfBirthYYYY-MM-DDOptionalPre-fills EDD form
countrystringRequiredCountry (ISO 3166-1 alpha-2)

EDD can also be launched via the mobile SDK — pass mode: .edd and an authToken from your server session.

EDD Status

GET/integration/api/integration/edd/{eddId}/status

Response

{ "eddId": "edd_abc123", "status": "PENDING_REVIEW", "userId": "your-user-id", "openedAt": "2024-01-15T10:30:00Z", "reviewedAt": null, "outcome": null }

Poll this endpoint or subscribe to edd.status.changed webhooks. EDD reviews are completed by your compliance team in the VerityPro case management portal.

Process Transaction

Submit transactions to VerityPro's AML engine for real-time risk scoring. Each transaction is checked against velocity rules, sanctions screening, and ML-based anomaly detection. A risk decision is returned synchronously.

POST/integration/api/integration/transactions
ParameterTypeRequiredDescription
vendorDatastringRequiredYour internal user identifier
transactionTypeenumRequiredTRANSFER | DEPOSIT | WITHDRAWAL | PAYMENT | EXCHANGE
amountnumberRequiredTransaction amount (positive decimal)
currencyISO 4217Required3-letter currency code, e.g. AUD, USD
sender.firstNamestringRequiredSender first name
sender.lastNamestringRequiredSender last name
sender.emailstringOptionalSender email
sender.countrystringRequiredSender country (ISO 3166-1 alpha-2)
recipient.firstNamestringRequiredRecipient first name
recipient.lastNamestringRequiredRecipient last name
recipient.countrystringRequiredRecipient country (ISO 3166-1 alpha-2)
paymentMethodenumRequiredBANK_TRANSFER | CARD | CRYPTO | CASH
transactionReferencestringOptionalYour reference number for reconciliation

Response

{ "decision": "PASS", "riskScore": 24, "riskLevel": "LOW", "transactionId": "txn_xyz789", "flags": [] }

Decision values: PASS | REVIEW | DECLINED. Treat REVIEW as a soft block — hold the transaction pending analyst review. DECLINED is a hard block.

Step-Up Biometric Authentication

Re-verify a returning user's identity using face liveness + face match against the template enrolled during KYC onboarding. Use this for risk-triggered moments — high-value transactions, new-device logins, suspicious activity — rather than full re-onboarding. The subject must have completed a liveness-verified KYC session with the BIOMETRIC module before step-up is available.

Authentication: x-api-key only (JWT is not accepted on step-up endpoints). The subjectId must exactly match the vendorData value used at KYC onboarding.

1 — Create a challenge

POST/kycintegration/api/v1/step-up/challenges
ParameterTypeRequiredDescription
subjectIdstringRequiredMust equal the vendorData used at KYC onboarding.
riskReasonstringRequiredWhy step-up was triggered, e.g. 'high_value_txn'.
channelOriginstringOptional'mobile_ios' | 'mobile_android' | 'web'.

Returns challengeId (your primary reference, valid 300s, max 3 attempts) and a short-lived token to forward to the app as X-StepUp-Token. A 422 means the subject has no enrolled face — route to full KYC.

2 — Get AWS Rekognition credentials

POST/kycintegration/api/v1/step-up/challenges/{challengeId}/begin-liveness

Send x-api-key + X-StepUp-Token. Returns livenessSessionId, region, and short-lived AWS credentials — pass all of them to the AWS Amplify Face Liveness widget in your app. No VerityPro SDK screens are needed for step-up.

3 — Complete after AWS liveness

POST/kycintegration/api/v1/step-up/challenges/{challengeId}/complete
ParameterTypeRequiredDescription
livenessSessionIdstringRequiredThe AWS Face Liveness session ID from step 2.
selfieImageB64stringRequiredBase64-encoded JPEG/PNG selfie captured by the AWS SDK.

Verdicts

verdictAction
PassedIdentity confirmed — proceed with the action
ManualReviewHold pending operator review; a webhook follows
FailedDeny the action; retry available while attemptCount < 3
NoEnrolledTemplateSubject has no enrolled face — route to full KYC

Webhook Event Types

VerityPro delivers events to your registered HTTPS endpoint. Configure the URL and secret in Settings → Integration → Webhooks.

EventTrigger
kyc.completedKYC session reached a terminal state
kyc.session.expiredKYC session timed out (60 min)
address.verifiedAddress verification completed
edd.status.changedEDD case status changed
transaction.risk.flaggedTransaction flagged REVIEW by TM engine
transaction.blockedTransaction blocked DECLINED by TM engine

Your endpoint must return HTTP 200 within 10 seconds. Failed deliveries are retried with exponential backoff for up to 24 hours.

Verify Webhook Signature

Every webhook request carries two headers: X-Veritypro-Signature, an HMAC-SHA512 signature, and X-Veritypro-Timestamp, the unix epoch seconds the payload was signed at. Always verify both before processing the payload.

The signature is computed as HMAC-SHA512(webhookSecret, "{timestamp}.{rawBody}") — the timestamp header value, a literal dot, then the raw request body bytes before JSON parsing. It is encoded as lowercase hex, 128 characters, with no prefix.

Sign the timestamped payload, not the body alone
The timestamp is part of the signed input. Computing the HMAC over the body by itself will never match. Reject any delivery whose timestamp is more than 5 minutes from your own clock in either direction — that bounds how long a captured request stays replayable, but it does not make deliveries unique, so still key your own processing on the event id.
Use raw body, not parsed JSON
JSON serialisation is not deterministic. Always compute the HMAC over the raw bytes received from the network, not over a re-serialised object.

Result Types

VerityOutcome

ValueMeaning
approvedAll required modules passed. Customer is verified.
pendingManualReviewRequires analyst review — do not approve or reject automatically.
rejectedVerification failed. Check VerityErrorCode for reason.
cancelledUser exited the SDK before completing.
failedTechnical error. Check recoverable flag before re-launching.

VerityVerificationError

ParameterTypeRequiredDescription
codeVerityErrorCodeRequiredNamed error code, e.g. DOCUMENT_EXPIRED
messagestringRequiredHuman-readable error description
recoverablebooleanRequiredTrue if re-launching the SDK may succeed
recommendedActionstringOptionalUX copy to show the user

Error Codes

HTTP errors use standard status codes. The response body contains a typed error payload.

StatusMeaning
400Bad Request — missing or invalid parameters
401Unauthorized — API key missing or invalid
403Forbidden — integration disabled or insufficient permissions
404Not Found — session or resource does not exist
409Conflict — duplicate request or resource already exists
422Unprocessable — request is well-formed but semantically invalid
429Rate Limited — slow down and retry after the Retry-After header
500Internal Error — transient; safe to retry with backoff

Error response body

{ "error": "SESSION_NOT_FOUND", "message": "The session token is invalid or has expired.", "traceId": "req_abc123" }