Law Hired

Law Hired

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.

v1 · REST · Bearer auth7 resources, live6 webhook eventsZapier · Make ready

Ready to integrate?

Sign in to your Law Hired account to create API keys and manage webhooks.

Ready-made integrations

Zapier
Make
HubSpot
Salesforce
Postman

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.

ResourceReadWriteUpsert (ERP sync)
/mattersGET list · GET /:idPOST · PATCH /:id · DELETE /:idPUT by external_id
/clientsGET list · GET /:idPOST · PATCH /:id · DELETE /:idPUT by external_id
/time-entriesGET list · GET /:idPOST · PATCH /:id · DELETE /:idPUT by external_id
/invoicesGET list · GET /:idRead-only
/leadsGET listPOST

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');
lead.created

Fires when a new lead is captured from any source

matter.created

Fires when a new legal matter is opened

client.created

Fires when a new client is added

invoice.paid

Fires when an invoice status changes to paid

document.signed

Fires when an e-signature request is completed

ping.test

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.

App definition ready — submit to Zapier Developer Platform

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.

Module definitions ready — submit to Make Developer Hub

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.

Spec live at /openapi.json

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.

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"
}

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"
    }
  ]
}

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
}

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
}

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"
  }
}

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"
}

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
  }
}

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:write
clients:read, clients:write
leads:read, leads:write
invoices:read, webhooks:write

Ready to build?

Create a free Law Hired account to get your API key and start integrating today.

We use essential cookies to operate this platform, and optional analytics cookies (PostHog) to understand how it is used. We do not use advertising cookies. Cookie Policy · Privacy Policy