# Backlink Building Agent | 3-Stage Pipeline, Pay Per Outcome (`themineworks/backlink-building-agent`) Actor

Full backlink outreach pipeline: discovers real guest-post & resource-link prospects for your topic, extracts a verified contact from each site, and drafts a personalized outreach email with AI. Billed only for outreach-ready leads. Never sends email.

- **URL**: https://apify.com/themineworks/backlink-building-agent.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** SEO tools, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $36.00 / 1,000 complete outreach leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Backlink Building Agent: 3-Stage Pipeline, Pay Per Outcome

🏆 Part of The Mine Works' 149-actor portfolio · 40,000+ runs · 200,000+ results delivered across our full distribution stack · 99.9%+ success rate

💰 From $4.80 / 1,000 results.

⚡ Three stages in one run: a footprint search for candidate pages worth
pitching, a real contact pulled off each candidate site, then an outreach email
drafted against something concrete on that specific page.
💸 Priced per outcome, so a prospect that only got partway never costs the
full-lead price. Nothing is ever sent for you.

Pay only for results delivered. [Browse all Actors](https://apify.com/themineworks).

### How to build a backlink outreach list without doing it by hand

Backlink Building Agent runs the real backlink-outreach workflow end to end: give it a topic and your own site, and it (1) discovers real candidate pages worth pitching for a backlink, (2) extracts a real contact from each candidate site, and (3) drafts a genuinely personalized outreach email for you to review and send. It is a 3-stage agent pipeline, not a single-source scraper. Most of the value is in wiring discovery, contact extraction, and AI drafting together so you end a run with something you can actually act on, not a spreadsheet of raw URLs.

**This actor never sends email.** It drafts outreach for a human to review and send themselves. Auto-sending is a much bigger scope with real consent and deliverability implications, and this actor deliberately stays out of that.

Billing is outcome-tiered, not per-row: you pay the most for a fully outreach-ready lead (discovered, contacted, and drafted), less for a lead that only made it partway, and nothing at all when a run finds nothing usable.

✅ No login required | ✅ Real contact extraction, not guessed emails | ✅ AI-personalized drafts, not templates | ✅ Pay per outcome | ✅ MCP-ready for AI agents

### Build a backlink prospect list for your niche

The minimum required input: one or more topics, your own site, and a short description of what you're promoting (the biggest lever for draft quality, be specific).

```json
{
  "topics": ["sustainable jewelry"],
  "siteUrl": "https://example.com/",
  "siteDescription": "We publish independently reviewed guides on lab-grown diamonds and ethical jewelry buying, including a widely-cited guide comparing certification standards.",
  "senderName": "Alex",
  "senderRole": "Content lead",
  "outreachGoal": "resource_link",
  "maxOutreachEmails": 5
}
```

### Pitch a guest post instead of a resource-page link

`outreachGoal` changes both the search footprints used in discovery ("write for us", "guest post guidelines") and the angle of the drafted email.

```json
{
  "topics": ["B2B SaaS onboarding"],
  "siteUrl": "https://example.com/",
  "siteDescription": "We write in-depth SaaS onboarding teardowns with real product screenshots.",
  "senderName": "Jordan",
  "outreachGoal": "guest_post",
  "maxOutreachEmails": 8
}
```

### Cap outreach spend while still discovering broadly

`maxProspectsPerTopic` controls discovery breadth (cheap, search only); `maxOutreachEmails` is the real spend/time cap, since only prospects promoted past discovery call the contact-finder sub-actor and Gemini.

```json
{
  "topics": ["vegan meal prep", "plant-based nutrition"],
  "siteUrl": "https://example.com/",
  "siteDescription": "Plant-based nutrition research with a focus on trail and endurance meal prep.",
  "senderName": "Alex",
  "outreachGoal": "resource_link",
  "maxProspectsPerTopic": 15,
  "maxOutreachEmails": 5
}
```

`contactPagesPerSite` (default 5, checked per candidate site) is the other lever worth tuning. Raise it for niches where contact info tends to live on a `/team` or `/write-for-us` page rather than the homepage.

### How the discover, contact, and draft stages actually work

**Stage 1: Discover.** For each topic you give it, the actor runs a set of standard backlink-prospecting search queries (topic + "write for us", "guest post guidelines", "helpful resources", etc., depending on your outreach goal) against Google Search, over Apify's purpose-built GOOGLE\_SERP proxy tier. Results are filtered twice: a denylist drops reference sites, search engines and social platforms, and a relevance gate requires the actual footprint phrase to appear in the result before it counts as a candidate. A degraded or irrelevant search never produces fabricated prospects. It produces an honest zero.

**Stage 2: Extract a contact.** Each qualified candidate domain is handed to the sibling actor [website-contact-finder](https://apify.com/themineworks/website-contact-finder), called directly via the Apify API, which crawls the homepage plus contact/about/team pages for a real email, phone number, or social profile. This actor absorbs that call's own small per-domain cost rather than adding it as a separate line item on your bill. You pay one price for the outcome.

**Stage 3: Draft outreach.** If a contact was found, the actor drafts a short, specific email with Gemini: it must reference something concrete from the target page (not generic flattery), explain why your content is relevant to *their* audience, and end with a single soft ask. A quality gate rejects anything that reads as templated (too short, leftover `[placeholder]` brackets, or no actual reference to the target page). That draft is simply not produced rather than shipped as a weak one.

### What else you can set: senderRole, proxy, and required fields

`senderRole` (e.g. "Content lead at Example.com") appears in the email signature alongside `senderName`. `topics`, `siteUrl`, and `siteDescription` are the only required fields. Everything else in the recipes above has a sensible default. `proxyConfiguration` defaults to `GOOGLE_SERP` for the search stage (stage 1), Apify's purpose-built Google Search proxy tier, which this actor is tuned for; residential proxy was tested and actually returns worse, query-degraded results for this target. Stage 2's contact-extraction call always uses residential internally, regardless of this setting.

### What a discovered prospect or complete lead looks like

Every discovered prospect produces one row, tagged with how far it got. This is a real, unedited row from a live run (topic "vegan meal prep", goal `guest_post`):

```json
{
  "topic": "vegan meal prep",
  "outreach_goal": "guest_post",
  "pipeline_stage": "complete_outreach_lead",
  "target_domain": "backpackinglight.com",
  "target_url": "https://backpackinglight.com/forums/topic/appalachian-vegan-food-prep/",
  "target_title": "Appalachian Vegan Food Prep",
  "footprint_matched": "write for us",
  "contact_phone": "406-640-4453",
  "contact_socials": { "facebook": "https://facebook.com/backpackinglight", "instagram": "https://instagram.com/backpackinglight" },
  "contact_source": "website-contact-finder",
  "outreach_subject": "Guest post idea: Ultralight vegan food prep for long trails",
  "outreach_body": "Hi there, I was reading through the Backpacking Light forum thread on Appalachian Vegan Food Prep and noticed how much interest there is around hitting macro goals on long hikes without adding extra pack weight. At Plant-Based Nutrition, we research plant protein science... I would love to write a guest post titled \"Ultralight Plant Protein: A Science-Backed Guide to Trail Meal Prep\"...",
  "personalization_note": "References \"Appalachian Vegan Food Prep\" on backpackinglight.com.",
  "scraped_at": "2026-08-02T16:07:03.938Z"
}
```

| Field | Description |
| --- | --- |
| `pipeline_stage` | `qualified_prospect` (discovered, no contact found), `contacted_prospect` (contact found, draft failed/skipped), or `complete_outreach_lead` (all three stages succeeded) |
| `target_domain` / `target_url` | The candidate site and specific page that matched a prospecting footprint |
| `footprint_matched` | Which search pattern surfaced it (e.g. "write for us", "helpful resources") |
| `contact_email` / `contact_phone` / `contact_socials` | Best contact found, present from `contacted_prospect` onward |
| `outreach_subject` / `outreach_body` | The drafted email, present only at `complete_outreach_lead`. **Review before sending; this actor never sends it for you.** |
| `personalization_note` | What the draft specifically referenced, for your own QA pass |

### What does outcome-tiered pricing actually mean here

> 💎 On the `GOLD` tier and above: **$36.00 per 1,000 results** ($0.036 each, 40% below the `FREE`-tier price of $0.06). Your tier is shown on your Apify billing page.

Backlink outreach tools on Apify are typically priced per finished outcome rather than per raw scraped row, because a raw URL and a send-ready lead are very different things to build and very different things to be worth. This actor follows the same logic with three tiers instead of one flat price, so you are never charged the full price for a partial result:

| Outcome | What happened | Why this tier |
| --- | --- | --- |
| **Complete outreach lead** | Discovered + contact extracted + email drafted | The full product: something you can review and send today |
| **Contacted prospect** | Discovered + contact extracted, drafting failed or was skipped | You still got a real, verified contact to reach out to |
| **Qualified prospect** | A real footprint-matched candidate site, no public contact found | Still a genuine, filtered lead worth manual follow-up |
| *(nothing usable)* | No candidates matched, or nothing survived the relevance gate | **Free. Nothing is ever charged for an empty or degraded run.** |

| Event | Price (Free plan) | Price (Gold and above) |
| --- | --- | --- |
| Complete outreach lead | $0.06 | $0.036 |
| Contacted prospect | $0.025 | $0.015 |
| Qualified prospect | $0.008 | $0.0048 |

Bronze and Silver sit between the two columns. Your plan is shown on your Apify
billing page.

Read that table before your first run: this is not one price per lead. A
prospect that reaches only stage 1 or stage 2 still bills, at the lower tier for
that stage. A candidate that fails the denylist or the relevance gate never
becomes a qualified prospect and never reaches a billable event at all.

### Common use cases

**SEO backlink outreach.** Turn a target keyword or niche into a working outreach list without doing the search-and-scrape legwork by hand.

**PR and media outreach.** Point it at a topic your story or data is relevant to and get a starting list of sites plus a drafted pitch angle for each.

**Content promotion.** After publishing a new guide or original research, find resource pages and roundups it's a genuine fit for.

**Agency link-building at scale.** Run it per client niche to produce a first-pass prospect-and-draft list, then have a human do final QA and send.

### Honest limits (read before you run a big batch)

- **Discovery quality depends on how much "write for us" / "resources" content already exists for your niche.** Broad, well-covered niches (SaaS, finance, health) turn up plenty of candidates. Narrow or under-written niches can legitimately return few or none. That is an honest signal about the niche, not a broken run.
- **Contact coverage is never 100%.** Not every site publishes a public email; some only have a contact form, which this actor cannot fill out for you.
- **AI drafts still need a human read before sending.** The quality gate rejects obviously generic output, but it cannot verify facts about the target site beyond what the search snippet says. Skim each draft before you send it.
- **This actor never sends anything.** No email account is connected, and there is no send feature to turn on.

### Run it on a schedule

Link building is a standing job rather than a one-off pull, so most people run
this weekly against a fixed topic and site.

1. Run it once with the input you want repeated, then click **Save as a task**
   so that exact input is attached to every future run.
2. In the Apify Console go to **Schedules** and create a new one, either a
   preset (hourly / daily / weekly) or a cron expression.
3. Save. It then runs unattended, billed the same pay-per-result way. Nothing
   is charged for the schedule existing.

Review every `complete_outreach_lead` row before you send anything. This actor
drafts, it does not send.

### FAQ

**Does this actually send the outreach emails?**
No. It drafts a subject and body for each complete lead. You copy it into your own email client (or a mail-merge tool) and send it yourself, after your own review.

**Am I only charged when I get a full outreach-ready lead?**
No. That is the most expensive of three billable outcomes. A qualified prospect
with no contact found bills $0.008 on the Free plan, and a contacted prospect
where drafting failed bills $0.025. Only the complete outreach lead at $0.06
includes a drafted email. The pricing table above has the full picture.

**How is a "contact" verified?**
It is extracted from a real, public page on the target site (not looked up in a third-party database or guessed from a name pattern) by the sibling [website-contact-finder](https://apify.com/themineworks/website-contact-finder) actor.

**Can I use it in an AI agent?**
Yes. It's exposed as an MCP tool. See below.

### Use in Claude, ChatGPT & any MCP agent

```
https://mcp.apify.com/?tools=themineworks/backlink-building-agent
```

Or call it programmatically with the Apify client:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('themineworks/backlink-building-agent').call({
  topics: ['sustainable jewelry'],
  siteUrl: 'https://example.com/',
  siteDescription: 'We publish independently reviewed guides on ethical jewelry buying.',
  senderName: 'Alex',
  outreachGoal: 'resource_link',
  maxOutreachEmails: 5,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Complete your outreach pipeline

- **[Website Contact Scraper](https://apify.com/themineworks/website-contact-finder)**: the sibling actor this pipeline calls for stage 2. Use it standalone if you already have your own list of target domains.
- **[B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder)**: find named decision-makers (not just a general inbox) at any company.
- **[Google News Scraper](https://apify.com/themineworks/google-news)**: monitor press coverage of your topic for fresh PR/media outreach angles.

Worth a look before you pitch a site, so you spend outreach effort on the ones
that can actually pass authority on:

- **[Semrush Authority Score Scraper](https://apify.com/themineworks/semrush-scraper)**: authority score and backlink counts for a candidate domain.
- **[Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper)**: traffic and rank for the same domain, no login.
- **[Google Ads Transparency](https://apify.com/themineworks/google-ads-transparency)**: what a competitor is already paying to promote.

Questions or need a custom field set? Reach out through the Apify profile.

Keywords: backlink outreach automation, guest post prospecting tool, link
building agent AI, contact extraction for outreach, personalized outreach email
drafting, resource page link building, SEO outreach pipeline, pay per outcome
backlink tool

*Last verified: 2026-08*

# Actor input Schema

## `topics` (type: `array`):

Keywords describing your site's niche or the article you want links to (e.g. 'sustainable jewelry', 'B2B SaaS onboarding', 'vegan meal prep'). Each topic is searched for real guest-post, 'write for us' and resource-page opportunities.

## `siteUrl` (type: `string`):

The URL of the site or page you want a backlink to, for example "https://yoursite.com/". Used to personalize outreach emails and to make sure the agent never pitches your own domain to itself.

## `siteDescription` (type: `string`):

1-3 sentences on what your site or the specific article is about and why it is relevant to pitch, for example "We publish independently reviewed guides on ethical jewelry buying." This is the single biggest lever for how personalized the drafted emails are, be specific.

## `senderName` (type: `string`):

Name to sign outreach emails with, for example "Alex Rivera".

## `senderRole` (type: `string`):

e.g. 'Content lead at Example.com'. Appears in the email signature.

## `outreachGoal` (type: `string`):

What you are asking the target site for. Changes both the search footprints used in discovery and the angle of the drafted email.

## `maxProspectsPerTopic` (type: `integer`):

How many footprint-matched candidate sites to discover per topic before filtering. Discovery is cheap (search only); this does not by itself drive cost.

## `maxOutreachEmails` (type: `integer`):

Hard cap on how many discovered prospects are carried through contact-extraction and email drafting in this run, across ALL topics combined. This is the real cost/time driver (each one calls the sibling contact-finder actor plus an LLM call) — it bounds both run time and spend regardless of how many topics or prospects are discovered.

## `contactPagesPerSite` (type: `integer`):

Passed to the contact-extraction stage: how many pages of each candidate site to check for an email, phone or social contact (homepage + /contact, /about, /write-for-us, etc).

## `proxyConfiguration` (type: `object`):

Apify Proxy used for search-engine discovery (stage 1). GOOGLE\_SERP is Apify's purpose-built tier for scraping Google Search and is what this actor is tuned for; RESIDENTIAL was tested and actually returns WORSE (query-degraded) results for this target. The contact-extraction stage (2) always uses RESIDENTIAL internally regardless of this setting.

## Actor input object example

```json
{
  "topics": [
    "sustainable jewelry"
  ],
  "siteUrl": "https://example.com/",
  "siteDescription": "We publish independently reviewed guides on lab-grown diamonds and ethical jewelry buying, including a widely-cited guide comparing lab-grown vs mined diamond certification standards.",
  "senderName": "Alex",
  "senderRole": "Content lead",
  "outreachGoal": "resource_link",
  "maxProspectsPerTopic": 5,
  "maxOutreachEmails": 5,
  "contactPagesPerSite": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "topics": [
        "sustainable jewelry"
    ],
    "siteUrl": "https://example.com/",
    "siteDescription": "We publish independently reviewed guides on lab-grown diamonds and ethical jewelry buying, including a widely-cited guide comparing lab-grown vs mined diamond certification standards.",
    "senderName": "Alex",
    "senderRole": "Content lead",
    "outreachGoal": "resource_link",
    "maxProspectsPerTopic": 5,
    "maxOutreachEmails": 5,
    "contactPagesPerSite": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "GOOGLE_SERP"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/backlink-building-agent").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "topics": ["sustainable jewelry"],
    "siteUrl": "https://example.com/",
    "siteDescription": "We publish independently reviewed guides on lab-grown diamonds and ethical jewelry buying, including a widely-cited guide comparing lab-grown vs mined diamond certification standards.",
    "senderName": "Alex",
    "senderRole": "Content lead",
    "outreachGoal": "resource_link",
    "maxProspectsPerTopic": 5,
    "maxOutreachEmails": 5,
    "contactPagesPerSite": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["GOOGLE_SERP"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/backlink-building-agent").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "topics": [
    "sustainable jewelry"
  ],
  "siteUrl": "https://example.com/",
  "siteDescription": "We publish independently reviewed guides on lab-grown diamonds and ethical jewelry buying, including a widely-cited guide comparing lab-grown vs mined diamond certification standards.",
  "senderName": "Alex",
  "senderRole": "Content lead",
  "outreachGoal": "resource_link",
  "maxProspectsPerTopic": 5,
  "maxOutreachEmails": 5,
  "contactPagesPerSite": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  }
}' |
apify call themineworks/backlink-building-agent --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,themineworks/backlink-building-agent"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zdskW3MX9HySKexAC/builds/IkuP3glKRHvkccgzg/openapi.json
