List backlink outreach prospects
curl --request GET \
--url https://api.snowseo.com/v3/outreach/prospects \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/outreach/prospects"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.snowseo.com/v3/outreach/prospects', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.snowseo.com/v3/outreach/prospects",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.snowseo.com/v3/outreach/prospects"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.snowseo.com/v3/outreach/prospects")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/outreach/prospects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"prospects": [
{
"id": "<string>",
"domain": "<string>",
"sources": [
"<string>"
],
"foundVia": [
{
"source": "<string>",
"matchedQuery": "<string>",
"position": 123
}
],
"status": "<string>",
"isNew": true,
"createdAt": "<string>",
"updatedAt": "<string>",
"lastActivityAt": "<string>",
"targetPage": {
"id": "<string>",
"url": "<string>",
"title": "<string>",
"source": "<string>",
"matchedQuery": "<string>",
"pageType": "<string>",
"linkStatus": "<string>",
"topicalFit": 123
},
"domainRating": 123,
"opportunity": "<string>",
"opportunityDetails": {
"code": "<string>",
"label": "<string>",
"description": "<string>",
"strength": 123,
"action": "<string>"
},
"lane": {
"code": "<string>",
"label": "<string>",
"action": "<string>",
"hint": "<string>",
"channel": "<string>"
},
"linkStatus": "<string>",
"linkEvidence": "<string>",
"reasons": [
"<string>"
],
"nextStep": "<string>",
"worth": 123,
"worthBand": "strong",
"worthDetails": {
"score": 123,
"band": "<string>",
"label": "<string>"
},
"odds": 123,
"oddsBand": "high",
"oddsDetails": {
"score": 123,
"band": "<string>",
"label": "<string>"
},
"relationship": "<string>",
"relationshipDetails": {
"code": "<string>",
"label": "<string>",
"description": "<string>"
},
"actionable": true,
"linkPlay": "<string>",
"playbook": {
"play": "<string>",
"title": "<string>",
"summary": "<string>",
"steps": [
"<string>"
]
},
"outreachStage": "<string>",
"contactReadiness": {
"code": "<string>",
"label": "<string>",
"description": "<string>",
"rank": 123,
"channel": "<string>"
},
"peopleCount": 123,
"pageCount": 123,
"emails": [
{
"id": "<string>",
"email": "<string>",
"name": "<string>",
"role": "<string>",
"countryCode": "<string>",
"location": "<string>",
"verifiedStatus": "<string>",
"confidence": 123,
"isPrimary": true
}
],
"analysis": "<string>",
"doNotContact": true
}
],
"discoveryStatus": "running",
"mentionCheckStatus": "running",
"relationshipSweepStatus": "running",
"mentionCheckProgress": {
"done": 123,
"total": 123
}
}Prospects
Prospects
Find sites worth pitching for a backlink, manage the list, and check whether the links went live.
GET
/
v3
/
outreach
/
prospects
List backlink outreach prospects
curl --request GET \
--url https://api.snowseo.com/v3/outreach/prospects \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/outreach/prospects"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.snowseo.com/v3/outreach/prospects', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.snowseo.com/v3/outreach/prospects",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.snowseo.com/v3/outreach/prospects"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.snowseo.com/v3/outreach/prospects")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/outreach/prospects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"prospects": [
{
"id": "<string>",
"domain": "<string>",
"sources": [
"<string>"
],
"foundVia": [
{
"source": "<string>",
"matchedQuery": "<string>",
"position": 123
}
],
"status": "<string>",
"isNew": true,
"createdAt": "<string>",
"updatedAt": "<string>",
"lastActivityAt": "<string>",
"targetPage": {
"id": "<string>",
"url": "<string>",
"title": "<string>",
"source": "<string>",
"matchedQuery": "<string>",
"pageType": "<string>",
"linkStatus": "<string>",
"topicalFit": 123
},
"domainRating": 123,
"opportunity": "<string>",
"opportunityDetails": {
"code": "<string>",
"label": "<string>",
"description": "<string>",
"strength": 123,
"action": "<string>"
},
"lane": {
"code": "<string>",
"label": "<string>",
"action": "<string>",
"hint": "<string>",
"channel": "<string>"
},
"linkStatus": "<string>",
"linkEvidence": "<string>",
"reasons": [
"<string>"
],
"nextStep": "<string>",
"worth": 123,
"worthBand": "strong",
"worthDetails": {
"score": 123,
"band": "<string>",
"label": "<string>"
},
"odds": 123,
"oddsBand": "high",
"oddsDetails": {
"score": 123,
"band": "<string>",
"label": "<string>"
},
"relationship": "<string>",
"relationshipDetails": {
"code": "<string>",
"label": "<string>",
"description": "<string>"
},
"actionable": true,
"linkPlay": "<string>",
"playbook": {
"play": "<string>",
"title": "<string>",
"summary": "<string>",
"steps": [
"<string>"
]
},
"outreachStage": "<string>",
"contactReadiness": {
"code": "<string>",
"label": "<string>",
"description": "<string>",
"rank": 123,
"channel": "<string>"
},
"peopleCount": 123,
"pageCount": 123,
"emails": [
{
"id": "<string>",
"email": "<string>",
"name": "<string>",
"role": "<string>",
"countryCode": "<string>",
"location": "<string>",
"verifiedStatus": "<string>",
"confidence": 123,
"isPrimary": true
}
],
"analysis": "<string>",
"doNotContact": true
}
],
"discoveryStatus": "running",
"mentionCheckStatus": "running",
"relationshipSweepStatus": "running",
"mentionCheckProgress": {
"done": 123,
"total": 123
}
}A prospect is one website that could link to you, plus the specific page the link would go on. This group covers finding them, curating the list, and re-checking earned links.
The server also sorts, filters and pages the list.
The response also carries
Backlink Outreach is in beta. Endpoints live under
/v3/outreach and every request is scoped to the brand your API key belongs to, so a brand key passes no teamId; an organization key passes the brand’s teamId. See Authentication.Several of these endpoints spend credits. Every one that does says so below. Background work is tracked through the prospect and mailbox statuses, without exposing queue job IDs.
List prospects
GET /v3/outreach/prospects
Every prospect for the brand, with the page it would be pitched about, its Domain Rating, contact counts and pipeline stage. By default, newly added rows (isNew) come first, then rows are ordered by the tier of their lane (broken links first, then unlinked mentions, listicles, comparisons and so on, with self-serve and community rows after), then by likelihood over value (0.65 * odds + 0.35 * worth), then by Domain Rating, then by recency. This is the starting point for any outreach question.
Query parameters
| Parameter | Description |
|---|---|
status | Filter by how far the contact search got: pending, finding_people, people_found, no_people, failed |
source | Filter to prospects with at least one page from this discovery source: query-expansion, keyword-serp, ai-citation, manual |
sortBy is one of target, dr, chance, opportunity or contacts (contact readiness), with sortDir of asc or desc (default desc); there is no sort by worth. page and pageSize (a number or all) page the rows, search matches text, ready=true keeps only rows ready to email, ids takes comma-separated prospect IDs, and filters takes JSON-encoded filter groups. Without sortBy the default order above applies. Without pageSize the first 25 rows are returned; send pageSize=all for every row.
Every response also carries page, pageSize, total, totalPages, and a summary of counts over the whole list: listed, laneTotal, lanes, journey, eligiblePeople, recheckSites and recheckPages.
Key fields on each prospect
| Field | What it tells you |
|---|---|
id | The prospect ID that every prospect endpoint takes |
domain | The site |
targetPage | The page the pitch is about - URL, title, page type, and the search that surfaced it. null for a hand-added bare domain |
domainRating | Domain Rating, 0-100. null until fetched |
opportunity | The ask: fix-broken-link, ask-for-link, offer-alternative, get-listed, pitch, or already-linked |
opportunityDetails | The same ask in plain words: { code, label, description, strength, action }. strength runs from 5 (broken link) down to 0 (already linked) |
lane | The group the row sits in: { code, label, action, hint, channel }. code is fix-broken, claim-mention, listicle, comparison, review, resource, other, claim-listing, thread, won or competitor. channel is how the link is earned: email, creator, self-serve, community or none |
contactReadiness | How close the row is to a send: { code, label, description, rank, channel }. code is not-searched, people-found, ready-to-send, none-found, search-failed, playbook, already-linked or competitor. A higher rank is further along |
linkStatus | What the crawl found about your domain on their pages: broken, linked, unlinked, or null when nothing has been checked. Per-page statuses (see List a prospect’s pages) also include absent and unknown |
linkEvidence | One line of observed facts about the target page, such as how many competitors it covers and when it was updated. null until the page has been read |
worth / worthBand | What the link is worth, 0-100 and a band |
worthDetails | { score, band, label } for worth |
odds / oddsBand | How likely the ask is to land: high, medium, long |
oddsDetails | { score, band, label } for odds |
reasons / nextStep | Evidence behind the recommendation and the suggested next action |
actionable | false when there is nothing left to pitch or the site is a direct competitor |
relationship | Who publishes it: publisher, vendor_adjacent, directory, community, competitor, unknown |
relationshipDetails | { code, label, description } for relationship |
linkPlay | How the link is actually earned: outreach, creator, self-serve, community |
playbook | Step-by-step instructions, present only when linkPlay is not outreach |
outreachStage | Pipeline stage: not_started, people_found, enriched, contacted, negotiating, won |
status | Contact search progress: pending, finding_people, people_found, no_people, failed |
sources / foundVia | The discovery sources that surfaced the site’s pages, and the search and position behind each |
peopleCount | People found at the site |
pageCount | Pages found on the site |
emails | Contact addresses found so far |
doNotContact | Excluded from sending, but still on the list |
isNew | true for rows added in the last 24 hours |
lastActivityAt | Latest change to the prospect or its people, pages, addresses, drafts and messages |
discoveryStatus, mentionCheckStatus and relationshipSweepStatus. Keep polling while any is running. While a page check is running, mentionCheckProgress is { done, total }, otherwise null. Each prospect’s status reports contact search progress. Its analysis is null when idle, or one of rechecking (a link re-check), checking_pages (its pages are being read) or classifying (its relationship is being judged).
Without
sortBy you get the default order. Pass sortBy=chance for quick wins (highest odds first) or sortBy=dr for strong domains. worth and odds can disagree: a valuable link may still be unlikely to earn.Find new prospects
Start a background search for new sites with Find prospects. It costs 25 AI credits and is refunded when no new prospects turn up.Manage the list
- Add prospects
- Delete a prospect
- Bulk prospect actions: delete, block, find people and re-check many at once
- Unblock a domain
- Set a prospect’s relationship
- Override a prospect’s stage
- Choose which page to pitch
Pages and link checks
Rate limits
Outreach endpoints are individually rate limited, with the tightest limits on the ones that spend money - discovery, enrichment, re-checks and sending. A429 carries a Retry-After header. Back off rather than retrying immediately.Authorizations
bearerAuthapiKey
Your SnowSEO API key (sk_...).
Query Parameters
1-based page. Default 1.
Rows per page (max 1000), or 'all'. Every response reports total and totalPages.
Comma-separated prospect IDs.
JSON-encoded filter groups.
Available options:
target, dr, chance, opportunity, contacts Available options:
asc, desc Filter by how far the contact search has got for each prospect.
Available options:
pending, finding_people, people_found, no_people, failed Filter to prospects with at least one page from this discovery source.
Response
200 - application/json
Default Response
Was this page helpful?

