Link Identity Platform · v1
API Reference
The Link Identity API exposes device registration, biometric enrollment, verification, and real-time event delivery over a single REST surface. All protected endpoints use OAuth 2.0 Client Credentials and require a Bearer token.
https://identity-api.imlink.networkOverview#
Four steps take you from credentials to a verified palm scan.
- Create OAuth client credentials in Integrations → OAuth Clients.
- Request a token from POST /v1/auth/token.
- Send Authorization: Bearer <access_token> on protected endpoints.
- Refresh the token before expiry using the expires_in field — request a new one ~60 seconds early.
Note
{ success: false, message } — see Error Format for the full shape.Authentication#
Exchange client credentials for a short-lived Bearer token, then attach it to every protected call.
/v1/auth/tokenPublicGenerate an access token. This endpoint itself is public — Bearer auth is not required to call it.
POST https://identity-api.imlink.network/v1/auth/token
Content-Type: application/json
{
"grant_type": "client_credentials",
"client_id": "06a4dc18-b06c-4e1c-ad25-204d44bf0c71",
"client_secret": "cs_live_xxx"
}{
"success": true,
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600
}Note
Credential Rotation#
How rotation and revocation affect tokens already in flight.
Warning
Endpoints
Register Device#
Reserve a hardware ID and one-time pairing code before connecting a scanner.
/v1/devicesBearer requiredRegisters a new scanner and returns a pairing code that the device uses to complete provisioning.
{
"device_name": "Lobby Scanner A",
"location": "Main Entrance - Floor 1"
}{
"success": true,
"data": {
"hardware_id": "hw_a1b2c3d4e5",
"device_name": "Lobby Scanner A",
"location": "Main Entrance - Floor 1",
"pairing_code": "PAR-7X92-KZQM",
"status": "pending_pair"
},
"message": "Device registered successfully. Use the pairing code to pair the device."
}Create Enrollment Challenge#
Initiate a biometric enrollment for a user against a specific paired scanner.
/v1/enrollBearer requiredCreates an enrollment challenge. The device captures the biometric; the result is delivered asynchronously via webhook.
{
"user_id": "d1e2f3a4-b5c6-7890-abcd-ef1234567890",
"hardware_id": "hw_a1b2c3d4e5",
"palm_type": "right",
"metadata": { "employee_id": "EMP-4421", "department": "Engineering" }
}Tip
user.enrolled webhook.Create Verification Challenge#
Run a 1:1 palm match against a previously enrolled user.
/v1/verifyBearer requiredCreates a verification challenge. The match result is emitted asynchronously over a webhook.
{
"user_id": "d1e2f3a4-b5c6-7890-abcd-ef1234567890",
"hardware_id": "hw_a1b2c3d4e5",
"palm_type": "right",
"metadata": { "session_id": "sess_0099", "access_point": "turnstile-7" }
}Tip
user.verified webhook with result: match | no_match.Webhooks
Create Webhook#
Register an HTTPS endpoint to receive event deliveries.
/v1/webhooksBearer requiredSubscribes a callback URL to one or more event keys. Deliveries POST a JSON payload signed with the optional API key.
{
"name": "Production Events",
"events": ["device.paired", "user.enrolled", "user.verified"],
"endpoint": "https://yourapp.example.com/webhooks/identity",
"api_key": "whsec_your_secret_key_here"
}Event Types#
The three event keys you can subscribe to today.
device.pairedDevice pairing completed.user.enrolledBiometric enrollment completed.user.verifiedVerification match or no-match result.Payload Format#
Every event delivery uses the same envelope: event key, ID, fired-at timestamp, and a payload-specific data block.
POST https://yourapp.example.com/webhooks/identity
Content-Type: application/json
X-API-Key: whsec_your_secret_key_here
{
"event": "user.verified",
"event_id": "evt_9f8e7d6c5b",
"fired_at": "2026-05-20T14:32:11Z",
"data": {
"challenge_id": "ch_verify_1a2b3c4d",
"user_id": "d1e2f3a4-b5c6-7890-abcd-ef1234567890",
"hardware_id": "hw_a1b2c3d4e5",
"palm_type": "right",
"result": "match",
"verified_at": "2026-05-20T14:32:10Z",
"metadata": { "session_id": "sess_0099", "access_point": "turnstile-7" }
}
}Note
Reference
Error Format#
Every non-2xx response uses the same JSON shape.
{
"success": false,
"message": "Human-readable description of the error"
}HTTP Status Codes#
The status codes you should expect across the API.