Skip to content
Developers

Build on SynthCounsel.

Public REST API + signed outbound webhooks for the firm tier. Bearer-token auth. OpenAPI 3.0 spec. Build your integration against a real legal-document engine instead of writing one from scratch.

Three things you can build

Custom matter intake

Embed an intake form on your firm site. POST to /api/v1/matters with a Bearer token and the matter shows up in /firm. Webhook subscriptions fire matter.created back to your CRM.

Two-way Clio replacement

Listen to time_entry.created and time_entry.pushed_to_clio webhooks. Push your time-tracker into SynthCounsel, get back the same data once it hits Clio. Saves the integration team a sprint.

Automation triggers

document.approved fires when an attorney signs off on a draft. Use it to kick off DocuSign envelopes, calendar events, Slack notifications — anything you can attach to a webhook.

Quickstart

30-second cURL test. Replace YOUR_KEY with a key generated at /firm/settings/api-keys.

# 1. List your matters
curl -H "Authorization: Bearer YOUR_KEY" \
  https://synthcounsel.com/api/v1/matters?limit=5

# 2. Create a matter
curl -X POST \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Smith v. Acme","client_name":"John Smith","jurisdiction":"CA"}' \
  https://synthcounsel.com/api/v1/matters

# 3. Log billable time
curl -X POST \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"matter_id":"<from step 2>","duration_minutes":45,"description":"Initial client call"}' \
  https://synthcounsel.com/api/v1/time-entries

Webhook signatures

Every webhook delivery includes an HMAC-SHA256 signature in the X-SynthCounsel-Signature header as sha256=<hex>. Verify before processing:

// Node.js / TypeScript
import { createHmac, timingSafeEqual } from 'node:crypto';

function verifyWebhook(req: Request, secret: string, body: string): boolean {
  const header = req.headers.get('x-synthcounsel-signature') ?? '';
  const expected = 'sha256=' + createHmac('sha256', secret).update(body).digest('hex');
  return header.length === expected.length &&
    timingSafeEqual(Buffer.from(header), Buffer.from(expected));
}

Rate limits

  • · 60 requests / minute / key (default).
  • · Headers: X-RateLimit-Limit, X-RateLimit-Remaining.
  • · On 429: honor the Retry-After seconds header.
  • · Need a higher limit? Email api@synthcounsel.com.

Versioning

The current version is /v1. Breaking changes ship on a new path (/v2) with a deprecation window for the previous version. Additive changes (new fields, new endpoints) ship to the existing version without version-bump.

Growth tier required

The public API is included with the SynthCounsel Growth tier. Solo and Small tiers do not get key issuance — upgrade to enable. Existing keys revoke immediately if subscription lapses.