API Reference — Web
SDK-Only Access
To ensure your integration remains stable and supported, always use the official SDKs. The underlying API endpoints are internal implementation details that may change in purpose, functionality, or be removed at any time without notice. Direct API access is not supported. Learn more →
The SDK methods documented here are your supported interface. Versioning is managed through SDK upgrades.
createVerifierSDK(config)
Creates and returns a VerifierSDK instance.
import { createVerifierSDK } from '@vecu/verifier-web-sdk';
const sdk = createVerifierSDK({
stage: 'production',
bearerToken: 'your-token',
});
Configuration
stage'development' | 'sandbox' | 'production'requiredDeployment stage. Determines the backend URL.
bearerTokenstringrequiredVECU API authentication token.
apiBaseUrlstringOverride the default endpoint for the selected stage.
polling.intervalMsnumberMilliseconds between status checks.
polling.timeoutMsnumberMaximum wait time (5 minutes).
polling.maxRetriesnumberConsecutive errors before stopping.
logLevel'debug' | 'info' | 'warn' | 'error' | 'none'Logging verbosity.
loggerLoggerCustom logger implementation with debug, info, warn, error methods.
The SDK automatically resolves the correct endpoint for each stage. The apiBaseUrl property is available for local mock server testing only.
SDK Methods
startVerification(container, options) — Container-Based UI
Renders the built-in verification UI into a DOM element. Handles all states automatically.
const cleanup = await sdk.startVerification(container, {
vin: '1HGBH41JXMN109186',
proximity: { thresholdMiles: 5.0 },
onApproved: result => {
/* VerificationApproved */
},
onDenied: result => {
/* VerificationDenied */
},
onExpired: result => {
/* VerificationExpired */
},
onError: error => {
/* VerifierError */
},
});
Options:
vinstringrequiredVehicle Identification Number to verify.
onApproved(result: VerificationApproved) => voidCalled when verification succeeds.
onDenied(result: VerificationDenied) => voidCalled when verification is denied.
onExpired(result: VerificationExpired) => voidCalled when the session expires.
onError(error: VerifierError) => voidCalled on any error.
proximityProximityConfigOptional GPS proximity verification. The SDK automatically retrieves the
device's GPS coordinates via the Geolocation API. If location permission is
denied, the proximity check will be unchecked.
classNamestringCustom CSS class for the container element.
useDefaultStylesbooleanWhether to apply the SDK's built-in styles. Set to false to use only your
own CSS.
Returns: Promise<CleanupFunction> — call to unmount UI and stop polling.
createPresentationRequest(vin, options?) — Headless
Creates a verification request and returns QR content.
const result = await sdk.createPresentationRequest('1HGBH41JXMN109186', {
proximity: { thresholdMiles: 5.0 },
});
if (result.ok) {
const { request_id, qr_content, expires_at } = result.data;
}
Returns: Promise<ApiResult<CreatePresentationResponse>>
startPolling()
Starts polling for verification status. Stops automatically on terminal states.
Returns: () => void — cleanup function to stop polling.
stopPolling()
Manually stop polling.
getStatus() / getRequest()
Get current verification status or full request state.
on(type, listener) / off(type, listener) / once(type, listener)
Subscribe/unsubscribe to events. on and once return an unsubscribe function. once automatically removes the listener after the first invocation.
destroy()
Clean up all resources. Sets sdk.isDestroyed = true.
Events
sdk.on('request:created', event => {
event.requestId; // string
event.qrContent; // string — display as QR code
event.vin; // string
});
sdk.on('status:changed', event => {
event.previousStatus; // VerificationStatus | null
event.currentStatus; // VerificationStatus
});
sdk.on('polling:started', event => {
event.requestId; // string
event.intervalMs; // number
});
sdk.on('polling:stopped', event => {
event.requestId; // string
event.reason; // 'terminal_state' | 'timeout' | 'manual' | 'error' | 'restart'
});
sdk.on('error', event => {
event.error; // VerifierError
});
Verification Status Types
Status is a discriminated union on the status field:
All statuses share a common shape with requestId, createdAt?, and expiresAt?:
// Pending — waiting for driver to scan
{ status: 'pending', requestId: string, createdAt?: string, expiresAt?: string }
// Approved — credential verified, OK to release vehicle
{
status: 'approved',
requestId: string,
createdAt?: string,
expiresAt?: string,
verifiedClaims?: {
vin: string,
originLocation?: string,
destinationLocation?: string,
},
proximityCheck?: {
status: 'pass' | 'fail' | 'unchecked',
distanceMiles: number | null,
thresholdMiles: number | null,
originCoordinates: { lat: number, lng: number } | null,
deviceCoordinates: { lat: number, lng: number } | null,
},
}
// Denied — DO NOT release vehicle
{ status: 'denied', requestId: string, createdAt?: string, expiresAt?: string, error?: string }
// Expired — session timed out
{ status: 'expired', requestId: string, createdAt?: string, expiresAt?: string }
Type guards:
import { isApproved, isDenied, isTerminalStatus } from '@vecu/verifier-web-sdk';
if (isApproved(status)) {
/* terminal — OK to release */
}
if (isTerminalStatus(status)) {
/* approved | denied | expired */
}
Proximity Types
ProximityConfig
Passed via startVerification options or createPresentationRequest. The SDK automatically retrieves device GPS coordinates using platform location services. If location permission is not granted, the proximity check result will be unchecked.
interface ProximityConfig {
thresholdMiles: number; // Max allowed distance from origin (miles)
}
ProximityCheck
Returned on VerificationApproved.proximityCheck when proximity was evaluated.
| Status | Meaning |
|---|---|
pass | Device is within threshold distance of origin — green "Proximity Verified" badge |
fail | Device is too far from origin — amber "Verified with Warning" card |
unchecked | Location permission denied or proximity not configured — neutral badge |
Error Types
Errors are a discriminated union on code:
| Code | Type | Extra Fields |
|---|---|---|
NETWORK_ERROR | NetworkError | cause? |
API_ERROR | ApiError | statusCode, details? |
VALIDATION_ERROR | ValidationError | field? |
TIMEOUT_ERROR | TimeoutError | timeoutMs |
SESSION_ERROR | SessionError | sessionId? |
All errors include code, message, and timestamp.
import { isVerifierError } from '@vecu/verifier-web-sdk';
React Components & Hooks
Imported from @vecu/verifier-web-sdk/react.
VerificationView
Full verification flow component with built-in UI. Mirrors the React Native VerificationView.
import { useVerifierSDK, VerificationView } from '@vecu/verifier-web-sdk/react';
<VerificationView
sdk={sdk}
vin='1HGBH41JXMN109186'
onApproved={result => {
/* VerificationApproved */
}}
onDenied={result => {
/* VerificationDenied */
}}
onExpired={result => {
/* VerificationExpired */
}}
onError={error => {
/* VerifierError */
}}
className='my-custom-class'
useDefaultStyles={true}
/>;
sdkVerifierSDKrequiredSDK instance from createVerifierSDK() or useVerifierSDK().
vinstringrequiredVehicle Identification Number to verify.
onApproved(result: VerificationApproved) => voidCalled when verification succeeds.
onDenied(result: VerificationDenied) => voidCalled when verification is denied.
onExpired(result: VerificationExpired) => voidCalled when the session expires.
onError(error: VerifierError) => voidCalled on any error.
proximityProximityConfigOptional GPS proximity verification. Device coordinates are retrieved
automatically. If location permission is denied, result will be unchecked.
classNamestringCustom CSS class for the container.
useDefaultStylesbooleanWhether to apply built-in styles.
useVerifierSDK(config)
Creates an SDK instance tied to the component lifecycle. Automatically destroys on unmount.
import { useVerifierSDK } from '@vecu/verifier-web-sdk/react';
const sdk = useVerifierSDK(config);
// Auto-creates/destroys SDK with component lifecycle
// Handles React StrictMode double-mounting
useVerification(sdk, vin, callbacks?)
Manages the full verification flow and returns UI state. Powers VerificationView internally.
import { useVerifierSDK, useVerification } from '@vecu/verifier-web-sdk/react';
const sdk = useVerifierSDK(config);
const { state, restart } = useVerification(sdk, vin, {
onApproved: result => {
/* ... */
},
onDenied: result => {
/* ... */
},
});
Returns:
state: UIState— current state ('loading'|'qr'|'qr-expired'|'approved'|'denied'|'expired'|'error')restart: () => void— restart the verification flow with a new QR code
Error Factory Functions
Helper functions for creating typed errors:
import {
createNetworkError,
createApiError,
createValidationError,
createTimeoutError,
createSessionError,
isVerifierError,
} from '@vecu/verifier-web-sdk';
const error = createNetworkError('Connection failed', originalError);
const apiErr = createApiError('Not found', 404, { detail: '...' });
const valErr = createValidationError('Invalid VIN', 'vin');
const timeErr = createTimeoutError('Polling timed out', 300000);
const sessErr = createSessionError('Session expired', 'session-123');