Rilevamento dello stack tecnologico
Consulta la documentazione API di Rilevamento dello stack tecnologico, i parametri delle richieste, i campi delle risposte, gli esempi di codice e la gestione degli errori per le integrazioni DomScan.
Rilevamento dello stack tecnologico
Rileva oltre 500 tecnologie verificate in più di 80 categorie. La modalità fast controlla segnali HTTP entro limiti definiti, la modalità rendered osserva JavaScript in fase di esecuzione e le richieste di rete tramite il browser Edge Relay isolato, mentre la modalità deep analizza fino a cinque pagine rappresentative della stessa origine. I risultati includono affidabilità, evidenze ripulite e associate a ciascuna pagina, limitazioni e limiti di copertura espliciti.
Parametri di query
| Parametro | Tipo | Descrizione |
|---|---|---|
| url facoltativo | string | URL HTTP(S) pubblica completa da analizzare. Se vengono forniti sia URL sia domain, URL ha la precedenza. |
| domain facoltativo | string | Dominio pubblico o URL HTTP(S) da analizzare. Fornisci URL oppure domain. |
| mode facoltativo | string | Modalità di scansione: fast costa 3 crediti, rendered costa 6 crediti e deep costa 9 crediti. |
| max_pages facoltativo | integer | Numero massimo di pagine della stessa origine da analizzare in modalità deep, da 1 a 5. Il valore predefinito è 3. |
Categorie di tecnologie
| Categoria | Esempi |
|---|---|
cdn | Cloudflare, Fastly, Akamai, CloudFront |
cms | WordPress, Drupal, Shopify, Squarespace |
analytics | Google Analytics, Mixpanel, Segment |
framework | React, Vue.js, Angular, Next.js |
server | nginx, Apache, IIS, LiteSpeed |
hosting | AWS, Google Cloud, Azure, Vercel |
platform | GitHub, Medium, Substack, GitBook |
Richiesta di esempio
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/tech?url=https%3A%2F%2Fwordpress.example%2F" -H "x-api-key: YOUR_API_KEY"
const domscanFetch = (url, options = {}) =>
fetch(url, {
...options,
headers: { ...options.headers, "X-API-Key": "your-api-key" },
});
const response = await domscanFetch(
"https://domscan.net/v1/tech?url=https%3A%2F%2Fwordpress.example%2F",
{ headers: { "x-api-key": "YOUR_API_KEY" } }
);
const data = await response.json();
for (const tech of data.technologies) {
console.log(`${tech.id}: ${tech.confidence_score}/100`);
}
import requests
domscan = requests.Session()
domscan.headers.update({"X-API-Key": "your-api-key"})
response = domscan.get(
"https://domscan.net/v1/tech",
params={"url": "https://wordpress.example/"},
headers={"x-api-key": "YOUR_API_KEY"}
)
data = response.json()
for tech in data['technologies']:
print(f"{tech['id']}: {tech['confidence_score']}/100")
Risposta di esempio
{
"url": "https://wordpress.example/",
"technologies": [
{
"id": "wordpress",
"name": "WordPress",
"category": "cms",
"version": "6.8.2",
"version_kind": "product",
"confidence": "high",
"confidence_score": 98,
"evidence": "Meta: generator",
"evidence_details": [
{
"source": "meta",
"key": "generator",
"matched": "WordPress 6.8.2"
}
],
"source_count": 1,
"caveats": [
"generator_can_be_removed_or_spoofed",
"asset_paths_can_be_rewritten"
],
"reference": {
"website": "https://wordpress.org/",
"source_url": "https://developer.wordpress.org/reference/functions/get_the_generator/",
"source_owner": "WordPress.org",
"source_kind": "official_docs",
"access": "public",
"access_method": "target_response_inspection",
"cost": "none",
"terms_status": "public_source_reviewed_factual_signature",
"expected_freshness": "reverify_on_source_or_signature_change",
"maintenance_risk": "medium",
"runtime_rate_limits": "not_applicable_no_source_request",
"fallback_behavior": "unmatched_or_unavailable_signal_is_not_detected",
"last_verified": "2026-07-15"
}
}
],
"detection_summary": {
"detected_count": 1,
"category_count": 1,
"categories": [
"cms"
],
"high_confidence_count": 1,
"medium_confidence_count": 0,
"low_confidence_count": 0,
"versioned_count": 1,
"evidence_sources": {
"header": 0,
"html": 0,
"asset_url": 0,
"network_url": 0,
"javascript": 0,
"meta": 1,
"cookie": 0,
"url": 0
},
"catalog_size": 522,
"catalog_category_count": 87,
"summary_field_count": 1
},
"summary": {
"cms": "WordPress"
},
"meta": {
"title": "Example WordPress site",
"description": "A reserved example response for the technology detection contract.",
"canonical_url": "https://wordpress.example/",
"language": "en",
"favicon": "https://wordpress.example/favicon.ico",
"open_graph": {
"title": null,
"description": null,
"image": null,
"url": null,
"type": null,
"site_name": null,
"locale": null
},
"twitter_card": {
"card": null,
"site": null,
"creator": null,
"title": null,
"description": null,
"image": null
},
"author": null,
"generator": "WordPress 6.8.2",
"theme_color": null,
"manifest_url": null,
"robots": "index, follow"
},
"headers": {
"content-type": "text/html; charset=UTF-8"
},
"ssl": {
"enabled": true
},
"analysis": {
"status": "complete",
"requested_url": "https://wordpress.example/",
"final_url": "https://wordpress.example/",
"response_status": 200,
"redirect_count": 0,
"relay_used": false,
"signals_checked": [
"url",
"header",
"cookie",
"html",
"asset_url",
"meta"
],
"signals_unavailable": [],
"html_characters_analyzed": 412,
"html_bytes_analyzed": 412,
"html_byte_limit": 1000000,
"html_truncated": false,
"response_body_truncated": false,
"mode": "fast",
"rendered": false,
"javascript_executed": false,
"pages_requested": 1,
"pages_analyzed": 1,
"page_limit": 1,
"network_requests_observed": 0,
"page_limit_reached": false,
"resource_limit_reached": false,
"redirected_to_different_host": false,
"no_detection_reason": null,
"recommended_mode": null,
"pages": [
{
"url": "https://wordpress.example/",
"status": 200,
"html_truncated": false,
"network_requests_observed": 0
}
]
},
"total_time_ms": 128,
"checked_at": "2026-07-15T10:30:00Z",
"_meta": {
"served_by": "pop=MAD country=ES",
"worker_version": "2.14.0",
"analysis_status": "ok",
"response_status": 200
}
}
Campi di risposta
| Campo | Tipo |
|---|---|
url |
string |
technologies[] |
object[] |
technologies[] |
object |
technologies[].id |
string |
technologies[].name |
string |
technologies[].category |
string |
technologies[].version |
string |
technologies[].version_kind |
string |
technologies[].confidence |
string |
technologies[].confidence_score |
integer |
technologies[].evidence |
string |
technologies[].evidence_details[] |
object[] |
technologies[].evidence_details[] |
object |
technologies[].evidence_details[].source |
string |
technologies[].evidence_details[].key |
string |
technologies[].evidence_details[].matched |
string |
technologies[].evidence_details[].page_url |
string |
technologies[].source_count |
integer |
technologies[].caveats[] |
string[] |
technologies[].reference |
object |
technologies[].reference.website |
string |
technologies[].reference.source_url |
string |
technologies[].reference.source_owner |
string |
technologies[].reference.source_kind |
string |
technologies[].reference.access |
string |
technologies[].reference.access_method |
string |
technologies[].reference.cost |
string |
technologies[].reference.terms_status |
string |
technologies[].reference.expected_freshness |
string |
technologies[].reference.maintenance_risk |
string |
technologies[].reference.runtime_rate_limits |
string |
technologies[].reference.fallback_behavior |
string |
technologies[].reference.last_verified |
string |
detection_summary |
object |
detection_summary.detected_count |
integer |
detection_summary.category_count |
integer |
detection_summary.categories[] |
string[] |
detection_summary.high_confidence_count |
integer |
detection_summary.medium_confidence_count |
integer |
detection_summary.low_confidence_count |
integer |
detection_summary.versioned_count |
integer |
detection_summary.evidence_sources |
object |
detection_summary.evidence_sources.header |
integer |
detection_summary.evidence_sources.html |
integer |
detection_summary.evidence_sources.asset_url |
integer |
detection_summary.evidence_sources.network_url |
integer |
detection_summary.evidence_sources.javascript |
integer |
detection_summary.evidence_sources.meta |
integer |
detection_summary.evidence_sources.cookie |
integer |
detection_summary.evidence_sources.url |
integer |
detection_summary.catalog_size |
integer |
detection_summary.catalog_category_count |
integer |
detection_summary.summary_field_count |
integer |
summary |
object |
summary.cdn |
string |
summary.server |
string |
summary.framework |
string |
summary.cms |
string |
summary.hosting |
string |
summary.platform |
string |
summary.analytics[] |
string[] |
headers |
object |
meta |
object |
ssl |
object |
ssl.enabled |
boolean |
analysis |
object |
analysis.status |
string |
analysis.requested_url |
string |
analysis.final_url |
string |
analysis.response_status |
integer |
analysis.redirect_count |
integer |
analysis.relay_used |
boolean |
analysis.signals_checked[] |
string[] |
analysis.signals_unavailable[] |
string[] |
analysis.html_characters_analyzed |
integer |
analysis.html_bytes_analyzed |
integer |
analysis.html_byte_limit |
integer |
analysis.html_truncated |
boolean |
analysis.response_body_truncated |
boolean |
analysis.mode |
string |
analysis.rendered |
boolean |
analysis.javascript_executed |
boolean |
analysis.pages_requested |
integer |
analysis.pages_analyzed |
integer |
analysis.page_limit |
integer |
analysis.network_requests_observed |
integer |
analysis.page_limit_reached |
boolean |
analysis.resource_limit_reached |
boolean |
analysis.redirected_to_different_host |
boolean |
analysis.no_detection_reason |
string | null |
analysis.recommended_mode |
string | null |
analysis.pages[] |
object[] |
analysis.pages[] |
object |
analysis.pages[].url |
string |
analysis.pages[].status |
integer |
analysis.pages[].html_truncated |
boolean |
analysis.pages[].network_requests_observed |
integer |
total_time_ms |
integer |
checked_at |
string |
_meta |
object |
_meta.served_by |
string |
_meta.worker_version |
string |
_meta.analysis_status |
string |
_meta.response_status |
integer |
Rilevamento rapido in blocco
POST /v1/tech/bulk esegue fino a 10 scansioni rapide nell’ordine indicato. Ogni destinazione valida costa 3 crediti, quelle non valide non costano nulla e gli errori dei servizi esterni vengono rimborsati per elemento.
curl -H "X-API-Key: your-api-key" -X POST "https://domscan.net/v1/tech/bulk" -H "x-api-key: YOUR_API_KEY" -H "content-type: application/json" -d '{"targets":["example.com",{"url":"https://shop.example.com/","reference":"shop"}]}'
Processi di scansione asincroni
POST /v1/tech/jobs accetta fino a 100 destinazioni in modalità fast, rendered o deep. I processi supportano la creazione idempotente, la consultazione dello stato riservata al proprietario, l’impaginazione firmata dei risultati, l’annullamento e i rimborsi per elemento. I risultati completi scadono dopo 48 ore.
curl -H "X-API-Key: your-api-key" -X POST "https://domscan.net/v1/tech/jobs" -H "x-api-key: YOUR_API_KEY" -H "Idempotency-Key: scan-batch-2026-07-15" -H "content-type: application/json" -d '{"mode":"deep","max_pages":3,"targets":["example.com","shop.example.com"]}'
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/tech/jobs?limit=25" -H "x-api-key: YOUR_API_KEY"
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/tech/jobs/tsj_JOB_ID" -H "x-api-key: YOUR_API_KEY"
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/tech/jobs/tsj_JOB_ID/results?limit=25" -H "x-api-key: YOUR_API_KEY"
curl -H "X-API-Key: your-api-key" -X DELETE "https://domscan.net/v1/tech/jobs/tsj_JOB_ID" -H "x-api-key: YOUR_API_KEY"
Parametri di query
| Parametro | Tipo | obbligatorio |
|---|---|---|
| domain | string | obbligatorio |
Campi di risposta
| Campo | Tipo |
|---|---|
domain |
string |
hosting |
object |
hosting.provider |
string |
hosting.provider_id |
string |
hosting.confidence |
number |
hosting.region |
string |
hosting.detection_method |
string |
cdn |
object |
cdn.detected |
boolean |
cdn.provider |
string |
cdn.provider_id |
string |
cdn.confidence |
number |
cdn.detection_method |
string |
cdn.features[] |
string[] |
waf |
object |
waf.detected |
boolean |
waf.provider |
string |
waf.provider_id |
string |
waf.confidence |
number |
waf.detection_method |
string |
dns_provider |
object |
dns_provider.provider |
string |
dns_provider.provider_id |
string |
dns_provider.nameservers[] |
string[] |
dns_provider.confidence |
number |
dns_providers[] |
object[] |
dns_providers[] |
object |
dns_providers[].provider_id |
string |
dns_providers[].provider |
string |
email_provider |
object |
email_provider.provider |
string |
email_provider.provider_id |
string |
email_provider.mx_records[] |
string[] |
email_provider.confidence |
number |
ssh |
object |
ssh.host |
string |
ssh.port |
integer |
ssh.reachable |
boolean |
ssh.banner |
string | null |
ssh.algorithms[] |
string[] |
ssh.weak_algorithms[] |
string[] |
ssh.keys[] |
object[] |
ssh.keys[] |
object |
ssh.keys[].host |
string |
ssh.keys[].algorithm |
string |
ssh.keys[].key_size |
integer | null |
ssh.keys[].fingerprint_sha256 |
string | null |
ssh.keys[].weak |
boolean |
ssh.keys[].weak_reasons[] |
string[] |
ssh.error |
string | null |
ssh.checked_at |
string |
provider_summary |
object |
provider_summary.cache_status |
string |
provider_summary.provider_count |
integer |
provider_summary.detected_surfaces[] |
string[] |
provider_summary.confidence |
string |
provider_summary.confidence_score |
integer |
provider_summary.hosting_provider |
string | null |
provider_summary.cdn_provider |
string | null |
provider_summary.waf_provider |
string | null |
provider_summary.dns_provider_count |
integer |
provider_summary.email_provider |
string | null |
provider_summary.ssh_exposed |
boolean | null |
provider_summary.evidence[] |
object[] |
provider_summary.evidence[] |
object |
provider_summary.evidence[].surface |
string |
provider_summary.evidence[].provider |
string |
provider_summary.evidence[].confidence |
number | null |
provider_summary.evidence[].method |
string | null |
ip_info |
object |
ip_info.ipv4[] |
string[] |
ip_info.ipv6[] |
string[] |
checked_at |
string |
check_duration_ms |
integer |
Richiesta di esempio
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/hosting?domain=example.com"
Risposta di esempio
{
"domain": "github.com",
"hosting": {
"provider": "Microsoft Azure",
"provider_id": "azure",
"confidence": 0.86,
"detection_method": "ip_range"
},
"cdn": {
"detected": true,
"provider": "Fastly",
"provider_id": "fastly",
"confidence": 0.94,
"detection_method": "headers"
},
"waf": {
"detected": false,
"confidence": 0.2,
"detection_method": "headers"
},
"dns_provider": {
"provider": "AWS Route 53",
"provider_id": "route53",
"nameservers": [
"ns-1283.awsdns-32.org",
"ns-1707.awsdns-21.co.uk"
],
"confidence": 0.9
},
"email_provider": {
"provider": "Google Workspace",
"provider_id": "google_workspace",
"mx_records": [
"aspmx.l.google.com"
],
"confidence": 0.95
},
"ssh": {
"host": "github.com",
"port": 22,
"reachable": true,
"banner": "SSH-2.0-babeld",
"algorithms": [
"ssh-ed25519",
"ecdsa-sha2-nistp256"
],
"weak_algorithms": [],
"keys": [
{
"host": "github.com",
"algorithm": "ssh-ed25519",
"key_size": 256,
"fingerprint_sha256": "SHA256:+DiY3wvvV6TuJJhbpZisF/Ym7N3QKXNoZk6sJ2x2d2s",
"weak": false,
"weak_reasons": []
}
],
"error": null,
"checked_at": "2026-04-18T21:00:00Z"
},
"provider_summary": {
"cache_status": "miss",
"provider_count": 4,
"detected_surfaces": [
"hosting",
"cdn",
"dns",
"email",
"ssh"
],
"confidence": "high",
"confidence_score": 92,
"hosting_provider": "Microsoft Azure",
"cdn_provider": "Fastly",
"waf_provider": null,
"dns_provider_count": 1,
"email_provider": "Google Workspace",
"ssh_exposed": true,
"evidence": [
{
"surface": "hosting",
"provider": "Microsoft Azure",
"confidence": 0.86,
"method": "ip_range"
},
{
"surface": "cdn",
"provider": "Fastly",
"confidence": 0.94,
"method": "headers"
},
{
"surface": "dns",
"provider": "AWS Route 53",
"confidence": 0.9,
"method": "ns"
},
{
"surface": "email",
"provider": "Google Workspace",
"confidence": 0.95,
"method": "mx"
},
{
"surface": "ssh",
"provider": "public-ssh",
"confidence": 90,
"method": "edge-relay"
}
]
},
"ip_info": {
"ipv4": [
"140.82.121.4"
],
"ipv6": []
},
"checked_at": "2026-04-18T21:00:00Z",
"check_duration_ms": 156
}
Parametri del corpo
| Parametro | Tipo | obbligatorio |
|---|---|---|
| domains | string[] | obbligatorio |
Campi di risposta
| Campo | Tipo |
|---|---|
results[] |
unknown[] |
meta |
object |
meta.total |
integer |
meta.succeeded |
integer |
meta.failed |
integer |
meta.max_items |
integer |
meta.credits_per_item |
integer |
meta.duration_ms |
integer |
Richiesta di esempio
curl -X POST "https://domscan.net/v1/hosting/bulk" \
-H "Content-Type: application/json" \
-H "X-API-Key: $DOMSCAN_API_KEY" \
-d '{
"domains": [
"example.com",
"cloudflare.com"
]
}'
Risposta di esempio
{
"results": [
null
],
"meta": {
"total": 1,
"succeeded": 1,
"failed": 1,
"max_items": 10,
"credits_per_item": 1,
"duration_ms": 1
}
}
Parametri di query
| Parametro | Tipo | obbligatorio |
|---|---|---|
| domain | string | obbligatorio |
Campi di risposta
| Campo | Tipo |
|---|---|
domain |
string |
is_parked |
boolean |
is_for_sale |
boolean |
parking_provider |
string | null |
aftermarket_listings[] |
object[] |
aftermarket_listings[] |
object |
aftermarket_listings[].platform |
string |
aftermarket_listings[].detected_via |
string |
signals[] |
object[] |
signals[] |
object |
signals[].type |
string |
signals[].detail |
string |
signals[].provider |
string |
confidence |
number |
checked_at |
string |
check_duration_ms |
integer |
Richiesta di esempio
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/parking?domain=example.com"
Risposta di esempio
{
"domain": "example.com",
"is_parked": true,
"is_for_sale": true,
"parking_provider": "string",
"aftermarket_listings": [
{
"platform": "string",
"detected_via": "dns"
}
],
"signals": [
{
"type": "string",
"detail": "string",
"provider": "string"
}
],
"confidence": 1,
"checked_at": "2026-04-15T12:00:00Z",
"check_duration_ms": 1
}