Overview
The Contacts domain stores people, organizations, and the relationships between them. Data models are built on vCard (RFC 6350) with extensions for interaction tracking, affiliations, and flexible tagging. Contacts are the connective tissue of Backside.app. Other domains (CRM deals, calendar attendees, task assignees) reference contacts by UUID rather than duplicating data. A contact updated in one place is updated everywhere.Data Model
Entities
| Entity | Description |
|---|---|
| Contact | A person, organization, or group. The core entity. |
| Channel | A communication channel (email, phone, social, custom) attached to a contact. |
| Address | A physical or mailing address attached to a contact. |
| Date | A significant date (birthday, anniversary, custom) attached to a contact. |
| Relationship | A typed connection between two contacts (reports_to, spouse, friend, etc.). |
| Affiliation | A person’s role at an organization (title, department, start/end dates). |
| Interaction | A logged touchpoint (meeting, call, email, note) with one or more contacts. |
| Tag | A label for categorizing contacts. Tags are tenant-scoped. |
| Group | A named collection of contacts for bulk operations. |
Contact kinds
Every contact has akind field:
| Kind | Description |
|---|---|
person | An individual human |
organization | A company, team, or institution |
group | A named collection (mailing list, family, etc.) |
Key Concepts
Communication channels
Channels store how you reach someone. Each channel has atype (email, phone, twitter, linkedin, custom) and a value.
- Emails are stored lowercased for consistent matching
- Phones should use E.164 format (
+15551234567) for reliable lookup - Use
GET /api/v1/contacts/find-by-channel?type=email&[email protected]to find a contact by email or phone
Relationships
Relationships connect two contacts with a typed, directional link. Default types includereports_to, works_with, manages, spouse, partner, parent, child, sibling, friend, and other. Custom types can be added per tenant.
Relationships have a from_contact_id and to_contact_id. The direction matters: “Alice reports_to Bob” is different from “Bob reports_to Alice”.
Affiliations
Affiliations link a person to an organization with role details: title, department, start date, end date. A person can have multiple affiliations (current and past employers).Interaction history
Log meetings, calls, emails, and other touchpoints. Each interaction has atype, occurred_at timestamp, summary, optional body, and can involve multiple contacts (participant_ids). Interactions are immutable — log them, don’t edit them.
Tags and groups
Tags are lightweight labels (e.g., “VIP”, “investor”, “friend”). Tag definitions are tenant-scoped. Apply the same tag to multiple contacts. Groups are named collections for bulk operations. A contact can belong to multiple groups.Soft delete
Deleted contacts are soft-deleted (deleted_at is set). They no longer appear in list/search results but can be restored. Related entities (channels, addresses, etc.) are cascade-deleted.
Full-text search
Search across display names, emails, phones, company names, titles, and tags using theq parameter on GET /api/v1/contacts.
MCP Tools
| Tool | Description |
|---|---|
contacts_search | Find contacts by name, email, phone, or any field |
contacts_get | Get full details for a specific contact |
contacts_create | Add a new person, organization, or group |
contacts_update | Update contact information |
contacts_delete | Remove a contact |
contacts_list_relationships | See who is connected to whom |
contacts_log_interaction | Record a meeting, call, or other touchpoint |
contacts_find_by_channel | Look up a contact by email or phone |
