NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For recruiters, researchers and job seekers

Know when a company posts a new role

Watch a careers page and get a webhook when its list of job links changes.

The problem

A recruiter tracking target companies, an investor watching who is hiring for what, a job seeker waiting for one team to open a role. Careers pages change without notice, and checking forty of them every morning is nobody's favourite task.

How domscout handles it

A monitor with checkLinks reports a change when the set of links on the page changes, which on a careers page means a role was added or taken down. The webhook names the run and the two captures; fetch both with GET /capture/{captureId} and compare their links to see which roles are new. Many careers pages embed their job list from a hiring platform in a frame on another domain, and content inside a frame from another origin is not read, so point the monitor at the hiring platform's own page for that company instead.

Where it shows up

  • Alerts across a list of target companies' careers pages.
  • A hiring signal for market or investment research.
  • A daily digest of new roles at the teams you follow.

The request

POST /monitors. Monitors start at Pro: 10 monitors, checked as often as every 60 minutes. Business allows 100 every 15 minutes and Enterprise 500 every 5. Each run is billed as a capture; creating and managing a monitor is free.

cURL
curl -X POST https://api.domscout.io/monitors \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example Co careers",
    "targetUrl": "https://example.com/careers",
    "intervalMinutes": 1440,
    "notifyWebhookUrl": "https://your-app.example/hooks/domscout",
    "checkLinks": true,
    "checkMarkdown": false,
    "checkTitle": false
  }'
Node.js
const response = await fetch("https://api.domscout.io/monitors", {
  method: "POST",
  headers: { "Content-Type": "application/json", "x-api-key": "YOUR_API_KEY" },
  body: JSON.stringify({
    name: "Example Co careers",
    targetUrl: "https://example.com/careers",
    intervalMinutes: 1440,
    notifyWebhookUrl: "https://your-app.example/hooks/domscout",
    checkLinks: true,
    checkMarkdown: false,
    checkTitle: false
  }),
});
console.log(await response.json());
Python
import requests

response = requests.post(
    "https://api.domscout.io/monitors",
    headers={"x-api-key": "YOUR_API_KEY"},
    json={
        "name": "Example Co careers",
        "targetUrl": "https://example.com/careers",
        "intervalMinutes": 1440,
        "notifyWebhookUrl": "https://your-app.example/hooks/domscout",
        "checkLinks": True,
        "checkMarkdown": False,
        "checkTitle": False
    },
)
print(response.json())
Go
package main

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

func main() {
	body, _ := json.Marshal(map[string]any{
		"name": "Example Co careers",
		"targetUrl": "https://example.com/careers",
		"intervalMinutes": 1440,
		"notifyWebhookUrl": "https://your-app.example/hooks/domscout",
		"checkLinks": true,
		"checkMarkdown": false,
		"checkTitle": false,
	})
	req, _ := http.NewRequest("POST", "https://api.domscout.io/monitors", 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()

	raw, _ := io.ReadAll(res.Body)
	fmt.Println(string(raw))
}
PHP
<?php
$ch = curl_init('https://api.domscout.io/monitors');
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([
        'name' => 'Example Co careers',
        'targetUrl' => 'https://example.com/careers',
        'intervalMinutes' => 1440,
        'notifyWebhookUrl' => 'https://your-app.example/hooks/domscout',
        'checkLinks' => true,
        'checkMarkdown' => false,
        'checkTitle' => false
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
echo $response;
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/monitors"),
  {
    name: "Example Co careers",
    targetUrl: "https://example.com/careers",
    intervalMinutes: 1440,
    notifyWebhookUrl: "https://your-app.example/hooks/domscout",
    checkLinks: true,
    checkMarkdown: false,
    checkTitle: false
  }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
puts response.body
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 = """
            {
                "name": "Example Co careers",
                "targetUrl": "https://example.com/careers",
                "intervalMinutes": 1440,
                "notifyWebhookUrl": "https://your-app.example/hooks/domscout",
                "checkLinks": true,
                "checkMarkdown": false,
                "checkTitle": false
            }
            """;
        HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.domscout.io/monitors"))
            .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 var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");

var response = await client.PostAsJsonAsync("https://api.domscout.io/monitors", new {
    name = "Example Co careers",
    targetUrl = "https://example.com/careers",
    intervalMinutes = 1440,
    notifyWebhookUrl = "https://your-app.example/hooks/domscout",
    checkLinks = true,
    checkMarkdown = false,
    checkTitle = false
});
Console.WriteLine(await response.Content.ReadAsStringAsync());

Go further

More in Monitoring and alerts: Website change monitoring · A feed for a site without RSS · Competitor price tracking · Minimum advertised price checks · Vendor changelog watching · Tender, grant and notice alerts · All use cases

Give your product a browser.

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