File: docker-compose.yml
version: '3.9'
services:
web-check:
container_name: Web-Check
image: lissy93/web-check
ports:
- 3000:3000
restart: unless-stopped
File: package.json
{
"name": "web-check",
"type": "module",
"version": "2.3.8",
"homepage": "https://web-check.xyz",
"engines": {
"node": "^22.22.3 || ^24.16.0 || >=26.3.0"
},
"scripts": {
"start": "node server",
"build": "astro check && astro build",
"dev:vercel": "PLATFORM='vercel' npx vercel dev",
"dev:netlify": "PLATFORM='netlify' npx netlify dev",
"dev:api": "DISABLE_GUI='true' PORT='3001' nodemon server",
"dev:astro": "PUBLIC_API_ENDPOINT=http://localhost:3001/api astro dev",
"dev": "concurrently -c magenta,cyan -n backend,frontend 'yarn dev:api' 'yarn dev:astro'",
"typecheck": "astro check",
"lint": "eslint --config .config/eslint.config.js .",
"format:check": "prettier --check --ignore-unknown '!yarn.lock' '!/*.md' .",
"format:fix": "prettier --write --ignore-unknown '!yarn.lock' '!/*.md' .",
"hold-my-beer": "yarn format:fix && yarn lint && yarn typecheck"
},
"dependencies": {
"@astrojs/check": "^0.9.10",
"@astrojs/node": "^11.1.6",
"@astrojs/react": "^7.0.0",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
"@fortawesome/fontawesome-svg-core": "^7.3.1",
"@fortawesome/free-brands-svg-icons": "^7.3.1",
"@fortawesome/free-regular-svg-icons": "^7.3.1",
"@fortawesome/free-solid-svg-icons": "^7.3.1",
"@fortawesome/svelte-fontawesome": "^0.2.4",
"@ghostery/adblocker": "2.17.3",
"@ghostery/trackerdb": "^1.0.952",
"@sparticuz/chromium": "^148.0.0",
"@types/react": "^19.3.0",
"@types/react-dom": "^19.3.0",
"astro": "^7.3.5",
"cheerio": "^1.2.0",
"chromium": "^3.0.3",
"cookie": "^2.0.1",
"cors": "^2.8.6",
"dotenv": "^18.0.5",
"express": "^5.2.1",
"express-rate-limit": "^8.7.1",
"framer-motion": "^14.0.0",
"prop-types": "^15.8.1",
"psl": "^1.15.0",
"puppeteer": "24.43.1",
"puppeteer-core": "24.43.1",
"react": "^19.3.0",
"react-dom": "^19.3.0",
"react-is": "^19.3.0",
"react-router": "^8.4.0",
"react-simple-maps": "^5.0.5",
"react-toastify": "^11.1.0",
"recharts": "^3.10.1",
"svelte": "^5.57.1",
"typescript": "^6.0.3",
"wappalyzer": "^6.10.66",
"whoiser": "^2.0.0-beta.10",
"xml2js": "^0.6.2"
},
"resolutions": {
"@astrojs/vercel//path-to-regexp": "^6.3.0",
"wappalyzer//tar-fs": "^2.1.5",
"ws": "^8.22.0",
"tmp": "^0.2.6",
"sharp": "^0.35.5"
},
"devDependencies": {
"@astrojs/netlify": "^8.2.6",
"@astrojs/sitemap": "^3.7.4",
"@astrojs/svelte": "^9.0.1",
"@astrojs/ts-plugin": "^1.10.12",
"@astrojs/vercel": "^11.0.11",
"@emnapi/runtime": "^1.11.3",
"@typescript-eslint/parser": "^8.71.1",
"concurrently": "^10.0.6",
"eslint": "^10.12.0",
"eslint-plugin-astro": "^3.2.1",
"nodemon": "^3.1.14",
"prettier": "^3.9.9",
"prettier-plugin-astro": "^1.1.1",
"sass": "^1.105.1"
},
"prettier": {
"printWidth": 100,
"semi": true,
"singleQuote": true,
"trailingComma": "all",
"plugins": [
"prettier-plugin-astro"
]
},
"packageManager": "[email protected]+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}
File: render.yaml
yaml-language-server: $schema=https://render.com/schema/render.yaml.json
Web Check on Render — Blueprint deploy
Upstream: https://github.com/Lissy93/web-check
Image: https://hub.docker.com/r/lissy93/web-check
Pattern: image-wrapper (official lissy93/web-check image with Chromium).
Optional OSINT API keys: add in Dashboard after deploy (see .env.sample). Do not
declare them as sync:false here or Apply will prompt for every key.
previews:
generation: off
services:
- type: web
name: web-check
runtime: image
plan: standard
region: oregon
image:
url: docker.io/lissy93/web-check:latest
healthCheckPath: /healthz
autoDeployTrigger: off
envVars:- key: PORT
value: '3000' - key: TRUST_PROXY
value: '1' - key: CHROME_PATH
value: '/usr/bin/chromium' - key: PUPPETEER_EXECUTABLE_PATH
value: '/usr/bin/chromium' - key: PUPPETEER_SKIP_DOWNLOAD
value: 'true' - key: API_ENABLE_RATE_LIMIT
value: 'true'
- key: PORT
File: tsconfig.json
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"plugins": [
{
"name": "@astrojs/ts-plugin"
}
],
"lib": ["DOM", "DOM.Iterable", "ES2022"],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"jsxImportSource": "react",
"paths": {
"@/": ["./src/"],
"@components/": ["./src/components/"],
"@layouts/": ["./src/layouts/"],
"@pages/": ["./src/pages/"],
"@styles/": ["./src/styles/"],
"@assets/": ["./src/assets/"],
"client/": ["./src/client/"]
}
},
"include": ["src"]
}
File: vercel.json
{
"version": 2,
"routes": [
{
"src": "/api/(.)",
"dest": "/api/$1.js"
}
],
"functions": {
"api/trackers.js": {
"maxDuration": 45,
"includeFiles": "node_modules/@ghostery/trackerdb/dist/trackerdb.engine"
},
"api/.js": {
"maxDuration": 45
}
},
"env": {
"PLATFORM": "vercel",
"CI": "false"
},
"build": {
"env": {
"PLATFORM": "vercel"
}
}
}
File: public/manifest.json
{
"name": "Web Check",
"short_name": "Web Check",
"description": "Web Check is the all-in-one OSINT and security tool, for revealing the inner workings of any website",
"id": "/",
"start_url": "/",
"scope": "/",
"display": "standalone",
"theme_color": "#d6fb41",
"background_color": "#111211",
"icons": [
{
"src": "/favicon.svg",
"type": "image/svg+xml",
"sizes": "any"
},
{
"src": "/favicon-16x16.png",
"type": "image/png",
"sizes": "16x16"
},
{
"src": "/favicon-32x32.png",
"type": "image/png",
"sizes": "32x32"
},
{
"src": "/apple-touch-icon.png",
"type": "image/png",
"sizes": "180x180"
},
{
"src": "/android-chrome-192x192.png",
"type": "image/png",
"sizes": "192x192",
"purpose": "any"
},
{
"src": "/android-chrome-512x512.png",
"type": "image/png",
"sizes": "512x512",
"purpose": "any"
}
]
}
File: public/security.txt
Contact: mailto:[email protected]
Contact: mailto:[email protected]
Expires: 2024-12-31T23:59:00.000Z
Encryption: https://keybase.io/aliciasykes/pgp_keys.asc?fingerprint=0688f8d34587d954e9e51fb8fedb68f55c0283a7
Preferred-Languages: en
Canonical: /security.txt
File: public/resources/openapi-spec.yml
openapi: 3.0.0
info:
title: Web Check 🕵
API documentation for the Web Check backend endpoints.
Web Check gives you x-ray vision, revealing the configration and inner workings of any website.
[](https://web-check.xyz/)
[](https://hub.docker.com/r/lissy93/web-check)
[](https://github.com/lissy93/web-check)
[](https://github.com/sponsors/Lissy93) version: 1.0.0
license:
name: 'License: MIT'
url: https://github.com/Lissy93/web-check/blob/master/LICENSE
termsOfService: https://web-check.xyz/about#terms-info
externalDocs:
url: https://github.com/Lissy93/web-check
servers:
- url: http://localhost:3001/api
- url: http://localhost:3000/api
- url: https://web-check.xyz/api
- url: https://web-check.as93.net/api
tags: - name: Quality & Info
- name: Security
- name: Server Info
- name: Client-Side Information
components:
responses:
Error:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Skipped:
content:
application/json:
schema:
$ref: '#/components/schemas/SkippedResponse'
MissingParam:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Unauthorized:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Forbidden:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
TooManyRequests:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
schemas:
ErrorResponse:
type: object
properties:
error:
type: string
SkippedResponse:
type: object
properties:
skipped:
type: string
paths:
/archives:
get:
summary: Retrieve archive data
tags:
- Quality & Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
firstScan:
type: string
format: date-time
example: '1996-12-21T17:11:14.000Z'
lastScan:
type: string
format: date-time
example: '2024-05-14T13:45:47.000Z'
totalScans:
type: integer
example: 3393
changeCount:
type: integer
example: 1946
averagePageSize:
type: integer
example: 527
scanFrequency:
type: object
properties:
daysBetweenScans:
type: number
format: float
example: 2.95
daysBetweenChanges:
type: number
format: float
example: 5.14
scansPerDay:
type: number
format: float
example: 0.34
changesPerDay:
type: number
format: float
example: 0.19
scans:
type: array
items:
type: array
items:
type: string
example:
- ['19961221171114', '200', 'RX44GNWXPO4HX6ERA2LHBORWD4BJ2HUJ', '971', null]
- ['19970209085620', '200', '6PUZMQAGXXV3RCEQ65WWUCMIJVSG4OQI', '1025', null]
- ['19970209085620', '200', 'RX44GNWXPO4HX6ERA2LHBORWD4BJ2HUJ', '975', null]
- ['19970412142046', '200', 'RX44GNWXPO4HX6ERA2LHBORWD4BJ2HUJ', '1022', null]
- ['19980206180754', '200', 'B6ACYSFKSPWKXRPASZYOK3IBIBY7HB3I', '1102', null]
scanUrl:
type: string
format: uri
example: 'https://duck.com'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/block-lists:
get:
summary: Retrieve block lists data
tags:
- Security
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
blocklists:
type: array
items:
type: object
properties:
server:
type: string
example: 'AdGuard'
serverIp:
type: string
example: '176.103.130.130'
isBlocked:
type: boolean
example: false
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/breaches:
get:
summary: Retrieve known data breaches of the domain, via Have I Been Pwned
tags:
- Security
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
domain:
type: string
example: 'adobe.com'
breaches:
type: array
items:
type: object
properties:
name:
type: string
example: 'Adobe'
title:
type: string
example: 'Adobe'
domain:
type: string
example: 'adobe.com'
date:
type: string
example: '2013-10-04'
accounts:
type: integer
example: 152445165
exposed:
type: array
items:
type: string
example: ['Email addresses', 'Passwords']
type: string
verified:
type: boolean
example: true
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'429':
$ref: '#/components/responses/TooManyRequests'
/caa-records:
get:
summary: Retrieve the CAA records listing which CAs may issue certificates for the domain
tags:
- Security
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
domain:
type: string
example: 'github.com'
records:
type: array
items:
type: object
properties:
tag:
type: string
example: 'issue'
value:
type: string
example: 'letsencrypt.org'
critical:
type: boolean
example: false
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
/carbon:
get:
summary: Retrieve carbon data
tags:
- Quality & Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
statistics:
type: object
properties:
adjustedBytes:
type: number
format: float
example: 104.19
energy:
type: number
format: float
example: 7.859794422984123e-8
co2:
type: object
properties:
grid:
type: object
properties:
grams:
type: number
format: float
example: 0.00003474029134958983
litres:
type: number
format: float
example: 0.00001932255004864186
renewable:
type: object
properties:
grams:
type: number
format: float
example: 0.000030118732228875164
litres:
type: number
format: float
example: 0.000016752038865700363
cleanerThan:
type: integer
example: 1
rating:
type: string
example: 'A+'
green:
type: boolean
example: false
scanUrl:
type: string
format: uri
example: 'https://duck.com'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/cookies:
get:
summary: Retrieve cookies data
tags:
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
headerCookies:
type: array
items:
type: string
example:
- 'SOCS=CAAaBgiAmZWyBg; expires=Sun, 15-Jun-2025 12:33:07 GMT; path=/; domain=.google.com; Secure; SameSite=lax'
- 'AEC=AQTF6HyLiMgX13QRJxvRyBXFos8vw-et4igVlyhgeZaeLlfDgvkgkhQmSg; expires=Tue, 12-Nov-2024 12:33:07 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax'
- '__Secure-ENID=19.SE=YMEDMLYol9GgV7AzLehnn5lFsrHNqD3emYqfTaVxHQPMmAHiIqeKLyqdjfwED8gPGFN5Gb7OqkGiGTki34F94cir_SXxYvVJXTFuUU9hPAMaxoluY4JeeWKP3ma4RlsBZDKDUrBBVIA-PoPwMMBRyy8Fu0m_nOPTGjlz8WMhm_jMuHdWEF8; expires=Mon, 16-Jun-2025 04:51:25 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax'
clientCookies:
type: array
items:
type: object
properties:
name:
type: string
example: '__Secure-ENID'
value:
type: string
example: '19.SE=LZ6Zj5jPrWer7Kk1PqTOWpwREJDJlMaxrCes3es4eXfLZ3-9e-HQ0tnRU-RNA_ezSw_CSyFbUWAd4A3FnTJGGYRsjK2FcqJfIum0UEcSy-oFXM49VreKYjxFyUNEshqsY_VQnZw1lFuRqRyH2JA2V90uHmaL_AVOlL_Myv1_PXwcPYgOCqsBQTkxYPeDVpS6QyHO9g'
domain:
type: string
example: '.google.com'
path:
type: string
example: '/'
expires:
type: number
format: float
example: 1750049486.285637
size:
type: integer
example: 217
httpOnly:
type: boolean
example: true
secure:
type: boolean
example: true
session:
type: boolean
example: false
sameSite:
type: string
example: 'Lax'
priority:
type: string
example: 'Medium'
sameParty:
type: boolean
example: false
sourceScheme:
type: string
example: 'Secure'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/dns-server:
get:
summary: Retrieve DNS server data
tags:
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
domain:
type: string
example: 'duck.com'
dns:
type: array
items:
type: object
properties:
address:
type: string
example: '52.142.124.215'
hostname:
type: array
items:
type: string
nullable: true
example:
- 'lhr48s30-in-f14.1e100.net'
dohDirectSupports:
type: boolean
example: false
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/dns:
get:
summary: Retrieve DNS data
tags:
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
A:
type: object
properties:
address:
type: string
example: '52.142.124.215'
family:
type: integer
example: 4
AAAA:
type: array
items:
type: string
example: ['52.142.124.215']
MX:
type: array
items:
type: string
example: []
TXT:
type: array
items:
type: object
properties:
exchange:
type: string
example: 'smtp-inbound1.duck.com'
priority:
type: integer
example: 5
NS:
type: array
items:
type: array
items:
type: string
example:
- [
'v=spf1 ip4:20.13.235.192/26 ip4:20.67.221.0/24 ip4:20.67.222.0/24 ip4:20.67.223.0/24 -all',
]
- ['google-site-verification=xWLxaaNt2iGObwJ_jeX1E3Wn-xro--W75DBKWs5uufc']
CNAME:
type: array
items:
type: string
example:
- 'dns1.p03.nsone.net'
- 'dns2.p03.nsone.net'
- 'dns3.p03.nsone.net'
- 'dns4.p03.nsone.net'
- 'ns01.quack-dns.com'
- 'ns02.quack-dns.com'
- 'ns03.quack-dns.com'
- 'ns04.quack-dns.com'
SOA:
type: array
items:
type: string
example: []
SRV:
type: object
properties:
nsname:
type: string
example: 'dns1.p03.nsone.net'
hostmaster:
type: string
example: 'hostmaster.nsone.net'
serial:
type: integer
example: 1654974460
refresh:
type: integer
example: 7200
retry:
type: integer
example: 7200
expire:
type: integer
example: 1209600
minttl:
type: integer
example: 14400
PTR:
type: array
items:
type: string
example: []
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/dnssec:
get:
summary: Retrieve DNSSEC data
tags:
- Security
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
DNSKEY:
type: object
properties:
isFound:
type: boolean
example: false
answer:
type: string
nullable: true
example: null
response:
type: object
properties:
Status:
type: integer
example: 3
TC:
type: boolean
example: false
RD:
type: boolean
example: true
RA:
type: boolean
example: true
AD:
type: boolean
example: false
CD:
type: boolean
example: false
Question:
type: array
items:
type: object
properties:
name:
type: string
example: 'https://duck.com.'
type:
type: integer
example: 48
Authority:
type: array
items:
type: object
properties:
name:
type: string
example: 'com.'
type:
type: integer
example: 6
TTL:
type: integer
example: 900
data:
type: string
example: 'a.gtld-servers.net. nstld.verisign-grs.com. 1715938809 1800 900 604800 86400'
Comment:
type: string
example: 'Response from 192.41.162.30.'
DS:
type: object
properties:
isFound:
type: boolean
example: false
answer:
type: string
nullable: true
example: null
response:
type: object
properties:
Status:
type: integer
example: 3
TC:
type: boolean
example: false
RD:
type: boolean
example: true
RA:
type: boolean
example: true
AD:
type: boolean
example: false
CD:
type: boolean
example: false
Question:
type: array
items:
type: object
properties:
name:
type: string
example: 'https://duck.com.'
type:
type: integer
example: 43
Authority:
type: array
items:
type: object
properties:
name:
type: string
example: 'com.'
type:
type: integer
example: 6
TTL:
type: integer
example: 900
data:
type: string
example: 'a.gtld-servers.net. nstld.verisign-grs.com. 1715938824 1800 900 604800 86400'
Comment:
type: string
example: 'Response from 192.52.178.30.'
RRSIG:
type: object
properties:
isFound:
type: boolean
example: false
answer:
type: string
nullable: true
example: null
response:
type: object
properties:
Status:
type: integer
example: 3
TC:
type: boolean
example: false
RD:
type: boolean
example: true
RA:
type: boolean
example: true
AD:
type: boolean
example: false
CD:
type: boolean
example: false
Question:
type: array
items:
type: object
properties:
name:
type: string
example: 'https://duck.com.'
type:
type: integer
example: 46
Authority:
type: array
items:
type: object
properties:
name:
type: string
example: 'com.'
type:
type: integer
example: 6
TTL:
type: integer
example: 900
data:
type: string
example: 'a.gtld-servers.net. nstld.verisign-grs.com. 1715938809 1800 900 604800 86400'
Comment:
type: string
example: 'Response from 2001:502:7094::30.'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/firewall:
get:
summary: Retrieve firewall data
tags:
- Security
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
hasWaf:
type: boolean
example: false
waf:
type: string
nullable: true
example: 'Cloudflare'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/get-ip:
get:
summary: Retrieve IP data
tags:
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
ip:
type: string
example: '52.142.124.215'
family:
type: integer
example: 4
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/headers:
get:
summary: Retrieve headers data
tags:
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
additionalProperties:
oneOf:
- type: string
- type: array
items:
type: string
example:
date: 'Fri, 17 May 2024 11:51:38 GMT'
content-type: 'text/html; charset=utf-8'
transfer-encoding: 'chunked'
connection: 'keep-alive'
cache-control: 'public, max-age=0, must-revalidate'
strict-transport-security: 'max-age=31536000; includeSubDomains'
permissions-policy: 'geolocation=(), camera=(), microphone=()'
referrer-policy: 'strict-origin-when-cross-origin'
x-content-type-options: 'nosniff'
x-frame-options: 'SAMEORIGIN'
x-gww-loc: 'EN-US'
x-pgs-loc: 'EN-US'
x-rm: 'GW'
x-xss-protection: '1; mode=block'
vary: 'Accept-Encoding'
server: 'cloudflare'
cf-ray: '8853658f9da5940b-LHR'
alt-svc: 'h3=":443"; ma=86400'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/hsts:
get:
summary: Retrieve HSTS data
tags:
- Server Info
- Security
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: 'HSTS header does not include all subdomains.'
compatible:
type: boolean
example: false
hstsHeader:
type: string
nullable: true
example: null
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/http-security:
get:
summary: Retrieve HTTP security data
tags:
- Server Info
- Security
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
contentSecurityPolicy:
oneOf: [{ type: string }, { type: boolean }]
example: "default-src 'self'; frame-ancestors 'none'"
strictTransportPolicy:
oneOf: [{ type: string }, { type: boolean }]
example: 'max-age=31536000; includeSubDomains'
xContentTypeOptions:
oneOf: [{ type: string }, { type: boolean }]
example: 'nosniff'
xFrameOptions:
oneOf: [{ type: string }, { type: boolean }]
example: 'DENY'
xXSSProtection:
oneOf: [{ type: string }, { type: boolean }]
example: false
referrerPolicy:
oneOf: [{ type: string }, { type: boolean }]
example: 'strict-origin-when-cross-origin'
permissionsPolicy:
oneOf: [{ type: string }, { type: boolean }]
example: 'camera=(), microphone=()'
crossOriginOpenerPolicy:
oneOf: [{ type: string }, { type: boolean }]
example: 'same-origin'
crossOriginResourcePolicy:
oneOf: [{ type: string }, { type: boolean }]
example: false
crossOriginEmbedderPolicy:
oneOf: [{ type: string }, { type: boolean }]
example: false
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/linked-pages:
get:
summary: Retrieve linked pages data
tags:
- Quality & Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
internal:
type: array
items:
type: string
example:
- 'https://bbc.com/news/business'
- 'https://bbc.com/news/entertainment_and_arts'
- 'https://bbc.com/news/uk'
- 'https://bbc.com/news/world'
- 'https://bbc.com/#chameleon-global-navigation-more-menu'
- 'https://bbc.com/sport/golf'
- 'https://bbc.com/sport'
external:
type: array
items:
type: string
example:
- 'https://www.bbc.co.uk/'
- 'https://www.bbc.co.uk/news'
- 'https://www.bbc.co.uk/sport'
- 'https://www.bbc.co.uk/weather'
- 'https://www.bbc.co.uk/iplayer'
- 'https://www.bbc.co.uk/sounds'
- 'https://www.bbc.co.uk/bitesize'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/mail-config:
get:
summary: Retrieve mail configuration data
tags:
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
mxRecords:
type: array
items:
type: object
properties:
exchange:
type: string
example: 'smtp.google.com'
priority:
type: integer
example: 10
txtRecords:
type: array
items:
type: array
items:
type: string
example:
- ['v=spf1 include:_spf.google.com ~all']
- ['v=DMARC1; p=reject; rua=mailto:[email protected]']
dmarcDomain:
type: string
example: 'github.com'
spfLookups:
type: integer
example: 7
dkim:
type: array
items:
type: object
properties:
selector:
type: string
example: 'google'
bits:
type: integer
nullable: true
example: 2048
mtaSts:
type: object
properties:
mode:
type: string
example: 'enforce'
mx:
type: array
items:
type: string
example: ['.mail.protection.outlook.com']
maxAge:
type: integer
example: 604800
dane:
type: array
items:
type: string
example: ['mail.protonmail.ch']
mailServices:
type: array
items:
type: object
properties:
provider:
type: string
example: 'Google Workspace'
value:
type: string
example: 'aspmx.l.google.com'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/mixed-content:
get:
summary: Find insecure resources on the page, and third-party scripts without SRI
tags:
- Security
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
url:
type: string
example: 'https://example.com/'
upgradeInsecureRequests:
type: boolean
example: false
integrityPolicy:
type: boolean
example: false
active:
type: array
items:
type: string
example: 'http://example.com/app.js'
passive:
type: array
items:
type: string
example: 'http://example.com/logo.png'
forms:
type: array
items:
type: string
example: 'http://example.com/login'
thirdPartyScripts:
type: integer
example: 3
missingIntegrity:
type: object
properties:
versioned:
type: array
items:
type: string
example: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js'
unversioned:
type: array
items:
type: string
example: 'https://www.googletagmanager.com/gtag/js?id=G-XXXX'
missingCrossorigin:
type: array
items:
type: string
example: 'https://cdn.example.net/lib.js'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
/ports:
get:
summary: Retrieve open and failed ports data
tags:
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
openPorts:
type: array
items:
type: integer
example:
- 80
- 443
- 8080
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/quality:
get:
summary: Retrieve website quality metrics
tags:
- Quality & Info
parameters:
- name: url
in: query
required: true
schema:
type: string
- name: apiKey
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
performance:
type: object
properties:
score:
type: number
format: float
example: 0.85
accessibility:
type: object
properties:
score:
type: number
format: float
example: 0.92
best_practices:
type: object
properties:
score:
type: number
format: float
example: 0.88
seo:
type: object
properties:
score:
type: number
format: float
example: 0.95
pwa:
type: object
properties:
score:
type: number
format: float
example: 0.75
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/rank:
get:
summary: Retrieve rank data
tags:
- Quality & Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
ranks:
type: array
items:
type: object
properties:
date:
type: string
format: date
example: '2024-05-16'
rank:
type: integer
example: 145896
domain:
type: string
example: 'duck.com'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/redirects:
get:
summary: Retrieve redirects data
tags:
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
redirects:
type: array
items:
type: string
example:
- 'https://duck.com'
- 'https://duckduckgo.com/'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/robots-txt:
get:
summary: Retrieve robots.txt data
tags:
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
robots:
type: array
items:
type: object
properties:
lbl:
type: string
example: 'User-agent'
val:
type: string
example: ''
example:
- lbl: 'User-agent'
val: ''
- lbl: 'Disallow'
val: '/lite'
- lbl: 'Disallow'
val: '/html'
- lbl: 'Disallow'
val: '/?'
- lbl: 'Disallow'
val: '/chrome_newtab'
- lbl: 'Disallow'
val: '/email/'
- lbl: 'Allow'
val: '/email/$'
- lbl: 'Allow'
val: '/email/privacy-guarantees'
- lbl: 'Allow'
val: '/email/privacy-terms'
- lbl: 'Disallow'
val: '/2012-privacy-policy'
- lbl: 'User-agent'
val: 'ia_archiver'
- lbl: 'Disallow'
val: '/'
llmsTxt:
type: boolean
example: false
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/screenshot:
get:
summary: Retrieve screenshot data
tags:
- Quality & Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties: {}
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/security-txt:
get:
summary: Retrieve security.txt data
tags:
- Security
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
isPresent:
type: boolean
example: true
foundIn:
type: string
nullable: true
example: '/.well-known/security.txt'
content:
type: string
nullable: true
example: "Contact: mailto:[email protected]\nExpires: 2024-12-31T23:59:59.999Z\nEncryption: https://api.protonmail.ch/pks/lookup?op=get&[email protected]\nPreferred-Languages: en\nCanonical: https://proton.me/.well-known/security.txt\nPolicy: https://proton.me/blog/protonmail-bug-bounty-program\nHiring: https://proton.me/careers\n"
isPgpSigned:
type: boolean
example: false
fields:
type: object
nullable: true
properties:
Contact:
type: string
example: 'mailto:[email protected]'
Expires:
type: string
format: date-time
example: '2024-12-31T23:59:59.999Z'
Encryption:
type: string
example: 'https://api.protonmail.ch/pks/lookup?op=get&[email protected]'
Preferred-Languages:
type: string
example: 'en'
Canonical:
type: string
example: 'https://proton.me/.well-known/security.txt'
Policy:
type: string
example: 'https://proton.me/blog/protonmail-bug-bounty-program'
Hiring:
type: string
example: 'https://proton.me/careers'
Acknowledgments:
type: string
nullable: true
example: 'https://hackerone.com/github/hacktivity'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/sitemap:
get:
summary: Retrieve sitemap data
tags:
- Quality & Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
urlset:
type: object
properties:
$:
type: object
properties:
xmlns:
type: string
example: 'http://www.sitemaps.org/schemas/sitemap/0.9'
xmlns:xsi:
type: string
example: 'http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation:
type: string
example: 'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'
url:
type: array
items:
type: object
properties:
loc:
type: array
items:
type: string
example: 'https://duckduckgo.com/'
lastmod:
type: array
items:
type: string
format: date
example: '2023-08-22'
changefreq:
type: array
items:
type: string
example: 'monthly'
priority:
type: array
items:
type: number
format: float
example: 1.00
Note: The structure might need changing to show pages below each user-agent.
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/social-presence:
get:
summary: Find and verify the site's social media accounts
tags:
- Quality & Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
domain:
type: string
example: 'mozilla.org'
profiles:
type: array
items:
type: object
properties:
network:
type: string
example: 'Mastodon'
handle:
type: string
example: '[email protected]'
url:
type: string
example: 'https://mastodon.social/@mozilla'
source:
type: string
enum: [declared, inferred, domain]
example: 'declared'
checked:
type: boolean
example: false
exists:
type: boolean
example: true
name:
type: string
example: 'Mozilla'
avatar:
type: string
example: 'https://files.mastodon.social/accounts/avatars/000/000/001/original/x.png'
joined:
type: string
example: '2017-04-20T00:00:00.000Z'
count:
oneOf:
- type: string
- type: integer
example: 7
followers:
type: integer
example: 18212
website:
type: string
example: 'https://www.mozilla.org'
websiteVerified:
type: boolean
example: true
linksBack:
type: boolean
example: true
domainVerified:
type: boolean
example: true
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
/social-tags:
get:
summary: Retrieve social media tags data
tags:
- Quality & Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
title:
type: string
example: 'DuckDuckGo — Privacy, simplified.'
type: string
example: 'The Internet privacy company that empowers you to seamlessly take control of your personal information online, without any tradeoffs.'
canonicalUrl:
type: string
example: 'https://duckduckgo.com'
ogTitle:
type: string
example: 'DuckDuckGo — Privacy, simplified.'
ogType:
type: string
example: 'website'
ogImage:
type: string
example: 'https://duckduckgo.com/assets/logo_social-media.png'
ogUrl:
type: string
example: 'https://duckduckgo.com'
ogDescription:
type: string
example: 'The Internet privacy company that empowers you to seamlessly take control of your personal information online, without any tradeoffs.'
ogSiteName:
type: string
example: 'DuckDuckGo'
twitterCard:
type: string
example: 'summary_large_image'
twitterSite:
type: string
example: '@duckduckgo'
twitterTitle:
type: string
example: 'DuckDuckGo — Privacy, simplified.'
twitterDescription:
type: string
example: 'The Internet privacy company that empowers you to seamlessly take control of your personal information online, without any tradeoffs.'
twitterImage:
type: string
example: 'https://duckduckgo.com/assets/logo_social-media.png'
viewport:
type: string
example: 'width=device-width, initial-scale=1, user-scalable=1 , viewport-fit=auto'
xHandle:
type: string
example: 'duckduckgo'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/ssl:
get:
summary: Retrieve SSL certificate data
tags:
- Security
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
subject:
type: object
properties:
C:
type: string
example: 'US'
ST:
type: string
example: 'Pennsylvania'
L:
type: string
example: 'Paoli'
O:
type: string
example: 'Duck Duck Go, Inc.'
CN:
type: string
example: '.duck.com'
issuer:
type: object
properties:
C:
type: string
example: 'US'
O:
type: string
example: 'DigiCert Inc'
CN:
type: string
example: 'DigiCert Global G2 TLS RSA SHA256 2020 CA1'
subjectaltname:
type: string
example: 'DNS:.duck.com, DNS:duck.com'
chain:
type: array
items:
type: string
example:
[
'.duck.com',
'DigiCert Global G2 TLS RSA SHA256 2020 CA1',
'DigiCert Global Root G2',
]
infoAccess:
type: object
properties:
'OCSP - URI':
type: array
items:
type: string
example:
- 'http://ocsp.digicert.com'
'CA Issuers - URI':
type: array
items:
type: string
example:
- 'http://cacerts.digicert.com/DigiCertGlobalG2TLSRSASHA2562020CA1-1.crt'
ca:
type: boolean
example: false
modulus:
type: string
example: 'A4B4F5B418A538F2570010FEDA319C3F73400EF8C20BB36668B34AE776233C5F06BE0572E36180FD8064D8AC41BD54AD2C6BAAEDEB31308F37B11EED1CD5D2F046C8B6B16381C4E80E817352C16B6F2A8687589BB564BF4B3C87A45284DB9A8240805002846A067C8CCEB50290D2A799907DFBF6EB0432528F413C5CC913F0230374250062C027664240E5A3A8574B8914F26216CEF076CECE04427A489137EA5AACFCD446827432C18CFF5E31AF0F3999B60A303925082FDDB1535513D6B131497F003397FD1EA4D58C24640261E1C205F33A83FDEE9D8C48A638F98927CEFE42C7DD3852C62AD62ECA74A417DE79290755689B3A6D19E44152695A5872491F'
bits:
type: integer
example: 2048
exponent:
type: string
example: '0x10001'
pubkey:
type: object
properties:
type:
type: string
example: 'Buffer'
data:
type: array
items:
type: integer
example:
[
48,
130,
1,
34,
48,
13,
6,
9,
42,
134,
72,
134,
247,
13,
1,
1,
1,
5,
0,
3,
130,
1,
15,
0,
48,
130,
1,
10,
2,
130,
1,
1,
0,
164,
180,
245,
180,
24,
165,
56,
242,
87,
0,
16,
254,
218,
49,
156,
63,
115,
64,
14,
248,
194,
11,
179,
102,
104,
179,
74,
231,
118,
35,
60,
95,
6,
190,
5,
114,
227,
97,
128,
253,
128,
100,
216,
172,
65,
189,
84,
173,
44,
107,
170,
237,
235,
49,
48,
143,
55,
177,
30,
237,
28,
213,
210,
240,
70,
200,
182,
177,
99,
129,
196,
232,
14,
129,
115,
82,
193,
107,
111,
42,
134,
135,
88,
155,
181,
100,
191,
75,
60,
135,
164,
82,
132,
219,
154,
130,
64,
128,
80,
2,
132,
106,
6,
124,
140,
206,
181,
2,
144,
210,
167,
153,
144,
125,
251,
246,
235,
4,
50,
82,
143,
65,
60,
92,
201,
19,
240,
35,
3,
116,
37,
0,
98,
192,
39,
102,
66,
64,
229,
163,
168,
87,
75,
137,
20,
242,
98,
22,
206,
240,
118,
206,
206,
4,
66,
122,
72,
145,
55,
234,
90,
172,
252,
212,
70,
130,
116,
50,
193,
140,
255,
94,
49,
175,
15,
57,
153,
182,
10,
48,
57,
37,
8,
47,
221,
177,
83,
85,
19,
214,
177,
49,
73,
127,
0,
51,
151,
253,
30,
164,
213,
140,
36,
100,
2,
97,
225,
194,
5,
243,
58,
131,
253,
238,
157,
140,
72,
166,
56,
249,
137,
39,
206,
254,
66,
199,
221,
56,
82,
198,
42,
214,
46,
202,
116,
164,
23,
222,
121,
41,
7,
85,
104,
155,
58,
109,
25,
228,
65,
82,
105,
90,
88,
114,
73,
31,
2,
3,
1,
0,
1,
]
valid_from:
type: string
example: 'Oct 3 00:00:00 2023 GMT'
valid_to:
type: string
example: 'Nov 2 23:59:59 2024 GMT'
fingerprint:
type: string
example: '54:3C:CB:82:A2:33:D0:CB:81:4D:7D:2C:AA:E6:84:CE:37:9A:0B:7A'
fingerprint256:
type: string
example: 'F3:64:C5:26:C1:BD:31:DE:67:BB:98:57:96:7B:B6:9B:C7:1A:CD:44:21:29:62:4C:CE:E2:C9:DF:49:73:DE:05'
fingerprint512:
type: string
example: 'FC:5A:8F:4D:27:DC:A1:4B:2B:31:8A:DD:37:DF:7E:7B:64:18:49:C9:B8:AB:29:9E:B2:5E:F6:43:36:D0:8B:9D:D0:3E:10:83:4D:B2:78:DF:E2:44:B3:7F:70:22:C7:1F:29:81:72:9E:D5:F2:7C:25:2A:02:FE:90:75:D6:35:CB'
ext_key_usage:
type: array
items:
type: string
example:
- '1.3.6.1.5.5.7.3.1'
- '1.3.6.1.5.5.7.3.2'
serialNumber:
type: string
example: '0ABA674EF6840EFD177509B0BF82C4A5'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/status:
get:
summary: Retrieve website status
tags:
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
isUp:
type: boolean
example: true
responseTime:
type: integer
example: 105
responseCode:
type: integer
example: 302
timings:
type: object
properties:
dns:
type: integer
example: 21
connect:
type: integer
example: 16
tls:
type: integer
example: 17
wait:
type: integer
example: 19
download:
type: integer
example: 32
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/tech-stack:
get:
summary: Retrieve technology stack data
tags:
- Quality & Info
- Client-Side Information
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
urls:
type: object
additionalProperties:
type: object
properties:
status:
type: integer
example: 302
example:
'https://duck.com/':
status: 302
'https://duckduckgo.com/':
status: 200
technologies:
type: array
items:
type: object
properties:
slug:
type: string
example: 'node-js'
name:
type: string
example: 'Node.js'
type: string
nullable: true
example: 'Node.js is an open-source, cross-platform, JavaScript runtime environment that executes JavaScript code outside a web browser.'
confidence:
type: integer
example: 100
version:
type: string
nullable: true
example: '12.3.4'
icon:
type: string
example: 'Node.js.svg'
website:
type: string
example: 'https://nodejs.org'
cpe:
type: string
nullable: true
example: 'cpe:2.3:a:nodejs:node.js::::::::*'
categories:
type: array
items:
type: object
properties:
id:
type: integer
example: 27
slug:
type: string
example: 'programming-languages'
name:
type: string
example: 'Programming languages'
rootPath:
type: boolean
example: true
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/threats:
get:
summary: Retrieve threats data
tags:
- Security
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties: {}
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/tls:
get:
summary: Retrieve TLS information for a target
tags:
- Security
- Server Info
parameters:
- name: target
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
id:
type: integer
example: 57369181
timestamp:
type: string
format: date-time
example: '2024-05-18T13:52:49.230114Z'
target:
type: string
example: 'duck.com'
replay:
type: integer
example: -1
has_tls:
type: boolean
example: true
cert_id:
type: integer
example: 189148642
trust_id:
type: integer
example: 343378161
is_valid:
type: boolean
example: true
completion_perc:
type: integer
example: 100
connection_info:
type: object
properties:
scanIP:
type: string
example: '52.250.42.157'
serverside:
type: boolean
example: true
ciphersuite:
type: array
items:
type: object
properties:
cipher:
type: string
example: 'ECDHE-RSA-AES128-GCM-SHA256'
code:
type: integer
example: 49199
protocols:
type: array
items:
type: string
example: 'TLSv1.2'
pubkey:
type: integer
example: 2048
sigalg:
type: string
example: 'sha256WithRSAEncryption'
ticket_hint:
type: string
example: '1200'
ocsp_stapling:
type: boolean
example: false
pfs:
type: string
example: 'ECDH,P-256,256bits'
curves:
type: array
items:
type: string
example: 'prime256v1'
curvesFallback:
type: boolean
example: false
analysis:
type: array
items:
type: object
properties:
id:
type: integer
example: 157573176
analyzer:
type: string
example: 'awsCertlint'
result:
type: object
properties:
bugs:
type: array
nullable: true
items:
type: string
errors:
type: array
nullable: true
items:
type: string
notices:
type: array
nullable: true
items:
type: string
warnings:
type: array
nullable: true
items:
type: string
fatalErrors:
type: array
nullable: true
items:
type: string
informational:
type: array
nullable: true
items:
type: string
host:
type: string
example: ''
issue:
type: array
nullable: true
items:
type: string
has_caa:
type: boolean
example: false
issuewild:
type: array
nullable: true
items:
type: string
revoked:
type: boolean
example: false
RevocationTime:
type: string
format: date-time
example: '0001-01-01T00:00:00Z'
level:
type: string
example: 'intermediate'
failures:
type: object
properties:
bad:
type: array
nullable: true
items:
type: string
old:
type: array
nullable: true
items:
type: string
example:
[
'sha256WithRSAEncryption is not an old certificate signature, use sha1WithRSAEncryption',
'consider adding ciphers ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-CHACHA20-POLY1305, ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, DHE-RSA-AES128-GCM-SHA256, DHE-DSS-AES128-GCM-SHA256, DHE-DSS-AES256-GCM-SHA384, DHE-RSA-AES256-GCM-SHA384, ECDHE-ECDSA-AES128-SHA256, ECDHE-ECDSA-AES128-SHA, ECDHE-ECDSA-AES256-SHA384, ECDHE-ECDSA-AES256-SHA, DHE-RSA-AES128-SHA256, DHE-RSA-AES128-SHA, DHE-DSS-AES128-SHA256, DHE-RSA-AES256-SHA256, DHE-DSS-AES256-SHA, DHE-RSA-AES256-SHA, ECDHE-RSA-DES-CBC3-SHA, ECDHE-ECDSA-DES-CBC3-SHA, EDH-RSA-DES-CBC3-SHA, DHE-DSS-AES256-SHA256, DHE-DSS-AES128-SHA, DES-CBC3-SHA, DHE-RSA-CHACHA20-POLY1305, ECDHE-RSA-CAMELLIA256-SHA384, ECDHE-ECDSA-CAMELLIA256-SHA384, DHE-RSA-CAMELLIA256-SHA256, DHE-DSS-CAMELLIA256-SHA256, DHE-RSA-CAMELLIA256-SHA, DHE-DSS-CAMELLIA256-SHA, CAMELLIA256-SHA256, CAMELLIA256-SHA, ECDHE-RSA-CAMELLIA128-SHA256, ECDHE-ECDSA-CAMELLIA128-SHA256, DHE-RSA-CAMELLIA128-SHA256, DHE-DSS-CAMELLIA128-SHA256, DHE-RSA-CAMELLIA128-SHA, DHE-DSS-CAMELLIA128-SHA, CAMELLIA128-SHA256, CAMELLIA128-SHA, DHE-RSA-SEED-SHA, DHE-DSS-SEED-SHA, SEED-SHA',
'add protocols TLSv1.1, TLSv1, SSLv3',
'consider enabling OCSP stapling',
'add cipher DES-CBC3-SHA for backward compatibility',
]
modern:
type: array
nullable: true
items:
type: string
example:
[
'remove ciphersuites ECDHE-RSA-AES128-SHA, AES128-GCM-SHA256, AES128-SHA256, AES128-SHA, ECDHE-RSA-AES256-SHA, AES256-GCM-SHA384, AES256-SHA256, AES256-SHA',
'consider adding ciphers ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-CHACHA20-POLY1305, ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-SHA384, ECDHE-ECDSA-AES128-SHA256',
'consider enabling OCSP stapling',
'use a certificate of type ecdsa, not RSA',
]
intermediate:
type: array
nullable: true
items:
type: string
example:
[
'consider adding ciphers ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-CHACHA20-POLY1305, ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, ECDHE-ECDSA-AES128-SHA256, ECDHE-ECDSA-AES128-SHA, ECDHE-ECDSA-AES256-SHA384, ECDHE-ECDSA-AES256-SHA, DHE-RSA-AES128-SHA256, DHE-RSA-AES128-SHA, DHE-RSA-AES256-SHA256, DHE-RSA-AES256-SHA, ECDHE-ECDSA-DES-CBC3-SHA, ECDHE-RSA-DES-CBC3-SHA, EDH-RSA-DES-CBC3-SHA, DES-CBC3-SHA',
'add protocols TLSv1.1, TLSv1',
'consider enabling OCSP stapling',
'increase priority of ECDHE-RSA-AES256-GCM-SHA384 over AES128-SHA',
'fix ciphersuite ordering, use recommended intermediate ciphersuite',
]
grade:
type: integer
example: 93
lettergrade:
type: string
example: 'A'
rank:
type: integer
example: 2147483647
domain:
type: string
example: 'duck.com'
alexa_rank:
type: integer
example: 2147483647
cisco_rank:
type: integer
example: 2147483647
alexa_domain:
type: string
example: 'duck.com'
cisco_domain:
type: string
example: 'duck.com'
reasons:
type: array
items:
type: string
example:
[
'path uses a blacklisted cert: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 2006 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 3 Public Primary Certification Authority - G5 (id=123)',
'whitelisted intermediate C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 (id=187368699) override blacklisting of 123',
'path uses a blacklisted cert: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 2006 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 3 Public Primary Certification Authority - G5 (id=188669208)',
'whitelisted intermediate C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 (id=187368699) override blacklisting of 188669208',
'path uses a root not trusted by Mozilla: C=IE, O=Baltimore, OU=CyberTrust, CN=Baltimore CyberTrust Root (id=16)',
'whitelisted intermediate C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 (id=189284449) override blacklisting of 34174538',
'whitelisted intermediate C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 (id=189094508) override blacklisting of 34174538',
'path uses a blacklisted cert: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 2008 VeriSign, Inc. - For authorized use only, CN=VeriSign Universal Root Certification Authority (id=124)',
'whitelisted intermediate C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 (id=188535492) override blacklisting of 124',
]
isDistrusted:
type: boolean
example: false
ack:
type: boolean
example: true
attempts:
type: integer
example: 1
analysis_params:
type: object
example: {}
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/trace-route:
get:
summary: Perform a traceroute to the specified URL
tags:
- Server Info
parameters:
- name: urlString
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: 'Traceroute completed!'
result:
type: array
items:
oneOf:
- type: object
additionalProperties:
type: array
items:
type: number
example: 2.015
- type: boolean
example: false
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/trackers:
get:
summary: List the trackers and other third parties a page loads, via TrackerDB and EasyPrivacy
tags:
- Client-Side Information
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
requests:
type: integer
example: 170
trackers:
type: array
items:
type: object
properties:
name:
type: string
example: 'Google Analytics'
category:
type: string
example: 'Site Analytics'
company:
type: string
example: 'Google'
country:
type: string
nullable: true
example: 'US'
privacyPolicy:
type: string
nullable: true
example: 'https://policies.google.com/privacy'
hosts:
type: array
items:
type: string
example: ['www.google-analytics.com']
requests:
type: integer
example: 3
otherTrackers:
type: array
items:
type: string
example: ['a1.api.bbc.co.uk']
unknown:
type: array
items:
type: string
example: ['cdn.example.net']
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'429':
$ref: '#/components/responses/TooManyRequests'
/txt-records:
get:
summary: Retrieve the TXT records for a specified domain
tags:
- Server Info
parameters:
- name: domain
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
additionalProperties:
type: string
example:
brave-ledger-verification: 'b9067df1ce0bb02c06924b88b62143d0c3c0b9c03a8f5c4aba3c0d0ec99f0a98'
google-site-verification: 'qFBMUPljNGHE2S-NwmQmYvxpa58UfmmIidAbJG9BiuM'
pinterest-site-verification: 'c71cdf6ff37b315830c4af9d98cf2add'
protonmail-verification: '2493afe89892e5b986b59415cdb104152c24f29e'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/whois:
get:
summary: Retrieve WHOIS information for a specified domain
tags:
- Server Info
parameters:
- name: url
in: query
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
type: object
properties:
internicData:
type: object
properties:
Domain_Name:
type: string
Registry_Domain_ID:
type: string
Registrar_WHOIS_Server:
type: string
Registrar_URL:
type: string
Updated_Date:
type: string
format: date-time
Creation_Date:
type: string
format: date-time
Registry_Expiry_Date:
type: string
format: date-time
Registrar:
type: string
Registrar_IANA_ID:
type: string
Domain_Status:
type: string
Name_Server:
type: string
DNSSEC:
type: string
URL_of_the_ICANN_Whois_Inaccuracy_Complaint_Form:
type: string
_Last_update_of_whois_database:
type: string
format: date-time
For_more_information_on_Whois_status_codes_please_visit_https:
type: string
NOTICE:
type: string
TERMS_OF_USE:
type: string
by_the_following_terms_of_use:
type: string
to:
type: string
whoisData:
type: object
properties:
domain:
type: object
properties:
id:
type: string
domain:
type: string
name:
type: string
extension:
type: string
whois_server:
type: string
status:
type: array
items:
type: string
name_servers:
type: array
items:
type: string
created_date:
type: string
format: date-time
updated_date:
type: string
format: date-time
expiration_date:
type: string
format: date-time
registrar:
type: object
properties:
id:
type: string
name:
type: string
phone:
type: string
email:
type: string
referral_url:
type: string
registrant:
type: object
properties:
name:
type: string
organization:
type: string
street:
type: string
city:
type: string
province:
type: string
postal_code:
type: string
country:
type: string
phone:
type: string
phone_ext:
type: string
fax:
type: string
fax_ext:
type: string
email:
type: string
administrative:
type: object
properties:
name:
type: string
organization:
type: string
street:
type: string
city:
type: string
province:
type: string
postal_code:
type: string
country:
type: string
phone:
type: string
phone_ext:
type: string
fax:
type: string
fax_ext:
type: string
email:
type: string
technical:
type: object
properties:
name:
type: string
organization:
type: string
street:
type: string
city:
type: string
province:
type: string
postal_code:
type: string
country:
type: string
phone:
type: string
phone_ext:
type: string
fax:
type: string
fax_ext:
type: string
email:
type: string
billing:
type: object
properties:
name:
type: string
organization:
type: string
street:
type: string
city:
type: string
province:
type: string
postal_code:
type: string
country:
type: string
phone:
type: string
phone_ext:
type: string
fax:
type: string
fax_ext:
type: string
email:
type: string
example:
internicData:
Domain_Name: 'AS93.NET'
Registry_Domain_ID: '1722029712_DOMAIN_NET-VRSN'
Registrar_WHOIS_Server: 'whois.cloudflare.com'
Registrar_URL: 'http://www.cloudflare.com'
Updated_Date: '2019-05-07T04:20:11Z'
Creation_Date: '2012-05-22T16:36:05Z'
Registry_Expiry_Date: '2025-05-22T16:36:05Z'
Registrar: 'CloudFlare, Inc.'
Registrar_IANA_ID: '1910'
Domain_Status: 'clientTransferProhibited https://icann.org/epp#clientTransferProhibited'
Name_Server: 'ALEX.NS.CLOUDFLARE.COM'
DNSSEC: 'unsigned'
URL_of_the_ICANN_Whois_Inaccuracy_Complaint_Form: 'https://www.icann.org/wicf/'
_Last_update_of_whois_database: '2024-05-18T13:59:10Z <<< '
For_more_information_on_Whois_status_codes_please_visit_https: '//icann.org/epp '
NOTICE: "The expiration date displayed in this record is the date the registrar's sponsorship of the domain name registration in the registry is currently set to expire. This date does not necessarily reflect the expiration date of the domain name registrant's agreement with the sponsoring registrar. Users may consult the sponsoring registrar's Whois database to view the registrar's reported date of expiration for this registration. "
TERMS_OF_USE: 'You are not authorized to access or query our Whois database through the use of electronic processes that are high-volume and automated except as reasonably necessary to register domain names or modify existing registrations; the Data in VeriSign Global Registry Services'' ("VeriSign") Whois database is provided by VeriSign for information purposes only, and to assist persons in obtaining information about or related to a domain name registration record. VeriSign does not guarantee its accuracy. By submitting a Whois query, you agree to abide'
by_the_following_terms_of_use: 'You agree that you may use this Data only for lawful purposes and that under no circumstances will you use this Data'
to: '(1) allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations via e-mail, telephone, or facsimile; or (2) enable high volume, automated, electronic processes that apply to VeriSign (or its computer systems). The compilation, repackaging, dissemination or other use of this Data is expressly prohibited without the prior written consent of VeriSign. You agree not to use electronic processes that are automated and high-volume to access or query the Whois database except as reasonably necessary to register domain names or modify existing registrations. VeriSign reserves the right to restrict your access to the Whois database in its sole discretion to ensure operational stability. VeriSign may restrict or terminate your access to the Whois database for failure to abide by these terms of use. VeriSign reserves the right to modify these terms at any time. The Registry database contains ONLY .COM, .NET, .EDU domains and Registrars. '
whoisData:
domain:
id: '1722029712_DOMAIN_NET-VRSN'
domain: 'as93.net'
name: 'as93'
extension: 'net'
whois_server: 'whois.cloudflare.com'
status:
- 'clienttransferprohibited'
name_servers:
- 'adrian.ns.cloudflare.com'
- 'alex.ns.cloudflare.com'
created_date: '2012-05-22T16:36:05Z'
updated_date: '2019-05-07T04:20:11Z'
expiration_date: '2025-05-22T16:36:05Z'
registrar:
id: '1910'
name: 'Cloudflare, Inc.'
phone: '+1.4153197517'
email: '[email protected]'
referral_url: 'https://www.cloudflare.com'
registrant:
name: 'DATA REDACTED'
organization: 'DATA REDACTED'
street: 'DATA REDACTED'
city: 'DATA REDACTED'
province: 'London'
postal_code: 'DATA REDACTED'
country: 'GB'
phone: 'DATA REDACTED'
phone_ext: 'DATA REDACTED'
fax: 'DATA REDACTED'
fax_ext: 'DATA REDACTED'
email: 'https://domaincontact.cloudflareregistrar.com/as93.net'
administrative:
name: 'DATA REDACTED'
organization: 'DATA REDACTED'
street: 'DATA REDACTED'
city: 'DATA REDACTED'
province: 'DATA REDACTED'
postal_code: 'DATA REDACTED'
country: 'DATA REDACTED'
phone: 'DATA REDACTED'
phone_ext: 'DATA REDACTED'
fax: 'DATA REDACTED'
fax_ext: 'DATA REDACTED'
email: 'https://domaincontact.cloudflareregistrar.com/as93.net'
technical:
name: 'DATA REDACTED'
organization: 'DATA REDACTED'
street: 'DATA REDACTED'
city: 'DATA REDACTED'
province: 'DATA REDACTED'
postal_code: 'DATA REDACTED'
country: 'DATA REDACTED'
phone: 'DATA REDACTED'
phone_ext: 'DATA REDACTED'
fax: 'DATA REDACTED'
fax_ext: 'DATA REDACTED'
email: 'https://domaincontact.cloudflareregistrar.com/as93.net'
billing:
name: 'DATA REDACTED'
organization: 'DATA REDACTED'
street: 'DATA REDACTED'
city: 'DATA REDACTED'
province: 'DATA REDACTED'
postal_code: 'DATA REDACTED'
country: 'DATA REDACTED'
phone: 'DATA REDACTED'
phone_ext: 'DATA REDACTED'
fax: 'DATA REDACTED'
fax_ext: 'DATA REDACTED'
email: 'https://domaincontact.cloudflareregistrar.com/as93.net'
'204':
$ref: '#/components/responses/Skipped'
'500':
$ref: '#/components/responses/Error'
'400':
$ref: '#/components/responses/MissingParam'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'