For developers
Build on Law Hired.
Sync matters, clients, time, and leads — and react to events in real time via webhooks. A REST API built for CRM, ERP, and billing integrations, with a live OpenAPI 3.0 spec and a Postman collection ready to import.
Ready to integrate?
Sign in to your Law Hired account to create API keys and manage webhooks.
Quick Start
All requests go to https://www.lawhired.com/api/v1 with your API key as a Bearer token. Sign in to create a key →
# List matters (delta sync — only records changed since Jan 1)
curl 'https://www.lawhired.com/api/v1/matters?updated_since=2026-01-01T00:00:00Z' \
-H 'Authorization: Bearer lh_live_YOUR_KEY'
# Upsert a client from your CRM
curl -X PUT 'https://www.lawhired.com/api/v1/clients' \
-H 'Authorization: Bearer lh_live_YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"external_id":"CRM-123","company_name":"Acme Corp","email":"ap@acme.com"}'REST Data API
Read and write your core records — built for two-way ERP/CRM sync. Every writable resource supports list, get-by-id, create, update, delete, and idempotent upsert by your own external_id. All responses are scoped to your account.
| Resource | Read | Write | Upsert (ERP sync) |
|---|---|---|---|
| /matters | GET list · GET /:id | POST · PATCH /:id · DELETE /:id | PUT by external_id |
| /clients | GET list · GET /:id | POST · PATCH /:id · DELETE /:id | PUT by external_id |
| /time-entries | GET list · GET /:id | POST · PATCH /:id · DELETE /:id | PUT by external_id |
| /invoices | GET list · GET /:id | Read-only | — |
| /leads | GET list | POST | — |
Delta sync (pull changed records)
curl 'https://www.lawhired.com/api/v1/matters?updated_since=2026-01-01T00:00:00Z&limit=50' \
-H 'Authorization: Bearer lh_live_xxx'Upsert from your ERP/CRM
curl -X PUT 'https://www.lawhired.com/api/v1/clients' \
-H 'Authorization: Bearer lh_live_xxx' \
-H 'Content-Type: application/json' \
-d '{"external_id":"HUBSPOT-123","company_name":"Acme","email":"ap@acme.com"}'Webhooks
Subscribe an endpoint and we POST signed events in real time — so your CRM or ERP reacts the moment something happens. Delivery is signed with HMAC-SHA256:
// Every delivery includes these headers:
X-LawHired-Event: lead.created
X-LawHired-Delivery: 550e8400-e29b-41d4-a716-446655440000
X-LawHired-Signature: sha256=a3f1b2c9d4e5...
// Example payload body:
{
"event": "lead.created",
"delivery_id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-03-15T10:00:00Z",
"data": {
"lead_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"first_name": "John",
"email": "john.doe@email.com",
"practice_area": "Family Law",
"status": "new"
}
}
// Verify signature (Node.js) — strip "sha256=" prefix first:
const crypto = require('crypto');
const received = req.headers['x-lawhired-signature'].replace('sha256=', '');
const expected = crypto.createHmac('sha256', 'whsec_YOUR_SECRET')
.update(rawBody).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected)))
throw new Error('Invalid signature');Fires when a new lead is captured from any source
Fires when a new legal matter is opened
Fires when a new client is added
Fires when an invoice status changes to paid
Fires when an e-signature request is completed
Sent by POST /webhooks/:id/test to verify your endpoint and signature logic
# Register a webhook — secret returned once
curl -X POST 'https://www.lawhired.com/api/v1/webhooks' \
-H 'Authorization: Bearer lh_live_xxx' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://your-crm.com/hooks/lawhired",
"events": ["lead.created", "invoice.paid", "document.signed"]
}'Ready-Made Integrations
No-code and low-code options for connecting Law Hired to your CRM without writing API calls.
Zapier
Triggers (new lead, new matter, invoice paid) + Actions (create matter, capture lead, upsert client). Connect 6,000+ apps — HubSpot, Salesforce, Gmail, Slack, Google Sheets.
Make (Integromat)
Instant webhook triggers + full action suite. 5× cheaper than Zapier for high-volume automation. Connect to 1,000+ apps with visual scenario builder.
OpenAPI / HubSpot / Salesforce
Import the OpenAPI 3.0 spec directly into HubSpot's API connector, Salesforce External Objects, Postman, or any tool that accepts OpenAPI.
API Resources
Seven resource groups covering every aspect of legal practice management.
Identity
Introspect the API key in use — name, environment, scopes, rate tier, and account UUID.
GET /me
Matters
Full CRUD on legal matters — create, update, delete, and ERP upsert by external_id.
GET /matters
GET /matters/:id
POST /matters
PUT /matters
PATCH /matters/:id
DELETE /matters/:id
Clients
Manage client records. Bi-directional sync with HubSpot, Salesforce, or any CRM via external_id upsert.
GET /clients
GET /clients/:id
POST /clients
PUT /clients
PATCH /clients/:id
DELETE /clients/:id
Time Entries
Log billable and non-billable time. Sync from Harvest, Toggl, or your own timekeeping system.
GET /time-entries
GET /time-entries/:id
POST /time-entries
PUT /time-entries
PATCH /time-entries/:id
DELETE /time-entries/:id
Invoices
Read-only invoice access — ideal for syncing to QuickBooks, Xero, or accounting dashboards.
GET /invoices
GET /invoices/:id
Leads
Capture leads from websites, CRMs, ad platforms, or call centers. Auto-deduplication and scoring.
POST /leads
GET /leads
Webhooks
Real-time push events. Subscribe to lead.created, matter.created, invoice.paid, and more.
GET /webhooks
POST /webhooks
POST /webhooks/:id/test
DELETE /webhooks/:id
Endpoint Reference
Detailed examples for each endpoint with real request/response bodies.
Identify API key (/me)
/me
Returns the authenticated key's name, environment (live/test), scopes, rate tier, and the owner's account UUID. Useful for verifying a key is valid and checking what it can access.
Request
curl 'https://www.lawhired.com/api/v1/me' \
-H 'Authorization: Bearer lh_live_xxx'Response
{
"key": {
"id": 1,
"name": "My CRM Integration",
"environment": "live",
"scopes": ["matters:read", "clients:read", "leads:write"],
"rate_tier": "pro"
},
"owner_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}List Matters (with delta sync)
/matters
Returns your matters paginated. Pass updated_since for incremental/delta sync — only records changed since that timestamp are returned.
Request
curl 'https://www.lawhired.com/api/v1/matters?limit=50&updated_since=2026-01-01T00:00:00Z' \
-H 'Authorization: Bearer lh_live_xxx'Response
{
"count": 12,
"limit": 50,
"offset": 0,
"data": [
{
"id": 1,
"title": "Smith v. Jones",
"status": "In Progress",
"case_category": "Litigation",
"client_id": 42,
"external_id": "ERP-MATTER-001",
"created_at": "2026-03-01T10:00:00Z",
"updated_at": "2026-03-15T14:32:00Z"
}
]
}Upsert a Matter by external_id
/matters
Idempotent create-or-update keyed on external_id. If a matter with that external_id already exists for your account it is updated; otherwise a new one is created. Safe to call every time your ERP syncs.
Request
curl -X PUT 'https://www.lawhired.com/api/v1/matters' \
-H 'Authorization: Bearer lh_live_xxx' \
-H 'Content-Type: application/json' \
-d '{
"external_id": "ERP-MATTER-001",
"title": "Smith v. Jones",
"status": "In Progress",
"client_id": 42
}'Response
{
"data": { "id": 1, "title": "Smith v. Jones", "external_id": "ERP-MATTER-001", ... },
"created": false
}Upsert a Client by external_id
/clients
Sync clients from HubSpot, Salesforce, or any CRM. Pass the CRM's contact ID as external_id — creates on first call, updates on subsequent ones.
Request
curl -X PUT 'https://www.lawhired.com/api/v1/clients' \
-H 'Authorization: Bearer lh_live_xxx' \
-H 'Content-Type: application/json' \
-d '{
"external_id": "HUBSPOT-CONTACT-123",
"company_name": "Acme Corp",
"email": "ap@acme.com",
"client_type": "business"
}'Response
{
"data": { "id": 7, "company_name": "Acme Corp", "external_id": "HUBSPOT-CONTACT-123", ... },
"created": true
}Capture a Lead
/leads
Submit a new lead from any source — website form, CRM, ad platform, or call center. Automatic deduplication by email and urgency-based scoring.
Request
curl -X POST 'https://www.lawhired.com/api/v1/leads' \
-H 'Authorization: Bearer lh_live_xxx' \
-H 'Content-Type: application/json' \
-d '{
"leadData": {
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@email.com",
"phone": "+1-555-0123",
"practice_area": "Family Law",
"description": "Need help with custody dispute",
"urgency": "high"
}
}'Response
{
"success": true,
"lead": {
"lead_id": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "John",
"email": "john.doe@email.com",
"status": "new",
"created_at": "2026-03-15T10:00:00Z"
}
}Create a Webhook
/webhooks
Subscribe a URL to one or more events. The signing secret (whsec_…) is returned once — store it immediately to verify delivery signatures with HMAC-SHA256.
Request
curl -X POST 'https://www.lawhired.com/api/v1/webhooks' \
-H 'Authorization: Bearer lh_live_xxx' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://your-crm.com/hooks/lawhired",
"events": ["lead.created", "invoice.paid"],
"description": "HubSpot CRM sync"
}'Response
{
"id": 3,
"url": "https://your-crm.com/hooks/lawhired",
"events": ["lead.created", "invoice.paid"],
"is_active": true,
"secret": "whsec_a1b2c3d4e5f6...",
"created_at": "2026-03-15T10:00:00Z"
}Log Time
/time-entries
Record a billable or non-billable time entry against a matter. Supports ERP upsert by external_id for syncing from Harvest, Toggl, or other timekeeping systems.
Request
curl -X POST 'https://www.lawhired.com/api/v1/time-entries' \
-H 'Authorization: Bearer lh_live_xxx' \
-H 'Content-Type: application/json' \
-d '{
"case_id": 1,
"description": "Draft motion for summary judgment",
"duration": 2.5,
"is_billable": true,
"rate": 350.00,
"activity_type": "Research"
}'Response
{
"data": {
"id": 42,
"case_id": 1,
"description": "Draft motion for summary judgment",
"duration": 2.5,
"is_billable": true,
"rate": 350.00
}
}List Invoices (read-only)
/invoices
Returns invoices for your account. Read-only — write operations are handled through QuickBooks or Xero sync.
Request
curl 'https://www.lawhired.com/api/v1/invoices?limit=50&updated_since=2026-01-01T00:00:00Z' \
-H 'Authorization: Bearer lh_live_xxx'Response
{
"count": 8,
"data": [
{
"invoice_id": 1,
"invoice_number": "INV-2026-001",
"total_amount": 5000.00,
"status": "paid",
"paid_date": "2026-03-10"
}
]
}Authentication & Rate Limits
Authentication
Every request requires an API key as a Bearer token:Authorization: Bearer lh_live_…
Keys are hashed at rest (SHA-256) and shown only once at creation. Create and revoke them in your developer dashboard.
Rate Limits
Free tier: 100 req/min
Pro tier: 1,000 req/min
Enterprise: Unlimited
When exceeded, you receive 429 Too Many Requests with a Retry-After header.
Scopes
Keys can be scoped to specific resources and operations:matters:read, matters:writeclients:read, clients:writeleads:read, leads:writeinvoices:read, webhooks:write
Ready to build?
Create a free Law Hired account to get your API key and start integrating today.
