Cold Leads

Verify leads in Make.com before they reach an Instantly campaign

Who it is for
Make.com users who send cold e-mail with Instantly
The problem
Addresses that were never checked go straight into a sending campaign. The invalid ones bounce, and bounces count against the mailboxes that send the campaign.
The solution
Put a Cold Leads check between the trigger and Instantly: one HTTP request per lead, a filter that lets only valid results through, and a second HTTP request that adds the lead to your campaign with the Instantly API v2.
What you get
A running Make scenario: new lead, Cold Leads verification, filter, lead added to the Instantly campaign. Leads that fail the filter stop there or go to a review sheet.

Addresses, IDs and results in the examples are illustrative. example.com is reserved for documentation, so a real check of these addresses returns invalid.

Before you start

  • A Cold Leads secret key (sk_…) from Settings → API keys. The API is part of the Business plan.
  • An Instantly API v2 key with a scope that can create leads (leads:create, leads:all, all:create or all:all). Create it in Instantly under Settings → Integrations → API Keys; it is shown only once. Your Instantly workspace needs a paid plan with API access.
  • The ID of the Instantly campaign. GET https://api.instantly.ai/api/v2/campaigns lists campaigns with their IDs (it needs the campaigns:read scope).
  • A sheet with a header row and the columns email, first_name, last_name and company. Make's Watch New Rows stops at a blank row, so keep the data without gaps.

Build the scenario

  1. Google Sheets → Watch New Rows: choose the spreadsheet and the sheet.
  2. HTTP → Make a request (the HTTP app, version 4). Authentication type: API key. Under Credentials add a key: Key = your sk_ key, API key placement = In the header, API key parameter name = x-api-key. URL: https://coldleads.app/api/v1/verify. Method: POST. Body content type: application/JSON. Body input method: JSON string. Body content: the JSON below, with the e-mail mapped from step 1. Parse response: Yes. In Advanced settings set Return error if HTTP request fails to Yes and Timeout to 30 seconds.
  3. Click the wrench on the link after the Cold Leads module and choose Set up a filter. Label: Valid only. Condition: status from the Cold Leads module's response data, Text operators: Equal to, value valid.
  4. HTTP → Make a request again for Instantly. Authentication type: API key; add a key with Key = Bearer followed by a space and your Instantly API key, API key placement = In the header, API key parameter name = Authorization. URL: https://api.instantly.ai/api/v2/leads. Method: POST. Body content type: application/JSON, JSON string, Parse response: Yes, Return error if HTTP request fails: Yes.
  5. Run the scenario once with a test row, check both module outputs, then schedule it.
Cold Leads module, Body content
{
  "email": "{{map the e-mail field of the trigger here}}",
  "timeout_ms": 10000
}
Instantly module, Body content
{
  "campaign": "your-instantly-campaign-id",
  "email": "{{map email from the Cold Leads module}}",
  "first_name": "{{map from the trigger}}",
  "last_name": "{{map from the trigger}}",
  "company_name": "{{map from the trigger}}",
  "skip_if_in_workspace": true
}

Replace each placeholder by clicking into the field and choosing the item in Make's mapping panel. Use only field names from Instantly's documentation; campaign and email are what it needs to add a lead to a campaign. skip_if_in_workspace set to true skips leads that already exist in your Instantly workspace.

Choose how strict the filter is

FilterWhat passesTrade-off
status Equal to validAddresses a mail server accepted (reason ok) and addresses whose domain accepts mail but whose mailbox was not checked (reason smtp_unreachable)More leads get through; some are unconfirmed.
status Equal to valid, and score greater than or equal to 80 (a numeric operator)Only addresses a mail server accepted: valid results score 97, or 80 for role addresses, when the mailbox was confirmed, and 75 or 65 when it was not checkedFewer leads; nothing passes while the SMTP step cannot run for a domain.

To keep risky leads instead of dropping them, add a Router after the Cold Leads module: one route with the filter above leads to Instantly, a second route with status Equal to risky leads to Google Sheets → Add a Row in a review sheet.

Test both requests from a terminal

If a module fails, send the same request with curl. It shows the exact answer, including error codes such as bad_api_key, api_not_in_plan or no_credits from Cold Leads.

bash
# 1) the Cold Leads request the first HTTP module sends (1 credit)
curl -s https://coldleads.app/api/v1/verify \
  -H "x-api-key: $COLDLEADS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"anna@example.com","timeout_ms":10000}'

# 2) the Instantly request the second HTTP module sends, for a lead that passed the filter
curl -s https://api.instantly.ai/api/v2/leads \
  -H "Authorization: Bearer $INSTANTLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaign":"your-instantly-campaign-id","email":"anna@example.com","first_name":"Anna","last_name":"Novak","company_name":"Acme","skip_if_in_workspace":true}'

Errors and retries

  • With Return error if HTTP request fails set to Yes, a 401 or 403 (key or plan), a 402 no_credits or a 429 stops the run at the module instead of passing an error body on to the next step.
  • Cold Leads allows 120 requests per minute per key and answers 429 rate_limited with Retry-After: 60 when that is exceeded. If other tools share the key, turn on Store incomplete executions in the scenario settings and add a Retry error handler to the Cold Leads module (right-click the module, Add error handler).
  • Make renamed its error handlers on May 26, 2026: Break is now Retry and Ignore is now Skip. The full set is Skip, Retry, Resume, Commit and Rollback.
  • Instantly allows up to 100 requests per second and 6,000 per minute per workspace, shared by all API keys, and answers 429 above that.

Limits and costs

  • 1 Cold Leads credit per lead checked, whatever the result and also for results from the 30-day cache.
  • timeout_ms 10000 keeps each check under about 10 seconds; if the budget runs out the result is risky with the reason timeout, so it stops at the filter.
  • The Business plan costs $99 a month and includes the API and 10,000 credits a month; extra packs of 1,000 credits cost $5.
  • Make and Instantly bill their own usage under your plans with them.

FAQ

Is there a built-in Cold Leads integration for Make or Instantly?

No. The scenario makes two plain HTTP requests with your own keys: one to the Cold Leads API and one to the Instantly API. Nothing is shared between the two services except what the scenario sends.

What happens to leads that fail the filter?

They stop at the filter and never reach Instantly. Add a Router with a second route if you want risky or invalid leads written to a review sheet.

Can I use the legacy HTTP module?

Yes. The legacy Make a request (HTTP version 3) takes the same values in its URL, Method, Headers (x-api-key or Authorization), raw JSON body and Parse response fields.

Why does a valid lead show the reason smtp_unreachable?

The address passed the syntax and MX checks, but Cold Leads could not reach the recipient's mail server over SMTP, so the mailbox itself was not checked. Use the stricter filter if you only want confirmed mailboxes.