DEV Community

Emma Watson
Emma Watson

Posted on

How I Built a Node.js Workflow for Bulk Backlink Exports

If you’ve ever tried pulling backlink data for dozens of competitor domains, you’ve probably run into the same problems: API rate limits, expensive credits, inconsistent data, and spreadsheets full of manually copied results.

I recently ran into this while working on a large SEO audit. I needed backlink data for more than 50 domains, and manually collecting everything from multiple tools was taking far too long.

Instead of continuing with the spreadsheet approach, I built a small Node.js workflow to handle the process automatically.

The goal was simple:

Input: A list of domains
Output: A clean, normalized CSV containing the backlink data

The interesting part wasn't actually fetching the data. The real challenge was managing concurrency, throttling, retries, and failed requests.

Why Rate Limiting Matters

Most backlink APIs have request limits. If you send dozens of requests simultaneously, you'll eventually start receiving HTTP 429 Too Many Requests responses.

For example, sending 50 requests at once might look efficient, but it's usually a bad idea.

A better approach is to maintain a controlled queue and process a limited number of requests concurrently.

Here's the basic pattern I used:

const pLimit = require("p-limit");

const delay = (ms) =>
new Promise((resolve) => setTimeout(resolve, ms));

async function exportBacklinks(domains) {
const limit = pLimit(5);
const results = [];

const tasks = domains.map((domain, index) =>
limit(async () => {
// Simulate an API request
await delay(1000 + Math.random() * 500);

  // Replace this with your actual API request
  const data = `Data for ${domain}`;


  results.push({
    domain,
    data
  });


  console.log(
    `Processed ${index + 1}/${domains.length}: ${domain}`
  );
})
Enter fullscreen mode Exit fullscreen mode

);

await Promise.all(tasks);

return results;
}

The important part here is:

const limit = pLimit(5);

Instead of firing every request simultaneously, the queue allows only five operations to run at the same time.

That makes the workflow much less likely to overwhelm an API.

Don't Forget Retries

Concurrency control alone isn't enough.

APIs can still return temporary errors, especially when you're processing hundreds or thousands of URLs.

For 429 responses, an exponential backoff strategy is useful. Instead of retrying immediately, increase the delay after each failed attempt.

A simple strategy looks like this:

Attempt 1 → wait 1 second
Attempt 2 → wait 2 seconds
Attempt 3 → wait 4 seconds
Attempt 4 → wait 8 seconds

You should also set a maximum number of retries so a permanently failing domain doesn't keep your entire queue running indefinitely.

Normalize the Data Before Exporting

Another issue I discovered was inconsistent URL formatting.

You might receive:

https://example.com/page
https://example.com/page/

Depending on your analysis, these could end up being treated as different URLs.

Before deduplicating or comparing data, normalize the URLs.

For example:

function normalizeUrl(url) {
return url
.trim()
.replace(/\/$/, "");
}

For production workflows, I'd recommend using a proper URL parser rather than relying only on string manipulation.

Exporting to CSV

Once the backlink data has been collected and normalized, exporting it is relatively straightforward.

Libraries such as json2csv can convert JavaScript objects into CSV format that you can open in Excel, Google Sheets, or process with Python.

The resulting dataset might look something like:

domain,url,anchor,type
example.com,https://example.com/page,SEO guide,dofollow
another.com,https://another.com/resource,marketing,referral

Having everything in a consistent format makes the next stage—actual SEO analysis—much easier.

The Real Problem With Bulk Backlink Analysis

The script itself wasn't the biggest challenge.

The bigger issue was API cost and infrastructure.

When you're analyzing a large number of domains, every API request can consume credits. If you're doing this regularly for multiple clients, those costs can add up quickly.

That's why I eventually moved this particular workflow to a dedicated tool: SERPSpur's Bulk Backlink Exporter.

Bulk Backlink Exporter

Instead of writing and maintaining the entire queue, throttling, and export pipeline myself, I can provide the domains and get structured backlink data ready for analysis.

For one-off experiments, writing your own script is useful. For repetitive SEO audits, using an existing workflow can save a considerable amount of development time.

Lessons From the Workflow

If you're building your own bulk backlink exporter, I'd keep these principles in mind:

  1. Respect API limits

Don't assume that because you can technically send 100 requests at once, you should.

Use concurrency limits and follow the API provider's documented rate limits.

  1. Implement exponential backoff

Temporary failures happen. Give the server time before retrying instead of immediately sending another request.

  1. Normalize your data

Standardize URLs, domains, anchors, and link types before running comparisons or deduplication.

  1. Log failures

When processing 50+ domains, you need to know exactly which request failed and why.

A useful log should include:

Domain
Request status
Error message
Retry count
Timestamp

  1. Separate collection from analysis

Don't try to perform all your SEO analysis while collecting the data.

First create a clean dataset. Then analyze metrics such as referring domains, anchor text, link types, authority, and link growth.

Build It Yourself or Use a Tool?

Building your own exporter is a great learning project if you want to understand asynchronous JavaScript, API limits, queues, and data processing.

But if your main goal is SEO analysis rather than building infrastructure, there's little value in spending an entire weekend maintaining the plumbing.

The most useful part of backlink analysis happens after the data is collected: identifying valuable referring domains, finding competitor gaps, analyzing anchor patterns, and turning those findings into an actionable link-building strategy.

Automate the repetitive part so you can spend more time analyzing the data.

Top comments (0)