API reference

Duplicate content checker API API

Compare pages for duplicate content, titles and meta descriptions. Use this reference to choose an operation and integrate its documented response contract.

Operations

GET /v1/duplicate-content View API reference

GET /v1/duplicate-content

Operation: getDuplicateContent Credits and authentication: 5 Authentication required
GET /v1/duplicate-content Credits: 5

Query parameters

Parameter Type required
urls string required

Response fields

Field Type
status string
checked_at string
threshold number
pages[] object[]
pages[] object
pages[].url string
pages[].final_url string
pages[].status string
pages[].reason string | null
pages[].http_status integer | null
pages[].title string | null
pages[].meta_description string | null
pages[].h1 string | null
pages[].canonical string | null
pages[].word_count integer
pages[].comparable boolean
pages[].comparison_reason string | null
pairs[] object[]
pairs[] object
pairs[].a string
pairs[].b string
pairs[].similarity number | null
pairs[].containment number | null
pairs[].near_duplicate boolean | null
pairs[].comparable boolean
pairs[].canonicalized boolean
pairs[].same_final_url boolean
pairs[].reason string | null
clusters[] string[][]
clusters[][] string[]
duplicates object
duplicates.titles[] object[]
duplicates.titles[] object
duplicates.titles[].value string
duplicates.titles[].urls[] string[]
duplicates.meta_descriptions[] object[]
duplicates.meta_descriptions[] object
duplicates.meta_descriptions[].value string
duplicates.meta_descriptions[].urls[] string[]
duplicates.h1[] object[]
duplicates.h1[] object
duplicates.h1[].value string
duplicates.h1[].urls[] string[]
summary object
summary.pages integer
summary.readable integer
summary.unknown integer
summary.comparable_pairs integer
summary.unknown_pairs integer
summary.same_final_url_pairs integer
summary.near_duplicate_pairs integer
summary.uncanonicalized_near_duplicates integer

Example request

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/duplicate-content?urls=https%3A%2F%2Fexample.com"
const response = await fetch("https://domscan.net/v1/duplicate-content?urls=https%3A%2F%2Fexample.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.get(
    "https://domscan.net/v1/duplicate-content?urls=https%3A%2F%2Fexample.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/duplicate-content?urls=https%3A%2F%2Fexample.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

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

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/duplicate-content?urls=https%3A%2F%2Fexample.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

Example response

{
  "status": "ok",
  "checked_at": "2026-10-13T12:00:00.000Z",
  "threshold": 0.8,
  "pages": [
    {
      "url": "https://example.com/a",
      "final_url": "https://example.com/a",
      "status": "ok",
      "reason": null,
      "http_status": 200,
      "title": "Trail shoes",
      "meta_description": "Shop trail shoes",
      "h1": "Trail shoes",
      "canonical": null,
      "word_count": 640,
      "comparable": true,
      "comparison_reason": null
    },
    {
      "url": "https://example.com/b",
      "final_url": "https://example.com/b",
      "status": "ok",
      "reason": null,
      "http_status": 200,
      "title": "Trail shoes",
      "meta_description": "Shop trail shoes",
      "h1": "Trail running shoes",
      "canonical": null,
      "word_count": 655,
      "comparable": true,
      "comparison_reason": null
    }
  ],
  "pairs": [
    {
      "a": "https://example.com/a",
      "b": "https://example.com/b",
      "similarity": 0.91,
      "containment": 0.96,
      "near_duplicate": true,
      "comparable": true,
      "canonicalized": false,
      "same_final_url": false,
      "reason": null
    }
  ],
  "clusters": [
    [
      "https://example.com/a",
      "https://example.com/b"
    ]
  ],
  "duplicates": {
    "titles": [
      {
        "value": "trail shoes",
        "urls": [
          "https://example.com/a",
          "https://example.com/b"
        ]
      }
    ],
    "meta_descriptions": [
      {
        "value": "shop trail shoes",
        "urls": [
          "https://example.com/a",
          "https://example.com/b"
        ]
      }
    ],
    "h1": []
  },
  "summary": {
    "pages": 2,
    "readable": 2,
    "unknown": 0,
    "comparable_pairs": 1,
    "unknown_pairs": 0,
    "same_final_url_pairs": 0,
    "near_duplicate_pairs": 1,
    "uncanonicalized_near_duplicates": 1
  }
}

HTTP status codes

  • 200 OK
  • 400 Bad Request
  • 401 Unauthorized
  • 402 Payment Required
  • 429 Too Many Requests

Reference resources