NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For teams that earn links

Check that the pages linking to you still do

Read the pages that should link to you and get back every link to your domain, and which of them are nofollow.

The problem

A partnership includes a link from the partner's integrations page, a guest post earned one in the author's bio, a directory listing was paid for. Months later the page is redesigned and the link is gone, or quietly marked nofollow, and nobody checks, because checking means opening every page by hand.

How domscout handles it

An extract request reads the rendered page, so links that JavaScript adds are counted too. One field collects every link whose address contains your domain; a second collects the ones whose rel includes nofollow. A field with no matches comes back with the status missing rather than as an empty value, which is the signal that a link has gone.

Where it shows up

  • A monthly check of every placement a partnership agreement includes.
  • Confirmation that a link went live after an outreach campaign.
  • Links that changed to nofollow since the last check.

The request

POST /scrape. extract starts at Pro and costs 2 credits a page. extractMarkdown: false skips the Markdown pass, so the fields come back in the same response, under analysis.extraction.fields.

cURL
curl -X POST https://api.domscout.io/scrape \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://partner.example.org/integrations",
    "extractMarkdown": false,
    "extract": {
      "fields": {
        "links": {
          "selector": "a[href*='\''example.com'\'']",
          "type": "attribute",
          "attribute": "href",
          "all": true
        },
        "nofollow": {
          "selector": "a[href*='\''example.com'\''][rel~='\''nofollow'\'']",
          "type": "attribute",
          "attribute": "href",
          "all": true
        }
      }
    }
  }'
Node.js
const response = await fetch("https://api.domscout.io/scrape", {
  method: "POST",
  headers: { "Content-Type": "application/json", "x-api-key": "YOUR_API_KEY" },
  body: JSON.stringify({
    url: "https://partner.example.org/integrations",
    extractMarkdown: false,
    extract: {
      fields: {
        links: {
          selector: "a[href*='example.com']",
          type: "attribute",
          attribute: "href",
          all: true
        },
        nofollow: {
          selector: "a[href*='example.com'][rel~='nofollow']",
          type: "attribute",
          attribute: "href",
          all: true
        }
      }
    }
  }),
});
const result = await response.json();
console.log(result.analysis);
Python
import requests

response = requests.post(
    "https://api.domscout.io/scrape",
    headers={"x-api-key": "YOUR_API_KEY"},
    json={
        "url": "https://partner.example.org/integrations",
        "extractMarkdown": False,
        "extract": {
            "fields": {
                "links": {
                    "selector": "a[href*='example.com']",
                    "type": "attribute",
                    "attribute": "href",
                    "all": True
                },
                "nofollow": {
                    "selector": "a[href*='example.com'][rel~='nofollow']",
                    "type": "attribute",
                    "attribute": "href",
                    "all": True
                }
            }
        }
    },
)
print(response.json()["analysis"])
Go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

func main() {
	body, _ := json.Marshal(map[string]any{
		"url": "https://partner.example.org/integrations",
		"extractMarkdown": false,
		"extract": map[string]any{
			"fields": map[string]any{
				"links": map[string]any{
					"selector": "a[href*='example.com']",
					"type": "attribute",
					"attribute": "href",
					"all": true,
				},
				"nofollow": map[string]any{
					"selector": "a[href*='example.com'][rel~='nofollow']",
					"type": "attribute",
					"attribute": "href",
					"all": true,
				},
			},
		},
	})
	req, _ := http.NewRequest("POST", "https://api.domscout.io/scrape", bytes.NewReader(body))
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("x-api-key", "YOUR_API_KEY")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	var result map[string]any
	json.NewDecoder(res.Body).Decode(&result)
	fmt.Println(result["analysis"])
}
PHP
<?php
$ch = curl_init('https://api.domscout.io/scrape');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'x-api-key: YOUR_API_KEY'],
    CURLOPT_POSTFIELDS => json_encode([
        'url' => 'https://partner.example.org/integrations',
        'extractMarkdown' => false,
        'extract' => [
            'fields' => [
                'links' => [
                    'selector' => 'a[href*=\'example.com\']',
                    'type' => 'attribute',
                    'attribute' => 'href',
                    'all' => true
                ],
                'nofollow' => [
                    'selector' => 'a[href*=\'example.com\'][rel~=\'nofollow\']',
                    'type' => 'attribute',
                    'attribute' => 'href',
                    'all' => true
                ]
            ]
        ]
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
$result = json_decode($response, true);
print_r($result['analysis']);
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/scrape"),
  {
    url: "https://partner.example.org/integrations",
    extractMarkdown: false,
    extract: {
      fields: {
        links: {
          selector: "a[href*='example.com']",
          type: "attribute",
          attribute: "href",
          all: true
        },
        nofollow: {
          selector: "a[href*='example.com'][rel~='nofollow']",
          type: "attribute",
          attribute: "href",
          all: true
        }
      }
    }
  }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
puts JSON.parse(response.body)["analysis"]
Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Capture {
    public static void main(String[] args) throws Exception {
        String body = """
            {
                "url": "https://partner.example.org/integrations",
                "extractMarkdown": false,
                "extract": {
                    "fields": {
                        "links": {
                            "selector": "a[href*='example.com']",
                            "type": "attribute",
                            "attribute": "href",
                            "all": true
                        },
                        "nofollow": {
                            "selector": "a[href*='example.com'][rel~='nofollow']",
                            "type": "attribute",
                            "attribute": "href",
                            "all": true
                        }
                    }
                }
            }
            """;
        HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.domscout.io/scrape"))
            .header("Content-Type", "application/json")
            .header("x-api-key", "YOUR_API_KEY")
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
C#
using System.Net.Http.Json;
using System.Text.Json;

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");

var response = await client.PostAsJsonAsync("https://api.domscout.io/scrape", new {
    url = "https://partner.example.org/integrations",
    extractMarkdown = false,
    extract = new {
        fields = new {
            links = new {
                selector = "a[href*='example.com']",
                type = "attribute",
                attribute = "href",
                all = true
            },
            nofollow = new {
                selector = "a[href*='example.com'][rel~='nofollow']",
                type = "attribute",
                attribute = "href",
                all = true
            }
        }
    }
});
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(result.GetProperty("analysis"));

Go further

More in SEO and site health: SEO regression checks · Link preview checks · Find every page on a site · Website migration checks · JavaScript SEO checks · Page weight and load metrics · JSON-LD structured data checks · hreflang checks · Website audits for prospects · All use cases

Give your product a browser.

Get clean web content and visual proof into your workflow in minutes.