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-entriesWebhook 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-Afterseconds 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.