> Enrich.chat gives AI agents verified work emails and mobiles. To use it from an agent, read https://enrich.chat/agents.md . This is the Markdown version of https://enrich.chat/integrations/salesforce/

# Salesforce data enrichment with a Flow HTTP callout, Apex or an AI agent

Enrich.chat has no Salesforce app. You call its API from a Flow, from Apex through a Named Credential, or from an agent over MCP, and write each work email and mobile back with its status.

By Enrich.chat Editorial. Updated October 15, 2026.

**Short answer:** You enrich Salesforce records by calling Enrich.chat's `GET /v1/person` from a Flow [HTTP Callout action](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout_configure.htm&language=en_US&type=5), from Apex through a Named Credential, or from an AI agent over MCP. There is no Salesforce app or AgentExchange listing. A work email found uses 10 credits, a mobile 250, and a lookup that finds nothing uses 0.

## Key takeaways

- Enrich.chat has no Salesforce app, AgentExchange listing or managed package. You connect it with a Flow HTTP Callout, an Apex callout or an agent that speaks MCP.
- Flow's HTTP Callout needs an external credential and a named credential first. A record-triggered flow must place the callout on an asynchronous path, because Salesforce blocks callouts while a record is saving.
- Apex allows 100 callouts per transaction, so run backfills as batch Apex with a small scope, or update a CSV with Data Loader.
- Agentforce can register enrich.chat/mcp in the Agentforce Registry, and Salesforce's hosted MCP servers let Claude, ChatGPT or Cursor read and update records next to it.

## Work emails and mobiles for your Salesforce records

- **No app to install.** Call it from a Flow, Apex or an agent. There is no package, no marketplace listing and no seat to buy.
- **Keys your records already have.** Send an email, a LinkedIn URL, or a name and website. Add a URL field, since Contact and Lead have no LinkedIn field.
- **A status next to every value.** Store the email status and mobile line in their own fields, so reports and flows can filter on them.
- **Credits only on matches.** 10 credits per work email, 250 per mobile. A record with no match uses 0.
- **A plain GET, JSON back.** Flow builds its data structure from a sample response. Apex reads the reply with JSON.deserializeUntyped.
- **Or let an agent do it.** Agentforce can register enrich.chat/mcp. Claude, ChatGPT or Cursor can pair it with Salesforce's hosted MCP servers.

## From a blank Mobile Phone field to a checked value

1. **Find the gaps.** Report on Contacts or Leads that have an Email but no Mobile Phone. Add text fields for the result and the statuses.
2. **Look up each record.** Call `GET /v1/person` with the email, a LinkedIn URL, or a name and website, and `fields=mobile`.
3. **Write back with the status.** Fill blank fields only, store the email status and mobile line, and mark records that were not found.

## Is there an Enrich.chat app for Salesforce?

