DEVELOPER REFERENCE v1

Inspector API documentation

DOCUMENTATION Quick start
START HERE

Send your first
API request.

Use your Inspector API key to submit a domain, URL, file or email address. The reference below documents request formats and response fields.

Your first domain lookup

This request uses 3 credits. Replace the placeholder with your API key and example.com with the domain you want to check.

curl -X POST 'https://inspector.gridinsoft.com/api/v1/domain/check' \
  -H 'Content-Type: application/json' \
  -d '{
    "apikey": "YOUR_PRIVATE_APIKEY",
    "domain": "example.com"
  }'
What comes back

verdict identifies the assessment, reputation gives the available score, and data_available tells you whether an assessment exists.

View response fields and examples

Choose the right API

Start with the input you have. Each operation uses the same account and credit balance.

Integration essentials

BASE URLhttps://inspector.gridinsoft.com
RESPONSE FORMATapplication/json

New to Inspector? Create a free account to get started. For a tool-using AI agent, see the MCP integration.

GET STARTED

Authenticate a request.

Your API key identifies the account and the shared credit balance used by every endpoint.

Get your API key

Open your account profile to find your API key. If you do not have an account yet, create one.

Where to send the key

APIRequest formatAuthentication field
Domain, URL, Emailapplication/json bodyapikey
Filemultipart/form-dataapikey form field
SearchGET query or POST form fieldsapikey parameter
{
  "apikey": "YOUR_PRIVATE_APIKEY",
  "domain": "example.com"
}

Keep the key on your server

Send requests from your backend. Keep real keys out of client-side JavaScript, public repositories and support messages. The examples in this documentation always use a placeholder, including when you are signed in.

Authentication errors

An invalid API key returns HTTP 401. Check the key and its placement in the request. See errors and credits for the response format and other status codes.

API REFERENCE

Pick your input.

Five operations, one account. Open a method for its request parameters, response fields and copyable examples.

Domain feeds are a separate bulk-delivery product. For snapshots and local matching, visit Data Feeds.

API REFERENCE

Domain Intelligence

Reputation, detections and domain context.

POST/api/v1/domain/check
3 credits / check
REQUEST JSONRESPONSE JSONAuthentication

Domain Intelligence API

POST a JSON object containing your API key and a domain or subdomain. Use a domain name without a URL path. A leading www. is removed before the lookup: www.example.com checks example.com. Other subdomains are checked individually by default. The subject and domain fields contain the normalized requested name, even when a parent assessment is returned.

3 credits per successful check, including Unknown results. API errors do not consume credits.

curl -X POST 'https://inspector.gridinsoft.com/api/v1/domain/check' \
  -H 'Content-Type: application/json' \
  -d '{"apikey":"YOUR_PRIVATE_APIKEY","domain":"example.com"}'

Optional parent-domain fallback

Set parent_fallback to the JSON boolean true to use an existing parent assessment when the requested domain has none. The default is false; strings, numbers and null are not accepted for this parameter. The closest parent with an assessment wins, whether that assessment is Safe or a threat classification. For example, a.b.example.co.jp is checked first, then b.example.co.jp, then example.co.jp. The search stops at the registrable domain and never inherits from a public suffix such as com or co.jp. Unknown suffixes are checked exactly, without parent fallback.

This opt-in also permits a hosting provider's assessment: customer.cloudfront.net may return an assessment of cloudfront.net. That is context about the provider, not a direct assessment or guarantee about the customer's content. The source is always identified in assessment_domain.

curl -X POST 'https://inspector.gridinsoft.com/api/v1/domain/check' \
  -H 'Content-Type: application/json' \
  -d '{"apikey":"YOUR_PRIVATE_APIKEY","domain":"a.b.example.com","parent_fallback":true}'

The entire successful request still costs 3 credits, including all parent checks and Unknown results. No fresh analysis is guaranteed. Parent lookup has a shared 10-second analysis-service budget in addition to the original lookup; incomplete lookups return an error without a charge. An inherited assessment describes the parent, not a direct analysis of the requested subdomain. Use assessment_domain and assessment_match to retain that distinction in your reports.

