Ahel in n8n and Make: per-call data for your workflows

Ahel in n8n and Make: call one catalog task per row from an HTTP Request node, the MCP Client Tool node or a Code node, find and verify work emails in the same call, and see the price before each run.

The problem

Your outbound runs in n8n or Make: a sheet of leads goes in, an enrichment step finds the emails, a sender takes them out. The enrichment step is where it hurts. Clay and Apollo sell credits on a monthly plan, and the credits run out halfway down the list. The addresses still bounce; Apollo users on r/gtmengineering put its invalid contacts at up to 30%. And you only learn what a row cost after it ran. You want one HTTP call per row, the price before it runs, and the check that the address accepts mail in the same call.

Steps

2
  1. Find a person's work email address$0.005317 per contact found

    Find the work email from a full name and the company domain, trying several providers in order and paying only for the one that finds it. People & contact data · people.email.find

  2. Verify an email address is deliverable$0.0011 per address settled

    Check the found address accepts mail. With verify set to true it runs inside the same call, so the flow needs no second node; it is listed here for its price. People & contact data · people.email.verify

Example cost for 100 rows

  • Find a person's work email addressfrom $0.5317 (QuickEnrich) up to $3.6997 (if every row falls through to Tomba)

    100 x $0.005317 per contact found at QuickEnrich; a row that falls through is tried at the next provider, up to Tomba

  • Verify an email address is deliverablefrom $0.11 (Ahel) up to $0.528 (if every row falls through to AnyAPI)

    100 x $0.0011 per address settled at Ahel; a row that falls through is tried at the next provider, up to AnyAPI

From $0.6417 (first provider) up to $4.2277 (if every row falls through to the last provider) for 100 rows through every step$0.6417 – $4.2277

Steps charged only when a result is found cost less when nothing is found. Paid from your prepaid balance at the quoted customer price. No top-up fee. Pay per call; each call’s price is shown before it runs. Each run is quoted before it starts.

Try it

Paste this into your agent

Start free, no card needed. Your agent runs each step and reports the cost.

GET https://ahel.ai/api/v1/call/people.email.find
X-Ahel-Token: <your Ahel API key>
X-Ahel-Max-Cost: 0.05
X-Ahel-Tag: acme-corp

Query parameters (n8n: Send Query Parameters, Using JSON):
{
  "full_name": "{{ $json.full_name }}",
  "domain": "{{ $json.domain }}",
  "verify": true,
  "_max_items": 1
}

0. The Ahel node (community node)

The quickest path is the Ahel community node, n8n-nodes-ahel on npm. In n8n open Settings, Community nodes, Install, enter n8n-nodes-ahel and confirm; on n8n Cloud, community nodes need the verified list, so use the HTTP Request node below until it is there. Create an Ahel API credential with your team API key (the credential test reads your balance and costs nothing). The node has four operations: Find Work Email (name and domain, verify on by default), Check a European Company (name and country code), Run Task (any catalog task, searchable in a dropdown, or quote only) and Run a List (one run per incoming item, a few at a time, each row keeping its input fields). Every output item carries cost_usd, provider and run_id. Source and example workflows: github.com/ahel-technologies/n8n-nodes-ahel.

1. The HTTP Request node

Add an HTTP Request node after the node that reads your rows. Method GET, URL https://ahel.ai/api/v1/call/people.email.find. Authentication: Generic, Header Auth, with the name X-Ahel-Token and your team API key as the value (the app shows it under Getting started and Team, API keys). Turn on Send Query Parameters, choose Using JSON and paste the parameters from the box above. n8n runs the node once per row. Ahel quotes each call, holds the exact price from your balance, runs it, waits and charges once; the answer holds the rows, how the run was routed and the charge. A run still going after its time limit answers 202 with a Location to poll.

2. The MCP Client Tool node

For an AI Agent node in n8n, add the MCP Client Tool node with the endpoint https://mcp.ahel.ai, transport HTTP Streamable, and Header Auth with the name X-Ahel-Token and your team API key. The agent then gets the same tools as Claude or Codex: capability_search to find a task, capability_inspect to price it, run_capability to run it and balance to read what is left. Use this when the agent should pick the task; use the HTTP Request node when the flow always runs the same one.

3. A Code node for a loop over rows

