API API de détection de contenu dupliqué
Comparez des pages pour détecter contenus, titres et meta descriptions en double. Utilisez cette référence pour choisir une opération et intégrer son contrat de réponse documenté.
Opérations
GET /v1/duplicate-content
GET
/v1/duplicate-content
Crédits: 5
Paramètres de requête
| Paramètre | Type | requis |
|---|---|---|
| urls | string | requis |
Champs de réponse
| Champ | 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 |
Exemple de requête
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))Exemple de réponse
{
"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
}
}
Codes de statut HTTP
200OK400Requête incorrecte401Non autorisé402Paiement requis429Trop de requêtes