> ## Documentation Index
> Fetch the complete documentation index at: https://docs.goliathdata.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Actions

> Things your Zaps can do inside Goliath.

Actions are how a Zap pushes data into Goliath. The current integration
focuses entirely on contacts: you can create them from structured fields,
create them from raw text using AI, update existing contacts, and look them
up.

Every contact created via a Zapier action is automatically labeled with
**Source: Zapier**, so you can filter for them in the Goliath contact list
and see a running count under **Automations → Integrations**.

<Note>
  Goliath de-duplicates contacts automatically. If a Zap creates a contact
  that matches an existing one, the new information is merged into the
  existing record instead of creating a duplicate — so it's safe to re-run
  a Zap.
</Note>

***

## Create Contact

Create a new contact from structured fields like name, phone, email, and
address.

### Fields

<ParamField path="full_name" type="string" optional>
  The contact's full name.
</ParamField>

<ParamField path="phone_number" type="string" optional>
  Phone number in any format. Include the country code for international
  numbers.
</ParamField>

<ParamField path="contact_email" type="string" optional>
  Email address.
</ParamField>

<ParamField path="contact_address" type="string" optional>
  A property address. Goliath will resolve it to a structured property and
  link it to the contact.
</ParamField>

<ParamField path="note" type="string" optional>
  An internal note attached to the contact.
</ParamField>

<ParamField path="tags" type="string[]" optional>
  Tag names to apply to the contact. New tags are created automatically if
  they don't exist yet in your workspace.
</ParamField>

<ParamField path="contributors" type="string[]" optional>
  Full names of Goliath users to add as contributors on the contact.
</ParamField>

### Example

A typical mapping from a web-form Zap might look like this:

| Zap step field    | Mapped from                |
| ----------------- | -------------------------- |
| `full_name`       | Form: Name                 |
| `phone_number`    | Form: Phone                |
| `contact_email`   | Form: Email                |
| `contact_address` | Form: Property Address     |
| `tags`            | `Inbound Lead`, `Web Form` |
| `note`            | Form: Message              |

***

## Create Contact from Text (AI)

Create a contact from a blob of unstructured text — call notes, a forwarded
email, a transcribed voicemail, a form submission. Goliath's extraction
model parses the text and pulls out the contact's name, phone, email,
address, and any other relevant context.

You can also pass any of the structured fields from **Create Contact**
alongside the text. Structured fields take precedence over what the AI
extracts, so use them when you already know the answer.

### Fields

<ParamField path="unstructured_text" type="string" required>
  Raw text describing the contact. Map this from the message body, voicemail
  transcript, or call notes in your trigger app.
</ParamField>

<ParamField path="full_name" type="string" optional>
  Override the AI-extracted name.
</ParamField>

<ParamField path="phone_number" type="string" optional>
  Override the AI-extracted phone.
</ParamField>

<ParamField path="contact_email" type="string" optional>
  Override the AI-extracted email.
</ParamField>

<ParamField path="contact_address" type="string" optional>
  Override the AI-extracted address.
</ParamField>

<ParamField path="tags" type="string[]" optional>
  Tag names to apply to the resulting contact.
</ParamField>

<ParamField path="note" type="string" optional>
  An additional internal note, on top of the unstructured text.
</ParamField>

<ParamField path="contributors" type="string[]" optional>
  Full names of users to assign as contributors.
</ParamField>

### Example

A voicemail transcription Zap might pass something like:

> *"Just got off the phone with Paul Davis. He's at 123 Main Street in
> Austin and wants to sell. His cell is 555-555-0123 and you can also reach
> him at [paul@example.com](mailto:paul@example.com). He mentioned he's looking at a 60-day close."*

Goliath will create a contact named **Paul Davis** with the phone, email,
and property address all extracted automatically.

<Note>
  Use this action when you're wiring Zapier to email parsers, voicemail
  transcribers, or any other source that produces messy text rather than
  clean fields.
</Note>

***

## Update Contact

Add new information to an existing contact without overwriting what's
already there. You'll need the contact's Goliath ID, which you can get from
the **Find Contact** action or from the **Contact Tag Added** trigger.

Updates are **additive**:

* New phone numbers and emails are appended; existing ones are kept.
* New tags are added; existing ones are kept.
* The note is replaced if you provide one.
* Contributors are added; existing contributors are not removed.

### Fields

<ParamField path="contact_id" type="string" required>
  The Goliath contact ID. Map this from a previous **Find Contact** step or
  from the **Contact Tag Added** trigger.
</ParamField>

All fields from **Create Contact** are also accepted and optional.

### Example

A common pattern is a follow-up Zap that watches your dialer for completed
calls, finds the matching contact in Goliath, and adds a note plus a
`Followed Up` tag:

| Zap step field | Mapped from              |
| -------------- | ------------------------ |
| `contact_id`   | Find Contact step → `id` |
| `tags`         | `Followed Up`            |
| `note`         | Dialer: Call Notes       |

***

## Find Contact

Look up an existing contact by name, phone, or email. Returns a list of
matches — usually 0 or 1, but more if duplicates exist in your workspace.

By default, the search requires **all** the fields you provide to match. Turn
on **Match any** to fall back to a looser search if the strict match returns
nothing.

### Fields

<ParamField path="full_name" type="string" optional>
  Full name to search for.
</ParamField>

<ParamField path="phone_number" type="string" optional>
  Phone number in any format.
</ParamField>

<ParamField path="contact_email" type="string" optional>
  Email address.
</ParamField>

<ParamField path="match_any" type="boolean" optional default="false">
  When on, if no contact matches all the fields you provided, Goliath
  retries with a looser search and returns matches on **any** of them, in
  priority order: name, then phone, then email.
</ParamField>

<Warning>
  You must provide at least one of **Full Name**, **Phone Number**, or
  **Email**. The step will fail if all three are empty.
</Warning>

### What you get back

Each result includes the contact's ID, name, all phone numbers, all emails,
all linked property addresses, contributors, and tags — so you can map any
of those into the next step of your Zap.

### Common patterns

* **Idempotent enrichment.** In a Zap that processes inbound leads, run
  **Find Contact** first. If it returns nothing, run **Create Contact**.
  Otherwise run **Update Contact** with the returned ID.
* **Routing.** Use **Find Contact** to resolve a phone number from an
  inbound SMS to the right Goliath contact, then push the message into a
  Slack thread tagged with the contact's name.