Ahel allows 30 requests a minute and 5,000 a day for the whole workspace, MCP and API calls counted together. Past that it answers 429 rate_limited with a Retry-After header. In the HTTP Request node, set Options, Batching to 1 item per batch with a 2,000 ms interval, which keeps a long sheet under the limit. For more control, use a Code node set to Run Once for All Items: loop over $input.all(), call this.helpers.httpRequest with the same URL, header and query for each row, wait 2 seconds before the next one, and on a 429 wait the Retry-After seconds and try that row again. On self-hosted n8n, read the key from an environment variable such as $env.AHEL_TOKEN rather than writing it into the code.

Worked flow: rows in, verified emails out

Google Sheets, Get Rows (columns full_name and domain) → HTTP Request (the box above) → Edit Fields, mapping email to {{ $json.rows[0].email }}, confidence to {{ $json.rows[0].confidence }}, status to {{ $json.routing.verification.verdict }}, provider to {{ $json.routing.served_by }} and cost to {{ $json.ledger.charged_usd }} → Google Sheets, Update Row. There is no people.email.verify node: verify true checks the found address in the same run, and status reads valid, invalid or risky; keep the valid ones. An empty rows list means no provider found an address.

What a row costs

When we checked with capability_inspect on 3 Nov 2026, people.email.find on a name and domain was tried first at QuickEnrich for $0.0053174 per contact found, then Hunter at $0.01012 and Tomba at $0.02156 per email found, each only on a miss before it. verify true adds Ahel's own check at $0.0011 per address, and a mailbox check at $0.00154 when the first cannot decide. One row reserves at most $0.0396374 and is charged only the exact cost; a miss is free when the provider does not bill it. Shown prices are the provider's cost plus Ahel's 10% margin. You start with $1 free, no card needed.

Price before you run

Ask any MCP client to run capability_inspect on people.email.find with your row's arguments: it returns the quote, the most the run may reserve and whether your balance covers it, and it is free and changes nothing. Over HTTP, GET https://ahel.ai/api/platform/v2/catalog/people.email.find lists each provider and its price, and POST https://ahel.ai/api/platform/v2/quotes with the body {"capability_id": "people.email.find", "registry_revision": "<from GET /api/platform/v2/capabilities>", "arguments": {"full_name": "Jane Doe", "domain": "example.com", "verify": true}, "limits": {"max_items": 1}} returns the exact hold with nothing held. POST /api/platform/v2/runs takes the same body plus quote_id and request_id. In the flow itself, X-Ahel-Max-Cost: 0.05 refuses any row quoted above 5 cents with 402 max_cost_exceeded, holding and charging nothing.

Tag runs by customer

Running the flow for several clients? Send X-Ahel-Tag with each call, such as {{ $json.client }} from a column. A tag is 1 to 64 lowercase letters, digits, dots, dashes or underscores; a bad one is refused with 422 before anything is quoted or run. In the app, Activity filters runs by tag and shows runs and charges per tag for the period you choose. The tag stays in Ahel and is never sent to a provider.

Make.com

Use the HTTP module, Make a request: method GET, the same URL, a header X-Ahel-Token with your key, and the same query string items: full_name, domain, verify set to true and _max_items set to 1. Turn on Parse response and map rows[1].email, routing.verification.verdict and ledger.charged_usd into your next module (Make counts arrays from 1). Add a Sleep module of 2 seconds after it to stay under 30 requests a minute.

Use contact data lawfully

Work emails and job titles are personal data. Use them for relevant B2B outreach, honour opt-outs and follow the rules where you sell, such as the GDPR in the EU.

  • Find and verify work emails

    Find a person's work email from their name and company domain, then check it accepts mail before you send.

  • A Clay alternative for Claude Code: the data step priced per call

    Looking for a Clay alternative for agents? Ahel is one MCP connection for company search, enrichment, people search, work email finding and verification, paid per call from a prepaid balance with a quote before every run, for teams that already run their outbound from Claude Code, Codex or Cursor.

Set up Ahel in your agent

  • Claude Code

    Run once, then approve the sign-in: claude mcp add --transport http --scope user ahel 'https://mcp.ahel.ai'

  • Codex

    Run once, then approve the sign-in: codex mcp add ahel --url 'https://mcp.ahel.ai' && codex mcp login ahel

  • Claude.ai

    Add a custom connector with the server address https://mcp.ahel.ai and approve the sign-in.