# Link Building Prospects & Guest Post Finder (Google, AI) (`rich_minds/link-building-prospects-ai`) Actor

First 25 prospects free. Link building prospects from Google Search: guest-post, resource and listicle pages with contact route, fit score and AI opener. Pay per qualified prospect: junk and repeat domains never charged. Free demo on any plan; live search runs on your own Apify account.

- **URL**: https://apify.com/rich\_minds/link-building-prospects-ai.md
- **Developed by:** [Rich Minds](https://apify.com/rich_minds) (community)
- **Categories:** SEO tools, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 qualified prospect (rules only)s

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Link Building Prospects & Guest Post Finder (Google, AI)

**Guest-post and resource-page sites for your keywords, with a checked e-mail and a first line.**

⚡ First **25 prospects free** · 💵 **$0.006** per qualified prospect · 🤖 **$0.018** with AI assessment (≈ $0.023 all-in) · 🔑 **No API key needed** — the AI uses the model access of your Apify plan, or your own key · ⏱️ demo in seconds; ≈ 4–6 min for 5 keywords with AI (estimate)

![One row per qualified link building prospect — site, opportunity type, fit score, e-mail, contact page and the outreach opener](https://api.apify.com/v2/key-value-stores/hMlzm9WdVKz1hmesE/records/shortlist.svg)

> **Try it in 30 seconds.** Click **Try it** — the pre-filled free demo turns 8 Google results into 4 link building
> prospects, nothing charged. Then switch *Where do the prospects come from?* to the live Google search and paste the
> page you want links to. Your first **25 qualified prospects** are free.
> → [What a run costs](#-pricing--what-a-run-really-costs) · [What the AI adds](#-what-the-ai-tier-adds) · [Run it weekly](#-run-it-weekly)

### ⚡ At a glance

| | |
|---|---|
| **What you get** | one row per site: opportunity type, checked best e-mail, authority, fit score, opener, dead links to pitch |
| **You provide** | the page you want links to — keywords and a one-line pitch are optional (read from the page) |
| **Never delivered** | directories, giants, PDFs, your own and ignored domains, sites you already received |
| **Output** | JSON / CSV / Excel, best-first, 6 views — or straight into your Lemlist / Instantly campaign |
| **Typical run** | 5 keywords → 30 Google searches → ≈ 300 results → ≈ 45 qualified (estimate) |
| **Cost of that run** | $0.14 Google search on your account + 45 × $0.006 = **$0.41**; AI tier ≈ **$0.023 per prospect all-in** → **$1.17** |
| **Free tier** | first 25 qualified prospects per account; the demo's sample rows never count |
| **Keys / setup** | none — the AI uses your Apify plan's model access, or your own key (`llmProvider: byok`) |

### 🎯 What this Actor does for link building

It runs the searches link builders type by hand, then does the spreadsheet work. You pay only for prospects that pass your filters:

- **The kind of opportunity** — guest post, resource page, listicle, review, forum, news, unlinked or competitor mention.
- **A way in you can trust** — e-mails, contact and write-for-us pages from the site, MX-checked, the best address picked.
- **Authority on every row** — a 0–100 `authorityScore` per site and a `minAuthority` filter.
- **The pitch that gets replies** — dead links on resource pages and listicles, named in the opener.
- **Straight into your campaign** — new prospects land in Lemlist or Instantly, no CSV step.

#### 🔗 Backlink prospecting with footprint searches

`keywords` × `opportunityTypes` become the searches you would type (`"remote work" "write for us"`,
`intitle:resources`), run by `apify/google-search-scraper`; add your own in `footprints`. **Only have a URL?** Leave
`keywords` empty — 3–5 keywords and the pitch are read from your `targetUrl` (`OUTPUT.derivedBrief`).

#### ✍️ Guest post finder: write-for-us pages and their rules

`guidelinesUrl` plus `acceptsGuestPosts`, `sponsoredMentioned`, `linkPolicy` and (AI) `topicsAccepted` per site.

#### 📚 Resource page link building and broken links

Link pages and "best X tools" roundups add entries. `checkBrokenLinks` (free) finds their dead outbound links
(404 / 410 / domain gone) → `brokenLinks`, and the opener becomes the broken-link pitch: *"The link to
estimatelab.example/ranges on it no longer works — my guide could replace it."*

#### 📬 Blogger outreach: contact route and checked e-mails

The page and one contact / write-for-us page (robots.txt honoured) give `contactEmails`, `contactPageUrl`,
`socialLinks`; `checkEmails` MX-checks them and picks `bestEmail` — a named person (`firstName`) before `info@`.

#### 📈 Domain authority for every prospect

`authorityScore` (0–100) from the Tranco top-1M rank, or Open PageRank with a free `openPageRankApiKey`;
`minAuthority` drops weaker sites free, before the AI.

#### 🏷️ Brand mentions, competitor mentions and exclusions

`brandName` pages are dropped or kept as `unlinked_mention`; `competitorNames` finds pages that cover a competitor
but not you (`competitor_mention`). `ownDomains`, `ignoredDomains` and `suppressionList` narrow the list.

#### 🏢 SEO outreach for agencies: every client in one run

`clients` holds one brief per client (`name`, `keywords`, `targetUrl`, `senderPitch`, `ownDomains`, campaign IDs …);
every other setting is shared. One schedule serves the agency: each client gets its own search, never-twice memory,
`client` column (view *By client*), digest e-mail and campaign. `maxQualified` and `maxDiscoveryChargeUsd` apply per client; up to 25 clients per run (example:
`storage-example/tasks/agency-weekly-resource-pages.json`).

### 🆚 Why this instead of Google Search Results Scraper?

| | [Google Search Results Scraper (`apify/google-search-scraper`)](https://apify.com/apify/google-search-scraper) | **Link Building Prospects & Guest Post Finder** |
|---|---|---|
| **Price** | $0.0045 per SERP page + $0.001 per run · 19,055 users / 30 days | $0.006 per qualified prospect (+ the SERP pages of a live search), first 25 free |
| **What you pay for** | every *SERP page*, directories and giants included | only *qualified prospects* — anything filtered out costs **$0** |
| **Same 100 prospects, all in** | ≈ **$15.66**: 67 SERP pages $0.30 + website content for 670 results $5.36 + 100 add-on leads $10.00 | ≈ **$2.60** with AI (67 SERP pages $0.30 + 100 × $0.018 + ≈ $0.50 tokens) — **83 % less**; $0.90 basic |
| **Link opportunity?** | its add-on only checks for your brand | typed, with dead links on resource pages |
| **Contact** | $0.10 per lead | MX-checked best e-mail, contact and guidelines page — free |
| **Repeat runs** | the same domains again next week | cross-run memory by root domain — only new sites are charged |

#### 🔎 The link prospecting Actors next to this one in the Store

<details>
<summary>A search for "link building prospects" shows <code>santhej/link-prospect-finder</code> and <code>scrapeai/backlink-opportunity-finder</code> next to us — compared</summary>

Numbers from their Store cards on 2026-09-26:

| | [`santhej/link-prospect-finder`](https://apify.com/santhej/link-prospect-finder) | [`scrapeai/backlink-opportunity-finder`](https://apify.com/scrapeai/backlink-opportunity-finder) | **This Actor** |
|---|---|---|---|
| **Price** | $0.004 per prospect + $0.001 per run | $0.00249 per result + platform usage on your account | $0.006 per qualified prospect, first 25 free, no start fee |
| **You pay for** | every unique domain found | every result row | only prospects that pass your filters |
| **Contact, authority, opener** | — (domain lists) | — | checked best e-mail, authority, fit score, opener |
| **Repeat runs** | — | — | cross-run dedupe, only new sites charged |

Also compared: `igolaizola/google-search-scraper-ppe` (raw results) and `pro100chok/ahrefs-seo-tools` (DR only).

</details>

### 💵 Pricing — what a run really costs

Pay per result: **one event per qualified prospect, nothing else.** No start fee.

| Event | When it is charged | Price |
|---|---|---|
| `free-tier` | your first 25 qualified prospects on this Actor, in any mode | **$0.00** |
| `qualified-prospect-basic` | AI off — type, rule score, authority, checked contact route, dead links, flags, template opener | **$0.006** |
| `qualified-prospect-ai` | AI on — plus AI type, fit score with quotes, opener, pitch angle, submission rules (and the follow-ups with `writeSequence`) | **$0.018** |

**You are never charged for:** the demo's sample rows, giants, directories, files, own / ignored / already-seen
domains, duplicates, anything below `minScore` / `minAuthority`, and the contact, e-mail, authority and dead-link checks.

**How that compares** — $0.006 is 1.5× one raw row at the $0.004 median of the Actors next to this one in Store search,
but one qualified prospect replaces 7 raw Google results you would research by hand ($0.028 of raw rows), with a checked
contact route and authority.

**Worked example (estimate)** — 5 keywords × 6 footprints = 30 Google pages ≈ 300 results → ≈ 110 unique sites → ≈ 45
qualified: Google Search Results Scraper $0.136 on your account + 45 × $0.006 = **$0.41, $0.009 per prospect**. AI on:
$0.136 + 45 × $0.018 + ≈ $0.225 tokens = **$1.17, $0.026 per prospect**. On your first run 25 of them are free.

**AI tier, all in:** ≈ **$0.023 per prospect**, 3.8× basic ($0.018 + ≈ $0.005 tokens at `anthropic/claude-haiku-4.5`
rates for ≈ 1,600 input / 630 output tokens per prospect, measured in a local run — not yet measured on the platform).
Tokens are billed through Apify's model access (or your own key), reported in `OUTPUT.aiTokens`; a paid AI run states
both prices before the search starts.

### 🚀 How to use it

1. **Click `Try it`** — the free demo is pre-filled and works as is.
2. **Switch the source** (`sourceMode`) to the live Google search — or a dataset / pasted URLs.
3. **Paste your `targetUrl`** — add `keywords` and `senderPitch` if you want to steer it — keep `minScore` 60, press **Start**.
4. **Open the dataset** — prospects land best-first; add your Lemlist / Instantly key to have them land in your campaign.

📚 **Learn more:** [Step-by-step tutorial — how to find link building prospects with this Actor](https://api.apify.com/v2/key-value-stores/hMlzm9WdVKz1hmesE/records/tutorial.html)

### 🤖 What the AI tier adds

The same demo prospect, AI **off** (`qualified-prospect-basic`):

```json
{"rootDomain": "remotecrewjournal.example", "opportunityType": "guest_post", "ruleScore": 95, "fitScore": null,
 "outreachOpener": "Hi — I read \"Write for Us\" while researching remote work. Could I pitch you a guest post on remote work, built around a free 2,500-word guide to async stand-ups for remote teams?",
 "pitchAngle": null, "topicsAccepted": []}
```

AI **on** (`qualified-prospect-ai`; local run 2026-09-25 with `groq:openai/gpt-oss-120b` — the platform default is
`anthropic/claude-haiku-4.5`):

```json
{
  "rootDomain": "remotecrewjournal.example", "opportunityType": "guest_post", "ruleScore": 95, "fitScore": 92,
  "fitReasons": ["We accept guest posts on remote work, async collaboration and distributed teams."],
  "outreachOpener": "I saw your “Write for Us – Remote Work Guest Posts” page and think our 2,500‑word async stand‑ups guide with templates would be a perfect fit.",
  "pitchAngle": "Provide a 2,500‑word guide on async stand‑ups with copy‑paste templates as a guest article.",
  "topicsAccepted": ["remote work", "async collaboration", "meetings", "distributed hiring"]
}
```

What it saves: 3–5 minutes of reading guidelines and writing a first line per prospect, for ≈ $0.017 more, tokens
included.

#### ✉️ The whole outreach sequence (`writeSequence`)

`writeSequence: true` adds `followUp` (≤ 60 words, one new reason to reply) and `breakUp` (≤ 40 words) to every hot /
warm prospect in the same AI call — same event price, a few more tokens, sent to Lemlist / Instantly as variables.

### ⚙️ Input

The Try-it form starts with the free demo (8 sample Google results, AI off); its first screen holds these 8 fields.

| Field | Type | Default | What it does |
|---|---|---|---|
| `sourceMode` | `actor` | `dataset` | `list` | `actor` | Live Google search, a dataset, or pasted URLs. `{}` over the API runs the free demo: nothing charged, no search started |
| `keywords` | string\[] | — | Topics; each becomes the footprint searches. Empty = read from `targetUrl` |
| `targetUrl` | string | — | The page you want links to — enough on its own to start a search |
| `senderPitch` | string | — | One line on what you offer |
| `minScore` | 0–100 | `60` | The field that decides what you pay: below this = not delivered, not charged |
| `maxQualified` | integer | `50` | Hard cap on output (and on spend) — per client in agency mode |
| `maxDiscoveryChargeUsd` | number | `0.5` | Caps the Google search cost on your account — the same in the form and over the API |
| `enableAi` | boolean | `true` | On = $0.018 per prospect + tokens; off = $0.006 |

<details>
<summary><b>The optional sections</b> — every other field</summary>

- **Filters:** `opportunityTypes`, `minAuthority`, `requireContactRoute` (drop sites without an e-mail / contact page),
  `countryCode` (Google country), `ownDomains`, `ignoredDomains`, `brandName`, `excludeBrandMentioned`, `competitorNames`,
  `targetFlags`, `suppressionList`.
- **Checks (free):** `findContactRoute` (read the site for its contact route), `checkEmails`, `checkBrokenLinks`,
  `lookupAuthority`, `openPageRankApiKey`.
- **AI:** `writeSequence`, `senderName` (so the AI never invents one), `llmProvider`, `llmModel` (empty = the default),
  `llmApiKey` (own-key mode), `aiCandidateMultiplier`.
- **Delivery:** `notifyEmail`, `lemlistApiKey` / `lemlistCampaignId`, `instantlyApiKey` / `instantlyCampaignId`,
  `webhookUrl`, `webhookHeaders`, `webhookBatchSize`. **Agency:** `clients`. **Memory:** `dedupeAcrossRuns`,
  `dedupeStoreName`, `maxToProcess`.

</details>

<details>
<summary><b>Flags</b> — the values <code>targetFlags</code> accepts</summary>

Put the first-column name into `targetFlags` (`hasEmail` works too); an unknown name stops the run with the valid list.

| Flag (`targetFlags` value) | Meaning |
|---|---|
| `has_email` · `has_contact_page` · `has_guidelines` | public e-mail · contact page linked · write-for-us / guidelines page found |
| `personal_email` · `email_mx_ok` | the best e-mail is a named person · its domain has a mail server |
| `accepts_guest_posts` · `sponsored_mentioned` | the site says it accepts guest posts · mentions sponsored or paid posts |
| `has_broken_link` | the resource page / listicle links to a dead page — pitch the fix |
| `high_authority` · `nofollow_heavy` | `authorityScore` ≥ 40 · ≥ 50 % of outbound links nofollow |
| `brand_mentioned` · `competitor_mentioned` | your brand is named · a competitor is named and you are not |
| `keyword_in_title` · `top_3` · `recent` · `wordpress` | keyword in title · Google top 3 · last 12 months · WordPress |
| `no_contact_route` · `fetch_failed` | no e-mail or contact page · page not fetchable |

</details>

### 📤 Output

One item per qualified prospect (one per site), best first.

<details>
<summary><b>Example row</b> — from the local AI run of <code>INPUT.ai.json</code>, trimmed</summary>

```json
{
  "prospectId": "e160d465b9912eac13c88b1827af97e2489a5d87",
  "url": "https://www.remotecrewjournal.example/write-for-us/",
  "rootDomain": "remotecrewjournal.example",
  "pageTitle": "Write for Us – Remote Work Guest Posts | Remote Crew Journal",
  "opportunityType": "guest_post", "score": 92, "label": "hot", "ruleScore": 95, "fitScore": 92,
  "contactEmails": ["editor@remotecrewjournal.example"],
  "bestEmail": "editor@remotecrewjournal.example", "emailStatus": "mx_ok", "isRoleAddress": true,
  "companyName": "Remote Crew Journal", "website": "https://www.remotecrewjournal.example",
  "authorityScore": 31, "authoritySource": "sample", "brokenLinks": [],
  "contactPageUrl": "https://www.remotecrewjournal.example/contact/",
  "guidelinesUrl": "https://www.remotecrewjournal.example/write-for-us/",
  "acceptsGuestPosts": true, "sponsoredMentioned": false, "client": null,
  "aiAssessed": true, "chargedEvent": "demo", "billedAs": "qualified-prospect-ai",
  "dedupeKey": "domain:remotecrewjournal.example"
}
```

</details>

Demo sites use the reserved `.example` domain: their authority, MX result and dead link are precomputed
(`authoritySource: "sample"`); your own sites are checked live.

**Upsert key:** `dedupeKey` (`domain:<root domain>`, the cross-run memory's key) — one row per site;
`prospectId` / `itemId` = a hash of the page URL.

<details>
<summary><b>Output fields</b> — every column of the dataset</summary>

| Field | Description |
|---|---|
| `prospectId`, `itemId`, `url`, `domain`, `rootDomain`, `dedupeKey` | Identity — `dedupeKey` = root domain (the upsert key) |
| `pageTitle`, `snippet`, `displayedUrl`, `publishedDate` | The page as Google shows it |
| `query`, `keyword`, `serpPosition`, `serpPage`, `country`, `matchedKeywords` | The footprint query and Google position |
| `opportunityType`, `score`, `label`, `ruleScore`, `fitScore`, `fitReasons` | Type, final score, hot/warm/cold, rule and AI scores, evidence |
| `contactEmails`, `contactPageUrl`, `guidelinesUrl`, `socialLinks`, `hasContactRoute` | The contact route from the site |
| `bestEmail`, `emailStatus`, `isRoleAddress`, `firstName` | Best address, MX check, shared inbox or person, first name |
| `companyName`, `website` | Site name and home page — import columns for outreach tools |
| `authorityScore`, `authorityRank`, `authoritySource` | 0–100 authority, Tranco rank, `tranco` / `openpagerank` / `sample` |
| `outboundLinkCount`, `nofollowShare`, `cms`, `brandMentioned`, `competitorsMentioned`, `brokenLinks` | Page facts, dead outbound links |
| `acceptsGuestPosts`, `sponsoredMentioned`, `linkPolicy`, `topicsAccepted` | Submission rules — null unless the page says so |
| `outreachOpener`, `pitchAngle`, `followUp`, `breakUp` | The opener (AI, or the template on hot / warm rows), the AI's pitch angle and sequence |
| `flags`, `targetFlagsMatched`, `aiAssessed`, `model`, `client` | Rule findings, matched target flags, AI provenance, agency client |
| `chargedEvent`, `billedAs`, `source`, `scrapedAt` | Billing (`billedAs` = the price tier, also on free / demo rows), provenance |

</details>

Views: `Overview`, `Outreach sheet`, `Outreach import (Lemlist / Instantly)`, `Submission rules`, `Google & evidence`,
`By client`. A Slack / e-mail-ready **`DIGEST`** record sits next to `OUTPUT` (the funnel, `outreachPush`, `timing`).

![Submission rules view — guest posts accepted, sponsored posts, link policy and guidelines page per site](https://api.apify.com/v2/key-value-stores/hMlzm9WdVKz1hmesE/records/submission-rules.svg)

⭐ **Found it useful? A review on the Store helps others find it** — it takes a minute on the Actor's page.

### 🔁 Run it weekly

1. **Actions → Schedule** weekly, with your address in `notifyEmail` — every run with new prospects e-mails you the
   digest.
2. Add `lemlistApiKey` + `lemlistCampaignId` (or the Instantly pair): the run pushes each new prospect into the
   campaign itself — email, firstName, website, the opener as icebreaker, pitch angle and dead link as variables.
   Nothing to export, ever; `OUTPUT.outreachPush` counts what landed.
3. Leave `dedupeAcrossRuns: true` — next week only **new sites** are delivered, charged and pushed (memory per brief,
   per client in agency mode).

Weekly cost is the new prospects only: 8 keywords (40 Google searches ≈ $0.18) and ≈ 30 new prospects ≈ $0.18 + 30 ×
$0.023 ≈ **$0.87 a week with AI**, $0.36 basic (estimate) — per client, all in **one** agency run.

#### 🎯 Try it for your niche

<details>
<summary>One saved Task per use case (<code>storage-example/tasks/*.json</code>) — run it with your values, then schedule it</summary>

| Niche | What it looks for | Task |
|---|---|---|
| SaaS content marketing | 5 product keywords → guest posts and listicles, contact route required | `saas-guest-posts.json` |
| SEO agency, weekly run for all clients | resource pages and guest posts per client, one schedule | `agency-weekly-resource-pages.json` |
| Digital PR | 3 category keywords → listicles, reviews, unlinked brand mentions of the last year | `digital-pr-listicles-and-mentions.json` |

</details>

### 🔌 Integrations, automation and API

- **Lemlist / Instantly** — direct push with `lemlistApiKey` / `instantlyApiKey` + campaign ID; a rejected key never
  fails the run.
- **Webhook** — `webhookUrl` gets `{"event": "prospect.qualified", "prospect": {…}, "runId": "…"}` per prospect (or
  `prospects.qualified` batches with `webhookBatchSize` > 1); retried once on 429 / 5xx, a failed POST is counted in
  `OUTPUT.webhook.failed`, never a failed run.
- **Google Sheets** — one cell keeps a Sheet current: `=IMPORTDATA("https://api.apify.com/v2/acts/rich_minds~link-building-prospects-ai/runs/last/dataset/items?format=csv&view=outreachImport&token=<YOUR_API_TOKEN>")`.
- **Slack / HubSpot / n8n / Make / Zapier** — the **Integrations** tab, or "Run Actor" → "Get dataset items".
- **AI agents / MCP** — every input is a plain typed field. **First call = the free trial:** `{"sourceMode": "list",
  "itemsList": [...]}` processes the URLs you send, no search on your account. An empty `{}` runs the free demo.

The client waits for the run (no fixed timeout — a run with your own key takes longer, see the FAQ):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("rich_minds/link-building-prospects-ai").call(run_input={
    "sourceMode": "list",
    "itemsList": ["https://www.remotecrewjournal.example/write-for-us/"],
    "maxQualified": 50,
    "maxDiscoveryChargeUsd": 0.5,  # spend cap on your account once you switch to "sourceMode": "actor"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["rootDomain"], item["opportunityType"], item["score"], item["bestEmail"])
```

<details>
<summary>The same call in JavaScript</summary>

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('rich_minds/link-building-prospects-ai').call({
    sourceMode: 'list',
    itemsList: ['https://www.remotecrewjournal.example/write-for-us/'],
    maxQualified: 50,
    maxDiscoveryChargeUsd: 0.5, // spend cap on your account once you switch to sourceMode: 'actor'
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((i) => [i.rootDomain, i.opportunityType, i.score, i.bestEmail]));
```

</details>

**Use it from Claude, ChatGPT or any MCP client** — add Apify's MCP server with this Actor as a tool:

```json
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?actors=rich_minds/link-building-prospects-ai"}}}
```

Then ask: *"Run link-building-prospects-ai in `list` mode on these URLs first (free), then search for my page
`targetUrl` with `maxDiscoveryChargeUsd: 0.5`."*

<details>
<summary><b>Run outcomes</b> — what your integration sees</summary>

| Outcome | Run status | Dataset | `OUTPUT` | Charged? | What to do |
|---|---|---|---|---|---|
| Free demo (the pre-filled sample) | SUCCEEDED | 4 sample prospects | `demo` | no | switch the source, paste your page |
| Sample records with AI on / edited | SUCCEEDED | sample rows as `chargedEvent: demo` | `demoRows` | no, no free unit used | — |
| Success | SUCCEEDED | qualified prospects, best first | funnel, `chargedEvents` | per qualified prospect | — |
| Agency run | SUCCEEDED | rows with `client` | `clients`, `failedClients` | per qualified prospect | fix the client named in `failedClients` |
| Nothing matched (the demo too) | SUCCEEDED | empty | `qualified: 0` | no | loosen `minScore` / `minAuthority` / `opportunityTypes` |
| Demo text still in place | SUCCEEDED | empty | `inputNeeded` | no | replace the field the status names |
| Invalid input | FAILED | empty | — | no | fix the field the status message names |
| Source failed | FAILED | empty | `sourceError` | no | follow the reason — e.g. a plan that cannot run Store Actors: use `dataset` / `list` mode |
| AI unavailable | SUCCEEDED | rule-scored prospects | `aiError`, `freeAiReserve` | free units first (a few kept for the AI), then basic | `llmProvider: byok` |

</details>

### 👥 Who is it for — SEO outreach and link building teams

| You are… | You run it to… | Start with |
|---|---|---|
| **SEO / link-building agency** | new sites for every client every week, one schedule | `clients` + `minAuthority` + your Lemlist key |
| **In-house SEO / content marketer** | blogs ranking for your topic that would link to one article | the article's `targetUrl` |
| **Digital-PR team** | roundups and reviews that cover your competitors but not you | `digital-pr-listicles-and-mentions.json` |
| **Blogger outreach freelancer** | an Ahrefs / Semrush export → typed prospects with a checked e-mail | `sourceMode: list` with the URLs |
| **AI agent (MCP)** | "find 30 guest-post sites about X" as one tool call | the free `list` call, then `actor` with a cap |

### 🧠 How the AI works

- **One call per prospect** — type, fit score, opener, pitch angle, submission rules and (opt-in) the follow-ups, from
  your inputs, the title, snippet, the first ~1,500 characters of the page and its dead links.
- **Grounded, checked in code** — reasons only as verbatim quotes; an opener that cites neither the page nor a dead link
  is replaced by the template. Default `anthropic/claude-haiku-4.5` via Apify's model access, or your own key.

### 🔒 Data, compliance and limits

- Public data only: Google results, ≤ 2 pages per site (robots.txt honoured), one HEAD request per checked link,
  public DNS and the Tranco ranking. Keep outreach within anti-spam law (GDPR, CAN-SPAM, CCPA).
- Limits: JavaScript-only sites may show no e-mail; no mailbox probe; ≤ 15 outbound links checked per page.

### ❓ FAQ

**How much will one run cost me?** 5 keywords: ≈ $0.14 Google search on your account + $0.006 per qualified prospect
(≈ $0.41 for 45), or ≈ $0.023 per prospect all-in with AI (≈ $1.17). The first 25 prospects are free.

**What will my first real search cost?** The form's 4 keywords × 3 default types = 24 Google searches ≈ 240 results ≈
$0.11 on your account (capped by `maxDiscoveryChargeUsd`) — ≈ 34 qualified prospects: 25 free, ≈ 9 at $0.006.

**Do I have to think up keywords?** No — paste the page you want links to (`targetUrl`) and leave `keywords` empty; 3–5
keywords and the pitch are read from its title and headings, and `OUTPUT.derivedBrief` shows them.

**Is this a Google Search Scraper?** It runs Google Search Results Scraper (`apify/google-search-scraper`) on your
account, then does the link-building work on top.

**Can I use it for SEO outreach at an agency with several clients?** Yes — put them all in `clients`: one run, one
schedule, a memory, digest and campaign per client, a `client` column on every row.

**What does "qualified" mean?** A picked type, fit score ≥ `minScore`, authority ≥ `minAuthority`, not excluded, and the
contact route if you require it. Only those are pushed and charged.

**Which Apify plan do I need?** Any plan runs the free demo and `dataset` / `list` mode. The live search runs Google
Search Results Scraper on your account and the AI uses your plan's model access — if your plan refuses either, the run
says so and charges nothing; use `list` mode and `llmProvider: "byok"`.

**Is the data public / is this legal?** Public pages, no login; outreach is your responsibility under anti-spam law.

<details>
<summary><b>More questions</b> — SERP exports, Pitchbox, Ahrefs DR, e-mail checks, run time, empty runs, repeat charges</summary>

**Can I feed it a Google SERP scraper export I already have?** Yes — `dataset` mode, or `list` with URLs / rows from any
Google SERP scraper, Ahrefs or Semrush.

**How is this different from a link prospecting tool like Pitchbox, BuzzStream or Respona?** Those are seat-priced
suites (≈ $24 to $200+ per month). Here 100 vetted prospects with a checked e-mail, authority and opener cost ≈ $2.60.

**Does it show domain authority like Ahrefs DR?** A free proxy: `authorityScore` from the Tranco rank, or Open PageRank
with your free key — not Ahrefs DR, but it sorts and filters the same way (`minAuthority`).

**Are the e-mails verified?** Every e-mail domain is checked for a mail server and shared inboxes are flagged; the
mailbox itself is not probed. `bestEmail` never points at a domain that cannot receive mail.

**How long does a run take?** Demo: seconds. A live search (estimate): Google ≈ 1–3 min for 30 pages, contact discovery
≈ 1 min per 100 sites; AI via Apify's model access ≈ 10–25 s per call, 8 at a time. With your own key (`byok`) 2 calls
at a time, one after a rate limit — 27 s per prospect measured on the platform; a rate-limited run stops the AI after 2
minutes (`OUTPUT.timing.aiBackoffSecs`). If you set a timeout: `timeoutSecs` ≥ 240 + `maxQualified` ×
`aiCandidateMultiplier` × 30 ÷ 2 with your own key (≈ 1,740 s at the defaults), ÷ 8 with Apify's model access.

**What happens if nothing matches my filters?** 0 rows, nothing charged; `OUTPUT.stats` names the filter.

**Will I be charged for the same site twice?** Not with `dedupeAcrossRuns` on (default) — see [Run it weekly](#-run-it-weekly).

</details>

### 🧩 More Actors from the same developer

For SEO teams and agencies — the same pay-per-qualified-result model:

- **[Google Reviews Insights](https://apify.com/rich_minds/google-reviews-insights)** — local SEO clients: what their Google reviews praise and complain about, to resell as a reputation report
- **[Local Business Lead](https://apify.com/rich_minds/local-business-lead)** — local SEO audit leads: businesses from Google Maps with the site problems an SEO agency sells the fix for

### 🆘 Support

Something missing or wrong? Open an issue on the Actor's page — requests from buyers are shipped first.

### 📝 Changelog

One line per published build, newest first — `/actor-publish` adds it with the commit subject.

- **0.3** (2026-09-26) — agency mode (`clients`), direct push to Lemlist / Instantly, dead links on resource pages
  (`brokenLinks`, broken-link opener), opt-in AI follow-up / break-up (`writeSequence`), keywords read from `targetUrl`,
  API spend cap $2 → $0.50 (= the form), demo rows show sample authority / MX values, shorter first screen and form.
- **0.2.2** (2026-09-26) — live AI price synced to $0.018, tutorial linked from the page, AI token figure labelled
  as a local measurement until the first platform AI run.

<details>
<summary>Older builds</summary>

- **0.2** (2026-09-26) — domain authority (`minAuthority`), MX-checked `bestEmail`, Lemlist / Instantly import view,
  competitor mentions (`competitorNames`), demo rows never charged, AI tier $0.04 → $0.018.
- **0.1.1** (2026-09-25) — first public build: real handle in the API snippets, pricing and listing applied.
- **0.1** (2026-09-25) — initial release: footprint searches, SERP flattening, free contact-route discovery, rule and AI
  qualification, cross-run domain dedupe.

</details>

# Actor input Schema

## `sourceMode` (type: `string`):

<b>actor</b> — search Google live: the footprint queries built from your keywords run with <code>apify/google-search-scraper</code> on your Apify account ($0.0045 per Google page + $0.001 per run, billed by that Actor and capped by <b>Max Google search spend</b>); it needs an Apify plan that can run Store Actors — if yours cannot, the run stops at once and nothing is charged. <b>dataset</b> — process an existing Google Search Results Scraper dataset (any plan, no search cost). <b>list</b> — paste Google results or plain URLs, e.g. an Ahrefs / Semrush export (any plan). The form starts on the free demo: 8 sample Google results. An API call that names nothing to search (<code>{}</code>) runs the same free demo — nothing is charged and no search is started.

## `keywords` (type: `array`):

1–10 topics your target page is about. For each one the Actor builds the footprint searches for the opportunity types you pick (e.g. <code>"remote work" "write for us"</code>, <code>"remote work" intitle:resources</code>, <code>best remote work tools</code>). 4 keywords × the 3 default types = 24 Google searches ≈ 240 results ≈ $0.11 on your account. Leave empty and fill only <b>Page you want links to</b>: 3–5 keywords (and the pitch, when empty) are read from that page's title and headings — logged, and anything you type wins.

## `targetUrl` (type: `string`):

The article, tool or page you are building links for. The fit score and the outreach opener use it. With <b>Keywords</b> empty, the live search reads its keywords from this page — one URL is enough to start.

## `senderPitch` (type: `string`):

One line on what you bring — a guest article idea, a free tool, a guide worth listing. The opener and the pitch angle build on it, never on invented claims.

## `minScore` (type: `integer`):

The field that decides what you pay: prospects whose fit score is below this are discarded and <b>not charged</b>. 70+ = pitch this week, 45–69 = maybe. Raise it to pay only for the strongest prospects, lower it to see more.

## `maxQualified` (type: `integer`):

Hard cap on results (and therefore on what you pay for). The best-scoring prospects are output first.

## `maxDiscoveryChargeUsd` (type: `number`):

Hard cap on what the Google search (<code>apify/google-search-scraper</code>) may charge your account in <b>actor</b> mode: footprint queries that would cost more are dropped before the search starts. $0.50 in the form and for an API / agent call that leaves it out — your first real search can never cost more. Raise it for bigger searches.

## `enableAi` (type: `boolean`):

On = $0.018 per qualified prospect + AI tokens (≈ $0.005, billed through Apify's model access or your own key); off = $0.006. Per prospect the AI adds: opportunity type and a 0–100 fit score with verbatim quotes from the page, an outreach opener and a pitch angle that cite the page, and the site's submission rules (guest posts accepted, sponsored, link policy, topics). Off = the rule-based type, score and template opener.

## `opportunityTypes` (type: `array`):

Which link opportunities to search for and deliver. Each type adds its own footprint searches; a prospect of a type you did not pick is dropped free. <b>Unlinked mentions</b> need <b>Your brand name</b>; <b>Competitor mentions</b> need <b>Competitors</b> (naming competitors switches it on).

## `minAuthority` (type: `integer`):

Drop sites below this <code>authorityScore</code> — free, before the AI. The score is a log scale of the site's Tranco rank (top 1 000 ≈ 54, top 100 000 ≈ 23), or Open PageRank × 10 with your key. Sites outside Tranco's top 1M have no score and are dropped by any value above 0. 0 = keep every site.

## `requireContactRoute` (type: `boolean`):

On = a prospect without a public e-mail or a contact page is dropped free. Off = it is delivered with <code>hasContactRoute: false</code>.

## `countryCode` (type: `string`):

Two-letter country of the Google search (us, gb, de, in, au …) — prospects that rank where your buyers are.

## `ownDomains` (type: `array`):

Your sites (and their subdomains) — never delivered as prospects. Also used to tell whether a page already links to you.

## `ignoredDomains` (type: `array`):

Competitors, sites you never pitch, sites you pitched outside this Actor. Dropped free, subdomains included.

## `brandName` (type: `string`):

Checked on every page (title, snippet, text). With <b>Unlinked brand mentions</b> picked, pages that name you without linking become prospects; otherwise see the next field.

## `excludeBrandMentioned` (type: `boolean`):

On = a page that already names your brand is dropped free (you probably know it). Ignored when you pick <b>Unlinked brand mentions</b>.

## `competitorNames` (type: `array`):

Brands or products you compete with. Each one adds a Google search for pages that name it but not <b>Your brand name</b> (<code>"Competitor" -"YourBrand"</code>); pages that mention a competitor and not you become <code>competitor\_mention</code> prospects with the competitor in <code>competitorsMentioned</code> — the sites to ask for a spot next to them.

## `targetFlags` (type: `array`):

Only deliver prospects that have at least one of these flags, and rank those with more of them higher. Leave empty to keep everything. Use the flag names from the README's flag table, e.g. <code>has\_email</code> or <code>accepts\_guest\_posts</code> (<code>hasEmail</code> works too); an unknown name stops the run at once with the list of valid ones.

## `suppressionList` (type: `array`):

Domains or URLs to never output. Suppressed prospects are skipped before any processing and never charged.

## `findContactRoute` (type: `boolean`):

Free: reads the prospect page and one of its contact / write-for-us pages (robots.txt honoured, max 2 pages per site) for public e-mails, the contact page, the guidelines page and social profiles. Off = faster, Google data only.

## `checkEmails` (type: `boolean`):

Free: checks that each e-mail's domain has a mail server (MX), marks shared inboxes (info@, contact@ …) and picks <code>bestEmail</code> — a named person first, then an editorial inbox — with <code>emailStatus</code>, <code>isRoleAddress</code> and <code>firstName</code> for Lemlist / Instantly. No mailbox (SMTP) verification.

## `checkBrokenLinks` (type: `boolean`):

Free: checks the outbound links of every resource page / listicle prospect (HEAD request, max 15 per page). A link that answers 404 / 410 or whose domain is gone lands in <code>brokenLinks</code>, sets the <code>has\_broken\_link</code> flag and turns the opener into the broken-link pitch: "the link to X on your page no longer works — my page could replace it".

## `lookupAuthority` (type: `boolean`):

Free: <code>authorityScore</code> (0–100) and <code>authorityRank</code> per site from the Tranco top-1M ranking (one download per run, ≈ 2 s), or from Open PageRank when you add a key below. Off = no authority figures and <b>Minimum domain authority</b> is ignored.

## `openPageRankApiKey` (type: `string`):

A free key from domcop.com/openpagerank adds a 0–10 PageRank for small sites too (Tranco only ranks the top 1M). Stored encrypted by Apify, never logged.

## `writeSequence` (type: `boolean`):

AI on only. Adds <code>followUp</code> (≤ 60 words, one new reason to reply) and <code>breakUp</code> (≤ 40 words) to every hot / warm prospect, grounded in the same page — a 3-step sequence ready for Lemlist / Instantly. Same event price; only a few more AI tokens.

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

Only used so the AI never invents a sender name — leave empty and the opener has none.

## `llmProvider` (type: `string`):

<b>Apify (no keys)</b> — the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates. <b>My own key</b> — use your OpenAI / Anthropic / Gemini / Groq key instead.

## `llmModel` (type: `string`):

Leave empty for the default (<code>anthropic/claude-haiku-4.5</code>). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4.1-mini</code>; own-key mode takes <code>provider:model</code>, e.g. <code>anthropic:claude-haiku-4-5-20251001</code>.

## `llmApiKey` (type: `string`):

Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged.

## `aiCandidateMultiplier` (type: `integer`):

How many of the best rule-scored prospects get the AI pass, as a multiple of <b>Max qualified prospects</b>. Higher = more thorough, slower, more tokens.

## `notifyEmail` (type: `string`):

After every run with at least one new prospect, the run's digest (how many are new, the top 10 with their contact route) is e-mailed here through Apify's send-mail Actor. Schedule the run weekly and the prospects come to your inbox — no Slack or Zapier needed. Never sent for the free demo.

## `lemlistApiKey` (type: `string`):

Adds every new prospect with a <code>bestEmail</code> to your Lemlist campaign after the run pushes it (firstName, companyName, website, the opener as <code>icebreaker</code>, the page, pitch angle and dead link as custom variables). Lemlist → Settings → Integrations → API. Stored encrypted by Apify, never logged.

## `lemlistCampaignId` (type: `string`):

The campaign the prospects are added to (<code>cam\_…</code> from the campaign's URL). Duplicates are skipped by Lemlist.

## `instantlyApiKey` (type: `string`):

Adds every new prospect with a <code>bestEmail</code> to your Instantly campaign (email, first\_name, company\_name, website, the opener as <code>personalization</code>, custom variables). Instantly → Settings → Integrations → API keys. Stored encrypted, never logged.

## `instantlyCampaignId` (type: `string`):

The campaign the prospects are added to (the ID in the campaign's URL). Leads already in your workspace are skipped.

## `webhookUrl` (type: `string`):

Qualified prospects are POSTed here as JSON (Zapier, Make, n8n, your CRM or outreach tool). For Google Sheets / Slack you can also use Apify's built-in Integrations tab.

## `webhookHeaders` (type: `object`):

Extra HTTP headers for the webhook, e.g. <code>{"Authorization": "Bearer …"}</code>.

## `webhookBatchSize` (type: `integer`):

1 = one POST per prospect the moment it is ready. Higher = one POST per N prospects.

## `clients` (type: `array`):

One run — one schedule — for all your clients. Each entry is one client's brief: <code>name</code> plus any of <code>keywords</code>, <code>targetUrl</code>, <code>senderPitch</code>, <code>ownDomains</code>, <code>ignoredDomains</code>, <code>brandName</code>, <code>competitorNames</code>, <code>suppressionList</code>, <code>notifyEmail</code>, <code>lemlistCampaignId</code>, <code>instantlyCampaignId</code>. Every other setting is shared. Each client gets its own search, its own never-twice memory, a <code>client</code> column (view <i>By client</i>), its own digest e-mail and campaign. Max 25 clients per run; <code>maxQualified</code> and <code>maxDiscoveryChargeUsd</code> apply per client.

## `dedupeAcrossRuns` (type: `boolean`):

Remembers every domain you received (in a named key-value store on your account) and skips it — free — in future runs, whichever of its pages ranks next time.

## `dedupeStoreName` (type: `string`):

Key-value store used for cross-run memory. Left at the default, the memory is kept per client: a different <code>targetUrl</code> / <code>ownDomains</code> / <code>brandName</code> starts its own list, so one client never hides prospects from another. Type your own name to share one memory across clients, or to keep one per campaign.

## `maxToProcess` (type: `integer`):

Upper bound on how many Google results are checked in one run (controls run time). Default = 3 × max qualified.

## `searchLanguage` (type: `string`):

Two-letter language of the results (en, de, fr, es …).

## `maxPagesPerQuery` (type: `integer`):

1 page = the top ~10 results of each footprint search ($0.0045 per page on your account). 2–3 digs deeper for niche keywords.

## `quickDateRange` (type: `string`):

Google's date filter — fresher pages, active sites.

## `footprints` (type: `array`):

Your own operator searches, one per line; <code>{keyword}</code> is replaced by each keyword, e.g. <code>"{keyword}" inurl:write-for-us</code> or <code>"{keyword}" "guest contributor"</code>. They run before the built-in ones.

## `maxQueries` (type: `integer`):

Caps the number of Google searches (keywords × footprints). The cheapest control of your search spend.

## `discoveryActorId` (type: `string`):

Actor used in <b>actor</b> mode. Any Actor whose output has the Google Search Results Scraper fields (<code>organicResults</code> or one result per row) works.

## `discoveryInput` (type: `object`):

Merged into the Google Search Results Scraper input and wins over the Actor's own values — e.g. <code>{"websiteContentScraper": true}</code> to have the source scrape each page (then nothing is fetched here), or your own <code>queries</code> instead of the footprints.

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

Only for reading the prospects' own pages. Off by default — blogs rarely block a single polite request; switch Apify Proxy on if many fetches fail.

## `datasetId` (type: `string`):

Only for <b>dataset</b> mode. A Google Search Results Scraper dataset (one item per Google page with <code>organicResults</code>, or its one-result-per-row view). Pick the dataset so the Actor is granted read access to it.

## `itemsList` (type: `array`):

Only for <b>list</b> mode. JSON array of URLs, or of objects with <code>url</code> and optionally <code>title</code>, <code>description</code>, <code>position</code>, <code>query</code> — e.g. an Ahrefs / Semrush / SERP export.

## Actor input object example

```json
{
  "sourceMode": "list",
  "keywords": [
    "remote work",
    "project management",
    "team productivity",
    "async communication"
  ],
  "targetUrl": "https://www.example.com/blog/async-standups-guide",
  "senderPitch": "A free 2,500-word guide to async stand-ups for remote teams, with copy-paste templates",
  "minScore": 60,
  "maxQualified": 50,
  "maxDiscoveryChargeUsd": 0.5,
  "enableAi": true,
  "opportunityTypes": [
    "guest_post",
    "resource_page",
    "listicle"
  ],
  "minAuthority": 0,
  "requireContactRoute": false,
  "countryCode": "us",
  "brandName": "",
  "excludeBrandMentioned": true,
  "findContactRoute": true,
  "checkEmails": true,
  "checkBrokenLinks": true,
  "lookupAuthority": true,
  "writeSequence": false,
  "senderName": "",
  "llmProvider": "apify",
  "aiCandidateMultiplier": 2,
  "webhookBatchSize": 1,
  "dedupeAcrossRuns": true,
  "dedupeStoreName": "link-building-prospects-ai-seen",
  "searchLanguage": "en",
  "maxPagesPerQuery": 1,
  "quickDateRange": "any",
  "maxQueries": 40,
  "discoveryActorId": "apify/google-search-scraper",
  "discoveryInput": {},
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "itemsList": [
    {
      "url": "https://www.remotecrewjournal.example/write-for-us/",
      "title": "Write for Us – Remote Work Guest Posts | Remote Crew Journal",
      "description": "We accept guest posts on remote work, async collaboration and distributed teams. Read our guidelines before you pitch the editors.",
      "position": 1,
      "query": "\"remote work\" \"write for us\"",
      "keyword": "remote work",
      "date": "2026-06-02",
      "websiteContent": {
        "markdown": "# Write for Us\n\nRemote Crew Journal publishes practical guides for people who lead remote and hybrid teams.\n\nWe accept guest posts on remote work, async collaboration, meetings and distributed hiring. Articles should be 1,200-2,000 words, original and never published elsewhere.\n\nEach accepted guest post may include one dofollow link to a relevant resource in the body.\n\nWe do not publish sponsored posts or casino, crypto or CBD content.\n\nEmail your pitch with two headline ideas to editor@remotecrewjournal.example.\n\n[Contact](https://www.remotecrewjournal.example/contact/) · [Twitter](https://twitter.com/remotecrewj) · [LinkedIn](https://www.linkedin.com/company/remote-crew-journal/)"
      },
      "sample": {
        "authorityScore": 31,
        "authorityRank": 48210,
        "emailStatus": "mx_ok"
      },
      "emphasizedKeywords": [
        "remote work",
        "guest posts"
      ]
    },
    {
      "url": "https://pmtoolkit.example/resources/project-management-links?utm_source=google",
      "title": "Project Management Resources: 40 Useful Links for PMs",
      "description": "A curated list of project management resources: templates, guides, courses and tools we recommend to new and senior project managers.",
      "position": 2,
      "query": "\"project management\" intitle:resources",
      "keyword": "project management",
      "date": "2026-03-18",
      "websiteContent": {
        "markdown": "# Project Management Resources\n\nThe links we send to every new project manager. Updated every quarter.\n\n## Templates\n\n- [Kick-off meeting agenda](https://agendahub.example/kickoff)\n- [RACI chart template](https://sheetsmith.example/raci)\n\n## Guides\n\n- [Running remote retrospectives](https://retrocraft.example/remote)\n- [Estimating with ranges](https://estimatelab.example/ranges)\n\nKnow a resource that belongs here? Suggest it to hello [at] pmtoolkit [dot] example — we review suggestions every month.\n\n[Contact us](https://pmtoolkit.example/contact)"
      },
      "sample": {
        "authorityScore": 24,
        "authorityRank": 168400,
        "emailStatus": "mx_ok",
        "brokenLinks": [
          "https://estimatelab.example/ranges"
        ]
      },
      "emphasizedKeywords": [
        "project management",
        "resources"
      ]
    },
    {
      "url": "https://focusflow.example/blog/best-team-productivity-tools/",
      "title": "11 Best Team Productivity Tools for Remote Teams (2026)",
      "description": "We tested 30 team productivity tools with remote teams. Here are the 11 best for planning, async stand-ups and focus time.",
      "position": 3,
      "query": "best team productivity tools",
      "keyword": "team productivity",
      "date": "2026-08-21",
      "websiteContent": {
        "markdown": "# 11 Best Team Productivity Tools for Remote Teams (2026)\n\nWe tested 30 team productivity tools with four remote teams over six weeks.\n\n1. [PlanBoard](https://planboard.example) - planning\n2. [StandupBot](https://standupbot.example) - async stand-ups\n3. [DeepWork Timer](https://deepwork.example) - focus time\n\nMissing a tool? We update this list every quarter — send it to our editor Maya Lopez at maya.lopez@focusflow.example.\n\n[Contact](https://focusflow.example/contact-us) · [Instagram](https://www.instagram.com/focusflowhq)"
      },
      "sample": {
        "authorityScore": 27,
        "authorityRank": 97300,
        "emailStatus": "mx_ok"
      },
      "emphasizedKeywords": [
        "team productivity tools"
      ]
    },
    {
      "url": "https://teamleadweekly.example/contribute/",
      "title": "Contribute to Team Lead Weekly – Guest Contributor Guidelines",
      "description": "Team Lead Weekly welcomes contributed articles from engineering and product managers about team productivity and project management.",
      "position": 4,
      "query": "\"team productivity\" \"submit a guest post\"",
      "keyword": "team productivity",
      "date": "2025-11-04",
      "websiteContent": {
        "markdown": "# Guest Contributor Guidelines\n\nTeam Lead Weekly welcomes contributed articles from engineering and product managers.\n\nTopics we accept: team productivity, project management, hiring, one-on-ones.\n\nLinks to your own site are nofollow. Sponsored posts are available and always labelled as sponsored.\n\nUse the form on our [contact page](https://teamleadweekly.example/contact) to pitch."
      },
      "sample": {
        "authorityScore": 35,
        "authorityRank": 29870
      },
      "emphasizedKeywords": [
        "team productivity",
        "project management"
      ]
    },
    {
      "url": "https://www.remotecrewjournal.example/blog/async-meetings/",
      "title": "Async Meetings: A Remote Work Playbook | Remote Crew Journal",
      "description": "How remote teams replace status meetings with written updates.",
      "position": 7,
      "query": "\"remote work\" \"submit a guest post\"",
      "keyword": "remote work"
    },
    {
      "url": "https://en.wikipedia.org/wiki/Remote_work",
      "title": "Remote work - Wikipedia",
      "description": "Remote work is the practice of working at or from one's home or another space rather than from an office.",
      "position": 2,
      "query": "\"remote work\" intitle:resources",
      "keyword": "remote work"
    },
    {
      "url": "https://www.g2.com/categories/project-management",
      "title": "Best Project Management Software in 2026 | G2",
      "description": "Compare the best project management software with verified user reviews.",
      "position": 1,
      "query": "best project management tools",
      "keyword": "project management"
    },
    {
      "url": "https://asyncworkinstitute.example/reports/remote-work-report-2026.pdf",
      "title": "State of Remote Work 2026 (PDF)",
      "description": "Survey of 3,000 remote workers on productivity and collaboration tools.",
      "position": 5,
      "query": "\"remote work\" intitle:resources",
      "keyword": "remote work"
    }
  ]
}
```

# Actor output Schema

## `qualified` (type: `string`):

All qualified prospects as JSON, best-scoring first.

## `sheet` (type: `string`):

The same prospects as a spreadsheet.

## `runSummary` (type: `string`):

JSON record with the funnel (loaded -> filtered -> AI-assessed -> qualified), per-reason skip counts, charged events by type, free-tier prospects used and remaining, whether a budget limit was reached, webhook delivery counts and the dedupe store size.

# 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 = {
    "sourceMode": "list",
    "keywords": [
        "remote work",
        "project management",
        "team productivity",
        "async communication"
    ],
    "targetUrl": "https://www.example.com/blog/async-standups-guide",
    "senderPitch": "A free 2,500-word guide to async stand-ups for remote teams, with copy-paste templates",
    "maxQualified": 50,
    "maxDiscoveryChargeUsd": 0.5,
    "maxPagesPerQuery": 1,
    "maxQueries": 40,
    "discoveryInput": {},
    "proxyConfiguration": {
        "useApifyProxy": false
    },
    "itemsList": [
        {
            "url": "https://www.remotecrewjournal.example/write-for-us/",
            "title": "Write for Us – Remote Work Guest Posts | Remote Crew Journal",
            "description": "We accept guest posts on remote work, async collaboration and distributed teams. Read our guidelines before you pitch the editors.",
            "position": 1,
            "query": "\"remote work\" \"write for us\"",
            "keyword": "remote work",
            "date": "2026-06-02",
            "websiteContent": {
                "markdown": "# Write for Us\n\nRemote Crew Journal publishes practical guides for people who lead remote and hybrid teams.\n\nWe accept guest posts on remote work, async collaboration, meetings and distributed hiring. Articles should be 1,200-2,000 words, original and never published elsewhere.\n\nEach accepted guest post may include one dofollow link to a relevant resource in the body.\n\nWe do not publish sponsored posts or casino, crypto or CBD content.\n\nEmail your pitch with two headline ideas to editor@remotecrewjournal.example.\n\n[Contact](https://www.remotecrewjournal.example/contact/) · [Twitter](https://twitter.com/remotecrewj) · [LinkedIn](https://www.linkedin.com/company/remote-crew-journal/)"
            },
            "sample": {
                "authorityScore": 31,
                "authorityRank": 48210,
                "emailStatus": "mx_ok"
            },
            "emphasizedKeywords": [
                "remote work",
                "guest posts"
            ]
        },
        {
            "url": "https://pmtoolkit.example/resources/project-management-links?utm_source=google",
            "title": "Project Management Resources: 40 Useful Links for PMs",
            "description": "A curated list of project management resources: templates, guides, courses and tools we recommend to new and senior project managers.",
            "position": 2,
            "query": "\"project management\" intitle:resources",
            "keyword": "project management",
            "date": "2026-03-18",
            "websiteContent": {
                "markdown": "# Project Management Resources\n\nThe links we send to every new project manager. Updated every quarter.\n\n## Templates\n\n- [Kick-off meeting agenda](https://agendahub.example/kickoff)\n- [RACI chart template](https://sheetsmith.example/raci)\n\n## Guides\n\n- [Running remote retrospectives](https://retrocraft.example/remote)\n- [Estimating with ranges](https://estimatelab.example/ranges)\n\nKnow a resource that belongs here? Suggest it to hello [at] pmtoolkit [dot] example — we review suggestions every month.\n\n[Contact us](https://pmtoolkit.example/contact)"
            },
            "sample": {
                "authorityScore": 24,
                "authorityRank": 168400,
                "emailStatus": "mx_ok",
                "brokenLinks": [
                    "https://estimatelab.example/ranges"
                ]
            },
            "emphasizedKeywords": [
                "project management",
                "resources"
            ]
        },
        {
            "url": "https://focusflow.example/blog/best-team-productivity-tools/",
            "title": "11 Best Team Productivity Tools for Remote Teams (2026)",
            "description": "We tested 30 team productivity tools with remote teams. Here are the 11 best for planning, async stand-ups and focus time.",
            "position": 3,
            "query": "best team productivity tools",
            "keyword": "team productivity",
            "date": "2026-08-21",
            "websiteContent": {
                "markdown": "# 11 Best Team Productivity Tools for Remote Teams (2026)\n\nWe tested 30 team productivity tools with four remote teams over six weeks.\n\n1. [PlanBoard](https://planboard.example) - planning\n2. [StandupBot](https://standupbot.example) - async stand-ups\n3. [DeepWork Timer](https://deepwork.example) - focus time\n\nMissing a tool? We update this list every quarter — send it to our editor Maya Lopez at maya.lopez@focusflow.example.\n\n[Contact](https://focusflow.example/contact-us) · [Instagram](https://www.instagram.com/focusflowhq)"
            },
            "sample": {
                "authorityScore": 27,
                "authorityRank": 97300,
                "emailStatus": "mx_ok"
            },
            "emphasizedKeywords": [
                "team productivity tools"
            ]
        },
        {
            "url": "https://teamleadweekly.example/contribute/",
            "title": "Contribute to Team Lead Weekly – Guest Contributor Guidelines",
            "description": "Team Lead Weekly welcomes contributed articles from engineering and product managers about team productivity and project management.",
            "position": 4,
            "query": "\"team productivity\" \"submit a guest post\"",
            "keyword": "team productivity",
            "date": "2025-11-04",
            "websiteContent": {
                "markdown": "# Guest Contributor Guidelines\n\nTeam Lead Weekly welcomes contributed articles from engineering and product managers.\n\nTopics we accept: team productivity, project management, hiring, one-on-ones.\n\nLinks to your own site are nofollow. Sponsored posts are available and always labelled as sponsored.\n\nUse the form on our [contact page](https://teamleadweekly.example/contact) to pitch."
            },
            "sample": {
                "authorityScore": 35,
                "authorityRank": 29870
            },
            "emphasizedKeywords": [
                "team productivity",
                "project management"
            ]
        },
        {
            "url": "https://www.remotecrewjournal.example/blog/async-meetings/",
            "title": "Async Meetings: A Remote Work Playbook | Remote Crew Journal",
            "description": "How remote teams replace status meetings with written updates.",
            "position": 7,
            "query": "\"remote work\" \"submit a guest post\"",
            "keyword": "remote work"
        },
        {
            "url": "https://en.wikipedia.org/wiki/Remote_work",
            "title": "Remote work - Wikipedia",
            "description": "Remote work is the practice of working at or from one's home or another space rather than from an office.",
            "position": 2,
            "query": "\"remote work\" intitle:resources",
            "keyword": "remote work"
        },
        {
            "url": "https://www.g2.com/categories/project-management",
            "title": "Best Project Management Software in 2026 | G2",
            "description": "Compare the best project management software with verified user reviews.",
            "position": 1,
            "query": "best project management tools",
            "keyword": "project management"
        },
        {
            "url": "https://asyncworkinstitute.example/reports/remote-work-report-2026.pdf",
            "title": "State of Remote Work 2026 (PDF)",
            "description": "Survey of 3,000 remote workers on productivity and collaboration tools.",
            "position": 5,
            "query": "\"remote work\" intitle:resources",
            "keyword": "remote work"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rich_minds/link-building-prospects-ai").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 = {
    "sourceMode": "list",
    "keywords": [
        "remote work",
        "project management",
        "team productivity",
        "async communication",
    ],
    "targetUrl": "https://www.example.com/blog/async-standups-guide",
    "senderPitch": "A free 2,500-word guide to async stand-ups for remote teams, with copy-paste templates",
    "maxQualified": 50,
    "maxDiscoveryChargeUsd": 0.5,
    "maxPagesPerQuery": 1,
    "maxQueries": 40,
    "discoveryInput": {},
    "proxyConfiguration": { "useApifyProxy": False },
    "itemsList": [
        {
            "url": "https://www.remotecrewjournal.example/write-for-us/",
            "title": "Write for Us – Remote Work Guest Posts | Remote Crew Journal",
            "description": "We accept guest posts on remote work, async collaboration and distributed teams. Read our guidelines before you pitch the editors.",
            "position": 1,
            "query": "\"remote work\" \"write for us\"",
            "keyword": "remote work",
            "date": "2026-06-02",
            "websiteContent": { "markdown": """# Write for Us

Remote Crew Journal publishes practical guides for people who lead remote and hybrid teams.

We accept guest posts on remote work, async collaboration, meetings and distributed hiring. Articles should be 1,200-2,000 words, original and never published elsewhere.

Each accepted guest post may include one dofollow link to a relevant resource in the body.

We do not publish sponsored posts or casino, crypto or CBD content.

Email your pitch with two headline ideas to editor@remotecrewjournal.example.

[Contact](https://www.remotecrewjournal.example/contact/) · [Twitter](https://twitter.com/remotecrewj) · [LinkedIn](https://www.linkedin.com/company/remote-crew-journal/)""" },
            "sample": {
                "authorityScore": 31,
                "authorityRank": 48210,
                "emailStatus": "mx_ok",
            },
            "emphasizedKeywords": [
                "remote work",
                "guest posts",
            ],
        },
        {
            "url": "https://pmtoolkit.example/resources/project-management-links?utm_source=google",
            "title": "Project Management Resources: 40 Useful Links for PMs",
            "description": "A curated list of project management resources: templates, guides, courses and tools we recommend to new and senior project managers.",
            "position": 2,
            "query": "\"project management\" intitle:resources",
            "keyword": "project management",
            "date": "2026-03-18",
            "websiteContent": { "markdown": """# Project Management Resources

The links we send to every new project manager. Updated every quarter.

## Templates

- [Kick-off meeting agenda](https://agendahub.example/kickoff)
- [RACI chart template](https://sheetsmith.example/raci)

## Guides

- [Running remote retrospectives](https://retrocraft.example/remote)
- [Estimating with ranges](https://estimatelab.example/ranges)

Know a resource that belongs here? Suggest it to hello [at] pmtoolkit [dot] example — we review suggestions every month.

[Contact us](https://pmtoolkit.example/contact)""" },
            "sample": {
                "authorityScore": 24,
                "authorityRank": 168400,
                "emailStatus": "mx_ok",
                "brokenLinks": ["https://estimatelab.example/ranges"],
            },
            "emphasizedKeywords": [
                "project management",
                "resources",
            ],
        },
        {
            "url": "https://focusflow.example/blog/best-team-productivity-tools/",
            "title": "11 Best Team Productivity Tools for Remote Teams (2026)",
            "description": "We tested 30 team productivity tools with remote teams. Here are the 11 best for planning, async stand-ups and focus time.",
            "position": 3,
            "query": "best team productivity tools",
            "keyword": "team productivity",
            "date": "2026-08-21",
            "websiteContent": { "markdown": """# 11 Best Team Productivity Tools for Remote Teams (2026)

We tested 30 team productivity tools with four remote teams over six weeks.

1. [PlanBoard](https://planboard.example) - planning
2. [StandupBot](https://standupbot.example) - async stand-ups
3. [DeepWork Timer](https://deepwork.example) - focus time

Missing a tool? We update this list every quarter — send it to our editor Maya Lopez at maya.lopez@focusflow.example.

[Contact](https://focusflow.example/contact-us) · [Instagram](https://www.instagram.com/focusflowhq)""" },
            "sample": {
                "authorityScore": 27,
                "authorityRank": 97300,
                "emailStatus": "mx_ok",
            },
            "emphasizedKeywords": ["team productivity tools"],
        },
        {
            "url": "https://teamleadweekly.example/contribute/",
            "title": "Contribute to Team Lead Weekly – Guest Contributor Guidelines",
            "description": "Team Lead Weekly welcomes contributed articles from engineering and product managers about team productivity and project management.",
            "position": 4,
            "query": "\"team productivity\" \"submit a guest post\"",
            "keyword": "team productivity",
            "date": "2025-11-04",
            "websiteContent": { "markdown": """# Guest Contributor Guidelines

Team Lead Weekly welcomes contributed articles from engineering and product managers.

Topics we accept: team productivity, project management, hiring, one-on-ones.

Links to your own site are nofollow. Sponsored posts are available and always labelled as sponsored.

Use the form on our [contact page](https://teamleadweekly.example/contact) to pitch.""" },
            "sample": {
                "authorityScore": 35,
                "authorityRank": 29870,
            },
            "emphasizedKeywords": [
                "team productivity",
                "project management",
            ],
        },
        {
            "url": "https://www.remotecrewjournal.example/blog/async-meetings/",
            "title": "Async Meetings: A Remote Work Playbook | Remote Crew Journal",
            "description": "How remote teams replace status meetings with written updates.",
            "position": 7,
            "query": "\"remote work\" \"submit a guest post\"",
            "keyword": "remote work",
        },
        {
            "url": "https://en.wikipedia.org/wiki/Remote_work",
            "title": "Remote work - Wikipedia",
            "description": "Remote work is the practice of working at or from one's home or another space rather than from an office.",
            "position": 2,
            "query": "\"remote work\" intitle:resources",
            "keyword": "remote work",
        },
        {
            "url": "https://www.g2.com/categories/project-management",
            "title": "Best Project Management Software in 2026 | G2",
            "description": "Compare the best project management software with verified user reviews.",
            "position": 1,
            "query": "best project management tools",
            "keyword": "project management",
        },
        {
            "url": "https://asyncworkinstitute.example/reports/remote-work-report-2026.pdf",
            "title": "State of Remote Work 2026 (PDF)",
            "description": "Survey of 3,000 remote workers on productivity and collaboration tools.",
            "position": 5,
            "query": "\"remote work\" intitle:resources",
            "keyword": "remote work",
        },
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("rich_minds/link-building-prospects-ai").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 '{
  "sourceMode": "list",
  "keywords": [
    "remote work",
    "project management",
    "team productivity",
    "async communication"
  ],
  "targetUrl": "https://www.example.com/blog/async-standups-guide",
  "senderPitch": "A free 2,500-word guide to async stand-ups for remote teams, with copy-paste templates",
  "maxQualified": 50,
  "maxDiscoveryChargeUsd": 0.5,
  "maxPagesPerQuery": 1,
  "maxQueries": 40,
  "discoveryInput": {},
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "itemsList": [
    {
      "url": "https://www.remotecrewjournal.example/write-for-us/",
      "title": "Write for Us – Remote Work Guest Posts | Remote Crew Journal",
      "description": "We accept guest posts on remote work, async collaboration and distributed teams. Read our guidelines before you pitch the editors.",
      "position": 1,
      "query": "\\"remote work\\" \\"write for us\\"",
      "keyword": "remote work",
      "date": "2026-06-02",
      "websiteContent": {
        "markdown": "# Write for Us\\n\\nRemote Crew Journal publishes practical guides for people who lead remote and hybrid teams.\\n\\nWe accept guest posts on remote work, async collaboration, meetings and distributed hiring. Articles should be 1,200-2,000 words, original and never published elsewhere.\\n\\nEach accepted guest post may include one dofollow link to a relevant resource in the body.\\n\\nWe do not publish sponsored posts or casino, crypto or CBD content.\\n\\nEmail your pitch with two headline ideas to editor@remotecrewjournal.example.\\n\\n[Contact](https://www.remotecrewjournal.example/contact/) · [Twitter](https://twitter.com/remotecrewj) · [LinkedIn](https://www.linkedin.com/company/remote-crew-journal/)"
      },
      "sample": {
        "authorityScore": 31,
        "authorityRank": 48210,
        "emailStatus": "mx_ok"
      },
      "emphasizedKeywords": [
        "remote work",
        "guest posts"
      ]
    },
    {
      "url": "https://pmtoolkit.example/resources/project-management-links?utm_source=google",
      "title": "Project Management Resources: 40 Useful Links for PMs",
      "description": "A curated list of project management resources: templates, guides, courses and tools we recommend to new and senior project managers.",
      "position": 2,
      "query": "\\"project management\\" intitle:resources",
      "keyword": "project management",
      "date": "2026-03-18",
      "websiteContent": {
        "markdown": "# Project Management Resources\\n\\nThe links we send to every new project manager. Updated every quarter.\\n\\n## Templates\\n\\n- [Kick-off meeting agenda](https://agendahub.example/kickoff)\\n- [RACI chart template](https://sheetsmith.example/raci)\\n\\n## Guides\\n\\n- [Running remote retrospectives](https://retrocraft.example/remote)\\n- [Estimating with ranges](https://estimatelab.example/ranges)\\n\\nKnow a resource that belongs here? Suggest it to hello [at] pmtoolkit [dot] example — we review suggestions every month.\\n\\n[Contact us](https://pmtoolkit.example/contact)"
      },
      "sample": {
        "authorityScore": 24,
        "authorityRank": 168400,
        "emailStatus": "mx_ok",
        "brokenLinks": [
          "https://estimatelab.example/ranges"
        ]
      },
      "emphasizedKeywords": [
        "project management",
        "resources"
      ]
    },
    {
      "url": "https://focusflow.example/blog/best-team-productivity-tools/",
      "title": "11 Best Team Productivity Tools for Remote Teams (2026)",
      "description": "We tested 30 team productivity tools with remote teams. Here are the 11 best for planning, async stand-ups and focus time.",
      "position": 3,
      "query": "best team productivity tools",
      "keyword": "team productivity",
      "date": "2026-08-21",
      "websiteContent": {
        "markdown": "# 11 Best Team Productivity Tools for Remote Teams (2026)\\n\\nWe tested 30 team productivity tools with four remote teams over six weeks.\\n\\n1. [PlanBoard](https://planboard.example) - planning\\n2. [StandupBot](https://standupbot.example) - async stand-ups\\n3. [DeepWork Timer](https://deepwork.example) - focus time\\n\\nMissing a tool? We update this list every quarter — send it to our editor Maya Lopez at maya.lopez@focusflow.example.\\n\\n[Contact](https://focusflow.example/contact-us) · [Instagram](https://www.instagram.com/focusflowhq)"
      },
      "sample": {
        "authorityScore": 27,
        "authorityRank": 97300,
        "emailStatus": "mx_ok"
      },
      "emphasizedKeywords": [
        "team productivity tools"
      ]
    },
    {
      "url": "https://teamleadweekly.example/contribute/",
      "title": "Contribute to Team Lead Weekly – Guest Contributor Guidelines",
      "description": "Team Lead Weekly welcomes contributed articles from engineering and product managers about team productivity and project management.",
      "position": 4,
      "query": "\\"team productivity\\" \\"submit a guest post\\"",
      "keyword": "team productivity",
      "date": "2025-11-04",
      "websiteContent": {
        "markdown": "# Guest Contributor Guidelines\\n\\nTeam Lead Weekly welcomes contributed articles from engineering and product managers.\\n\\nTopics we accept: team productivity, project management, hiring, one-on-ones.\\n\\nLinks to your own site are nofollow. Sponsored posts are available and always labelled as sponsored.\\n\\nUse the form on our [contact page](https://teamleadweekly.example/contact) to pitch."
      },
      "sample": {
        "authorityScore": 35,
        "authorityRank": 29870
      },
      "emphasizedKeywords": [
        "team productivity",
        "project management"
      ]
    },
    {
      "url": "https://www.remotecrewjournal.example/blog/async-meetings/",
      "title": "Async Meetings: A Remote Work Playbook | Remote Crew Journal",
      "description": "How remote teams replace status meetings with written updates.",
      "position": 7,
      "query": "\\"remote work\\" \\"submit a guest post\\"",
      "keyword": "remote work"
    },
    {
      "url": "https://en.wikipedia.org/wiki/Remote_work",
      "title": "Remote work - Wikipedia",
      "description": "Remote work is the practice of working at or from one'\''s home or another space rather than from an office.",
      "position": 2,
      "query": "\\"remote work\\" intitle:resources",
      "keyword": "remote work"
    },
    {
      "url": "https://www.g2.com/categories/project-management",
      "title": "Best Project Management Software in 2026 | G2",
      "description": "Compare the best project management software with verified user reviews.",
      "position": 1,
      "query": "best project management tools",
      "keyword": "project management"
    },
    {
      "url": "https://asyncworkinstitute.example/reports/remote-work-report-2026.pdf",
      "title": "State of Remote Work 2026 (PDF)",
      "description": "Survey of 3,000 remote workers on productivity and collaboration tools.",
      "position": 5,
      "query": "\\"remote work\\" intitle:resources",
      "keyword": "remote work"
    }
  ]
}' |
apify call rich_minds/link-building-prospects-ai --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rich_minds/link-building-prospects-ai"
        }
    }
}
```

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/hyc0cilNOuZqBCbVH/builds/CdEzTsQt7gdwqKNvn/openapi.json