Response fields

FieldMeaning
subject, domainThe normalized domain that was checked.
assessment_domainThe domain whose assessment supplied the result, or null for Unknown. A parent result keeps the requested subject and domain unchanged.
assessment_matchexact for an assessment of the normalized requested name, parent for an inherited assessment, or none when no assessment was found. With parent, all assessment fields (including date, score, whitelist status and report) refer to assessment_domain.
platformLocal service-directory context for the normalized requested domain, independent of its assessment. Contains matched, types, matched_suffix, provider and registry_version. Always present; unmatched domains have false, an empty types array, and null suffix/provider.
verdictA category such as Safe, Phishing, Adware Distributor or Unknown. Safe means an available assessment found no classified threat; it is not a guarantee of safety. Do not assume there are only three possible verdict strings.
data_availableBoolean. False means there is no usable assessment; it does not mean safe.
score, reputationAliases for the available reputation score (0–100, higher is better), or null. This is not a probability or confidence percentage.
categoryAvailable category identifier, or null. Zero is a valid category (Adult Content), not a missing value.
tagsAvailable category or behavior tags, or null.
dateDate of the available assessment, when known; otherwise null. A null date does not invalidate an available verdict or category. Use data_available to distinguish an assessment from no data. The date is not the time of this request.
fingerprintAvailable fingerprint value, or null.
whitelistedWhether the available assessment marks the domain as whitelisted.
reportAvailable report reference, or null.

Example: a classified domain

Illustrative response using a reserved example domain. This is a format example, not a finding about a real website.

{
  "subject": "download.example",
  "domain": "download.example",
  "assessment_domain": "download.example",
  "assessment_match": "exact",
  "verdict": "Unwanted Application Distributor",
  "data_available": true,
  "score": 15,
  "reputation": 15,
  "category": 8,
  "tags": null,
  "date": "2026-09-27 12:00:00",
  "fingerprint": null,
  "whitelisted": false,
  "report": null,
  "platform": {
    "matched": false,
    "types": [],
    "matched_suffix": null,
    "provider": null,
    "registry_version": "2026-10-26.5"
  }
}

Example: no analysis record

{
  "subject": "unknown.example",
  "domain": "unknown.example",
  "assessment_domain": null,
  "assessment_match": "none",
  "verdict": "Unknown",
  "data_available": false,
  "score": null,
  "reputation": null,
  "category": null,
  "tags": null,
  "date": null,
  "fingerprint": null,
  "whitelisted": false,
  "report": null,
  "platform": {
    "matched": false,
    "types": [],
    "matched_suffix": null,
    "provider": null,
    "registry_version": "2026-10-26.5"
  }
}

Handle Unknown separately from Safe. Optional context may be null even when a verdict is available. A missing verdict does not guarantee that a new analysis will be completed during the lookup.

Example: inherited assessment

{
  "subject": "a.b.example.com",
  "domain": "a.b.example.com",
  "assessment_domain": "example.com",
  "assessment_match": "parent",
  "verdict": "Safe",
  "data_available": true,
  "score": 95,
  "reputation": 95,
  "category": -1,
  "tags": null,
  "date": "2026-10-25 12:00:00",
  "fingerprint": null,
  "whitelisted": false,
  "report": null,
  "platform": {
    "matched": false,
    "types": [],
    "matched_suffix": null,
    "provider": null,
    "registry_version": "2026-10-26.5"
  }
}

Platform and service context

The platform object is included automatically, including for Unknown results and with parent fallback disabled. Matching uses complete DNS labels and the closest matching suffix. Provider may be null when only an infrastructure category is known. Registry entries describe a service association; they do not prove a hostname is active, its precise purpose, or that it is safe. They never change verdict, score, whitelist status, assessment availability or the 3-credit request cost. With parent fallback, platform still describes the requested hostname, not assessment_domain.

Inspector shows platform and service labels separately from the assessment. New history records save the platform snapshot and registry version at check time. Older records show Context not recorded; they are never silently reclassified as historical facts. History distinguishes a saved no-match result from missing context. Expand a history row to inspect the saved matched zone and registry version.

