> 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/blog/n8n-lead-enrichment/

# n8n lead enrichment: build the workflow with the HTTP Request node

The node settings, the expressions that read the reply, and the error handling that keeps a long run from stalling. Make and Zapier equivalents are included.

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

**Short answer:** To enrich leads in n8n, add an HTTP Request node that sends a GET request to a contact data API, then map the JSON reply into your sheet or CRM with an Edit Fields node. Turn on [Include Response Headers and Status and Never Error](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/), so a Switch node can route 402 and 429 replies instead of failing the run. The Enrich.chat free tier needs no credential.

## Key takeaways

- n8n has no all-in-one enrichment node. The HTTP Request node calls any REST API, and its Import cURL button fills in the settings from a command.
- The built-in LinkedIn node only creates posts, so it cannot look up a profile. Hunter, Dropcontact, Clearbit and Apollo have their own nodes.
- n8n counts a whole workflow run as one execution, however many rows it handles. Starter lists 20€ a month, billed annually, for 2.5K executions.
- Turn on Never Error and Include Response Headers and Status, then branch on statusCode: stop on 402, wait on 429, and treat found false as a free miss.
- Enrich.chat answers /v1/person in the same response, so no Wait node is needed. A work email uses 10 credits, a mobile 250, and a miss 0.

## How does lead enrichment work in n8n?

Lead enrichment in n8n is a short chain of nodes. A trigger finds a lead, an API call adds the missing fields, and a last node saves them. n8n does not supply the data itself. You pick a source and call it, usually with the [HTTP Request node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/), which n8n says can query data from any app or service with a REST API.

The figure below shows the chain this guide builds. It reads rows from Google Sheets, but the first node can also be a webhook from a form or a CRM event. The middle steps stay the same.

**Figure 1: The five nodes of an n8n lead enrichment workflow.** Five n8n nodes in order. A Schedule Trigger starts the run, Get Row(s) reads the Google Sheets rows, an HTTP Request node calls GET /v1/person once for each row, a Switch node routes on statusCode, and Update Row saves the mapped reply after an Edit Fields node.

*The five-node workflow built in this guide. Node names follow n8n's pages for the [HTTP Request](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/), [Switch](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.switch/) and [Google Sheets](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/sheet-operations/) nodes. Source: n8n Docs.*

