Naming notePeople type "a href backlink checker" when they mean Ahrefs. The gate below works with any source of a domain rating, and here we use our own bulk_dr action. Real tools in this space include Ahrefs, Semrush and Moz; Google Search Console shows only your own links.
What the gate looks at
The gate reads the outbound links in a draft. It never touches your own rankings.
A script extracts every <a href> from the rendered HTML, reduces each URL to its host, removes duplicates and sends the list to bulk_dr in one call. That is one credit for up to 2,000 hosts, so the cost of a gate is a rounding error even for a post with sixty references.
Run it on the rendered HTML, not on the Markdown. Shortcodes, embeds and plugins add links you never typed, and the gate has to see the page as a visitor will.
Where it runs
As late as possible.
Place the gate in the last build step before the scheduler, after the CMS or static generator has produced final HTML. On WordPress that means a hook on the status change to Scheduled, on Hugo a step after hugo build, and on Ghost a webhook for the post-scheduled event, each ending in the same bulk call.
The tree, one question at a time
- 1
Does any host come back with rating 0 or no row?
A zero means our index holds no referring domains for it. That is normal for a brand-new site and a warning for anything you cite as an authority. Go to question 2.
- 2
Is the zero host a source you named in the text?
If the post calls it a study, a report or an official page, HOLD the post and send it to an editor. If it is a footnote tool or a brand mention, PASS.
- 3
Do three or more hosts sit under your own floor?
Pick the floor from your history (see the next section). Three or more low hosts in one post usually means a scraped list or a pasted AI draft. HOLD.
- 4
Is the same host linked more than five times?
Repeated links to a single outside domain look like an affiliate pattern. Reduce them to the first mention. If the script cannot decide, HOLD.
What each exit does in the pipeline
Exit codes are a suggestion; map them to your own CI.| Exit | Meaning | Pipeline action | Who looks |
|---|
| PASS | No rule fired | Post moves to the scheduler | Nobody |
|---|
| HOLD | One soft rule fired | Status set to Pending review, Slack message with the host list | An editor |
|---|
| BLOCK | API error 401/402 or malformed list | Job fails, post stays draft | Whoever owns the pipeline |
|---|
Picking the floor without borrowing one
Use your own history.
Take thirty published posts you are happy with and run their outbound hosts through bulk_dr once. Sort the ratings. The tenth percentile is a sensible first floor. It flags the weakest tenth of what you already accept, while Ahrefs DR and Moz DA remain separate scales and our rating is a log scale from 0 to 100, so never paste a threshold from a forum thread.
Review the floor each quarter, since the link graph grows and the data refreshes roughly once a month. A host that scored 8 in spring may show 15 after a refresh without anything about the site changing. See the glossary for the terms.
The gate in thirty lines
A sketch in shell and jq. Swap in your language; the shape stays the same.
bash
HOSTS=$(grep -o 'href="https\?://[^/"]*' post.html | sed 's|.*//||' | sort -u | paste -sd, -)
RES=$(curl -s -H "Authorization: Bearer $SBB_KEY" \
"https://seoblogbot.com/api.php?action=bulk_dr&domains=$HOSTS")
case $(echo "$RES" | jq -r '.ok') in
true) ;;
*) echo "BLOCK: api error"; exit 2 ;;
esac
# inspect the response once and adapt the jq path to its shape
echo "$RES" | jq '.'
Our position
Hold more than you block
A gate that blocks too easily gets switched off by the third annoyed editor. Keep BLOCK for broken infrastructure and let rule hits become a HOLD with a clear reason.
- Log the host list with the verdict so appeals take a minute.
- Run the post-publish audit as a second layer.
- Read the post-mortem for the failure that makes teams add this.