Integrations · CrewAI

CrewAI Enrichment — Give Your Crew Real Company and Contact Data

Wrap RichAPI endpoints as CrewAI tools, or point the crew at our hosted MCP server. The thing that bites is budget: an autonomous crew with a research loop will call a tool more times than you expected, so cap iterations and give the agent the execution_log so it can tell a miss from a bad input.

In short: RichAPI integrates with CrewAI in two ways: as custom tools subclassing crewai.tools.BaseTool that call the REST API at https://api.richapi.ai/api/v1/{endpoint} with an x-api-key header, or via RichAPI's hosted Model Context Protocol server at https://mcp.richapi.ai/mcp, which CrewAI can consume as an MCP tool source. There is no CrewAI-published RichAPI tool in crewai-tools; the wrappers are written by the user. Available endpoints include enrich_company and enrich_profile (both take a LinkedIn URL, not a domain), email_finder, email_verifier, phone_finder, people_search, find_linkedin_url_by_email, linkedin_job_search and web_tech_stack. Waterfall endpoints (email_finder, email_verifier, phone_finder) return HTTP 200 with success false and billed false on a miss and cost zero credits; every other endpoint bills on a successful 2xx response. When a crew member comes back empty-handed you need to know whether the input was wrong or the data is genuinely absent. On waterfall calls `execution_log` answers that, carrying one entry per attempt with a status. Because CrewAI agents loop autonomously, agents holding enrichment tools should have max_iter set to bound credit spend. RichAPI does not send email or write to a CRM. New accounts get 100 free credits without a credit card.

Last updated November 4, 2026

Connect it

  1. 1. Create a RichAPI account at app.richapi.ai/signup and copy your API key.

    100 free credits, no card.

  2. 2. Export it as RICHAPI_KEY.

    Never inline a key in a tool's source. CrewAI serialises tool definitions into prompts and traces.

  3. 3. Write a BaseTool subclass per endpoint, or one tool with an endpoint argument.

    Two or three narrow tools beat one generic HTTP tool: the agent picks better when the tool name says what it does.

  4. 4. Alternatively skip the wrappers.

    CrewAI can consume an MCP server, and ours is hosted at https://mcp.richapi.ai/mcp with an x-api-key header. Same endpoints, same key, same credit pool.

  5. 5. Set max_iter on any agent that holds an enrichment tool, and return the credit cost in the tool's output string so the agent's own reasoning includes what it just spent.

CrewAI

What you can ask for

Researcher agent: given a domain,
Researcher agent: given a domain, enrich the company, find the head of growth, and return a one-paragraph account brief with the source of each field.
Crew of two: a sourcer
Crew of two: a sourcer that runs people_search over an ICP filter, and a qualifier that enriches each profile and drops anyone below director.
Given 30 accounts, find a
Given 30 accounts, find a verified work email for the senior-most engineering leader at each and report which accounts came back empty and why.
Signal agent: pull last week's
Signal agent: pull last week's LinkedIn job posts for a role, enrich the hiring company, hand the shortlist to the writer agent.
Verify this list before the
Verify this list before the writer agent drafts anything, and refuse to draft for a catch-all address.

Why it Matters

A crew that reasons over invented company facts is a very expensive hallucination generator. Wiring one live lookup tool into the researcher role turns the crew's output from plausible to checkable, and the per-call receipt means the agent can explain a gap instead of filling it in.

CrewAI enrichment: one tool turns a research crew from plausible into checkable

CrewAI's whole premise is roles. A researcher gathers, an analyst judges, a writer drafts. The premise falls over at the first step, because a researcher agent with no data tool researches by recalling training data, and training data does not know who runs marketing at a 40-person company that raised in March.

There is no RichAPI tool in crewai-tools. You write the wrapper, which is about fifteen lines, or you attach our MCP server and write none.

The tool

import os, requests
from crewai.tools import BaseTool
from pydantic import BaseModel, Field

class FindEmailArgs(BaseModel):
 full_name: str = Field(description="Person's full name")
 company_domain: str = Field(description="Company domain, e.g. acme.com")