The directory covers provider domain families, including CDN, cloud hosting, SaaS, authentication and dynamic DNS platforms. New subdomains at any depth under a listed zone are recognized without adding individual hostnames. Curated provider records retain official source references and review dates. Matching is local and does not resolve CNAMEs; a customer-owned custom domain needs its own assessment or registry entry.

Types currently include hosted_tenant, hosting_provider, shared_infrastructure, customer_support, authentication, analytics, site_search, advertising, web_fonts, marketing_automation, error_monitoring, video_hosting and content_delivery. Multiple types can apply. Consumers should accept future types and registry versions.

Example of the platform field for a hostname under ada.support (service context only):

{
  "platform": {
    "matched": true,
    "types": ["customer_support"],
    "matched_suffix": "ada.support",
    "provider": "Ada",
    "registry_version": "2026-10-26.5"
  }
}

Errors and timing

Handle HTTP 400 (invalid input), 401 (authentication), 405 (method), 429 (insufficient credits), and 5xx errors. Response times vary; use timeouts and bounded retries for transient errors. Check your credit balance before retrying a 429 response.

Service coverage includes site search (Algolia, Coveo, Searchspring, Swiftype, Typesense, Doofinder), web fonts, video delivery and browser error monitoring. Specific service hostnames are used where a provider also operates unrelated services. Labels describe service context, not proof of activity or request contents.

API REFERENCE

URL Analysis

Page content, redirects and captured evidence.

POST/api/v1/url/scan
10 credits / check
REQUEST JSONRESPONSE JSONAuthentication

How to use?

You need to use the HTTP POST method, sending your data in the form of a JSON object within the body of the request.

POST https://inspector.gridinsoft.com/api/v1/url/scan

Each successful scan costs 10 credits. API errors do not consume credits.

Request:

Field Type Description
apikey String Your unique API key that authenticates requests to our services.
url String A full HTTP or HTTPS URL, including its path when relevant

Example:

You can use various tools or libraries to make this POST request. Here’s how you might typically do it using curl, a command-line tool:

curl -X POST 'https://inspector.gridinsoft.com/api/v1/url/scan' \
    -H 'Content-Type: application/json' \
    -d '{
    "apikey": "YOUR_PRIVATE_APIKEY",
    "url": "https://example.com/path"
    }'

Response:

The JSON response has metadata, security and analysis blocks. Individual fields can be null or empty when information could not be obtained; a missing finding is not a guarantee of safety.

Field Type Description
url String The input URL that was analyzed.
metadata Object Basic information about the page, including title, description, language, and categories.
security Object Critical security indicators:
  • verdict: Available assessment object from Gridinsoft, or null.
  • effective_url: Final destination after all redirects.
  • redirect_chain: Available redirect information.
  • antiviruses_detection: Aggregated detection stats from multiple engines.
  • dns_records: Available DNS records; not a complete DNS history.
  • certificate: Detailed SSL/TLS info (SANs, validity, issuer).
  • jarm & reputation: Advanced technical fingerprints and scores.
analysis Object Additional captured analysis. Available for paid users only; this block is null on the free plan. Individual artifacts may be absent.
  • screenshots: Visual captures (PC & Mobile).
  • network_requests: Captured network request data, when available.
  • cookies & console_logs: Browser environment details.
  • urls_in_html: Available links extracted from the page source.

Response example

Illustrative excerpt using example.com; fields not shown are omitted for readability.

{
  "url": "https://example.com/path",
  "metadata": {"title": "Example page", "description": "", "categories": [], "language": "en"},
  "security": {"effective_url": "https://example.com/path", "redirect_chain": null, "verdict": null},
  "analysis": null
}

A null verdict is unavailable evidence, not a clean verdict. The analysis block is null on a free plan. On paid plans, inspect each artifact for availability before using it.

Allow for variable response times. A full scan can take several seconds or longer; handle HTTP errors and timeouts in your client.

API REFERENCE

File Analysis

Malware detections and file metadata.

