Co-owners API
List, create, modify, and delete co-owners via the Syndic+ API.
Overview#
The Co-owners module exposes 4 MCP tools and equivalent REST endpoints for managing the unit owners of your syndicate.
| MCP tool | REST method | Scope |
|---|---|---|
list_co_owners | GET /api/co-owners | read:co-owners |
create_co_owner | POST /api/co-owners | write:co-owners |
update_co_owner | PATCH /api/co-owners/:id | write:co-owners |
delete_co_owner | DELETE /api/co-owners/:id | write:co-owners |
Co-owner object#
{
id: string; // UUID
firstName: string;
lastName: string;
email: string | null;
phone: string | null;
unitId: string; // UUID — see /docs/api/units
fractionPercent: number; // 0-100 (ownership share %)
isResident: boolean; // true = lives in the unit
isPrimary: boolean; // true = primary co-owner (1 per unit)
language: "fr" | "en";
hasPortalAccess: boolean;
createdAt: string; // ISO 8601
updatedAt: string;
}
list_co_owners#
Parameters#
| Parameter | Type | Required | Description |
|---|---|---|---|
unitId | string | — | Filter by unit |
search | string | — | Search by name or email |
hasPortalAccess | boolean | — | Filter those with portal access |
pageSize | number | — | 1–200, default 50 |
page | number | — | Default 1 |
Example#
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_co_owners",
"arguments": {
"search": "Tremblay",
"pageSize": 100
}
}
}
Response#
{
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"firstName": "Marie",
"lastName": "Tremblay",
"email": "marie@example.com",
"unitId": "123e4567-e89b-12d3-a456-426614174000",
"fractionPercent": 2.5,
"isPrimary": true
}
],
"pagination": {
"page": 1,
"pageSize": 100,
"total": 47
}
}
create_co_owner#
Parameters#
| Parameter | Type | Required | Description |
|---|---|---|---|
firstName | string | ✅ | 1–100 characters |
lastName | string | ✅ | 1–100 characters |
email | string | — | Valid email format |
phone | string | — | E.164 format recommended |
unitId | string (UUID) | ✅ | Unit must exist |
fractionPercent | number | — | 0–100, default 0 |
isResident | boolean | — |
Example#
{
"name": "create_co_owner",
"arguments": {
"firstName": "Marie",
"lastName": "Tremblay",
"email": "marie@example.com",
"unitId": "123e4567-e89b-12d3-a456-426614174000",
"fractionPercent": 2.5,
"isPrimary": true,
"language": "fr"
}
}
Common errors#
| Code | Cause |
|---|---|
UNIT_NOT_FOUND | unitId doesn't exist in your syndicate |
DUPLICATE_PRIMARY | Unit already has an isPrimary: true |
INVALID_EMAIL | Invalid email format |
FRACTION_OUT_OF_RANGE | fractionPercent < 0 or > 100 |
update_co_owner#
Parameters#
All fields optional except id. Only provided fields are updated.
{
"name": "update_co_owner",
"arguments": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "marie.tremblay@new.com",
"phone": "+15145550123"
}
}
delete_co_owner#
Parameters#
| Parameter | Type | Required |
|---|---|---|
id | string (UUID) | ✅ |
Behavior#
- Soft delete (no physical removal) — the co-owner is marked
deletedAtand dropped from lists - Payment history, minutes, and meeting decisions remain intact
- If the co-owner has an active portal access, it's automatically revoked
- Permission required: only a syndicate admin can delete
Restore#
To restore an archived co-owner, use restore_co_owner (available via UI: Registry → Archives).
Bulk import#
To import multiple co-owners at once, use bulk_create_co_owners:
{
"name": "bulk_create_co_owners",
"arguments": {
"coOwners": [
{ "firstName": "Marie", "lastName": "Tremblay", "unitId": "..." },
{ "firstName": "Jean", "lastName": "Dupuis", "unitId": "..." }
]
}
}
Max 500 co-owners per call. The response contains created IDs and any per-row errors.