Skip to main content

Requirements

RequirementMinimum Version
iOS15.0+
macOS13.0+
Swift5.9+
Xcode15.0+

Installation

Add the Verilock SDK via Swift Package Manager. In Xcode, go to File > Add Package Dependencies and enter:
https://github.com/verilock/verilock-swift
Or add it to your Package.swift:
Package.swift
dependencies: [
    .package(url: "https://github.com/verilock/verilock-swift", from: "1.0.0"),
],
targets: [
    .target(
        name: "YourApp",
        dependencies: [
            .product(name: "VerilockSDK", package: "verilock-swift"),
        ]
    ),
]

Configuration

Create a Verilock client with your API key. All API calls are made through this instance.
import VerilockSDK

let verilock = Verilock(
    apiKey: "qi_live_..."
)
You can customise the client with optional parameters:
let verilock = Verilock(
    apiKey: "qi_live_...",
    baseURL: "https://verilock.io/api/v1",  // default
    timeout: 30,                          // seconds, default
    maxRetries: 2                         // retries on 429/5xx, default
)
Keep your API key secure. Never embed production keys in client-side code or commit them to version control.

Quick Start

Create a KYC session, upload a document and selfie, then submit for verification:
import VerilockSDK

let verilock = Verilock(apiKey: "qi_live_...")

// 1. Create a session
let session = try await verilock.sessions.create(
    CreateSessionParams(
        applicantEmail: "john@example.com",
        redirectUrl: "https://example.com/callback"
    )
)
print(session.sessionUrl) // Redirect user here, or upload docs directly

// 2. Upload document (front)
try await verilock.sessions.uploadDocument(
    UploadDocumentParams(
        sessionId: session.id,
        fileData: frontImageData,
        side: .front,
        documentType: .passport
    )
)

// 3. Upload selfie
try await verilock.sessions.uploadSelfie(
    UploadSelfieParams(
        sessionId: session.id,
        fileData: selfieData
    )
)

// 4. Submit for verification
let result = try await verilock.sessions.submit(session.id)

KYC Sessions

The sessions resource manages the full verification lifecycle.
// Create a session
let session = try await verilock.sessions.create(
    CreateSessionParams(
        applicantEmail: "jane@example.com",
        redirectUrl: "https://example.com/done"
    )
)

// List sessions with pagination
let list = try await verilock.sessions.list(
    ListSessionsParams(page: 1, limit: 20)
)

// Retrieve a session by ID
let details = try await verilock.sessions.retrieve("sess_abc123")
print(details.decision) // "approved", "declined", or "review"

// Upload address proof
try await verilock.sessions.uploadAddressProof(
    UploadAddressProofParams(
        sessionId: "sess_abc123",
        fileData: proofData,
        documentType: .utilityBill
    )
)

AML Screening

Screen individuals against global sanctions, PEP, and watchlists.
let screening = try await verilock.aml.screen(
    ScreenPersonParams(name: "John Doe")
)
print(screening.risk)    // risk classification
print(screening.matches) // matched watchlist entries

Transaction Monitoring

Screen transactions for suspicious activity.
let tx = try await verilock.transactions.screen(
    ScreenTransactionParams(
        transactionRef: "TX-001",
        senderName: "Alice",
        receiverName: "Bob",
        amount: 5000,
        currency: "USD"
    )
)
print(tx.risk)
print(tx.flags)

Premium Features

The SDK provides access to premium verification services through dedicated resource properties.
// Biometric face authentication
let biometricResult = try await verilock.biometric.verify(params)

// Government database validation
let dbResult = try await verilock.database.validate(params)

// 1:N face duplicate detection
let searchResult = try await verilock.faceSearch.search(params)

// Crypto wallet compliance screening
let walletResult = try await verilock.wallet.screen(params)

// Reusable KYC credentials
let credential = try await verilock.credentials.create(params)

// Age verification from selfie
let ageResult = try await verilock.ageVerify.check(params)
Premium features require an active subscription. See the Premium Features docs for details.

Error Handling

All methods are async throws. Errors are thrown as VerilockError, a Swift enum with associated values for each error type.
do {
    let session = try await verilock.sessions.retrieve("sess_invalid")
} catch let error as VerilockError {
    switch error {
    case .authentication(let message, _):
        print("Auth failed: \(message)")

    case .insufficientBalance(let message, let required, let balance):
        print("Need \(required), have \(balance): \(message)")

    case .notFound(let message):
        print("Not found: \(message)")

    case .validation(let message):
        print("Invalid input: \(message)")

    case .rateLimited(let message, let retryAfter):
        print("Slow down: \(message), retry in \(retryAfter ?? 0)s")

    case .serverError(let statusCode, let message):
        print("Server error \(statusCode): \(message)")

    case .networkError(let underlyingError):
        print("Network issue: \(underlyingError.localizedDescription)")

    case .decodingError(let underlyingError):
        print("Decoding issue: \(underlyingError.localizedDescription)")

    case .apiError(let statusCode, let message, _):
        print("API error \(statusCode): \(message)")
    }
}

Error Reference

CaseHTTP StatusDescription
authentication401Invalid or missing API key
insufficientBalance402Account balance too low
notFound404Resource does not exist
validation422Request parameters failed validation
rateLimited429Too many requests
serverError5xxServer-side error
networkErrorNo response received
decodingErrorResponse body could not be parsed
apiError*Catch-all for other HTTP errors
The SDK automatically retries requests on 429 and 5xx errors up to maxRetries times (default: 2) with exponential backoff. You only need to handle errors that persist after retries.