No. Enrich.chat has no Salesforce app, no AppExchange or AgentExchange listing and no managed package. You connect it with tools Salesforce already ships: a Flow HTTP Callout, an Apex callout through a Named Credential, or an AI agent that speaks MCP. All three send the same request, `GET /v1/person`, described on the [person enrichment API](https://enrich.chat/api/person-enrichment/) page.

Salesforce's own enrichment covers other ground. [Data 360 enrichments](https://help.salesforce.com/s/articleView?id=data.c360_a_enrich_your_org_with_data_and_insights.htm&language=en_US&type=5) copy fields from Data 360, and [data integration rules](https://help.salesforce.com/s/articleView?id=sf.ddc_data_integration_understanding_field_mapping.htm&language=en_US&type=5) add geocodes and Dun & Bradstreet company information. Our [CRM data enrichment guide](https://enrich.chat/blog/crm-data-enrichment/) compares them. Enrich.chat adds a work email or mobile, each with a status.

Contact and Lead have a Mobile Phone field, and neither has a LinkedIn field, per the [Contact](https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_contact.htm) and [Lead](https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_lead.htm) references. Add a URL field if you want to look people up by LinkedIn URL. The URL is only a lookup key, and Enrich.chat never logs in to LinkedIn. Pick a route:

**Figure 1: Which route fits your Salesforce records.** A decision tree that asks who starts the lookup and how many records there are. If a person asks about a few records, use an AI agent with MCP, such as Claude, ChatGPT, Cursor or Agentforce. If every new record should be enriched automatically, use a Flow HTTP Callout on an asynchronous path. If you have a backlog of thousands, use batch Apex or a Data Loader file. Every route sends the same request, GET /v1/person.

*Three routes, one request. Sources: [Salesforce's HTTP Callout guide](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout_configure.htm&language=en_US&type=5), [Apex callout limits](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_callouts_timeouts.htm), [Agentforce Registry guide](https://help.salesforce.com/s/articleView?id=ai.agent_mcp_connect_register.htm&language=en_US&type=5) and the [Enrich.chat agent docs](https://enrich.chat/agents.md).*

## How do you enrich Salesforce records with a Flow HTTP callout?

Create the credentials, build one HTTP Callout action, then call it from a record-triggered flow on an asynchronous path. [Salesforce's HTTP Callout guide](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout.htm&language=en_US&type=5) says admins with the Customize Applications permission can use it. We did not run this in an org, so every step comes from Salesforce's documentation.

### What do you create before the flow?

Do these four in order. [Salesforce's authentication guidelines](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout_guidelines_authenticating.htm&language=en_US&type=5) cover the first three.

| Setup item | Value for Enrich.chat |
| --- | --- |
| Permission set | Holds the external credential principal. Assign it to the users who run the flow. |
| External credential | Protocol [No Authentication](https://help.salesforce.com/s/articleView?id=xcloud.nc_auth_protocols.htm&language=en_US&type=5) for the free tier |
| Named credential | URL `https://enrich.chat/v1`, linked to the external credential |
| HTTP Callout action | GET, path `/person`, query keys `email` and `fields`, and the Response tab as the sample |

A key is optional. To use one, set the protocol to Custom, store the key as a parameter on the principal, and add an `Authorization` header whose value is Bearer, a space and the key. On the named credential, clear Generate Authorization Header and select Allow Formulas in HTTP Header. [Salesforce's API key guide](https://help.salesforce.com/s/articleView?id=sf.nc_custom_headers_and_api_keys.htm&language=en_US&type=5) has the syntax.

Skip the OpenAPI file. Enrich.chat's spec at [enrich.chat/openapi.json](https://enrich.chat/openapi.json) is version 3.1, and Salesforce's [External Services page](https://help.salesforce.com/s/articleView?id=sf.external_services_intro_openapi_2_3_support.htm&language=en_US&type=5) lists OpenAPI 2.0 and 3.0. The HTTP Callout builder reads a sample response instead.

### How do you build the flow?

1. Add text fields on Contact for the result, email status, mobile line and last-check date, and a checkbox called Enrich requested.
2. In Flow Builder, add an **Action** element, click **Create HTTP Callout**, pick the named credential, set the method, path and query keys, and paste the sample response. [Flow Builder then creates](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout_configure.htm&language=en_US&type=5) the action and its Apex classes from it.
3. Create a record-triggered flow on Contact that runs after the save, with the entry condition Enrich requested equals true. [Salesforce's entry conditions guide](https://help.salesforce.com/s/articleView?id=platform.automate_flow_build_working_with_conditions_record_triggered_flows.htm&language=en_US&type=5) says an AND condition fires when a record moves from failing it to meeting it, so ticking the box starts one run.
4. Under **Actions and Related Records**, turn on the asynchronous path. [Salesforce's flow considerations](https://help.salesforce.com/s/articleView?id=platform.flow_considerations_trigger_record.htm&language=en_US&type=5) say a flow fails if it reaches external data on its synchronous path, because callouts cannot run while a record is saving.
5. On that path, call the action with the contact's email and `fields=mobile`, then add a Decision on `found`. If it is true, update the record. If not, set the result to not_found.
6. Add a fault path. A response code of 300 or greater is returned as an error, per [Salesforce's HTTP Callout limits](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout_considerations.htm&language=en_US&type=5), so a 402 or a 429 lands there. Set the result to error.

**Figure 2: A record-triggered flow that calls Enrich.chat for one Contact.** A Contact with the Enrich requested box ticked starts a record-triggered flow that runs after the save. The flow runs on the asynchronous path, because Salesforce blocks callouts while a record is saving. An HTTP Callout action sends GET enrich.chat/v1/person with email and fields=mobile through a named credential that holds the URL and any key. A decision on found then sends the flow three ways. If found is true, it fills the blank fields: mobile, status and date, and email only if empty. If found is false, it marks not_found, uses 0 credits and changes nothing else. A response code of 300 or above, such as a 402 or a 429, goes to the fault path, which marks error and stops, so the record can be retried later.

*The flow calls Enrich.chat once for each ticked Contact, from an asynchronous path, and a Decision on `found` picks what Salesforce writes. Sources: [record-triggered flow considerations](https://help.salesforce.com/s/articleView?id=platform.flow_considerations_trigger_record.htm&language=en_US&type=5), [HTTP Callout limits](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout_considerations.htm&language=en_US&type=5), [entry conditions guide](https://help.salesforce.com/s/articleView?id=platform.automate_flow_build_working_with_conditions_record_triggered_flows.htm&language=en_US&type=5).*

An action sends only the keys you define, so build one per identifier: `email`, `linkedin_url`, or `name` with `company` set to the account's website. Personal addresses such as gmail.com are not looked up, so skip them. For Accounts, send the Website domain to `GET /v1/company`, as the [company enrichment API](https://enrich.chat/api/company-enrichment/) page shows.

### What should the flow write back?

Write the mobile and the email only when the field is blank, and store the email status, mobile line and result in fields of their own. Switch on [field history tracking](https://help.salesforce.com/s/articleView?id=sf.tracking_field_history.htm&language=en_US&type=5) first: it starts only when you turn it on, and it skips changes a flow makes when the running user lacks edit permission. [Duplicate rules run](https://help.salesforce.com/s/articleView?id=sales.duplicate_rules_overview.htm&language=en_US&type=5) on an edited record only when an edited field is in the matching rule, so filling Email can trigger one.

## How do you enrich Salesforce records with Apex?

Use a named credential as the endpoint and run the lookups in batch Apex. The Batch Apex tab at the top of this page is a starting point. We checked its class and method names against Salesforce's reference but did not run it, so test it in a sandbox first.

- **Endpoint.** [Salesforce's Apex guide](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_callouts_named_credentials.htm) says a named credential URL is `callout:`, the credential name and a path, and it skips Remote Site Settings.
- **Limits.** [One Apex transaction](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_callouts_timeouts.htm) can make 100 callouts, with a 10 second default timeout and a 120 second total. You cannot call out after DML in the same transaction, so the class saves all updates once, at the end.
- **Batches.** Batch Apex needs [`Database.AllowsCallouts`](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_batch_interface.htm), and each execute call is its own transaction, so run it with a scope of 10.
- **Tests.** [Salesforce's HTTP classes guide](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restful_http.htm) says deploying Apex needs 75% test coverage and tests make no callouts, so mock them with `Test.setMock`.

### How do you enrich a Salesforce file with Data Loader?

Export the records, let an agent add the columns, and update them again. In Data Loader, [export with a SOQL query](https://developer.salesforce.com/docs/atlas.en-us.dataLoader.meta/dataLoader/exporting_data.htm) that includes Id, then [run an Update](https://developer.salesforce.com/docs/platform/data-loader-impl/guide/inserting-updating-or-deleting-data.html) with Id mapped. [Data Loader writes](https://developer.salesforce.com/docs/platform/data-loader-impl/guide/configuring-the-data-loader.html) a blank cell over existing data only if you select Insert null values, so rows not found keep their data.

## Can an AI agent enrich Salesforce records through MCP?

Yes, in two ways. Agentforce can call Enrich.chat as an MCP client, and an outside agent such as Claude can use Salesforce and Enrich.chat as two MCP servers. Enrich.chat's server is `enrich.chat/mcp`, with no key, and the [install page](https://enrich.chat/install/) lists the per-app steps. We did not test either route.

**Figure 3: Two ways an agent reaches Enrich.chat from Salesforce.** Two paths. In path A, an Agentforce agent uses a tool as an agent action. The tool comes from the Agentforce Registry, where you add the server with no authentication and allowlist its tools. The server is enrich.chat/mcp, which uses Streamable HTTP and needs no key. In path B, your own MCP client, such as Claude, ChatGPT or Cursor, connects to two MCP servers: a Salesforce hosted MCP server that an admin enables, with per-user OAuth, and the Enrich.chat MCP server, with no key and the same tools as path A. Enrich.chat only returns data. A Salesforce record changes only through an action or server you allow.

*Two ways an agent can reach Enrich.chat from Salesforce. Sources: [Agentforce Registry guide](https://help.salesforce.com/s/articleView?id=ai.agent_mcp_connect_register.htm&language=en_US&type=5), [hosted MCP servers overview](https://developer.salesforce.com/docs/platform/hosted-mcp-servers/guide/hosted-mcp-servers-overview.html) and the [Enrich.chat agent docs](https://enrich.chat/agents.md).*

### How does Agentforce call Enrich.chat?

In Setup, open Agentforce Registry, click New, enter the URL, choose No Authentication and allowlist the tools, per [Salesforce's steps](https://help.salesforce.com/s/articleView?id=ai.agent_mcp_connect_register.htm&language=en_US&type=5). The tools then appear as agent actions. MCP for Agentforce needs an [Enterprise, Performance, Unlimited or Developer edition](https://help.salesforce.com/s/articleView?id=ai.agent_mcp.htm&language=en_US&type=5).

[Salesforce's considerations](https://help.salesforce.com/s/articleView?id=ai.agent_mcp_considerations.htm&language=en_US&type=5) list three checks. MCP for Agentforce supports only Streamable HTTP servers and their tools. Salesforce says nested properties are not supported end to end, and Enrich.chat's person response nests `value` and `status` inside `work_email` and `mobile`. The tool name pattern on that page has no underscore, and tools such as `find_person_contact` have one. Test in a sandbox first.

### How do Claude, ChatGPT and Cursor use both?

[Salesforce Hosted MCP Servers](https://developer.salesforce.com/docs/platform/hosted-mcp-servers/guide/hosted-mcp-servers-overview.html) let any MCP client connect to an org, and the guide names Claude, ChatGPT and Cursor. An admin enables a standard server such as SObject Reads, because [standard servers are off by default](https://developer.salesforce.com/docs/platform/hosted-mcp-servers/references/reference/servers-reference.html). Sign-in is per user, and field-level security applies. Salesforce says the servers are intended only for customers with Flex Credits, and you may be billed. Add `enrich.chat/mcp` as a second server, then paste a prompt like this one.

```text
Use www.enrich.chat and my Salesforce connection to find 10 contacts that have an email but no Mobile Phone, look each one up with fields=mobile, and show me every value with its status and credits_used. Write nothing to Salesforce until I say go.
```

## What does it cost to enrich Salesforce records?

A work email found uses 10 credits, a mobile 250, a company profile 5, and a miss 0. Each response shows `credits_used`.

| You enrich | Credits if every record matches | Plan that covers it |
| --- | --- | --- |
| 1,000 contacts, work email | 10,000 | Growth plan, $29 a month |
| 1,000 contacts, mobile | 250,000 | Scale plan, $90 a month |
| 1,000 contacts, email and mobile | 260,000 | Scale plan, $90 a month |
| 1,000 accounts, company profile | 5,000 | Growth plan, $29 a month |

Plans bill monthly with unlimited seats and no annual contract: Growth $29 for 100,000 credits, Scale $90 for 500,000 credits, Pro $299 for 2,500,000 credits. Credits renew monthly and do not roll over. See [Enrich.chat pricing](https://enrich.chat/pricing/) for every field.

Each IP address gets 10 free lookups a day with no signup and no key. Salesforce sends callouts from [its published IP ranges](https://help.salesforce.com/s/articleView?id=000394078&language=en_US&type=1), so the free count may be shared. Try a few records, then log in at [enrich.chat/account/](https://enrich.chat/account/), pick a plan, pay at checkout and copy the key.

## When is another Salesforce enrichment option the better choice?

- **You want no build at all.** Salesforce's own [Data 360 enrichments](https://help.salesforce.com/s/articleView?id=data.c360_a_enrich_your_org_with_data_and_insights.htm&language=en_US&type=5) and [data integration rules](https://help.salesforce.com/s/articleView?id=sf.ddc_data_integration_understanding_field_mapping.htm&language=en_US&type=5) run inside the CRM, and [AgentExchange](https://www.salesforce.com/agentforce/agentexchange/) is where Salesforce says businesses find third-party tools. See our [best data enrichment tools](https://enrich.chat/blog/best-data-enrichment-tools/).
- **You want many sources in one table.** Read about [waterfall enrichment](https://enrich.chat/blog/waterfall-enrichment/) and [Clay](https://enrich.chat/integrations/clay/).
- **Your records are in a sheet or HubSpot.** See the [Google Sheets](https://enrich.chat/integrations/google-sheets/) and [HubSpot](https://enrich.chat/integrations/hubspot/) guides.

### What should you watch out for?

- **You build and maintain it.** There is no managed package, button or sync.
- **It answers when you call it.** There is no scheduled refresh or job-change alert, and it does not deduplicate records. Mobiles use the most credits, so ask for the email first.

Treat every result as a strong lead, not a guarantee. Treat catch_all as risky, as the [catch-all checker](https://enrich.chat/tools/catch-all-checker/) explains, and check a number with the [phone number validator](https://enrich.chat/tools/phone-number-validator/). Anyone can opt out at [enrich.chat/opt-out/](https://enrich.chat/opt-out/), processed within 15 days. You are responsible for TCPA, CAN-SPAM and GDPR rules: start with our [TCPA guide](https://enrich.chat/blog/tcpa-b2b-cold-calling/). Accounts fall under our [terms](https://enrich.chat/terms/).

## Frequently asked questions

### Can Salesforce Flow call an external API without code?

Yes. Flow's HTTP Callout action connects a flow to a REST API without Apex, and [Salesforce says](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout.htm&language=en_US&type=5) admins with the Customize Applications permission can use it. Set up an external credential and a named credential first, then paste a sample JSON response so Flow Builder can build the data structure. Enrich.chat's `GET /v1/person` works this way. We did not run it in an org.

### Why does my record-triggered flow fail when it calls an API?

Salesforce blocks callouts while a record is saving. Its [record-triggered flow considerations](https://help.salesforce.com/s/articleView?id=platform.flow_considerations_trigger_record.htm&language=en_US&type=5) say a flow fails if it reaches external data on the synchronous path, and tell you to turn on Add Asynchronous Path in the Start element. That path runs in the background after the save is committed. Put the HTTP Callout action there, and the flow can call Enrich.chat.

### How many API calls can Apex make in one transaction?

[Salesforce allows 100 callouts](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_callouts_timeouts.htm) in a single Apex transaction. The default timeout is 10 seconds, and callouts in one transaction share a 120 second total. You also cannot call out after uncommitted DML. For a backlog, run batch Apex with a small scope, because each execute call is its own transaction, or update a CSV with Data Loader.

### Is there an Enrich.chat app on AgentExchange or AppExchange?

No. Enrich.chat has no Salesforce app, no AgentExchange or AppExchange listing and no managed package. You connect it with a Flow HTTP Callout, an Apex callout through a Named Credential, or an AI agent that uses MCP. All three call the same API, so you own the flow, class or prompt. The [agents page](https://enrich.chat/agents/) lists the clients, and the [install page](https://enrich.chat/install/) has the MCP steps.

### Can Agentforce use Enrich.chat through MCP?

Agentforce can register it, but test it in a sandbox first. [Salesforce says](https://help.salesforce.com/s/articleView?id=ai.agent_mcp_considerations.htm&language=en_US&type=5) MCP for Agentforce supports Streamable HTTP servers with no authentication or OAuth client credentials, and Enrich.chat's server at enrich.chat/mcp uses Streamable HTTP with no key. Salesforce also says nested properties are not supported end to end, and Enrich.chat's person response nests `value` and `status`.

### Do I need an API key to enrich Salesforce records?

No. A key is optional. The free tier needs none and gives 10 lookups per IP address per day with no signup, and a lookup that finds nothing does not count. Salesforce sends callouts from [its published IP ranges](https://help.salesforce.com/s/articleView?id=000394078&language=en_US&type=1), so the free count may be shared and run out early. Log in at [enrich.chat/account/](https://enrich.chat/account/), pick a plan and pay at checkout, and the key appears on that page.

## Sources

1. [Configure an HTTP Callout Action](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout_configure.htm&language=en_US&type=5)
2. [HTTP Callout Considerations and Limits](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout_considerations.htm&language=en_US&type=5)
3. [Guidelines for Authenticating HTTP Callout Actions](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout_guidelines_authenticating.htm&language=en_US&type=5)
4. [Connecting to an API Without a Connector Using HTTP Callout](https://help.salesforce.com/s/articleView?id=platform.flow_http_callout.htm&language=en_US&type=5)
5. [Record-Triggered Flow Considerations](https://help.salesforce.com/s/articleView?id=platform.flow_considerations_trigger_record.htm&language=en_US&type=5)
6. [How Entry Conditions Work in Record-Triggered Flows](https://help.salesforce.com/s/articleView?id=platform.automate_flow_build_working_with_conditions_record_triggered_flows.htm&language=en_US&type=5)
7. [Per-Transaction Flow Limits](https://help.salesforce.com/s/articleView?id=platform.flow_considerations_limit_transaction.htm&language=en_US&type=5)
8. [Use API Keys in Custom Headers with Named Credentials](https://help.salesforce.com/s/articleView?id=sf.nc_custom_headers_and_api_keys.htm&language=en_US&type=5)
9. [Authentication Protocols for Named Credentials](https://help.salesforce.com/s/articleView?id=xcloud.nc_auth_protocols.htm&language=en_US&type=5)
10. [Callout Limits and Limitations](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_callouts_timeouts.htm)
11. [Named Credentials as Callout Endpoints](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_callouts_named_credentials.htm)
12. [HTTP Classes](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restful_http.htm)
13. [Using Batch Apex](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_batch_interface.htm)
14. [JSON Class](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_class_System_Json.htm)
15. [EncodingUtil Class](https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_classes_restful_encodingUtil.htm)
16. [Database Class](https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_methods_system_database.htm)
17. [MCP for Agentforce](https://help.salesforce.com/s/articleView?id=ai.agent_mcp.htm&language=en_US&type=5)
18. [Considerations for MCP for Agentforce](https://help.salesforce.com/s/articleView?id=ai.agent_mcp_considerations.htm&language=en_US&type=5)
19. [Register a Third-Party MCP Server in Agentforce Registry](https://help.salesforce.com/s/articleView?id=ai.agent_mcp_connect_register.htm&language=en_US&type=5)
20. [Salesforce Hosted MCP Servers overview](https://developer.salesforce.com/docs/platform/hosted-mcp-servers/guide/hosted-mcp-servers-overview.html)
21. [Hosted MCP Servers and Tools reference](https://developer.salesforce.com/docs/platform/hosted-mcp-servers/references/reference/servers-reference.html)
22. [Create a Custom Agent Action](https://help.salesforce.com/s/articleView?id=ai.copilot_actions_custom.htm&language=en_US&type=5)
23. [OpenAPI 2.0 and 3.0 Support (External Services)](https://help.salesforce.com/s/articleView?id=sf.external_services_intro_openapi_2_3_support.htm&language=en_US&type=5)
24. [Contact object reference](https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_contact.htm)
25. [Lead object reference](https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_lead.htm)
26. [Insert, Update, or Delete Data Using Data Loader](https://developer.salesforce.com/docs/platform/data-loader-impl/guide/inserting-updating-or-deleting-data.html)
27. [Configure Data Loader](https://developer.salesforce.com/docs/platform/data-loader-impl/guide/configuring-the-data-loader.html)
28. [Export Data from Salesforce](https://developer.salesforce.com/docs/atlas.en-us.dataLoader.meta/dataLoader/exporting_data.htm)
29. [Field History Tracking Overview](https://help.salesforce.com/s/articleView?id=sf.tracking_field_history.htm&language=en_US&type=5)
30. [Things to Know About Duplicate Rules](https://help.salesforce.com/s/articleView?id=sales.duplicate_rules_overview.htm&language=en_US&type=5)
31. [Enrich Your Org with 360 Data and Insights](https://help.salesforce.com/s/articleView?id=data.c360_a_enrich_your_org_with_data_and_insights.htm&language=en_US&type=5)
32. [Things to Know About Configuring and Activating Data Integration Rules](https://help.salesforce.com/s/articleView?id=sf.ddc_data_integration_understanding_field_mapping.htm&language=en_US&type=5)
33. [Preferred Alternatives to IP Allowlisting on Hyperforce](https://help.salesforce.com/s/articleView?id=000394078&language=en_US&type=1)
34. [Salesforce AgentExchange](https://www.salesforce.com/agentforce/agentexchange/)
35. [Enrich.chat agents.md](https://enrich.chat/agents.md)

## Examples

**Batch Apex**

```text
// Batch Apex for Contacts. Not run in an org: test in a sandbox.
// Named credential Enrich_chat points to https://enrich.chat/v1
public with sharing class EnrichContactsBatch
    implements Database.Batchable<SObject>, Database.AllowsCallouts {

  public Database.QueryLocator start(Database.BatchableContext bc) {
    // Mobiles cost the most, so keep the first run small
    return Database.getQueryLocator([
      SELECT Id, Email FROM Contact
      WHERE Email != null AND MobilePhone = null
      AND Enrich_Result__c = null LIMIT 200
    ]);
  }

  public void execute(Database.BatchableContext bc,
                      List<Contact> scope) {
    List<Contact> updates = new List<Contact>();
    for (Contact c : scope) {
      HttpRequest req = new HttpRequest();
      req.setEndpoint('callout:Enrich_chat/person?fields=mobile&email='
        + EncodingUtil.urlEncode(c.Email, 'UTF-8'));
      req.setMethod('GET');
      req.setTimeout(20000);
      HttpResponse res = new Http().send(req);
      Integer code = res.getStatusCode();
      // Out of lookups, too fast or busy: stop, retry on a later run
      if (code == 402 || code == 429 || code >= 500) break;
      c.Enrich_Result__c = 'error';
      if (code == 200) {
        Map<String, Object> body = (Map<String, Object>)
          JSON.deserializeUntyped(res.getBody());
        Boolean found = (Boolean) body.get('found');
        Map<String, Object> mob =
          (Map<String, Object>) body.get('mobile');
        if (found == true && mob != null) {
          c.MobilePhone = (String) mob.get('value');
          c.Mobile_Line__c = (String) mob.get('line');
          c.Enrich_Result__c = 'found';
        } else {
          c.Enrich_Result__c = 'not_found'; // 0 credits
        }
      }
      updates.add(c);
    }
    Database.update(updates, false); // after the last callout
  }

  public void finish(Database.BatchableContext bc) {}
}
// Run it: Database.executeBatch(new EnrichContactsBatch(), 10);
```

**Flow setup**

```text
# 1. Setup > Named Credentials
External credential: Enrich_chat_EC
  Protocol: No Authentication
  Principal: add it to a permission set
Named credential: Enrich_chat
  URL: https://enrich.chat/v1

# 2. Flow Builder > Action > Create HTTP Callout
External service name: EnrichPerson
Named credential: Enrich_chat
Label: Find person
Method: GET
URL path: /person
Query keys: email (Text), fields (Text)
Sample response: paste the Response tab

# 3. Record-triggered flow on Contact, after the save
Entry condition: Enrich requested is true
Actions and Related Records: add the asynchronous path
On that path: callout, Decision on found, Update Records
```

**cURL**

```bash
# One Contact, as a request. A mobile found uses 250 credits.
# The free tier needs no key. A key is optional: add
#   -H "Authorization: Bearer $ENRICH_KEY"
curl -G "https://enrich.chat/v1/person" \
  -d "email=jane.doe@acmelogistics.com" \
  -d "fields=mobile"
```

**Response**

```json
{
  "found": true,
  "name": "Jane Doe",
  "title": "VP Operations",
  "company": {"name": "Acme Logistics"},
  "linkedin_url": "https://www.linkedin.com/in/jane-doe-ops",
  "work_email": {
    "value": "jane.doe@acmelogistics.com",
    "status": "verified"
  },
  "mobile": {"value": "+1 415 555 0142", "line": "mobile"},
  "credits_used": 260,
  "free_lookups_remaining": 9
}
```

**Agent prompt**

```text
# Paste into Claude, ChatGPT or Cursor with the Salesforce
# hosted MCP server connected, or into an Agentforce agent
# that has enrich.chat/mcp registered.
Use www.enrich.chat and my Salesforce connection to find 10
contacts that have an email but no Mobile Phone, look each one
up with fields=mobile, and show me every value with its status
and credits_used. Write nothing to Salesforce until I say go.
```

## Prices

| What you get | Credits |
| --- | --- |
| Work email found | 10 |
| Mobile number found | 250 |
| Company tech stack or profile found | 5 |

10 free lookups a day for every IP address, no signup. Nothing is charged when nothing is found. Monthly plans start at $29 for 100,000 credits.

## Try this prompt

Enrich Salesforce contacts from your agent

```text
Use www.enrich.chat and my Salesforce connection to find 10 contacts that have an email but no Mobile Phone, look each one up with fields=mobile, and show me every value with its status and credits_used. Write nothing to Salesforce until I say go.
```

## Related

- [HubSpot data enrichment: fill emails and mobiles](https://enrich.chat/integrations/hubspot/)
- [CRM data enrichment: what, how often, how](https://enrich.chat/blog/crm-data-enrichment/)
- [Person enrichment API](https://enrich.chat/api/person-enrichment/)