POST/api/v1/file/check
5 credits / check
REQUEST Multipart formRESPONSE JSONAuthentication

How to use?

You need to use the POST request with the file data and your API key. The request should be formatted as 'multipart/form-data'.

POST https://inspector.gridinsoft.com/api/v1/file/check

Each successful check costs 5 credits. API errors do not consume credits.

Request:

Field Type Description
apikey String Your unique API key that authenticates requests to our services.
file File The file to be checked, uploaded as multipart/form-data.

Example:

curl -X POST https://inspector.gridinsoft.com/api/v1/file/check \
     -H 'Content-Type: multipart/form-data' \
     -F 'apikey=YOUR_PRIVATE_APIKEY' \
     -F 'file=@/path/to/your/file'

Response:

Field Type Description
sha256 String SHA-256 hash of the file.
md5 String MD5 hash of the file.
filename String Name of the file.
size Integer Size of the file in bytes.
detection String Detection label, or Clean when no detection was returned. Clean is not a guarantee that a file is safe.
type String Available PE identification signatures, or null.
heuristic Object Contains malicious and harmless flags for this result. Available detailed criteria appear in heuristic.analysis on Premium; otherwise that field is null.
PE Object PE data in an executable (EXE) file refers to the Portable Executable format, which is a file format for executables, object code, DLLs, FON Font files, and others used in 32-bit and 64-bit versions of Windows operating systems. Available PE data is included on paid plans; it may be null when not applicable or unavailable.
API REFERENCE

Email Validation

Address format, domain and mailbox signals.

POST/api/v1/email/check
2 credits / check
REQUEST JSONRESPONSE JSONAuthentication

How to use?

You need to use the HTTP POST method, sending your data in the form of a JSON object within the body of the request.

POST https://inspector.gridinsoft.com/api/v1/email/check

Each successful check costs 2 credits, including inconclusive results. API errors do not consume credits.

Request:

Field Type Description
apikey String Your unique API key that authenticates requests to our services.
email String The email address you want to validate.

Example:

You can use various tools or libraries to make this POST request. Here's how you might typically do it using curl, a command-line tool:

curl -X POST 'https://inspector.gridinsoft.com/api/v1/email/check' \
    -H 'Content-Type: application/json' \
    -d '{
    "apikey": "YOUR_PRIVATE_APIKEY",
    "email": "[email protected]"
    }'

Response:

Field Type Description
verdict String Validation result: "VALID", "INVALID", "NON_EXISTENT", "RISKY", or "UNKNOWN".
message String Human-readable description of the validation result.
checks Object Detailed checks; account can be null when the SMTP result is inconclusive.
checks.format Boolean Whether the email has a valid format.
checks.service Boolean Whether the domain exists and has MX records.
checks.account Boolean or null SMTP recipient result: true for accepted, false for rejected, null for inconclusive. Acceptance does not prove the mailbox exists or that delivery will succeed.
checks.disposable Boolean Whether the email domain is a known disposable/temporary email provider.
checks.spam Boolean Whether the domain is listed in spam blacklists (DNSBL).
mx_records Array List of MX servers found for the email domain.
account_statusStringaccepted, rejected or unknown when an SMTP check is performed. Can be absent for early validation failures.
details Array SMTP conversation details for debugging purposes.

Example: inconclusive mailbox check

Illustrative response excerpt. A server timeout or policy restriction must not be interpreted as a nonexistent mailbox.

{
  "verdict": "UNKNOWN",
  "account_status": "unknown",
  "checks": {
    "format": true,
    "service": true,
    "account": null,
    "disposable": false,
    "spam": false
  }
}

Catch-all servers may accept recipients that do not have individual mailboxes. Use address confirmation when proof of ownership or deliverability is required.

API REFERENCE

Domain Search

Find domain records by name, detection or context.

GET / POST/api/v1/domain/search
5 credits / search
REQUEST Query / form fieldsRESPONSE JSONAuthentication

Domain Search API

Search existing domain records with GET query parameters or POST form fields. For POST, use application/x-www-form-urlencoded, not a JSON body.

