CheckResponse
Main threat analysis response (`domain/check_pipeline.rs::assemble_check_json`; for hashes `api/check_core.rs::check_hash_json`; for email addresses and phone numbers `domain/contact_indicators`). Only `malicious`, `apiVersion`, `enrichmentLevel`, `dataTrust`, `evidence` and the three document stamps (`firstSeen`, `lastSeen`, `lastUpdated` — nullable) are present on every entity response. Everything else depends on the query (with no target at all, a minimal body is returned), the entity type (hash responses carry `hashInfo`/`knownGood`, never `geo`/`whois`), the enrichment level (`riskScore`, `confidence`, `classification` and the cross-correlation block need `standard`+; `timeline` and `relatedInfrastructure` need `full`) and on what the dataset holds for the entity. `geo`, `whois`, `certificates`, `vulnerabilities` and `dns` are **raw upstream payloads** cached as-is — their shape follows the source (ip-api, WHOIS, crt.sh, Shodan InternetDB, DoH), not a schema this API controls. `certificates` keeps crt.sh's row shape but is normalised (see the field). Feed-ingested hash documents additionally pass their raw fields through at the top level (e.g. `malwareFamily`, `firstSeen`, `categories`). This endpoint never contacts the target: it reads the dataset and the caches the report stream filled. Only `/check/stream` and `/check/certificates` open a connection to the target (a TLS handshake on port 443, no HTTP request). An **email address** or a **phone number** answers from the dataset only — no live lookup at any enrichment level — with `type`, `entity`, `lookupStatus` (`found` | `unknown`), `verdict`, `recommendedAction`, `reasons`, `categories`, `riskScore` and an `email` or `phone` block next to the common fields. Its `verdict` is `malicious`, `suspicious` or `unknown` and never `clean`: absence from the dataset is not evidence of safety.
Properties
| Name | Type | Description |
|---|---|---|
| apiVersion | string | API version |
| asnReputation | objectnull | ASN-level reputation (`standard`/`full`, when resolvable) |
| azureTenant | objectnull | Azure tenant details (cached enrichment) |
| blocklistHits | integernull | Number of blocklist sources listing the entity |
| blocklistListed | booleannull | Whether the entity appears on at least one enabled blocklist |
| categories | arraynull | Categories claimed by the threat listings (email and phone queries); hash documents pass their stored `categories` through |
| certificateFacts | objectnull | The certificate section, each part naming its source and time: `status` (`found` | `none` | `unknown` | `pending` | `not_applicable`), `live` (what our own TLS handshake on port 443 observed — read fr |
| certificates | arraynull | Certificate Transparency entries from crt.sh, in crt.sh's row shape (`not_before` / `not_after` without a timezone, UTC). Normalised: at most 10 current certificates, newest first, or the 10 most rece |
| classification | object | |
| confidence | object | |
| confidenceScore | numbernull | Hash queries only: ingestion confidence from the feed document (0-100) |
| crossCorrelation | objectnull | Cross-correlation signals across data facets (`standard`/`full`) |
| dataTrust | object | Data quality, freshness, source reliability, and provider agreement profile |
| delisted | booleannull | Present and `true` when the entity was delisted after review |
| dns | objectnull | Raw DNS snapshot (records, SPF/DMARC flags) |
| object | ||
| enrichmentLevel | string | Enrichment level applied: `basic` | `standard` | `full` | `fast` |
| entity | stringnull | Email and phone queries only: what was looked up — the lowercased address, or the E.164 number (its digits when no country could be told) |
| evidence | object | SOC verdict evidence, reasons, contradictions, and recommended action |
| firstSeen | stringnull | When the entity entered the dataset, or the feed's earliest observation of it — RFC 3339 UTC (`2026-08-25T14:17:40Z`). Present at every enrichment level; `null` when the stored document carries no sta |
| geo | objectnull | Raw geolocation payload (shape follows ip-api) |
| greynoise | objectnull | GreyNoise Community context for an IPv4 (`standard`/`full`), present only when a report lookup has fetched it in the last three days — this endpoint reads that answer and never calls GreyNoise itself. |
| hashInfo | object | |
| infrastructure | object | |
| intelOwl | objectnull | IntelOwl analyzer output (cached enrichment) |
| knownGood | booleannull | Hash queries only: present and `true` when the hash is NSRL-listed known software |
| lastSeen | stringnull | Latest re-observation of the entity by a feed — RFC 3339 UTC. Present at every enrichment level; `null` when unknown |
| lastUpdated | stringnull | Last full refresh of the stored document at ingest — RFC 3339 UTC. Present at every enrichment level; `null` when unknown |
| lookupQueued | booleannull | Hash queries only, next to `pending: ["circl"]`: `false` when nothing is running or queued for the hash — every background lookup slot was taken — so nothing completes it in the background: the next c |
| lookupStatus | stringnull | Hash queries: `known` when a reputation source or NSRL match is available, otherwise `unknown`. Email and phone queries: `found` when the dataset holds a document for the address or number, otherwise |
| malicious | boolean | Explicit or scanner-derived malicious detection for IPs/domains; hashes also include malware-feed matches. `false` is not a safety verdict. Consult `riskScore`, `evidence` and blocklist fields for the |
| microsoftTenant | booleannull | Whether the domain maps to a Microsoft/Azure tenant |
| mitre | objectnull | MITRE ATT&CK mapping for the classified categories (`standard`/`full`) |
| otx | objectnull | AlienVault OTX pulse context (`standard`/`full`) |
| pending | arraynull | `fast` only: the facets the cache did not hold for this answer and that are being fetched in the background — `dns`, `whois`, `geo`, `certificates` (the CT history of a public domain name), `otx` for |
| phone | object | |
| processingTime | integernull | Server-side processing time in milliseconds (absent on the minimal no-target response) |
| pwnedPassword | object | |
| ransomware | objectnull | Ransomware-group context, when the entity appears in ransomware feeds |
| reasons | arraynull | Email and phone queries only: at most five short sentences stating the evidence behind `verdict` |
| recommendedAction | stringnull | Email and phone queries only: `block` (malicious) | `review` (suspicious) | `unverified` (unknown — nothing is known either way) |
| relatedInfrastructure | objectnull | Related infrastructure (`full` enrichment only) |
| reputation | objectnull | Aggregated detection counters (typically `malicious` / `suspicious` / `harmless` / `undetected`, sometimes `timeout`). May be `null` for unknown entities. |
| riskScore | object | |
| similar_domains | objectnull | Lookalikes of the domain that the corpus lists — typosquats, homoglyphs, the name on other TLDs or wrapped in phishing words — best first: `{ keywords, hits, total_hits, truncated, matches: [{ domain, |
| sources | arraynull | Raw source rows from the feed corpus (name, url, category, … as ingested). Each row may carry `threatClass` (`threat` when absent, `infrastructure`, `policy`, `allowlist`) and `fpRisk` (`low` when abs |
| techStack | objectnull | Detected technology stack (cached enrichment) |
| timeline | objectnull | Detection timeline (`full` enrichment only) |
| type | stringnull | Email and phone queries only: `email` | `phone` |
| verdict | stringnull | Email and phone queries only: `malicious` | `suspicious` | `unknown`, never `clean` |
| vulnerabilities | objectnull | Raw open-port / CVE payload (shape follows Shodan InternetDB: `cpes` / `hostnames` / `ip` / `ports` / `tags` / `vulns`) |
| whois | objectnull | Raw WHOIS payload (shape follows the WHOIS provider) |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/ismalicious-com/json-schema/ismalicious-com-check-response-schema.json",
"title": "CheckResponse",
"description": "Main threat analysis response (`domain/check_pipeline.rs::assemble_check_json`;\nfor hashes `api/check_core.rs::check_hash_json`; for email addresses and\nphone numbers `domain/contact_indicators`).\n\nOnly `malicious`, `apiVersion`, `enrichmentLevel`, `dataTrust`,\n`evidence` and the three document stamps (`firstSeen`, `lastSeen`,\n`lastUpdated` — nullable) are present on every entity response.\nEverything else depends on the\nquery (with no target at all, a minimal body is returned), the entity type\n(hash responses carry `hashInfo`/`knownGood`, never `geo`/`whois`), the\nenrichment level (`riskScore`, `confidence`, `classification` and the\ncross-correlation block need `standard`+; `timeline` and\n`relatedInfrastructure` need `full`) and on what the dataset holds for the\nentity.\n\n`geo`, `whois`, `certificates`, `vulnerabilities` and `dns` are **raw\nupstream payloads** cached as-is — their shape follows the source\n(ip-api, WHOIS, crt.sh, Shodan InternetDB, DoH), not a schema this API\ncontrols. `certificates` keeps crt.sh's row shape but is normalised (see\nthe field). Feed-ingested hash documents additionally pass their raw\nfields through at the top level (e.g. `malwareFamily`, `firstSeen`,\n`categories`).\n\nThis endpoint never contacts the target: it reads the dataset and the\ncaches the report stream filled. Only `/check/stream` and\n`/check/certificates` open a connection to the target (a TLS handshake on\nport 443, no HTTP request).\n\nAn **email address** or a **phone number** answers from the dataset only\n— no live lookup at any enrichment level — with `type`, `entity`,\n`lookupStatus` (`found` | `unknown`), `verdict`, `recommendedAction`,\n`reasons`, `categories`, `riskScore` and an `email` or `phone` block next\nto the common fields. Its `verdict` is `malicious`, `suspicious` or\n`unknown` and never `clean`: absence from the dataset is not evidence of\nsafety.",
"x-generated": "2026-11-12",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/ismalicious-com-openapi.json#/components/schemas/CheckResponse",
"type": "object",
"required": [
"malicious",
"apiVersion",
"enrichmentLevel",
"dataTrust",
"evidence"
],
"properties": {
"apiVersion": {
"type": "string",
"description": "API version"
},
"asnReputation": {
"type": [
"object",
"null"
],
"description": "ASN-level reputation (`standard`/`full`, when resolvable)"
},
"azureTenant": {
"type": [
"object",
"null"
],
"description": "Azure tenant details (cached enrichment)"
},
"blocklistHits": {
"type": [
"integer",
"null"
],
"format": "int64",
"description": "Number of blocklist sources listing the entity",
"minimum": 0
},
"blocklistListed": {
"type": [
"boolean",
"null"
],
"description": "Whether the entity appears on at least one enabled blocklist"
},
"categories": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "Categories claimed by the threat listings (email and phone queries);\nhash documents pass their stored `categories` through"
},
"certificateFacts": {
"type": [
"object",
"null"
],
"description": "The certificate section, each part naming its source and time:\n`status` (`found` | `none` | `unknown` | `pending` |\n`not_applicable`), `live` (what our own TLS handshake on port 443\nobserved — read from the cache here, never probed by this endpoint)\nand `ctHistory` (crt.sh: `status`, `via` http|postgres|stored,\n`fetchedAt`, `stale`, counts, `rows`, `error`). `none` is only ever\nsaid for a registrable domain with no current certificate logged and\nnothing observed live; a source that did not answer reads `unknown`."
},
"certificates": {
"type": [
"array",
"null"
],
"items": {
"type": "object"
},
"description": "Certificate Transparency entries from crt.sh, in crt.sh's row shape\n(`not_before` / `not_after` without a timezone, UTC). Normalised: at\nmost 10 current certificates, newest first, or the 10 most recent\nexpired ones when none is current, with the precertificate/final\nduplicates removed — the full counts are in\n`certificateFacts.ctHistory` (`currentCount`, `totalSeen`). Never the\nlive certificate, never set for an IP. Omitted while crt.sh is\nswitched off."
},
"classification": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/$defs/Classification",
"description": "Threat classification (`standard`/`full` enrichment)"
}
]
},
"confidence": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/$defs/Confidence",
"description": "Confidence score (`standard`/`full` enrichment)"
}
]
},
"confidenceScore": {
"type": [
"number",
"null"
],
"format": "double",
"description": "Hash queries only: ingestion confidence from the feed document (0-100)"
},
"crossCorrelation": {
"type": [
"object",
"null"
],
"description": "Cross-correlation signals across data facets (`standard`/`full`)"
},
"dataTrust": {
"$ref": "#/$defs/DataTrustProfile",
"description": "Data quality, freshness, source reliability, and provider agreement profile"
},
"delisted": {
"type": [
"boolean",
"null"
],
"description": "Present and `true` when the entity was delisted after review"
},
"dns": {
"type": [
"object",
"null"
],
"description": "Raw DNS snapshot (records, SPF/DMARC flags)"
},
"email": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/$defs/EmailIndicator",
"description": "Email queries only: the address, its domain and what the dataset holds\nabout that domain"
}
]
},
"enrichmentLevel": {
"type": "string",
"description": "Enrichment level applied: `basic` | `standard` | `full` | `fast`"
},
"entity": {
"type": [
"string",
"null"
],
"description": "Email and phone queries only: what was looked up — the lowercased\naddress, or the E.164 number (its digits when no country could be told)"
},
"evidence": {
"$ref": "#/$defs/SocEvidence",
"description": "SOC verdict evidence, reasons, contradictions, and recommended action"
},
"firstSeen": {
"type": [
"string",
"null"
],
"description": "When the entity entered the dataset, or the feed's earliest\nobservation of it — RFC 3339 UTC (`2026-08-25T14:17:40Z`). Present at\nevery enrichment level; `null` when the stored document carries no\nstamp (an entity no feed has ever listed)"
},
"geo": {
"type": [
"object",
"null"
],
"description": "Raw geolocation payload (shape follows ip-api)"
},
"greynoise": {
"type": [
"object",
"null"
],
"description": "GreyNoise Community context for an IPv4 (`standard`/`full`), present\nonly when a report lookup has fetched it in the last three days —\nthis endpoint reads that answer and never calls GreyNoise itself.\n`{ source, fetchedAt, classification: benign|malicious|unknown,\nnoise, riot, name, link, lastSeen, tags }`. `riot: true` (a known\nbusiness service) and `benign` are context and never raise\n`riskScore`; `malicious` feeds its Context factor. Absent is \"no\nanswer\", never a clean verdict"
},
"hashInfo": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/$defs/HashInfo",
"description": "Hash queries only: what was looked up"
}
]
},
"infrastructure": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/$defs/InfrastructureAttribution",
"description": "What the entity IS according to its non-threat listings — a cloud or\nCDN range, a Tor exit, a VPN egress, a DoH resolver, a crawler, an\nuptime monitor, a sinkhole, a known-good list. Present only when at\nleast one listing in `sources` is `infrastructure` / `policy` /\n`allowlist` class; such listings carry no verdict weight and are not\ncounted in `blocklistHits`"
}
]
},
"intelOwl": {
"type": [
"object",
"null"
],
"description": "IntelOwl analyzer output (cached enrichment)"
},
"knownGood": {
"type": [
"boolean",
"null"
],
"description": "Hash queries only: present and `true` when the hash is NSRL-listed\nknown software"
},
"lastSeen": {
"type": [
"string",
"null"
],
"description": "Latest re-observation of the entity by a feed — RFC 3339 UTC. Present\nat every enrichment level; `null` when unknown"
},
"lastUpdated": {
"type": [
"string",
"null"
],
"description": "Last full refresh of the stored document at ingest — RFC 3339 UTC.\nPresent at every enrichment level; `null` when unknown"
},
"lookupQueued": {
"type": [
"boolean",
"null"
],
"description": "Hash queries only, next to `pending: [\"circl\"]`: `false` when nothing\nis running or queued for the hash — every background lookup slot was\ntaken — so nothing completes it in the background: the next check\nstarts the lookup. Absent otherwise (additive: a lookup is running,\nor queued to start once a slot frees)"
},
"lookupStatus": {
"type": [
"string",
"null"
],
"description": "Hash queries: `known` when a reputation source or NSRL match is\navailable, otherwise `unknown`. Email and phone queries: `found` when\nthe dataset holds a document for the address or number, otherwise\n`unknown`. Unknown is never positive evidence of safety."
},
"malicious": {
"type": "boolean",
"description": "Explicit or scanner-derived malicious detection for IPs/domains;\nhashes also include malware-feed matches. `false` is not a safety\nverdict. Consult `riskScore`, `evidence` and blocklist fields for the\noverall assessment, and `lookupStatus` for unknown hashes."
},
"microsoftTenant": {
"type": [
"boolean",
"null"
],
"description": "Whether the domain maps to a Microsoft/Azure tenant"
},
"mitre": {
"type": [
"object",
"null"
],
"description": "MITRE ATT&CK mapping for the classified categories (`standard`/`full`)"
},
"otx": {
"type": [
"object",
"null"
],
"description": "AlienVault OTX pulse context (`standard`/`full`)"
},
"pending": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "`fast` only: the facets the cache did not hold for this answer and\nthat are being fetched in the background — `dns`, `whois`, `geo`,\n`certificates` (the CT history of a public domain name), `otx` for an\nIP, a domain or a URL; `circl` for a hash\nwhose lookup outlived the request deadline, or found every lookup slot\nbusy until it and starts once one frees (`lookupStatus` then reads\n`unknown` for now, not a CIRCL miss) — unless `lookupQueued` is\n`false`. A re-check a few seconds later answers them from the cache.\nA facet no fetch can fill is not listed: one whose last fetch failed\nwithin the past five minutes, the geo and WHOIS of a private or\nreserved address. Absent when nothing is pending"
},
"phone": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/$defs/PhoneIndicator",
"description": "Phone queries only: the number as received and how it was resolved\nto E.164"
}
]
},
"processingTime": {
"type": [
"integer",
"null"
],
"format": "int64",
"description": "Server-side processing time in milliseconds (absent on the minimal\nno-target response)",
"minimum": 0
},
"pwnedPassword": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/$defs/PwnedPassword",
"description": "Hash queries only: present when the digest is the SHA-1 (40 hex) or\nNTLM (32 hex) hash of a password seen in breaches"
}
]
},
"ransomware": {
"type": [
"object",
"null"
],
"description": "Ransomware-group context, when the entity appears in ransomware feeds"
},
"reasons": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "Email and phone queries only: at most five short sentences stating the\nevidence behind `verdict`"
},
"recommendedAction": {
"type": [
"string",
"null"
],
"description": "Email and phone queries only: `block` (malicious) | `review`\n(suspicious) | `unverified` (unknown — nothing is known either way)"
},
"relatedInfrastructure": {
"type": [
"object",
"null"
],
"description": "Related infrastructure (`full` enrichment only)"
},
"reputation": {
"type": [
"object",
"null"
],
"description": "Aggregated detection counters (typically `malicious` / `suspicious` /\n`harmless` / `undetected`, sometimes `timeout`). May be `null` for\nunknown entities."
},
"riskScore": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/$defs/RiskScore",
"description": "Risk score (`standard`/`full` enrichment, and hash queries)"
}
]
},
"similar_domains": {
"type": [
"object",
"null"
],
"description": "Lookalikes of the domain that the corpus lists — typosquats,\nhomoglyphs, the name on other TLDs or wrapped in phishing words — best\nfirst: `{ keywords, hits, total_hits, truncated, matches: [{ domain,\nfuzzer, threatLevel }] }`. `hits` holds the same names as `matches`."
},
"sources": {
"type": [
"array",
"null"
],
"items": {
"type": "object"
},
"description": "Raw source rows from the feed corpus (name, url, category, … as\ningested). Each row may carry `threatClass` (`threat` when absent,\n`infrastructure`, `policy`, `allowlist`) and `fpRisk` (`low` when\nabsent, `medium`, `high`) copied from the feed registry"
},
"techStack": {
"type": [
"object",
"null"
],
"description": "Detected technology stack (cached enrichment)"
},
"timeline": {
"type": [
"object",
"null"
],
"description": "Detection timeline (`full` enrichment only)"
},
"type": {
"type": [
"string",
"null"
],
"description": "Email and phone queries only: `email` | `phone`"
},
"verdict": {
"type": [
"string",
"null"
],
"description": "Email and phone queries only: `malicious` | `suspicious` | `unknown`,\nnever `clean`"
},
"vulnerabilities": {
"type": [
"object",
"null"
],
"description": "Raw open-port / CVE payload (shape follows Shodan InternetDB:\n`cpes` / `hostnames` / `ip` / `ports` / `tags` / `vulns`)"
},
"whois": {
"type": [
"object",
"null"
],
"description": "Raw WHOIS payload (shape follows the WHOIS provider)"
}
},
"$defs": {
"Classification": {
"type": "object",
"description": "Classification of the entity\n(`enrichment/threat_classifier.rs::ThreatClassification`).",
"required": [
"primary",
"secondary",
"confidence",
"indicators"
],
"properties": {
"confidence": {
"type": "integer",
"format": "int32",
"description": "Classification confidence (0-100)",
"minimum": 0
},
"indicators": {
"type": "array",
"items": {
"$ref": "#/$defs/ThreatIndicator"
},
"description": "Indicators behind the classification"
},
"primary": {
"type": "string",
"description": "Primary classification"
},
"secondary": {
"type": "array",
"items": {
"type": "string"
},
"description": "Secondary classifications"
}
}
},
"Confidence": {
"type": "object",
"description": "Confidence score with level and factors\n(`enrichment/confidence.rs::ConfidenceScore`).",
"required": [
"score",
"level",
"factors",
"explanation"
],
"properties": {
"explanation": {
"type": "string",
"description": "One-line explanation of the confidence"
},
"factors": {
"type": "array",
"items": {
"$ref": "#/$defs/ConfidenceFactor"
},
"description": "Factors contributing to the confidence score"
},
"level": {
"type": "string",
"description": "Confidence level: `low` | `medium` | `high`"
},
"score": {
"type": "integer",
"format": "int32",
"description": "Confidence score from 0-100",
"maximum": 100,
"minimum": 0
}
}
},
"ConfidenceFactor": {
"type": "object",
"description": "One weighted factor of the confidence score\n(`enrichment/confidence.rs::ConfidenceFactor`).",
"required": [
"name",
"score",
"weight",
"contribution",
"description"
],
"properties": {
"contribution": {
"type": "number",
"format": "double",
"description": "Weighted contribution to the final score"
},
"description": {
"type": "string",
"description": "Human-readable explanation"
},
"name": {
"type": "string",
"description": "Factor name"
},
"score": {
"type": "number",
"format": "double",
"description": "Raw factor score"
},
"weight": {
"type": "number",
"format": "double",
"description": "Weight of this factor in the composite score"
}
}
},
"DataCompleteness": {
"type": "object",
"description": "Data completeness across expected enrichment facets",
"required": [
"score",
"present",
"missing"
],
"properties": {
"facetFreshness": {
"type": "object",
"description": "Age of each cached enrichment facet that carries a `fetchedAt`\n(`techStack`, `relatedInfrastructure`, `azureTenant`, `ransomware`,\n`intelOwl`, `timeline`), keyed by facet: `{ fetchedAt, freshness,\ndataAgeHours }`. An empty object when none is cached"
},
"missing": {
"type": "array",
"items": {
"type": "string"
}
},
"present": {
"type": "array",
"items": {
"type": "string"
}
},
"score": {
"type": "integer",
"format": "int32"
}
}
},
"DataTrustCertificates": {
"type": "object",
"description": "The certificate facet of a domain's Data Trust profile: the summary of\n`certificateFacts`, and which source said so.",
"required": [
"state"
],
"properties": {
"source": {
"type": [
"string",
"null"
],
"description": "`tls` (our own handshake on port 443), `crt.sh` (Certificate\nTransparency), `stored` (the CT rows a previous lookup stored), or\n`null` when no source answered"
},
"state": {
"type": "string",
"description": "`found`, `none` (CT logs no current certificate for this registrable\ndomain and nothing was observed live), `unknown` (no source answered:\nnever read it as `none`), `pending` (report stream only, before the\nCT lookup lands) or `not_applicable` (an IP, an invalid name)"
}
}
},
"DataTrustProfile": {
"type": "object",
"description": "Data Trust profile attached to check responses",
"required": [
"observedAt",
"freshness",
"sourceAgreement",
"sources",
"completeness",
"providerAgreement"
],
"properties": {
"certificates": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/$defs/DataTrustCertificates",
"description": "Domains only: the certificate facet's state and source"
}
]
},
"completeness": {
"$ref": "#/$defs/DataCompleteness"
},
"dataAgeHours": {
"type": [
"number",
"null"
],
"format": "double"
},
"firstSeen": {
"type": [
"string",
"null"
]
},
"freshness": {
"type": "string"
},
"lastSeen": {
"type": [
"string",
"null"
]
},
"lastUpdated": {
"type": [
"string",
"null"
]
},
"observedAt": {
"type": "string"
},
"providerAgreement": {
"$ref": "#/$defs/ProviderAgreement"
},
"sourceAgreement": {
"$ref": "#/$defs/SourceAgreement"
},
"sources": {
"type": "array",
"items": {
"$ref": "#/$defs/DataTrustSource"
}
}
}
},
"DataTrustSource": {
"type": "object",
"description": "Source entry with reliability metadata",
"required": [
"name",
"type",
"reliability",
"reliabilityLevel",
"noiseProfile"
],
"properties": {
"category": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"noiseProfile": {
"$ref": "#/$defs/NoiseProfile"
},
"reliability": {
"type": "number",
"format": "double"
},
"reliabilityLevel": {
"$ref": "#/$defs/ReliabilityLevel"
},
"type": {
"type": "string"
},
"url": {
"type": [
"string",
"null"
]
}
}
},
"EmailDomainReputation": {
"type": "object",
"description": "What the dataset holds about the sender domain.",
"required": [
"lookupStatus",
"malicious",
"blocklistHits",
"sources",
"infrastructure"
],
"properties": {
"blocklistHits": {
"type": "integer",
"description": "Threat-class listings on the domain",
"minimum": 0
},
"delisted": {
"type": [
"boolean",
"null"
],
"description": "Present and `true` when a delisting cleared the domain's listings"
},
"infrastructure": {
"type": "array",
"items": {
"type": "string"
},
"description": "Attributes of the domain's non-threat listings (`disposable-email`, …)"
},
"lookupStatus": {
"type": "string",
"description": "`found` when a document exists for the domain, else `unknown`"
},
"malicious": {
"type": "boolean",
"description": "The domain is malicious by the same evidence `/check` reads for it"
},
"sources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of those listings, at most 10"
}
}
},
"EmailIndicator": {
"type": "object",
"description": "The `email` block of a contact body.",
"required": [
"address",
"localPart",
"domain",
"disposable",
"freeProvider",
"domainReputation"
],
"properties": {
"address": {
"type": "string",
"description": "The address as looked up: trimmed, lowercased"
},
"disposable": {
"type": "boolean",
"description": "The domain is a disposable-mail provider: a disposable-email listing\nfrom a list that is not an aggregate of other lists. Never `true` for\na shared mail provider"
},
"domain": {
"type": "string"
},
"domainReputation": {
"$ref": "#/$defs/EmailDomainReputation"
},
"freeProvider": {
"type": "boolean",
"description": "The domain is a consumer or shared mail provider: its reputation is\nnever propagated to the address"
},
"localPart": {
"type": "string"
},
"mx": {
"type": [
"boolean",
"null"
],
"description": "The domain publishes MX hosts (`true`), publishes a null MX — it\naccepts no mail (`false`), or no cached answer settles it (`null`: no\ncached DNS answer, or an empty MX answer, which a failed lookup also\ngives) — this path never resolves"
}
}
},
"EvidenceConfidence": {
"type": "object",
"description": "Confidence excerpt included in SOC evidence",
"required": [
"score",
"level"
],
"properties": {
"level": {
"type": "string"
},
"score": {
"type": "integer",
"format": "int32"
}
}
},
"EvidenceSourceSummary": {
"type": "object",
"description": "Source summary included in SOC evidence",
"required": [
"count",
"weightedStrength",
"highReliabilityCount",
"noiseWarnings"
],
"properties": {
"count": {
"type": "integer",
"format": "int32"
},
"highReliabilityCount": {
"type": "integer",
"format": "int32"
},
"noiseWarnings": {
"type": "array",
"items": {
"type": "string"
}
},
"weightedStrength": {
"type": "number",
"format": "double"
}
}
},
"HashInfo": {
"type": "object",
"description": "Identity of the hash that was looked up (hash queries only).\n\nFeed-ingested hash documents pass extra file metadata through alongside\nthese fields (file names, sizes, signatures — shape follows the source\nfeed), so treat this object as open.",
"required": [
"hashType",
"hash"
],
"properties": {
"hash": {
"type": "string",
"description": "The hash as queried"
},
"hashType": {
"type": "string",
"description": "`md5` | `sha1` | `sha256` | `unknown`"
},
"nsrl": {
"type": [
"boolean",
"null"
],
"description": "Present and `true` when the hash is in the NSRL known-software corpus"
}
}
},
"InfrastructureAttribution": {
"type": "object",
"description": "What the entity IS, according to the listings that describe rather than\naccuse it. Present on a response only when at least one such listing\nexists on the document.",
"required": [
"attributes",
"sources"
],
"properties": {
"attributes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Distinct, sorted attributes drawn from the vocabulary: `tor-exit`,\n`vpn`, `proxy`, `doh-resolver`, `dns-resolver`, `sinkhole`, `cloud`,\n`cdn`, `crawler`, `scanner`, `monitoring`, `disposable-email`,\n`dynamic-dns`, `url-shortener`, `bogon`, `saas`, `allowlist`"
},
"sources": {
"type": "array",
"items": {
"$ref": "#/$defs/InfrastructureSource"
},
"description": "The non-threat listings the attributes were derived from"
}
}
},
"InfrastructureSource": {
"type": "object",
"description": "One non-threat listing behind the attribution.",
"required": [
"name",
"threatClass"
],
"properties": {
"category": {
"type": [
"string",
"null"
],
"description": "The listing's primary category, as ingested"
},
"id": {
"type": [
"string",
"null"
],
"description": "Registry id of the feed (absent on legacy listings written before ids)"
},
"name": {
"type": "string",
"description": "Feed name as stored on the listing"
},
"threatClass": {
"type": "string",
"description": "`infrastructure` | `policy` | `allowlist` — never `threat` here"
}
}
},
"NoiseProfile": {
"type": "string",
"description": "Operational noise profile for a source",
"enum": [
"authoritative",
"contextual",
"noisy"
]
},
"PhoneIndicator": {
"type": "object",
"description": "The `phone` block of a contact body.",
"required": [
"input",
"resolvedWith"
],
"properties": {
"countryCallingCode": {
"type": [
"string",
"null"
],
"description": "Country calling code, without `+`, when known"
},
"e164": {
"type": [
"string",
"null"
],
"description": "The number in E.164 form, `null` when no country could be told"
},
"input": {
"type": "string",
"description": "The query as received, trimmed; a `tel:` / `sms:` / `callto:` scheme\nand its parameters removed"
},
"resolvedWith": {
"type": "string",
"description": "`e164` (written internationally) | `country` (the `country=` hint) |\n`nanp-guess` (read as North American, no hint) | `digits` (no\ncountry could be told)"
}
}
},
"ProviderAgreement": {
"type": "object",
"description": "Provider agreement summary from cross-correlation signals",
"required": [
"status",
"summary",
"contradictorySignals"
],
"properties": {
"contradictorySignals": {
"type": "array",
"items": {
"$ref": "#/$defs/ProviderContradictorySignal"
}
},
"status": {
"type": "string"
},
"summary": {
"type": "string"
}
}
},
"ProviderContradictorySignal": {
"type": "object",
"description": "Contradictory provider signal included in SOC evidence",
"required": [
"type",
"severity",
"title",
"description"
],
"properties": {
"description": {
"type": "string"
},
"severity": {
"type": "string"
},
"title": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"PwnedPassword": {
"type": "object",
"description": "A queried digest that is the SHA-1 or NTLM hash of a breached password\n(hash queries only). Beside the file verdict, never part of it: no\nlisting in `sources`, no effect on `riskScore` or `lookupStatus`.",
"required": [
"found",
"hashType",
"count",
"source",
"sourceUrl"
# --- truncated at 32 KB (38 KB total) ---
# Full source: https://artifacts.apis.io/ismalicious-com/json-schema/ismalicious-com-check-response-schema.json
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
curl "https://apis.io/api/v1/json-schemas/ismalicious-com-check-response"
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.