NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For teams that bid, apply or comply

Get the new tender, grant or regulatory notice the day it is posted

Watch notice and listing pages for new entries, and keep a full-page picture of the listing every time it is checked.

The problem

Procurement portals, grant programmes and regulators publish notices on listing pages with short deadlines and no alerts worth the name. Missing one by a week can mean missing it entirely.

How domscout handles it

A monitor on the listing page with checkLinks reports a change when new notice links appear, and checkMarkdown when the listing's text changes, such as a deadline being extended. captureParams with fullPage: true saves a picture of the whole listing on every run, so you also have a dated record of what was published and when.

Where it shows up

  • Alerts on the procurement portals in your sector.
  • A watch on grant programmes' open-calls pages.
  • A dated record of the notices a regulator published.

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. fullPage adds 1 credit to each run.

cURL
curl -X POST https://api.domscout.io/monitors \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Procurement notices",
    "targetUrl": "https://procurement.example.gov/notices",
    "intervalMinutes": 720,
    "notifyWebhookUrl": "https://your-app.example/hooks/domscout",
    "checkLinks": true,
    "checkMarkdown": true,
    "captureParams": {"fullPage": true}
  }'
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: "Procurement notices",
    targetUrl: "https://procurement.example.gov/notices",
    intervalMinutes: 720,
    notifyWebhookUrl: "https://your-app.example/hooks/domscout",
    checkLinks: true,
    checkMarkdown: true,
    captureParams: { fullPage: true }
  }),
});
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": "Procurement notices",
        "targetUrl": "https://procurement.example.gov/notices",
        "intervalMinutes": 720,
        "notifyWebhookUrl": "https://your-app.example/hooks/domscout",
        "checkLinks": True,
        "checkMarkdown": True,
        "captureParams": {"fullPage": True}
    },
)
print(response.json())
Go
package main

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

func main() {
	body, _ := json.Marshal(map[string]any{
		"name": "Procurement notices",
		"targetUrl": "https://procurement.example.gov/notices",
		"intervalMinutes": 720,
		"notifyWebhookUrl": "https://your-app.example/hooks/domscout",
		"checkLinks": true,
		"checkMarkdown": true,
		"captureParams": map[string]any{"fullPage": true},
	})
	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' => 'Procurement notices',
        'targetUrl' => 'https://procurement.example.gov/notices',
        'intervalMinutes' => 720,
        'notifyWebhookUrl' => 'https://your-app.example/hooks/domscout',
        'checkLinks' => true,
        'checkMarkdown' => true,
        'captureParams' => ['fullPage' => true]
    ]),
]);
$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: "Procurement notices",
    targetUrl: "https://procurement.example.gov/notices",
    intervalMinutes: 720,
    notifyWebhookUrl: "https://your-app.example/hooks/domscout",
    checkLinks: true,
    checkMarkdown: true,
    captureParams: { fullPage: true }
  }.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": "Procurement notices",
                "targetUrl": "https://procurement.example.gov/notices",
                "intervalMinutes": 720,
                "notifyWebhookUrl": "https://your-app.example/hooks/domscout",
                "checkLinks": true,
                "checkMarkdown": true,
                "captureParams": {"fullPage": true}
            }
            """;
        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 = "Procurement notices",
    targetUrl = "https://procurement.example.gov/notices",
    intervalMinutes = 720,
    notifyWebhookUrl = "https://your-app.example/hooks/domscout",
    checkLinks = true,
    checkMarkdown = true,
    captureParams = new { fullPage = true }
});
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 · New job posting alerts · Vendor changelog watching · All use cases

Give your product a browser.

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