> For the complete documentation index, see [llms.txt](https://docs.visualsentinel.com/llms.txt)

# Tools API

Free public website checking tools. This page lists all 4 endpoints in the Tools area of the Visual Sentinel REST API.

Base URL: `https://visualsentinel.com`. Unless an endpoint says otherwise it accepts an API key or a session cookie, see [Authentication](https://docs.visualsentinel.com/guides/authentication.md). Most error responses use the [ErrorResponse](https://docs.visualsentinel.com/reference/models/error-response.md) shape, see [Errors](https://docs.visualsentinel.com/guides/errors.md) and [Rate limits](https://docs.visualsentinel.com/guides/rate-limits.md).

## Endpoints

- [Website health check](#website-check): `GET /api/tools/website-check`
- [SSL certificate check](#ssl-check): `GET /api/tools/ssl-check`
- [DNS lookup tool](#dns-check): `GET /api/tools/dns-check`
- [Website speed test](#speed-test): `GET /api/tools/speed-test`

## Website health check

`GET /api/tools/website-check`

Free tool to check whether a website responds, from each check region, with its response time and certificate. Rate limited to 10 requests/minute per IP. With visual=1 it also tries one homepage screenshot (3 per 10 minutes per IP).

Authentication: no session or API key needed.

**Parameters**

- `url` (query, string, required): URL to check (https:// prefix added if missing)
- `visual` (query, string, optional): Also capture one homepage screenshot (the address is reduced to its origin). One of: `1`.

**Responses**

- `200`: Website check results. Body: object.
- `400`: The address cannot be checked: missing, not a valid URL, or not a public http/https address. Body: object.
- `422`: The site could not be checked: its name does not resolve (not_found, with lookup and an optional suggestion), or its bot protection blocked the check in every region, answering each with a verification page (bot_protection). Body: object.
- `429`: Rate limit exceeded. Retry-After gives the seconds to wait. Body: object.
- `503`: Our checker could not finish this check (check_error). Nothing is known about the site. Body: object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string | No |   |
| `status` | string | No | One of: `UP`, `DEGRADED`, `DOWN`. |
| `responseTime` | integer or null | No |   |
| `statusCode` | integer or null | No |   |
| `sslValid` | boolean or null | No |   |
| `sslDaysRemaining` | integer or null | No |   |
| `sslIssuer` | string or null | No |   |
| `dnsTime` | integer or null | No |   |
| `regions` | array of object | No |   |
| `regions[].region` | string | No |   |
| `regions[].status` | string | No | One of: `UP`, `DOWN`. |
| `regions[].responseTime` | integer or null | No |   |
| `regions[].statusCode` | integer or null | No |   |
| `regions[].error` | string or null | No |   |
| `checkedAt` | string (date-time) | No |   |
| `screenshot` | string or null | No | visual=1 only: a data URL, or null when no screenshot was taken. |
| `screenshotUnavailable` | boolean | No | visual=1 only: screenshots are switched off for now. |
| `screenshotBlocked` | string | No | visual=1 only: the site's bot protection showed a verification page instead of the site. One of: `bot_protection`. |
| `screenshotLimited` | boolean | No | visual=1 only: this caller reached the screenshot limit. |

## SSL certificate check

`GET /api/tools/ssl-check`

Free tool to check SSL certificate validity, expiration, and chain details.

Authentication: no session or API key needed.

**Parameters**

- `domain` (query, string, required): Host name, optionally with an https:// prefix or a :port, for example `example.com` or `example.com:8443`.

**Responses**

- `200`: SSL certificate details.
- `429`: Rate limit exceeded.

## DNS lookup tool

`GET /api/tools/dns-check`

Free tool to check DNS records (A, AAAA, MX, NS, TXT, CNAME, SOA).

Authentication: no session or API key needed.

**Parameters**

- `domain` (query, string, required)
- `type` (query, string, optional): Record type. Case-insensitive. One of: `A`, `AAAA`, `MX`, `CNAME`, `TXT`, `NS`, `SOA`, `ALL`. Default: `ALL`.

**Responses**

- `200`: DNS records.
- `429`: Rate limit exceeded.

## Website speed test

`GET /api/tools/speed-test`

Free tool to test website loading speed and performance metrics.

Authentication: no session or API key needed.

**Parameters**

- `url` (query, string, required)

**Responses**

- `200`: Speed test results.
- `429`: Rate limit exceeded.
- `503`: The test did not run. `SPEED_TEST_SERVICE_BUSY`: the testing service was busy, rate limited or timed out (not a problem with the page); a `Retry-After` header is sent, try again in a few minutes. `PAGE_NOT_TESTABLE`: the page could not be loaded for testing. `SPEED_TEST_UNAVAILABLE` and `SPEED_TEST_FAILED`: the speed test is unavailable on our side. Failures are sent with `Cache-Control: no-store`.

Generated from the OpenAPI 3.1 specification at [https://docs.visualsentinel.com/openapi.json](https://docs.visualsentinel.com/openapi.json), the same file the interactive reference reads.
