FlowRunner
PricingContact
Theme
Start Free

Contacts+

CRM

Connect AI agents to Contacts+, a shared contact management platform from FullContact. Agents create and dedupe contacts, apply tags, share address books across teams, and manage webhook subscriptions for downstream systems.

22 actions OAuth available
A scheduled sweep runs, or a new lead list lands in a spreadsheet
Search Contacts matches each person on email within the personal or team address book
Get Contacts by IDs reads each matched record to obtain its current etag
The agent compares the incoming fields against what the record already holds
Create Contact writes the people who matched nothing, then Manage Contact Tags labels the import
The address book owner receives a list of what was created, tagged, and deliberately left alone
A person approves every Update Contact that would run with Resolve Conflicts enabled

What This Integration Enables

Contacts+ is an address book, not a pipeline. It is where a scanned business card and a half-remembered introduction land long before anyone decides whether that person matters commercially, and it is usually shared, which is exactly what makes it fragile. The API reflects that reality more honestly than most contact tools do. Every update and every delete requires the record's current etag, so you cannot write without first reading, and Contacts+ will refuse a write that races another person's edit unless you explicitly instruct it to win. Most integrations treat that as friction to be configured away. FlowRunner treats it as the most useful signal the API produces, because a rejected write is not a failure, it is the platform telling you two sources of truth disagree about a human being.

Agents get the full record surface: create, update, delete, and search across personal and team contacts, tag creation and bulk tag application through Manage Contact Tags, ownership reassignment through Change Contact Owner, team enumeration through List Teams, and photo attachment from a file URL through Upload Contact Photo. Most actions accept an optional Team ID, so the same flow can operate on one person's private book or on a shared team book depending on what you pass, and Change Contact Owner requires one. Contacts+ ships no triggers to FlowRunner. The vendor has a webhook subscription API and this connector manages it through Create Webhook, Search Webhooks, Delete Webhook, Get Webhook Batches, and Get Webhook Triggers, but the payload Contacts+ delivers to a subscribed URL is not documented from a primary source, so no realtime trigger was built rather than one that guesses. Agents pick up change by polling List Contacts and Search Contacts with their scroll and search cursors, and Get Webhook Batches audits deliveries already going to another receiver across a trailing fourteen day window. Deletes of contacts, tags, and webhooks are permanent, which is why the digital andon cord hangs where the writes are contested.

Without FlowRunner

Address book drifts Contacts get corrected in one system and stay stale in the shared book nobody owns
Overwrites land silently A sync writes over a colleague's edit and neither person finds out until a call goes wrong
Tagging done one record at a time Segmentation happens by hand, so it lapses the week anyone gets busy

With FlowRunner

Reads happen before writes Every update starts by fetching the record and its current version marker
Contested edits surface A write that would overrule a change made since the record was read stops and gets shown to a person
Segmentation applied in bulk Tags are applied and removed across a matched set in one pass, on a schedule that does not lapse

Use Case Scenarios

An address book that stops drifting away from the CRM

The team's real customer data lives in HubSpot, but the shared Contacts+ book is what the field team actually opens on a phone. On a schedule, the agent pulls contacts changed since the last run, then calls Search Contacts on each email address to find the counterpart in the team book. For people with no match, Create Contact writes the record and Manage Contact Tags applies the account tier and territory. For people who already exist, the agent calls Get Contacts by IDs to read the record and its etag, compares the fields, and updates only the ones that genuinely changed. Records where both systems changed since the last sync are not written at all. They are collected and reported, because a two-sided change is a disagreement and not a stale field.

Business cards that become tagged records without a data entry queue

Cards scanned at a conference arrive as rows in Google Sheets with an image URL per row. The agent reads each row, calls Search Contacts to check whether the person is already in the book, and for genuinely new people calls Create Contact with the parsed name, company, and email. Upload Contact Photo then downloads the card image from the URL and attaches it to the record, so the original artifact stays with the data extracted from it. Manage Contact Tags applies the event name in one pass across the whole import, which makes the batch reversible as a set later. Rows where the parsed email is malformed or the company is missing are held back and routed to a person rather than written as a half record.

Ownership that follows the team, not the person who left

A rep changes territory. The agent calls List Teams to resolve the team context, then Search Contacts with a Team ID to pull every contact currently owned by the departing rep. It assembles the list, cross-references it against open work in the CRM, and posts a summary to the sales manager in Slack naming the accounts involved. Once the manager confirms the receiving rep, Change Contact Owner reassigns the set inside the team, and Manage Contact Tags stamps the transition date so the handover is visible on the record itself rather than in someone's memory of a meeting.

Human-in-Loop Highlight