Cost is the other half of the design. n8n counts [a single run of the entire workflow as one execution](https://n8n.io/pricing/), however many steps or rows it handles. A scheduled run that enriches 500 rows is one execution. A webhook workflow that fires once per lead is one execution per lead. Pick the trigger with that in mind.

## Which n8n nodes can enrich leads, and which cannot?

n8n has no all-in-one enrichment node. It has separate nodes for a few data providers, and the HTTP Request node for everything else. The table below uses n8n's own node pages, checked October 15, 2026.

| Node | What n8n's docs say it does | Good fit |
| --- | --- | --- |
| [LinkedIn](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.linkedin/) | Creates posts, as a person or an organization. No other operation. | Publishing, not lookups |
| [Hunter](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.hunter/) | Finds the email addresses on a domain, finds the likely address for a name, and verifies deliverability. | Email finding by domain |
| [Dropcontact](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.dropcontact/) | Contact operations: Enrich and Fetch Request. | Enriching a contact you already hold |
| [Clearbit](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.clearbit/) | Looks up a person or a company from an email or a domain. | Older workflows (see the note below) |
| [Apollo](https://n8n.io/integrations/apollo/) | A verified node built and maintained by Apollo. Covers contacts, people, organizations and sequences, with Enrich and Bulk Enrich. | Teams already on Apollo |
| [HTTP Request](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/) | Calls any service with a REST API. | Any other source, including Enrich.chat |

The LinkedIn row answers a common search. The built-in [LinkedIn node supports creating posts](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.linkedin/). It cannot look up a profile, an email or a phone number. To go from a LinkedIn URL to contact data, you call an API that accepts the URL as a lookup key. Enrich.chat does this with a `linkedin_url` parameter. It never logs in to LinkedIn or uses anyone's account.

The Clearbit row needs a caution. Clearbit's own release notes say it joined HubSpot in December 2023 and that [new sign-ups need a HubSpot account](https://clearbit.com/changelog/2023-12-05). If a workflow still uses the node, check that its credential works. Our [Clearbit alternatives](https://enrich.chat/alternatives/clearbit/) page lists replacements.

Apollo is the one provider here with a verified n8n node that it built itself. That is a real strength: typed fields, and no query string to write. One thing to plan for is timing. Apollo's [People Enrichment docs](https://docs.apollo.io/reference/people-enrichment) say a phone reveal needs a webhook URL and the results arrive asynchronously, sometimes after several minutes. Our [Apollo API guide](https://enrich.chat/blog/apollo-api/) covers its credits and limits.

## How do I set up the HTTP Request node for lead enrichment?

Set the method to GET, set the URL to `https://enrich.chat/v1/person`, and send the row's LinkedIn URL as a query parameter. Then open Options and turn on two response settings so you can branch on the status code. The free tier needs no credential.

The table lists every setting. The names match [n8n's node documentation](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/).

| Setting | Value | Why |
| --- | --- | --- |
| Method | `GET` | The person endpoint is a GET request. |
| URL | `https://enrich.chat/v1/person` | One endpoint covers a LinkedIn URL, an email, or a name and company. |
| Authentication | None | The free tier needs no key. See the note below for paid plans. |
| Send Query Parameters | On, Using Fields Below | Each parameter is one name and value pair. |
| Parameter `linkedin_url` | `{{ $json.linkedin_url }}` | Reads the column from the Get Row(s) node. |
| Parameter `fields` | `email,mobile` | Ask only for what you need. Add `profile` if you want it. |
| Options, Response | Include Response Headers and Status: on. Never Error: on. Response Format: JSON. | Puts `statusCode` beside `body`, and stops a 402 or 429 from failing the run. |
| Options, Batching | Items per Batch 1, Batch Interval 500 | Spaces out the requests. The rate limit section explains why. |
| Options, Timeout | `15000` | Milliseconds to wait for a reply before the node gives up. |

On a paid plan, add your key as a credential instead of typing it into the node. n8n describes [Bearer auth](https://docs.n8n.io/integrations/builtin/credentials/httprequest/) as header auth with the name set to Authorization and the value set to Bearer plus your token. Create a Generic Credential Type of Bearer Auth, paste the key, and select it in the node. The key is optional: leave Authentication on None to stay on the free tier.

### Can I paste a cURL command instead?

Yes. The node has an Import cURL button. n8n loads the request into the node fields, overwrites any existing settings, and [imports every value as a string](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/). Paste a command like this one, check that the parameters landed under Send Query Parameters, then replace the fixed LinkedIn URL with the expression from the table.

```
curl -G "https://enrich.chat/v1/person" \
  -d "linkedin_url=linkedin.com/in/jane-doe-ops" \
  -d "fields=email,mobile"
```

### What if a row has no LinkedIn URL?

The same endpoint also takes an `email`, or a `name` plus a `company` website such as acme.com, per the [Enrich.chat agents file](https://enrich.chat/agents.md). Personal addresses such as Gmail are not looked up. For a sheet that mixes both, set Send Query Parameters to Using JSON and switch the field to an expression. n8n's docs show this pattern of wrapping an object in double curly brackets.

```
{{ $json.linkedin_url
  ? { linkedin_url: $json.linkedin_url, fields: 'email,mobile' }
  : { name: $json.name, company: $json.company_domain, fields: 'email,mobile' } }}
```

Run one row and read the output before you run the sheet.

### Do I need a Wait node?

Not for an API that replies in the same HTTP response, which is how `/v1/person` works. Some providers reply later. [Zeliq's n8n guide](https://help.zeliq.com/en/articles/13141658-enrich-contacts-in-n8n-the-right-way) posts a callback URL set to `$execution.resumeUrl`, then uses a Wait node set to resume on a webhook call, with a two-hour limit. That pattern also means turning off or raising the workflow timeout. A plain GET avoids all of it.

## How do I read the reply in n8n expressions?

With Include Response Headers and Status on, n8n puts the API reply under `body` and the HTTP code in `statusCode`. A work email is `$json.body.work_email.value`, and its status is `$json.body.work_email.status`. Without that option, drop the `body` part.

**Figure 2: Where n8n puts the Enrich.chat reply.** The item that leaves the HTTP Request node when Include Response Headers and Status is on. The HTTP code is at $json.statusCode. The reply sits under $json.body: found, work_email value and status, mobile value and line, credits_used and free_lookups_remaining. With the option off, the body prefix is dropped.

*The shape of the n8n item and the paths to each field. The body fields follow the sample response in the [Enrich.chat agents file](https://enrich.chat/agents.md), and the option names come from the [n8n HTTP Request docs](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/). Values are sample data.*

Add an Edit Fields node after the HTTP Request node and map one sheet column to each expression. The HTTP Request node replaces the incoming row with the API reply, so read the row key from the earlier node. In n8n, [$('node name').item.json](https://docs.n8n.io/build/work-with-data/reference-data/reference-previous-nodes/) returns the linked item from a previous node.

| Sheet column | Expression |
| --- | --- |
| `linkedin_url` | `{{ $('Get Row(s)').item.json.linkedin_url }}` |
| `work_email` | `{{ $json.body.work_email ? $json.body.work_email.value : '' }}` |
| `email_status` | `{{ $json.body.work_email ? $json.body.work_email.status : '' }}` |
| `mobile` | `{{ $json.body.mobile ? $json.body.mobile.value : '' }}` |
| `mobile_line` | `{{ $json.body.mobile ? $json.body.mobile.line : '' }}` |
| `credits_used` | `{{ $json.body.credits_used }}` |

The conditional in each expression matters. The agents file says a requested field with no data comes back as `null`, so reading `.value` on a row that has an email but no mobile would throw an error. A miss returns only `{"found": false}`, so the same guard covers it.

Save the row with a Google Sheets node set to Update Row. Choose the column that identifies the row, such as `linkedin_url`, as the Column to Match On, per [n8n's Google Sheets docs](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/sheet-operations/). For a CRM, swap in the HubSpot or Salesforce node. Our guides cover [HubSpot](https://enrich.chat/integrations/hubspot/), [Salesforce](https://enrich.chat/integrations/salesforce/) and [which CRM fields to enrich](https://enrich.chat/blog/crm-data-enrichment/).

Keep the status next to every value. An email marked `verified` is a strong lead. One marked `catch_all` sits on a domain that accepts every address, so the mailbox cannot be confirmed. Filter on `verified` before you send, and read [what a good bounce rate is](https://enrich.chat/blog/email-bounce-rate/) first. The [catch-all checker](https://enrich.chat/tools/catch-all-checker/) explains the status in more detail.

## How do I handle 402 and 429 errors in n8n?

Turn on Never Error, then add a Switch node that routes on `statusCode`. Send a 402 to a Stop And Error node, send a 429 to a Wait node, and treat `found: false` as a normal result that uses nothing. By default the HTTP Request node [returns success only on a 2xx code](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/), so with default settings a single 402 stops the run.

**Figure 3: Routing each reply out of the Switch node.** A Switch node on statusCode has five outputs. A 200 with found true goes to Edit Fields and Update Row. A 200 with found false marks the row not_found at 0 credits. A 402 goes to a Stop And Error node that fires the error workflow. A 429 or 503 waits for retry_after and retries the row. Anything else is logged for review.

*One way to route the reply. Status codes and error names come from the [Enrich.chat agents file](https://enrich.chat/agents.md). The Fallback Output setting is described in n8n's [Switch node docs](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.switch/).*

Set the Switch node to Rules mode. Rule one checks that `{{ $json.statusCode }}` equals 200 and `{{ $json.body.found }}` is true. Rules two to four match the next three outputs in the figure. Under Options, set Fallback Output to Extra Output so any other code lands in a fifth branch. The table lists the codes from the Enrich.chat agents file.

| Status | Error code | What it means | What to do in n8n |
| --- | --- | --- | --- |
| 200, `found` true | None | A match. `credits_used` shows the cost. | Map the fields and save the row. |
| 200, `found` false | None | No match. Nothing is used. | Write `not_found` so the row is skipped next time. |
| 400 | `bad_request` | A parameter is missing or invalid. | Fix the row. Do not retry it unchanged. |
| 401 | `invalid_api_key` | The key is wrong or revoked. | Check the credential, or remove it to use the free tier. |
| 402 | `free_limit_reached`, `credits_exhausted`, `plan_inactive` | The free lookups, the plan's credits or the plan itself ran out. | Stop the run and alert someone. |
| 429 | `too_many_requests` | Requests came too fast. | Wait `retry_after` seconds, then retry. |
| 503 | `temporarily_unavailable` | The service is briefly unavailable. Nothing was billed. | Retry once after `retry_after` seconds. |

For the 429 branch, add a [Wait node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/). Set it to resume after a time interval, with the Wait Amount set to `{{ $json.body.retry_after }}` and the Wait Unit set to Seconds. Connect its output back to the HTTP Request node. Add a counter column if you want a hard cap, so a stuck row cannot loop forever.

### How do I alert someone on a 402?

Connect the 402 output to a Stop And Error node. n8n says it [causes executions to fail under conditions you choose](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.stopanderror/) and sends custom error information to error workflows. Put `{{ $json.body.message }}` in its Error Message field. Every Enrich.chat error carries a message that is safe to show a user. Then build a second workflow that starts with the Error Trigger node and sends an email or a Slack message, and select it under the first workflow's Settings. n8n's [error handling guide](https://docs.n8n.io/build/flow-logic/handle-errors-gracefully/) has the steps.

### Is Retry On Fail enough?

For a small sheet, maybe. In a node's Settings tab, n8n's [HTTP Request troubleshooting page](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/common-issues/) tells you to enable Retry on Fail, then set Max Tries and Wait Between Tries in milliseconds. That works only when Never Error is off, because n8n retries a node that fails, and a node set to never error does not fail. It also retries a 402, where waiting cannot help. The [On Error setting](https://docs.n8n.io/build/understand-workflows/workflow-components/work-with-nodes) offers a middle path. Continue (using error output) passes the error information on instead of stopping the workflow.

## How do I enrich a whole sheet without hitting rate limits?

Use the HTTP Request node's Batching option. Set Items per Batch to 1 and Batch Interval to a few hundred milliseconds. Without it, the node starts a request for every input item in the same run.

That behavior comes from the node's code. The [HTTP Request source on GitHub](https://github.com/n8n-io/n8n/blob/master/packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts), read October 15, 2026, builds a request for each input item and then waits for all of them together. It adds a pause between groups only when you set a batch interval. The same file sets a 429 error message that tells you to space requests out with the batching settings. n8n's docs call Batching [the equivalent of Loop Over Items and Wait](https://docs.n8n.io/integrations/builtin/handle-rate-limits/).

Start with 500 milliseconds, run a small batch, then tune it. Enrich.chat lists its rate limits in the [API reference](https://enrich.chat/docs/), and a 429 reply tells you how many seconds to wait in `retry_after`.

You can build the same pacing by hand. Put a Loop Over Items node before the HTTP Request node and a Wait node after it, then connect the Wait node back to the loop, as n8n's [rate limit page](https://docs.n8n.io/integrations/builtin/handle-rate-limits/) describes. The [Loop Over Items docs](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitinbatches/) also note that most nodes already run once for each input item, so you only need the loop for pacing.

### How do I avoid enriching the same row twice?

Write a result on every row, including misses. Add a Filter node after Get Row(s) that keeps only rows where an `enrich_result` column is empty. n8n's [Filter node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.filter/) passes items that meet a condition and drops the rest. Each scheduled run then picks up only new rows, and a miss never repeats.

## How much does an n8n enrichment workflow cost?

You pay two meters: n8n for runs, and the data source for lookups. On n8n Cloud, [Starter lists 20€ a month billed annually for 2.5K workflow executions](https://n8n.io/pricing/), and Pro lists 50€ for 10K, checked October 15, 2026. n8n also offers a standard self-hosted version, the Community Edition, on GitHub. n8n's docs say [only production executions count toward the quota](https://docs.n8n.io/build/understand-workflows/understand-executions), so manual test runs from the editor do not use it.

On the data side, Enrich.chat uses credits only when a lookup finds something. A work email uses 10 credits and a mobile uses 250. A miss uses 0. The plans are Growth $29 for 100,000 credits, Scale $90 for 500,000 credits, Pro $299 for 2,500,000 credits, and every plan includes unlimited seats. The table shows what a monthly run needs if every row matches.

| Monthly run | Credits | Plan that covers it |
| --- | --- | --- |
| 1,000 rows, work email | 10,000 | Growth, $29 a month |
| 5,000 rows, work email | 50,000 | Growth, $29 a month |
| 10,000 rows, work email | 100,000 | Growth, $29 a month |
| 1,000 rows, email and mobile | 260,000 | Scale, $90 a month |

Rows with no match use 0 credits, so real runs usually need less. Credits renew with each monthly payment, and unused credits do not roll over. The free tier gives 10 API lookups a day per IP address with no signup, which is enough to test the node on a few rows. For a recurring workflow, log in at enrich.chat/account/ with your email, pick a plan, and copy the key from that page. See [Enrich.chat pricing](https://enrich.chat/pricing/) for the full plan table.

## How do Make and Zapier compare for lead enrichment?

Make and Zapier can both call the same endpoint, so the reply is identical. Only the place where you type the URL and the query string changes.

- **Make.** The [HTTP app](https://apps.make.com/http) has a Make a request module that sends GET and the other methods. Its authentication choices include No authentication, which suits the free tier. Set Parse response to Yes so the JSON fields appear for mapping in the next modules. Put the full URL, with the query string, in the URL field.
- **Zapier.** Add the Webhooks by Zapier action and choose the GET event. Zapier's help says to [leave URL parameters out of the URL field](https://help.zapier.com/hc/en-us/articles/8496326446989-Send-webhooks-in-Zaps) and enter them in the Data section, one key and value per row. The same page says Webhooks by Zapier is available on Professional, Team and Enterprise plans, not Free.

Check each tool's pricing page for how it counts steps before you run a long list. The main design difference is branching. n8n lets you route a 402 or 429 with a Switch node in the same workflow. Our [Google Sheets, n8n, Zapier and Make guide](https://enrich.chat/integrations/google-sheets/) covers all of them.

## Where does Enrich.chat fit in an n8n workflow?

Enrich.chat is a contact data API built for agents and apps. It has no dedicated n8n node, so you reach it with the HTTP Request node described above. One GET request to `/v1/person` takes a LinkedIn URL, an email, or a name and company website. It returns a work email marked `verified`, `catch_all` or `unknown`, and a mobile with a line of `mobile` or `unknown`. Treat every result as a strong lead, not a guarantee.

A LinkedIn URL is only a lookup key, and Enrich.chat does not log in to LinkedIn. People can opt out at [enrich.chat/opt-out](https://enrich.chat/opt-out/). You stay responsible for the rules that apply to your outreach, such as [TCPA rules for calls and texts to mobile numbers](https://enrich.chat/blog/tcpa-b2b-cold-calling/). For the endpoint in detail, see the [LinkedIn URL to contact API](https://enrich.chat/api/linkedin-to-contact/) and the [person enrichment API](https://enrich.chat/api/person-enrichment/).

If you would rather have an agent write the node for you, paste this prompt into ChatGPT, Claude or Cursor.

```text
Use www.enrich.chat to write the n8n HTTP Request node settings that look up a work email and mobile from a linkedin_url column, plus the Switch rules for 402 and 429 replies.
```

### Can an n8n AI agent call it instead of a fixed node?

Yes. n8n's [MCP Client node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.mcpclient/) calls a remote MCP server, and its Authentication can be set to None. Pick the Server Transport that matches the server. The Enrich.chat server at `https://enrich.chat/mcp` uses Streamable HTTP and needs no key. Steps for other apps are on the [install page](https://enrich.chat/install/). Use a fixed HTTP node when the steps are known. Use an agent when each lead needs judgment, such as picking the right person at a company.

### What should you watch out for?

- **No dedicated node.** You build and maintain the HTTP Request settings yourself, and n8n will not update them for you.
- **Mobiles use the most credits.** A mobile uses 250 credits and a work email 10. Request `fields=email` first, and add `mobile` only for rows you will call.

Enrich.chat also has no sequencing, dialer or visual table builder. n8n or your CRM does that work.

### When is a dedicated n8n node the better choice?

Choose Apollo's verified node if you already pay for Apollo and want lookups and outreach in one tool. Choose the Hunter node for domain-wide email searches or deliverability checks. Both give you typed fields without writing a query string. Choose the HTTP Request node when no node exists, when you want to swap data sources without rebuilding, or when you want one request shape for a LinkedIn URL, an email or a name. Our [waterfall enrichment guide](https://enrich.chat/blog/waterfall-enrichment/) covers calling several sources in order, and [what data enrichment is](https://enrich.chat/blog/what-is-data-enrichment/) covers the basics.

For a one-off list, you can skip the workflow. Paste this prompt and your agent does the lookups directly.

```text
Use www.enrich.chat to find the work email and mobile for each LinkedIn URL in this list, and add columns for the email status and mobile line. Mark rows with no match as not found.
```

## Frequently asked questions

### Does n8n have a built-in lead enrichment node?

No single node does it. n8n's docs list separate nodes for [Hunter](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.hunter/), [Dropcontact](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.dropcontact/) and [Clearbit](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.clearbit/), and Apollo has a [verified node](https://n8n.io/integrations/apollo/) it maintains. The built-in [LinkedIn node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.linkedin/) only creates posts. For any other source, use the HTTP Request node, which can call any REST API.

### How do I enrich a lead in n8n with the HTTP Request node?

Add the node, set the method to GET, and enter the API URL. Turn on Send Query Parameters and map a field from the previous node, such as `{{ $json.linkedin_url }}`. Under Options, turn on Include Response Headers and Status and Never Error, so a Switch node can branch on `statusCode`. Then use an Edit Fields node to map the reply into your sheet or CRM. See the [node docs](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/) for each option.

### How many n8n executions does a lead enrichment workflow use?

One run is one execution, however many rows it processes. [n8n's pricing page](https://n8n.io/pricing/) says an execution is a single run of the entire workflow, whatever the steps or data. A schedule that enriches 500 rows uses one. A webhook that fires per lead uses one per lead. Per [n8n's docs](https://docs.n8n.io/build/understand-workflows/understand-executions), only production runs count, not manual test runs.

### How do I stop n8n from hitting an API rate limit?

Open the HTTP Request node, choose Add Option, then Batching. Set Items per Batch and a Batch Interval in milliseconds. n8n's [rate limit page](https://docs.n8n.io/integrations/builtin/handle-rate-limits/) calls this the equivalent of Loop Over Items and Wait. You can also enable Retry on Fail with Max Tries and Wait Between Tries. If an API sends a `retry_after` value on a 429, wait that many seconds before you retry.

### Can n8n look up an email or phone number from a LinkedIn URL?

Not with the built-in LinkedIn node, which [supports creating posts](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.linkedin/) only. Use the HTTP Request node with an API that takes a LinkedIn URL as a lookup key. Enrich.chat's `/v1/person` endpoint accepts `linkedin_url`, and it does not log in to LinkedIn or use anyone's account. The [LinkedIn URL to contact API](https://enrich.chat/api/linkedin-to-contact/) page has the details.

### Can I run the same enrichment in Make or Zapier?

Yes. Make's [HTTP app](https://apps.make.com/http) has a Make a request module that sends GET requests. In Zapier, use the Webhooks by Zapier action with the GET event, which [Zapier lists](https://help.zapier.com/hc/en-us/articles/8496326446989-Send-webhooks-in-Zaps) on Professional, Team and Enterprise plans, not Free. Both call the same Enrich.chat endpoint, so the reply is the same. See the [Google Sheets, n8n, Zapier and Make guide](https://enrich.chat/integrations/google-sheets/).

## Sources

1. [HTTP Request node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/)
2. [HTTP Request node: common issues](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/common-issues/)
3. [Handle rate limits](https://docs.n8n.io/integrations/builtin/handle-rate-limits/)
4. [Work with nodes](https://docs.n8n.io/build/understand-workflows/workflow-components/work-with-nodes)
5. [Handle errors gracefully](https://docs.n8n.io/build/flow-logic/handle-errors-gracefully)
6. [Understand executions](https://docs.n8n.io/build/understand-workflows/understand-executions)
7. [Reference previous nodes](https://docs.n8n.io/build/work-with-data/reference-data/reference-previous-nodes)
8. [HTTP Request credentials](https://docs.n8n.io/integrations/builtin/credentials/httprequest/)
9. [Switch node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.switch/)
10. [Wait node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/)
11. [Stop And Error node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.stopanderror/)
12. [Filter node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.filter/)
13. [Loop Over Items (Split in Batches)](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitinbatches/)
14. [Google Sheets node: sheet operations](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/sheet-operations/)
15. [LinkedIn node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.linkedin/)
16. [Hunter node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.hunter/)
17. [Dropcontact node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.dropcontact/)
18. [Clearbit node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.clearbit/)
19. [MCP Client node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.mcpclient/)
20. [n8n pricing](https://n8n.io/pricing/)
21. [Apollo integration for n8n](https://n8n.io/integrations/apollo/)
22. [HttpRequestV3.node.ts (HTTP Request node source)](https://github.com/n8n-io/n8n/blob/master/packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts)
23. [People Enrichment (API reference)](https://docs.apollo.io/reference/people-enrichment)
24. [Release notes, December 5, 2023](https://clearbit.com/changelog/2023-12-05)
25. [Enrich contacts in n8n the right way](https://help.zeliq.com/en/articles/13141658-enrich-contacts-in-n8n-the-right-way)
26. [HTTP app](https://apps.make.com/http)
27. [Send webhooks in Zap workflows](https://help.zapier.com/hc/en-us/articles/8496326446989-Send-webhooks-in-Zaps)
28. [Enrich.chat agents.md](https://enrich.chat/agents.md)

## Try this prompt

Draft your n8n enrichment node

```text
Use www.enrich.chat to write the n8n HTTP Request node settings that look up a work email and mobile from a linkedin_url column, plus the Switch rules for 402 and 429 replies.
```

## Related

- [Google Sheets lead enrichment](https://enrich.chat/integrations/google-sheets/)
- [Person enrichment API](https://enrich.chat/api/person-enrichment/)
- [CRM data enrichment: what, how often, how](https://enrich.chat/blog/crm-data-enrichment/)
