example

Vet a backlink donor before you pitch

Spam score, authority, and the link-mix breakdown for any domain — 30 credits to skip a bad neighborhood.

The donor list from the backlink-donors walkthrough is candidates, not vetted donors. Two calls per domain finish the job.

language
prerequisites

Export your key once.

$ setupcurl
export SEOFETCH_KEY=sof_live_…
# the scripts below use jq -- brew install jq / apt-get install jq
step 1

One call: authority, spam score, and the breakdown of how the links arrive.

→ requestcurl
curl https://api.seofetch.com/v1/backlinks/summary \
  -H "Authorization: Bearer $SEOFETCH_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target": "donorsite.io"}' \
  -o summary.json
← response200
{
  "id": "back_baa6enwnooqzprqku2k74hfz",
  "request_id": "req_7fitaios4je3hcfii4l4sv5q7e",
  "object": "backlink_summary",
  "created_at": "2026-08-09T07:27:38Z",
  "elapsed_ms": 180,
  "cache": "miss",
  "credits": {
    "charged": 20,
    "balance": 9857
  },
  "data": {
    "target": "donorsite.io",
    "authority": 33,
    "backlinks": 617091,
    "spam_score": 9,
    "referring_domains": 3582,
    "referring_root_domains": 3160,
    "referring_pages": 210044,
    "link_breakdown": {
      "tlds": {
        "com": 2891,
        "net": 412,
        "org": 279
      },
      "types": {
        "anchor": 17226,
        "image": 421,
        "redirect": 12
      },
      "attributes": {
        "nofollow": 1769,
        "ugc": 340,
        "external": 88,
        "sponsored": 26
      },
      "platforms": {
        "blogs": 3021,
        "cms": 1104,
        "news": 214
      },
      "page_sections": {
        "article": 12904,
        "footer": 2200,
        "section": 1122
      },
      "countries": {
        "US": 9821,
        "GB": 2011,
        "DE": 1502
      }
    }
  }
}

spam_score is the first gate — where you draw the line is policy, but high spam plus thin authority is a pitch you skip. The breakdown tells you how the domain earns its links.

step 2

Two ratios tell you more than the raw count.

$ localrun locally
jq '{nofollow_share: (.data.link_breakdown.attributes.nofollow / .data.backlinks), sponsored_share: (.data.link_breakdown.attributes.sponsored / .data.backlinks)}' summary.json

A donor whose profile is mostly nofollow or sponsored passes less than the totals suggest. Numbers over adjectives — compute them, don't eyeball.

step 3

Organic reality-check: does it rank anywhere in your market?

→ requestcurl
curl https://api.seofetch.com/v1/domains/overview \
  -H "Authorization: Bearer $SEOFETCH_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "donorsite.io", "location": 2840, "language": "en"}'
← response200
{
  "id": "doma_7z52ktrstezpbtjehqtem3iq",
  "request_id": "req_arnlhmto4bcirawcrqsgw6ks2m",
  "object": "domain_overview",
  "created_at": "2026-08-09T07:27:38Z",
  "elapsed_ms": 180,
  "cache": "miss",
  "credits": {
    "charged": 10,
    "balance": 9857
  },
  "data": {
    "organic": {
      "keywords_count": 101,
      "traffic_estimate": 70.17,
      "traffic_value": 704.38,
      "positions": {
        "top_3": 0,
        "top_10": 3,
        "top_20": 11,
        "top_100": 101
      }
    },
    "paid": {
      "keywords_count": 0,
      "traffic_estimate": 0,
      "traffic_value": 0,
      "positions": {
        "top_3": 0,
        "top_10": 0,
        "top_20": 0,
        "top_100": 0
      }
    }
  }
}

Authority with no rankings in your market is a warning, not a verdict — this is one location/language snapshot (2840 is the United States; look up others with /v1/locations). But it's the cheap question to ask before your outreach email does.

script

Run the whole thing.

Each language below is the full pipeline — swap in your candidates, run it after exporting SEOFETCH_KEY: domains.txt in, verdict.csv out, sorted by authority — bring your own weighting.

→ runvet.sh
#!/usr/bin/env bash
# vet.sh -- vet backlink donors before you pitch: spam score + link mix + traffic reality-check.
# domains.txt: one candidate domain per line. Output: verdict.csv, highest authority first.
set -euo pipefail
: "${SEOFETCH_KEY:?export SEOFETCH_KEY first}"
api() { curl -sS --fail-with-body "https://api.seofetch.com$1" \
  -H "Authorization: Bearer $SEOFETCH_KEY" \
  -H "Content-Type: application/json" \
  -d "$2"; }

: > verdict.csv
while IFS= read -r d; do
  [ -z "$d" ] && continue
  api /v1/backlinks/summary "$(jq -cn --arg t "$d" '{target: $t}')" > "summary-$d.json"
  api /v1/domains/overview \
    "$(jq -cn --arg d "$d" '{domain: $d, location: 2840, language: "en"}')" > "overview-$d.json"
  jq -n --arg d "$d" --slurpfile s "summary-$d.json" --slurpfile o "overview-$d.json" \
    '[$d, $s[0].data.authority, $s[0].data.spam_score,
      ($s[0].data.link_breakdown.attributes.nofollow / $s[0].data.backlinks),
      $o[0].data.organic.keywords_count, $o[0].data.organic.traffic_estimate] | @csv' \
    >> verdict.csv
done < domains.txt
sort -t, -k2 -rn verdict.csv -o verdict.csv
echo "verdict.csv: domain, authority, spam_score, nofollow_share, organic_keywords, traffic -- highest authority first -- bring your own weighting"