GET / POST https://inspector.gridinsoft.com/api/v1/domain/search

5 credits per completed request, including each results page and searches with no matches. Requests rejected before the search completes do not consume credits.

Request parameters

Field Type Required Description
apikey String Yes Your unique API key that authenticates requests to our services.
q String Yes* (for simple search) 3–255 characters. Matches a domain, report identifier or IP prefix, or an exact fingerprint. Does not search tags or page descriptions.
domain String No* (for advanced search) Domain or host prefix, such as login. A leading dot selects a domain suffix, such as .com or .co.uk. Add domain_exact=1 for an exact match.
detect String No* (for advanced search) Detection label prefix, such as Phishing or Scam Website. Add detect_exact=1 for an exact match.
category String No* (for advanced search) Legacy alias for detection-label matching, not a numeric category ID. Use detect in new integrations. Supports category_exact=1.
tags String No* (for advanced search) Prefix of the stored tags value. tags_exact=1 compares the entire stored value; this is not an individual-tag membership check.
fingerprint String No* (for advanced search) Exact fingerprint value. Matching is always exact; fingerprint_exact does not enable pattern matching.
hosts String No* (for advanced search) Stored host or IP prefix. Add hosts_exact=1 for an exact match.
p Integer No Page number starting at 1. Defaults to 1; bounded by your plan.
limit Integer No Requested rows per page. Defaults to 10; bounded by your plan.

* Supply either q or at least one advanced field: domain, detect, category, tags, fingerprint or hosts. Advanced values are limited to 255 characters. All parameters must be scalar values, not arrays or objects.

Matching rules

Advanced filters are combined with AND. When an advanced field is supplied, it takes precedence over q. Exact-match flags accept 1 or true; fingerprint matching is always exact.

Text filters use a prefix. The domain filter also supports a suffix when the value starts with a dot: domain=.com selects domains ending in .com, and domain=.xyz selects domains ending in .xyz. This suffix is literal, including the dot boundary; .com does not match .company or .com.example. The exact-match flag takes precedence over suffix matching.

Simple search lowercases the query and removes an HTTP(S) scheme, path, query string and fragment before matching. Results are ordered by their database update time, newest first. Searching reads existing records; it does not start a new scan.

Pagination and credits

PlanRows per pagePage access
Free10Page 1 only.
Basic1–10Pages 1–2.
Standard1–10Pages 1–3.
Premium1–50No plan-based page cap; the simple-search offset limit below still applies.

Read the returned p and limit: requests outside your plan's range are clamped. Every completed page request costs 5 credits.

Simple search has a database offset limit of 500. Keep (p - 1) × limit <= 500; a higher request repeats the final offset even if the response still echoes a higher p. Narrow the search instead of continuing beyond that offset.

total is a bounded count: 1001 means more than 1,000 matches, not an exact total. Advanced-search counts can be cached for up to 10 minutes. Removed reports are filtered after row selection, so a page can contain fewer than limit records and the count can include records not shown.

Examples

Simple search with GET

curl --get 'https://inspector.gridinsoft.com/api/v1/domain/search' \
  --data-urlencode 'apikey=YOUR_PRIVATE_APIKEY' \
  --data-urlencode 'q=example' \
  --data-urlencode 'p=1' \
  --data-urlencode 'limit=10' \
  -H 'Accept: application/json'

Combined filters with POST

curl -X POST 'https://inspector.gridinsoft.com/api/v1/domain/search' \
  --data-urlencode 'apikey=YOUR_PRIVATE_APIKEY' \
  --data-urlencode 'detect=Phishing' \
  --data-urlencode 'detect_exact=1' \
  --data-urlencode 'domain=login' \
  --data-urlencode 'p=1' \
  --data-urlencode 'limit=10' \
  -H 'Accept: application/json'

cURL sets the form content type automatically. This example combines an exact Phishing detection label with a domain or host starting with login.

Response

Response envelope

