API reference
Every read an API key can make. Each needs the scope shown, and the key's maker must still hold that permission in your organization. Send Authorization: Bearer <key> to your region's server; {orgId} is your organization's id.
GET /v1/orgs/{orgId}: An organizationGET /v1/orgs/{orgId}/clients: Which families gave the firm's professionals access, and since when (names and dates only)GET /v1/orgs/{orgId}/members: Members and their rolesGET /v1/orgs/{orgId}/outcomes: De-identified outcomes across the firm's client families over 90 days (never below 5 families)GET /v1/orgs/{orgId}/referral-codes: The organization's referral codes and their countsGET /v1/orgs/{orgId}/referral-earnings: The organization's share of what families it referred have paid, by month (sums only)GET /v1/orgs/{orgId}/roles: System org roles and this organization's ownGET /v1/orgs/{orgId}/seats: The organization's seats for client families: how many, how many in use, and what pays for themGET /v1/orgs/{orgId}/seats/families: Which client families have a seat, and which could have one (names only)
GET/v1/orgs/{orgId}
An organization.
Scope: org.read
Response fields
| Field | Type |
|---|---|
id | id (uuid) |
name | string |
slug | string |
kind | "direct" | "law_firm" | "mediation" | "legal_aid" | "court" | "nonprofit" | "other" |
status | string |
createdAt | date-time |
Example response
{
"id": "5f0c2a1e-8d4b-4c7a-9e21-3b6f0d9a7c14",
"name": "…",
"slug": "…",
"kind": "direct",
"status": "…",
"createdAt": "2026-10-09T18:30:00.000Z"
}GET/v1/orgs/{orgId}/clients
Which families gave the firm's professionals access, and since when (names and dates only).
Scope: org.clients.read
Response fields
| Field | Type |
|---|---|
clients | object[] |
clients[].grantId | id (uuid) |
clients[].kind | "attorney" | "neutral" |
clients[].professional | string |
clients[].family | string |
clients[].since | date-time |
clients[].endsAt | date-time | null |
clients[].status | "active" | "ended" |
seats | object |
seats.members | integer |
seats.professionalsWithClients | integer |
seats.activeFamilies | integer |
Example response
{
"clients": [
{
"grantId": "5f0c2a1e-8d4b-4c7a-9e21-3b6f0d9a7c14",
"kind": "attorney",
"professional": "…",
"family": "…",
"since": "2026-10-09T18:30:00.000Z",
"endsAt": "2026-10-09T18:30:00.000Z",
"status": "active"
}
],
"seats": {
"members": 0,
"professionalsWithClients": 0,
"activeFamilies": 0
}
}GET/v1/orgs/{orgId}/members
Members and their roles.
Scope: org.members.read
Response fields
| Field | Type |
|---|---|
[].userId | string |
[].name | string |
[].email | string |
[].title | string | null |
[].status | string |
[].roles | object[] |
[].roles[].id | id (uuid) |
[].roles[].key | string |
[].roles[].name | string |
Example response
[
{
"userId": "…",
"name": "…",
"email": "…",
"title": "…",
"status": "…",
"roles": [
{
"id": "5f0c2a1e-8d4b-4c7a-9e21-3b6f0d9a7c14",
"key": "…",
"name": "…"
}
]
}
]GET/v1/orgs/{orgId}/outcomes
De-identified outcomes across the firm's client families over 90 days (never below 5 families).
Scope: org.analytics.read
Response fields
| Field | Type |
|---|---|
windowDays | integer |
families | integer |
minimumFamilies | integer |
shown | boolean |
calmMessages | object | null |
calmMessages.count | integer |
calmMessages.of | integer |
calmMessages.percent | number | null |
exchangesOnTime | object | null |
exchangesOnTime.count | integer |
exchangesOnTime.of | integer |
exchangesOnTime.percent | number | null |
expensesAnsweredIn14Days | object | null |
expensesAnsweredIn14Days.count | integer |
expensesAnsweredIn14Days.of | integer |
expensesAnsweredIn14Days.percent | number | null |
Example response
{
"windowDays": 0,
"families": 0,
"minimumFamilies": 0,
"shown": true,
"calmMessages": {
"count": 0,
"of": 0,
"percent": 0
},
"exchangesOnTime": {
"count": 0,
"of": 0,
"percent": 0
},
"expensesAnsweredIn14Days": {
"count": 0,
"of": 0,
"percent": 0
}
}GET/v1/orgs/{orgId}/referral-codes
The organization's referral codes and their counts.
Scope: org.referrals.manage
Response fields
| Field | Type |
|---|---|
[].id | id (uuid) |
[].code | string |
[].link | string |
[].label | string | null |
[].active | boolean |
[].counts | object |
[].counts.signedUp | integer |
[].counts.qualified | integer |
[].counts.notCounted | integer |
Example response
[
{
"id": "5f0c2a1e-8d4b-4c7a-9e21-3b6f0d9a7c14",
"code": "…",
"link": "…",
"label": "…",
"active": true,
"counts": {
"signedUp": 0,
"qualified": 0,
"notCounted": 0
}
}
]GET/v1/orgs/{orgId}/referral-earnings
The organization's share of what families it referred have paid, by month (sums only).
Scope: org.referrals.manage
Response fields
| Field | Type |
|---|---|
months | object[] |
months[].month | string |
months[].currency | string |
months[].invoices | integer |
months[].shareCents | integer |
Example response
{
"months": [
{
"month": "…",
"currency": "…",
"invoices": 0,
"shareCents": 0
}
]
}GET/v1/orgs/{orgId}/roles
System org roles and this organization's own.
Scope: org.roles.read
Response fields
| Field | Type |
|---|---|
[].id | id (uuid) |
[].key | string |
[].name | string |
[].description | string |
[].isSystem | boolean |
[].permissions | string[] |
Example response
[
{
"id": "5f0c2a1e-8d4b-4c7a-9e21-3b6f0d9a7c14",
"key": "…",
"name": "…",
"description": "…",
"isSystem": true,
"permissions": [
"…"
]
}
]GET/v1/orgs/{orgId}/seats
The organization's seats for client families: how many, how many in use, and what pays for them.
Scope: org.billing.manage
Response fields
| Field | Type |
|---|---|
total | integer |
used | integer |
paid | integer |
invoiced | integer |
pricePerSeat | object | null |
pricePerSeat.currency | string |
pricePerSeat.cents | integer |
subscriptions | object[] |
subscriptions[].status | string |
subscriptions[].quantity | integer |
subscriptions[].renewsAt | date-time | null |
subscriptions[].cancelAtPeriodEnd | boolean |
Example response
{
"total": 0,
"used": 0,
"paid": 0,
"invoiced": 0,
"pricePerSeat": {
"currency": "…",
"cents": 0
},
"subscriptions": [
{
"status": "…",
"quantity": 0,
"renewsAt": "2026-10-09T18:30:00.000Z",
"cancelAtPeriodEnd": true
}
]
}GET/v1/orgs/{orgId}/seats/families
Which client families have a seat, and which could have one (names only).
Scope: org.clients.read
Response fields
| Field | Type |
|---|---|
seats | object[] |
seats[].id | id (uuid) |
seats[].grantId | id (uuid) |
seats[].family | string |
seats[].professional | string |
seats[].kind | string |
seats[].givenAt | date-time |
eligible | object[] |
eligible[].grantId | id (uuid) |
eligible[].family | string |
eligible[].professional | string |
eligible[].kind | string |
ended | object[] |
ended[].id | id (uuid) |
ended[].family | string |
ended[].endedAt | date-time |
ended[].reason | string |
Example response
{
"seats": [
{
"id": "5f0c2a1e-8d4b-4c7a-9e21-3b6f0d9a7c14",
"grantId": "b81e7f02-3c95-4d1a-8f6e-2a7d9c04e5b3",
"family": "…",
"professional": "…",
"kind": "…",
"givenAt": "2026-10-09T18:30:00.000Z"
}
],
"eligible": [
{
"grantId": "0d4a96c3-71e8-4b25-a3f9-6c1e8b72d940",
"family": "…",
"professional": "…",
"kind": "…"
}
],
"ended": [
{
"id": "e7329b15-ca06-4f87-9d2b-58f1a3c6e0d7",
"family": "…",
"endedAt": "2026-10-09T18:30:00.000Z",
"reason": "…"
}
]
}