Connect Lukhoo to your firm software
Follow one path from your first authenticated request through signed event delivery and two-way client messaging. Each step tells you what to do, what Lukhoo does, and what success looks like.
See the complete connection
A webhook announces that something changed. Your software then uses its API key to fetch the current permitted record and can write an authorized response back to Lukhoo.
The API key authorizes API requests. The webhook signing secret proves that a webhook came from Lukhoo. They are different secrets and are never interchangeable.
Make your first successful request
Start with a read. This confirms membership, API-key authentication, attorney identity, and connectivity without changing client data.
- Sign in to the API Console. Portal + API Integration Access must be active.
- Open Connection. Create a key named for the system using it, such as
Case management production. - Select only required permissions. For the complete messaging test, select
incidents:read,messages:read,messages:write, andengagements:write. - Store the key immediately. It begins with
lk_live_and is displayed once. Put it in the firm's secret manager or Postman local secret value. - Call the conversations endpoint. A
200response proves the API connection is authenticated.
First read
GET /conversations?after=0&limit=100 Authorization: Bearer lk_live_YOUR_KEY
curl -sS "https://lukhoo.com/api/attorney/v1/conversations?after=0&limit=100" \ -H "Authorization: Bearer $LUKHOO_API_KEY"
HTTP 200 with an items array. An empty array means the key worked but this attorney currently has no permitted conversations.
Configure event delivery
Webhooks are the primary near-real-time notification channel. They tell the firm what changed without placing private incident or message content in the notification.
Test without firm software
- In Connection, select Create test receiver.
- On the Lukhoo test receiver, select Send test.
- Open Activity and find
test.delivery. - Confirm
delivered, HTTP200, andsignature verified.
It proves event creation, HMAC signing, HTTP delivery, signature verification, and acknowledgement. It uses synthetic data only. It does not fetch a client record or send a client message.
Receive live event references
- Provide a public HTTPS URL on port 443 that your firm controls.
- Select the event types the firm needs and save the endpoint.
- Store the one-time
whsec_signing secret securely. - Send a test. Live events begin only after the endpoint returns a successful response.
- Persist each event before returning a
2xxresponse.
Use a receiver controlled by the firm or a designated Lukhoo test environment. Even reference identifiers should be treated as protected integration data.
What the firm receives
{
"spec_version": "1.0",
"event_id": "b38d0a60-2367-4c67-a6ad-bb9d83243a12",
"sequence": "125",
"event_type": "message.created",
"created_at": "2026-09-08T18:00:00.000Z",
"data": {
"resource_type": "message",
"resource_id": "456",
"resource_url": "/api/attorney/v1/messages/456"
}
}
Lukhoo-Signature, extract the timestamp, and calculate HMAC-SHA256 over the exact bytes of timestamp + "." + raw_request_body.
RejectReject an invalid signature or a timestamp more than five minutes from the receiver's server clock.
StoreDeduplicate with event_id. Deliveries are at least once and may arrive again or out of order.
FetchCall data.resource_url with the Bearer API key to obtain the current authorized resource.
Know what each event means
Event notifications are instructions to fetch or reconcile current state. They are not permanent copies of client records.
| Event | Meaning | Firm action |
|---|---|---|
incident.created | A permitted incident became visible. | Fetch the incident and create or update the local view. |
incident.updated | Incident data, evidence availability, permission, or scoring changed. | Fetch the incident again and replace cached current state. |
incident.removed | The incident is no longer available to this attorney. | Remove private details from active firm views. |
conversation.updated | Contact-window, unread, or hiring state changed. | Fetch the conversation and update workflow status. |
message.created | A client or attorney message was created. | Fetch the message, deduplicate it, and update the conversation. |
message.updated | A currently visible message changed. | Fetch it again and reconcile the local copy. |
Use GET /events?after=125&limit=100 with the last saved sequence for recovery. Webhooks are near real time; the event cursor is the recovery path when a receiver was unavailable.
Access and security rules
Every read, write, artifact download, and webhook delivery is checked against current membership and current client permission.
Membership
Client permission
403 or 404.
API keys are restricted credentials. Rotate or revoke them in Connection. Webhook signing secrets must be stored separately. Never place either secret in browser code, source control, support tickets, screenshots, or application logs.
Understand common responses
The response code tells the firm whether to fix the request, refresh permission, or retry later.
| Response | Meaning | Next action |
|---|---|---|
200 / 201 | The request completed. | Store the returned identifier or cursor. |
400 | The request, paging value, or idempotency key is invalid. | Correct the request before retrying. |
401 console_sign_in_required | No Bearer Authorization header reached the API. | Set Postman to Bearer Token or restore the missing header. |
401 invalid_api_key | The Bearer key is malformed, invalid, expired, or revoked. | Check the key value or rotate the key. |
403 scope_required | The key lacks the required permission. | Create or use a key with the required scope. |
403 api_membership_required | Portal + API Integration Access is not active. | Review membership before retrying. |
404 | The resource does not exist or is no longer visible. | Remove cached private details from the active view. |
409 | An idempotency key was reused for different content or the requested state conflicts. | Do not blindly retry; reconcile the original action. |
429 | A request limit was reached. | Honor the rate-limit headers and retry with backoff. |
503 | A required Lukhoo source could not be verified. | Retry later with exponential backoff. |