Field Type Description
search_typeStringType of search performed ("simple" or "advanced").
qStringTrimmed input query. Present for simple search only.
paramsObjectApplied filters, with supplied exact-match flags normalized to booleans. Present for advanced search only.
pIntegerPage number after plan limits are applied. See the separate simple-search offset limit above.
limitIntegerPage size after plan limits are applied.
totalIntegerBounded matching-row count. A value of 1001 means more than 1,000 matches.
resultsArrayDomain records. An empty array is a valid completed search.

Domain record fields

Field Type Description
domainStringThe domain name.
dateString / nullLast database update time, not the search request time or a guarantee of a fresh scan.
verdictStringCategory label, such as Safe, Phishing, Scam Website, Suspicious Website or Browser Notification Spam. Unknown means no category is available.
categoryInteger / nullCategory ID behind the verdict. For example, 7 is Phishing and 0 is Adult Content; zero is not a safe verdict.
reputationInteger / nullReputation score from 0 to 100; higher is safer. This is not a detection-confidence score.
fingerprintStringStored fingerprint value.
reportStringLink to the public domain report.
hostingObjectAvailable hosting context, such as IP, provider and location.
whoisObjectAvailable registration data, such as registrar and registration dates.
siteObjectAvailable website metadata and tags.

Optional context can be absent, empty or null. The Search record schema differs from the Domain Check response. Interpret the verdict and category independently of whether WHOIS or site metadata is available.

Simple search response

A completed search with no matches:

{
    "search_type": "simple",
    "q": "unknown.example",
    "results": [],
    "p": 1,
    "limit": 10,
    "total": 0
}

Advanced search response

Illustrative response excerpt using a reserved example domain; additional record fields are omitted. Advanced search replaces q with params.

{
    "search_type": "advanced",
    "params": {
        "detect": "Phishing",
        "detect_exact": true,
        "domain": "login"
    },
    "results": [
        {
            "domain": "login-check.example",
            "date": "2026-10-25 12:00:00",
            "verdict": "Phishing",
            "category": 7,
            "reputation": 5
        }
    ],
    "p": 1,
    "limit": 10,
    "total": 1
}
INTEGRATION

Errors & credits.

Handle the HTTP status, read the response, and retain the request reference when you need support.

HTTP status codes

StatusWhat to do
400Check required fields, JSON syntax and the input format. Correct the request before retrying.
401Check the API key and where it is sent. See Authentication.
405Use the endpoint’s documented HTTP method.
413The uploaded file exceeds the permitted size. Review the File Analysis reference.
429The account has insufficient credits for this operation. Review the balance and allowance date; repeated retries will not add credits.
500 / 502 / 504Processing failed, or the analysis service was unavailable or timed out. Use bounded retries with backoff.

Error response

Errors use an HTTP error status and a JSON object with error and message.

{
  "error": "Invalid API key",
  "message": "Invalid API key"
}

HTTP 200 with data_available: false is a completed domain lookup with an Unknown assessment, not an API error.

Credit accounting

Charges apply to completed checks and searches, including Unknown domain results. HTTP API errors do not consume credits. Each search results page is a separate operation. All endpoints share your account balance.

After a lost connection, check your balance and request history before retrying: a completed request might already have consumed credits.

Response headers

HeaderMeaning
X-Inspector-Credits-RemainingRemaining credits after a completed paid operation.
X-Inspector-Request-IDReference for support correlation when a product API request reaches the application. Save it with the HTTP status.

A gateway response or lost connection may prevent these headers from arriving.

INTEGRATION

Choose your integration path.

Individual checks, bulk intelligence or an agreement for your product.

API subscriptions

Use public API plans for regular checks. Compare plans and estimate your monthly usage.

Domain data feeds

For local bulk matching against your events, logs and indicators, use domain data feeds under a separate licence.

Commercial and private processing

Discuss a customer-facing service, redistribution or confidential processing through a commercial evaluation.

API subscriptions use our standard terms. Paying for a plan does not make submissions private or remove our rights to use and publish analysis. Private processing, customer-facing services, redistribution, and other special rights require written agreement. Discuss your requirements.

Your privacy choices. Essential storage supports your account. Optional analytics helps us improve public product pages. Privacy details