class FindWorkEmail(BaseTool):
 name: str = "find_work_email"
 description: str = (
 "Find a verified work email from a full name and company domain. "
 "Returns the address and its verification status, or reports a miss "
 "with the list of sources that were tried."
 )
 args_schema: type[BaseModel] = FindEmailArgs

 def _run(self, full_name: str, company_domain: str) -> str:
 r = requests.post(
 "https://api.richapi.ai/api/v1/email_finder",
 headers={"x-api-key": os.environ["RICHAPI_KEY"]},
 json={"full_name": full_name, "company_domain": company_domain},
 ).json()
 if not r.get("success"):
 tried = [a.get("status") for a in r.get("execution_log", [])]
 return f"No email found for {full_name} at {company_domain}. sources tried: {tried}. Nothing was billed."
 return f"{r['data']['email']} (status: {r['data']['status']}, cost: 5 credits)"

@agent
def researcher(self) -> Agent:
 return Agent(config=self.agents_config["researcher"],
 tools=[FindWorkEmail()], max_iter=6)

Two details in there are doing real work.

The miss branch returns the source statuses as prose. A tool that returns null teaches the agent nothing, so it retries with the same arguments and gets the same nothing. A tool that says four sources ran, three had no data, one timed out gives the agent something to reason with: retry, try the LinkedIn URL instead, or move on.

The success branch names the cost. The agent's own context now contains what it spent, which is the cheapest budget control that exists in an autonomous loop.

The MCP alternative

Skip the wrappers entirely. We host an MCP server at https://mcp.richapi.ai/mcp, authenticated with the same x-api-key header, exposing the same endpoints on the same credit pool. CrewAI can consume MCP tool sources, so the whole catalog arrives without you maintaining a Python class per endpoint. The transport is standard streamable HTTP, and the config format on the CrewAI side moves faster than this page does.

Write wrappers when you want a narrow, well-named tool surface and full control over what the agent sees on a miss. Use MCP when you want the whole catalog and do not care to curate it.

Budget, because a crew loops

This is the part that surprises people coming from a plain script. A sequential chain calls email_finder once per row. A crew with an agent that decides for itself calls it once, gets a miss, decides to try find_linkedin_url_by_name first, then calls it again. That is often the right call, and it is also three lookups where you budgeted one.

Three controls, in order of how much they help:

  1. max_iter on any agent holding a paid tool. Bounds the loop. Do this one.
  2. Cost in the tool's return string, as above. The agent factors spend into its own decisions.
  3. A narrow tool surface. An agent given find_work_email and enrich_company behaves. An agent given a generic call_richapi(endpoint, body) will explore.
Endpoint Cost
email_finder 5 credits
email_verifier 2 credits
phone_finder 25 credits
enrich_company / enrich_profile 1 credit
people_search 0.1 credits per result

Full price only on results, scoped to the waterfall endpoints: email_finder, email_verifier and phone_finder cost zero when nothing is found. The rest bill on a successful 2xx even when the payload is thin. Tiers on /pricing.

Where we stop with CrewAI

We are the lookup layer. No sending, no sequencing, no CRM writes, no prospecting UI, so the worst outcome of a badly scoped crew is spent credits, not an email to a customer with {{first_name}} in the subject line.

Neighbours, and the full integrations index: LangChain if you want typed tool schemas and chains rather than roles, OpenAI Agents SDK for handoffs and tracing, LangGraph when the loop needs to be a graph you can see. Or Claude to prove the prompt by hand before you build the crew.

CrewAI FAQ

Is there an official RichAPI tool in crewai-tools? No. You write the BaseTool, or attach the MCP server.

Does enrich_company take a domain? No, a LinkedIn URL. Give the agent find_website_by_company_name or a search step if it only has a name. Full shape in company enrichment API.

Can the crew spend my whole balance? It can spend what the tool costs times the number of calls, which is why max_iter exists and why we give you 100 free credits to watch it behave first.

Can I hand the crew a list? Use kickoff_for_each, or do the bulk pass outside the crew and let the crew reason over the results. See bulk enrich without seats.

Does it work with a local model? The API does not care what is calling it. Anything that can issue an HTTP POST works.

Start with CrewAI

100 free credits, no card. Paste the tool above into your crew and give the researcher something real to research.

FAQ

Frequently asked questions

No — CrewAI Enrichment — Give Your Crew Real Company and Contact Data authenticates through the connection you set up, using the same key and credit pool as the REST API. Revoking access from your RichAPI dashboard disconnects it immediately.
No — MCP and REST share the same credit pool and the same published endpoint rates. There's no separate MCP surcharge.

More from RichAPI

More companies

Browse company profiles with company overviews, key details, and email formats.

Start free with 100 credits

Get 100 free credits to explore RichAPI with no card required.

Free tools

Use our Email Permutator, llms.txt Generator, Waterfall Calculator, and live API demo — all free to try.

Related integrations