Integration Steps
Follow these steps to integrate your application with Clio Manage through LawLink.ai.
Create Organization Admin & Login
First, a Superuser or Admin creates an Organization Admin (ORG_ADMIN) account for your law firm. The ORG_ADMIN will manage attorneys and API tokens for the organization.
💡 Tip: Login to LawLink at
https://app.lawlink.ai using your ORG_ADMIN credentials.
Create API Access Token
Navigate to API Tokens page and create a new API access token for integration. Set an appropriate expiration period (e.g., 1 year). Copy the token immediately — it's only shown once!
⚠️ Important: Store your API token securely. It grants access to all attorneys in your organization via the attorney_email parameter.
Add Attorney Users
As an ORG_ADMIN, navigate to the Organization page and add user accounts for each attorney. Each attorney will have their own Clio connection and data.
📋 Fields Required: Email, Full Name, Password. Users are automatically assigned the USER role.
Authentication
Attorney Authorizes Clio Access
Each attorney must authorize LawLink to access their Clio Manage account. Send a Clio Invitation from the Organization page, or have the attorney login and connect directly.
🔐 OAuth Flow: The attorney will be redirected to Clio to grant access, then returned to LawLink upon success.
API Usage
Call APIs with Token & Attorney Email
Use your API token in the Authorization header as a Bearer token.
Specify which attorney's Clio account to access using the attorney_email query
parameter.
API Request Structure
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json
# Query Parameter (for ORG_ADMIN tokens)
attorney_email=attorney@lawfirm.com
Example: Get Contacts
# Get contacts for a specific attorney
curl.exe -X GET \
"https://app.lawlink.ai/api/v1/clio/contacts?attorney_email=attorney@lawfirm.com&limit=10" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/json"
Example: Create Contact
# Create a new contact in attorney's Clio account
curl.exe -X POST \
"https://app.lawlink.ai/api/v1/clio/contacts/create?attorney_email=attorney@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com",
"phone": "+15551234567"
}'
🔑 Key Points:
- The
attorney_emailparameter identifies which attorney's Clio account to use - The API token authenticates your application to LawLink
- All API calls affect the specified attorney's Clio data
- ORG_ADMIN tokens can access any attorney in their organization
Contact Conflict Check
Implement Contact Conflict Check
Before creating a new contact, use the /api/v1/clio/contacts/check endpoint
to detect potential duplicates. This prevents dirty data in your Clio account.
🔍 Detection Logic:
- High Confidence Fail: Exact email match OR (Name + Phone match)
- Low Confidence Fail: Name OR Phone match (partial match - same phone or similar name)
- Pass: No match found (Safe to create)
POST /api/v1/clio/contacts/check
{
"first_name": "John",
"last_name": "Smith",
"email": "john@example.com", // Optional
"phone": "+15551234567" // Optional
}
{
"status": "pass",
"message": "Conflict check passes"
}
{
"status": "high_confidence_fail",
"message": "Conflict check failed with high confidence",
"reason": "Email matches an existing contact",
"contact": { "id": 12345, "name": "John Smith", ... }
}
{
"status": "low_confidence_fail",
"message": "Conflict check failed with low confidence",
"reason": "Name OR phone number matches (but not both)",
"matches": [ { "id": 67890, "name": "John Smith", ... } ]
}
Calendar & Automated Booking
1. Discover Available Calendars
Retrieve all calendars the attorney has access to (Personal, Firm-wide, or Shared). Each calendar returned includes its unique ID and brand color.
Example: Get Calendars
# Fetch list of calendars for an attorney
curl.exe -X GET \
"https://app.lawlink.ai/api/v1/clio/calendars?attorney_email=attorney@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN"
// Returns list of available calendars
{
"data": [
{ "id": 123, "name": "Default Calendar", "color": "#367b9c" },
{ "id": 456, "name": "Firm Holidays", "color": "#e2445c" }
]
}
2. Check Availability
Retrieve a complete list of events for any given date. Instead of just free/busy blocks, LawLink provides the full context of the attorney's schedule.
🕒 Schedule Logic:
- Returns Full Event List: Every calendar entry for the requested period.
- Start/End Precision: All event times are normalized for easy integration with frontend calendars.
Example: Check Availability
# Find free gaps for a specific date
curl.exe -X GET \
"https://app.lawlink.ai/api/v1/clio/get-availability?date=2026-03-20&calendar_id=123&attorney_email=attorney@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN"
// Returns raw list of events
{
"status": "success",
"events": [
{
"id": 1690562,
"summary": "Client Consultation",
"start_at": "2026-03-24T10:00:00Z",
"end_at": "2026-03-24T11:00:00Z",
"location": "Zoom",
"description": "Initial case review"
}
]
}
3. Smart Slot Booking
Once a slot is chosen, LawLink validates availability one last time before creating the event to prevent double-booking.
🧠 Booking Intelligence:
- Deterministic Timing: Send simple timestamps; LawLink handles the attorney's timezone.
- Conflict Safeguards: If a collision occurs, the API returns the conflicting event and suggested free slots automatically.
Example: Book a Slot
# Create event with conflict protection
curl.exe -X POST \
"https://app.lawlink.ai/api/v1/clio/book-slot?attorney_email=attorney@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"summary": "Legal Consultation",
"start_at": "2026-03-20T10:00:00",
"end_at": "2026-03-20T11:00:00",
"calendar_id": 123
}'
// Success Response (No Conflict)
{
"event": {
"id": "4699678906",
"summary": "Legal Consultation",
"start_at": "2026-03-20T04:30:00Z",
"end_at": "2026-03-20T05:30:00Z",
"matter": null,
"calendar_owner": {
"id": 123456,
"name": "Primary Calendar"
}
},
"reminders_created": []
}
// Conflict Response (Double-booking Prevention)
{
"available": false,
"message": "Slot not available on calendar 123456. See suggestions below.",
"conflict": {
"id": "123456789",
"summary": "Meeting",
"start_at": "2026-02-26T10:00:00+00:00",
"end_at": "2026-02-26T11:00:00+00:00",
"all_day": false
},
"suggested_slots": [
{ "start": "10:42", "end": "14:00", "duration_minutes": 198 },
{ "start": "15:00", "end": "15:30", "duration_minutes": 30 }
]
}
4. Create Specialized Calendars
Organize your firm by creating dedicated calendars for specific workflows (e.g., "Intakes", "Depositions", "Court Dates").
🎨 Color Validation: Clio only accepts 20 specific brand colors. LawLink ensures your new calendars always use firm-approved styling.
Example: Create New Calendar
# Add a specialized workflow calendar
curl.exe -X POST \
"https://app.lawlink.ai/api/v1/clio/calendars?attorney_email=attorney@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Intake Calendar",
"color": "#367b9c"
}'
// New calendar details
{
"id": 789,
"name": "Intake Calendar",
"color": "#367b9c",
"visible": true
}
🛠️ Developer Note:
LawLink strictly requires ISO-8601 compliant timestamps. Non-ISO formats (e.g.,
MM/DD/YYYY) will be rejected.
Dates may be naive (e.g., 2026-03-20T10:00:00) or ISO with an offset. If no offset
is provided, the attorney's Clio-configured timezone is assumed.
Document Management
LawLink exposes the full Clio document lifecycle: list, upload, rename/move, lock, delete, and retrieve
download links. All endpoints accept attorney_email for ORG_ADMIN access.
1. List & Search Documents
Retrieve documents filtered by matter, folder, contact, category, text query, or lock state. All filters are optional — omit them to list all documents.
# Documents for a specific matter, newest first
curl.exe -X GET \
"https://app.lawlink.ai/api/v1/clio/documents?matter_id=1773038573&order=created_at(desc)&limit=25&attorney_email=jane@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN"
// Response
{
"data": [
{
"id": 18893119313,
"name": "Retainer_Agreement_v2.pdf",
"locked": false,
"matter": { "id": 1773038573 },
"document_category": { "id": 4, "name": "Agreements" },
"created_at": "2026-04-01T09:15:00Z"
}
]
}
2. Upload a Document File
Send a multipart/form-data POST. LawLink handles the full Clio signed-URL
upload flow (create session → PUT to S3 → mark complete) transparently.
Provide exactly one parent: matter_id, folder_id,
contact_id, or document_id (to add a new version).
⚠️ Parent Rule: Supplying more than one parent returns HTTP 400. Use
document_id only when uploading a new version of an existing document.
# Upload a new document to a matter
curl.exe -X POST \
"https://app.lawlink.ai/api/v1/clio/documents/upload?attorney_email=jane@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-F "file=@Retainer_Agreement.pdf" \
-F "matter_id=1773038573" \
-F "category_id=4"
# Upload a new version of an existing document
curl.exe -X POST \
"https://app.lawlink.ai/api/v1/clio/documents/upload?attorney_email=jane@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-F "file=@Retainer_Agreement_v3.pdf" \
-F "document_id=18893119313"
{
"data": { "id": 18903442808, "latest_document_version": { "fully_uploaded": true } },
"upload": { "mode": "signed_put_url", "completed": true }
}
3. Rename, Move, Lock, or Restore
A single PATCH covers all metadata mutations. Send only the fields you want to change.
🔑 Operations supported in one call:
name— rename the filematter_id/folder_id/contact_id— move to a new parent (one at a time)locked: true/false— lock or unlockcategory_id— reassign categoryrestore: true— recover a trashed document
# Rename and lock in one request
curl.exe -X PATCH \
"https://app.lawlink.ai/api/v1/clio/documents/18893119313?attorney_email=jane@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Retainer_Agreement_FINAL.pdf",
"locked": true
}'
4. Get a Download Link
Returns a short-lived signed S3 URL (typically valid for 10 minutes). Pass
version_id to download a specific version; omit for the latest.
# Download link for a specific version
curl.exe -X GET \
"https://app.lawlink.ai/api/v1/clio/documents/18893119313/download-link?version_id=18981709538&attorney_email=jane@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN"
{
"document_id": "18893119313",
"version_id": "18981709538",
"download_url": "https://iris-production.s3.us-east-1.amazonaws.com/uploads/...",
"status_code": 302
}
5. Delete & Restore
Clio uses soft deletion — deleted documents move to trash and are permanently removed
after 30 days. A GET by ID still returns the document (with a deleted_at
timestamp) until then.
# Soft-delete (move to trash)
curl.exe -X DELETE \
"https://app.lawlink.ai/api/v1/clio/documents/18893119313?attorney_email=jane@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN"
# Restore from trash
curl.exe -X PATCH \
"https://app.lawlink.ai/api/v1/clio/documents/18893119313?attorney_email=jane@lawfirm.com" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "restore": true }'