The gate here is not the delete. It is Update Contact with Resolve Conflicts set to true. Contacts+ uses optimistic concurrency: you read a record, you get its etag, and your update is accepted only if that etag is still current. If somebody edited the contact in the meantime, the write is rejected. Resolve Conflicts is the escape hatch that tells Contacts+ to overwrite the record anyway, and it is genuinely useful, because a rejected write in the middle of an overnight sync will otherwise strand hundreds of records. It is also the single fastest way to erase a colleague's work without anybody noticing, because the overwrite succeeds quietly and the previous value is simply gone. So the sync agent does not decide. It writes every uncontested record straight through, then stops on the contested ones and posts to the address book owner in Slack: "Overnight sync matched 340 contacts. 318 updated cleanly. 22 were edited in Contacts+ since I read them. Of those, 14 differ only in a field the CRM is authoritative for, and 8 have a mobile number that was changed by hand in Contacts+ and does not match the CRM. Overwrite the 14, and leave the 8 for review?" The owner answers, and only then does the agent re-read each approved record for a fresh etag and call Update Contact with Resolve Conflicts on that set alone. The eight hand-edited numbers stay hand-edited, which is almost always the right answer, because a person typing a mobile number into a shared address book is usually looking at better evidence than the nightly job.

Agent processes routinely
Detects exception requiring judgment
Clear match Continues automatically
Ambiguous Routes to human via Slack
Human decides
Agent resumes with decision

Agent Capabilities

22 actions

Account

1
  • Get Account Returns the connected Contacts+ account. Used as the preflight check that the connection is live before a batch run commits to any writes.

Contacts

9
  • Get Contacts by IDs Retrieves one or more contacts by identifier, returning the current `etag` for each. This is the read that has to happen before any update or delete, so it is the first step of nearly every write path.
  • List Contacts Returns contacts from the personal book, or from a team book when a Team ID is supplied. Cursor based: pass the `scrollCursor` from the previous response to page. Used for full sweeps and reporting.
  • Search Contacts Searches contacts by name, email, or company, paging with a `searchCursor`. Used as the duplicate check before a create, and to assemble a target set for tagging or reassignment.
  • Create Contact Creates a contact in the personal or team book. Used when a form, a card scan, or a spreadsheet introduces someone the book does not have.
  • Update Contact Updates an existing contact. Requires the record's current `etag`, and accepts Resolve Conflicts to overwrite a record that changed since that etag was read. The overwrite path is the one held behind human approval.
  • Delete Contact Deletes a contact using its current `etag`. Permanent and not recoverable, so agents assemble the set and a person approves it.
  • Change Contact Owner Reassigns ownership of a contact within a team. Requires a Team ID. Used for territory changes and joiner and leaver handovers.
  • Manage Contact Tags Applies and removes tags across contacts. Used to segment an address book in bulk, which also makes a batch import reversible as a set.
  • Upload Contact Photo Downloads an image from a supplied Photo URL and attaches it to the identified contact. Used to keep a scanned business card attached to the record parsed from it.

Tags

5
  • Get Tags by IDs Retrieves tags by identifier, returning the `etag` needed to update or delete them.
  • List Tags Returns the tags in the personal or team context, cursor paged. Used to resolve a tag before applying it and to audit taxonomy drift.
  • Create Tag Creates a tag. Used when a campaign, event, or territory needs a label the book does not yet have.
  • Update Tag Renames or amends a tag using its current `etag`. Used to keep segmentation labels consistent as naming conventions change.
  • Delete Tag Deletes a tag. Permanent, and it removes the segmentation that other flows may be selecting on, so it sits behind review.

Teams

1
  • List Teams Returns the teams the connected account belongs to. Used to resolve the Team ID that switches an action from a personal book to a shared one, and required before Change Contact Owner.

Webhooks

6
  • Get Webhooks by IDs Retrieves webhook subscriptions by identifier, returning the `etag` required to delete them.
  • Search Webhooks Finds existing webhook subscriptions on the account. Used to audit which external receivers are already subscribed before adding another.
  • Create Webhook Registers a webhook subscription so a separate receiving system is notified of contact and tag changes. Note that this subscribes an external endpoint of your choosing; it does not create a FlowRunner trigger.
  • Delete Webhook Removes a webhook subscription using its `etag`. Permanent, and it silently stops delivery to whatever system depended on it.
  • Get Webhook Batches Returns delivery batches for a subscription across the trailing fourteen day window. Used to audit whether an external receiver is actually being fed.
  • Get Webhook Triggers Returns the trigger definitions available for webhook subscriptions. Used to confirm which change types a subscription will fire on before registering it.

Frequently Asked Questions

What can FlowRunner do with Contacts+?

FlowRunner agents can run Get Account, Get Contacts by IDs, and List Contacts in Contacts+, plus 19 more actions.

Does connecting Contacts+ to FlowRunner require OAuth?

Yes. Contacts+ connects to FlowRunner with OAuth 2.0, so agents authenticate without handling raw credentials.

Can Contacts+ trigger a FlowRunner workflow automatically?

Contacts+ doesn't currently expose triggers in FlowRunner. It connects as an action step inside workflows started by another trigger.

Start building with Contacts+

$100 in credits. No card required. Connect in minutes.