PracticeWings is currently in beta. Request early access →
REST API v1

PracticeWings API

Build powerful integrations for your firm. Access clients, engagements, tasks, billing, and more through our comprehensive REST API.

Quick Start

Everything you need to make your first API call.

Step 1

Authentication

// Include in all requests
Authorization: Bearer <your_access_token>
Step 2

Base URL

// All endpoints are prefixed with
https://api.practicewings.com/api/v1
Step 3

Response Format

// All responses wrapped in:
{
  "data": { ... }
}

API Reference

Explore endpoints organized by domain area.

Clients and Contacts

Manage client records, contacts, and client groups.

GET/clients
POST/clients
GET/contacts

Engagements

Create and manage client engagements and service agreements.

GET/engagements
POST/engagements
PATCH/engagements/:id

Work Items and Tasks

Create tasks, manage workflows, and track work completion.

GET/work-items
POST/work-items
PATCH/work-items/:id/status

Time Entries

Log time, manage timers, and track billable hours.

GET/time-entries
POST/time-entries
PATCH/time-entries/:id

Invoices and Billing

Generate invoices, record payments, and manage billing.

GET/invoices
POST/invoices
POST/payments

Documents

Upload, organize, and share documents with clients.

GET/documents
POST/documents/upload
GET/document-folders

Users and Organizations

Manage firm users, roles, permissions, and office locations.

GET/users
GET/organizations
GET/roles

Code Examples

Get started quickly with these ready-to-use examples.

# List all active clients
curl -X GET "https://api.practicewings.com/api/v1/clients" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json"

# Create a new client
curl -X POST "https://api.practicewings.com/api/v1/clients" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "displayName": "Acme Corporation",
    "type": "business",
    "status": "active",
    "email": "[email protected]"
  }'
// List all active clients
const response = await fetch('https://api.practicewings.com/api/v1/clients', {
  headers: {
    'Authorization': `Bearer ${accessToken}`,
    'Content-Type': 'application/json'
  }
});

const { data } = await response.json();
console.log(data); // Array of client objects

// Create a new client
const newClient = await fetch('https://api.practicewings.com/api/v1/clients', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${accessToken}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    displayName: 'Acme Corporation',
    type: 'business',
    status: 'active',
    email: '[email protected]'
  })
});
import requests

# List all active clients
headers = {
    "Authorization": f"Bearer {access_token}",
    "Content-Type": "application/json"
}

response = requests.get(
    "https://api.practicewings.com/api/v1/clients",
    headers=headers
)

clients = response.json()["data"]

# Create a new client
new_client = requests.post(
    "https://api.practicewings.com/api/v1/clients",
    headers=headers,
    json={
        "displayName": "Acme Corporation",
        "type": "business",
        "status": "active",
        "email": "[email protected]"
    }
)

Request API Access

Tell us about your integration needs and we'll get you set up with API credentials.