# Contact

URL: /business/nouns/contact · Id: `noun:contact`

> A Contact is a person or Agent a Startup knows by at least one address, where Consent to message them is recorded.

A Contact is a person or [Agent](/business/nouns/agent) a [Startup](/business/nouns/startup) knows by at least one address, where [Consent](/business/nouns/consent) to message them is recorded.

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `email` | `email` | No | The primary email address. |
| `phone` | `string` | No | The primary phone number. |
| `name` | `string` | No | The name the Contact goes by. |

Inherits from [Party](/business/nouns/party), which adds no properties of its own.

## Object
```json
{
  "$id": "https://api.sb/tutorloop.com/contacts/contact_1",
  "$type": "Contact",
  "email": "malik@tutorloop.com",
  "phone": "Example phone",
  "name": "TutorLoop"
}
```

## Relationships
- <a id="rel-becomes"></a>A Contact **becomes** one [Customer](/business/nouns/customer): a Contact becomes a [Customer](/business/nouns/customer) on accepting an [Offer](/business/nouns/offer). `becomes`, inverse [`contact`](/business/nouns/customer#rel-contact).
- <a id="rel-enrolled-in"></a>A Contact **is enrolled in** many [Sequences](/business/nouns/sequence): a [Sequence](/business/nouns/sequence) runs for an enrolled Contact until a reply, a purchase, or another exit [Event](/business/nouns/event) ends it. `enrolledIn`, inverse [`enrolls`](/business/nouns/sequence#rel-enrolls).
- <a id="rel-enrollments"></a>A Contact **has** many [Enrollments](/business/nouns/enrollment): the Contact this run belongs to; pausing one Contact’s nurture pauses this [Enrollment](/business/nouns/enrollment). `enrollments`, inverse [`runsFor`](/business/nouns/enrollment#rel-runs-for).
- <a id="rel-gives"></a>A Contact **gives** many [Consents](/business/nouns/consent): a Contact grants [Consents](/business/nouns/consent), each for one [Purpose](/business/nouns/purpose), with its basis and expiry. `gives`, inverse [`givenBy`](/business/nouns/consent#rel-given-by).
- <a id="rel-registrations"></a>A Contact **has** many [Registrations](/business/nouns/registration): each [Registration](/business/nouns/registration) holds one Contact’s place; one Contact registers for many [Gatherings](/business/nouns/gathering). `registrations`, inverse [`names`](/business/nouns/registration#rel-names).
- <a id="rel-resolves-to"></a>A Contact **resolves to** one [Person](/business/nouns/person): each Contact is one [Startup](/business/nouns/startup)’s view of a [Person](/business/nouns/person) shared across every Startup that knows them. `resolvesTo`, inverse [`contacts`](/business/nouns/person#rel-contacts).
- <a id="rel-works-at"></a>A Contact **works at** one [Organization](/business/nouns/organization): a Contact works for one [Organization](/business/nouns/organization), as this [Startup](/business/nouns/startup) knows it. `worksAt`, inverse [`people`](/business/nouns/organization#rel-people).

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| [Contact.enrich](/business/nouns/contact/enrich) | Enrich fills a Contact’s missing fields from outside sources and marks each value with where it came from. | [Prospector](/agents/sales/prospector) | [`Contact.enriched`](/business/events/Contact.enriched) | None. |
| [Contact.enroll](/business/nouns/contact/enroll) | Enroll adds a Contact to a Sequence, which sends its steps until the Contact replies or exits. | [Prospector](/agents/sales/prospector) | [`Contact.enrolled`](/business/events/Contact.enrolled) | None. |
| [Contact.merge](/business/nouns/contact/merge) | Merge joins a duplicate Contact into another, keeping every link, Message and Event on the one that remains. | [Sales Lead](/agents/sales/sales-lead) | [`Contact.merged`](/business/events/Contact.merged) | One-way: `send`, `do` |
| [Gathering.register](/business/nouns/gathering/register) | Register gives a Contact a place at a Gathering, or a waitlist place when the Gathering is full. | [Marketing Lead](/agents/marketing/marketing-lead) | [`Gathering.registered`](/business/events/Gathering.registered) | Two-way: `try`, `send`, `do` |
| [Quote.request](/business/nouns/quote/request) | Request asks a Startup for terms on one or more Offers, with the volume, term or scope wanted. | [Contact](/business/nouns/contact) | [`Quote.requested`](/business/events/Quote.requested) | None. |
| [Contact.subscribe](/business/nouns/contact/subscribe) | Subscribe records a Contact’s chosen topics and frequency from the hosted preference page, with Consent for each topic. | [Marketing Lead](/agents/marketing/marketing-lead) | [`Contact.subscribed`](/business/events/Contact.subscribed) | Two-way: `try`, `send`, `do` |
| [Contact.suppress](/business/nouns/contact/suppress) | Suppress records a Suppression for a Contact’s address, which every Startup honors forever. | [Prospector](/agents/sales/prospector) | [`Contact.suppressed`](/business/events/Contact.suppressed) | None. |
| [Contact.unsubscribe](/business/nouns/contact/unsubscribe) | Unsubscribe stops commercial Messages to a Contact in one click, for one topic or all, honored at once. | [Marketing Lead](/agents/marketing/marketing-lead) | [`Contact.unsubscribed`](/business/events/Contact.unsubscribed) | Two-way: `try`, `send`, `do` |
| [Consent.withdraw](/business/nouns/consent/withdraw) | Withdraw ends a Consent at once: processing for its Purpose stops, and the record is kept. | [Privacy Officer](/agents/legal/privacy-officer) | [`Consent.withdrawn`](/business/events/Consent.withdrawn) | Two-way: `try`, `send`, `do` |
| <a id="create"></a>[Contact.create](/business/nouns/contact/create) | Creates a Contact. Inherited from [Noun](/business/nouns/noun). | None. | `Contact.created` | Two-way: `try`, `send`, `do` |
| <a id="get"></a>[Contact.get](/business/nouns/contact/get) | Returns one Contact by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Contact.list](/business/nouns/contact/list) | Returns Contacts, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="update"></a>[Contact.update](/business/nouns/contact/update) | Changes the given properties of a Contact. Inherited from [Noun](/business/nouns/noun). | None. | `Contact.updated` | Two-way: `try`, `send`, `do` |
| <a id="delete"></a>[Contact.delete](/business/nouns/contact/delete) | Deletes a Contact; its history is kept. Inherited from [Noun](/business/nouns/noun). | None. | `Contact.deleted` | One-way: `send`, `do` |

## Permissions
Which Access level may call each Verb. One-way Verbs wait their delay window.

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Contact.create` | Yes | Yes | Yes | No |
| `Contact.get` | Yes | Yes | Yes | Yes |
| `Contact.list` | Yes | Yes | Yes | Yes |
| `Contact.update` | Yes | Yes | Yes | No |
| `Contact.delete` | Yes | Yes | Yes | No |
| `Contact.enrich` | Yes | Yes | Yes | No |
| `Contact.enroll` | Yes | Yes | Yes | No |
| `Contact.merge` | Yes | No | No | No |
| `Contact.subscribe` | Yes | Yes | Yes | No |
| `Contact.suppress` | Yes | Yes | Yes | No |
| `Contact.unsubscribe` | Yes | Yes | Yes | No |

## Call it

**Ask**

```text
Enroll the contact Malik Owens with a sequence.
```

**API**

```bash
curl -X POST https://api.sb/tutorloop.com/contacts/contact_1/enroll \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sequence":"sequence_1"}'
```

```json
{
  "api": "https://api.sb/tutorloop.com",
  "contact": {
    "$id": "https://api.sb/tutorloop.com/contacts/contact_1",
    "$type": "Contact",
    "email": "malik@tutorloop.com",
    "phone": "Example phone"
  },
  "enrollment": {
    "$id": "https://api.sb/tutorloop.com/enrollments/enrollment_1",
    "$type": "Enrollment",
    "status": "active",
    "step": "Example step"
  },
  "action": {
    "$id": "https://api.sb/tutorloop.com/actions/action_1",
    "operation": "Contact.enroll",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/tutorloop.com/actions/action_1"
  }
}
```

**SDK**

```ts
import { $ } from 'startup-builder'

const { contact, enrollment } = await $.Contact.enroll({ contact: 'contact_1', sequence: 'sequence_1' })
```

**CLI**

```bash
npx startup-builder do Contact.enroll --json '{"contact":"contact_1","sequence":"sequence_1"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Contact.enroll({ contact: 'contact_1', sequence: 'sequence_1' })"
  }
}
```

## Example
`owner@brightsmiles.dental` books a demo of a dental-scheduling [App](/business/nouns/app) and becomes a Contact. She has not given marketing [Consent](/business/nouns/consent), so she gets replies about her demo but no newsletter.