Validate HTML
web.validate_html
Overview
You send HTML you already hold, inline or as a file reference. A disposable Java child runs the pinned Nu Html Checker with a fixed argument vector and returns normalized syntax diagnostics. Markup is accepted only through stdin; URL mode, schema paths, filter files and arbitrary flags are not exposed. A match against the checker is not an accessibility, rendering or live-site guarantee. A successful call costs 2 execution credits. Accepts file input via file_ref — no need to extract file content first.
HTML syntax can be checked mechanically with a pinned checker; fetching a live page would change the privacy and availability model.
Reliability
VNU_JAR_UNAVAILABLE — trigger: pinned jar missing or digest mismatch; retryable: yes after the image is repaired; next: do not send a URL. VNU_CAPACITY_EXCEEDED — trigger: all checker slots busy; retryable: yes with backoff. VNU_EXECUTION_TIMEOUT — trigger: the child did not finish in 8 seconds; retryable: yes, bounded. VNU_OUTPUT_TOO_LARGE — trigger: checker stdout exceeded 2 MiB; retryable: no, reduce the document. VNU_EXECUTION_FAILED — trigger: the child exited without usable JSON; retryable: no unless the pin is restored.
Context footprint
Diagnostics only; document text and host paths are not returned. A successful call costs 2 execution credits.
When to use it
When markup is already in hand and the need is Nu Html Checker syntax diagnostics, not rendering or sanitizing.
When the page still needs fetching, when scripts must run, or when the goal is XSS cleaning rather than syntax.
Powered by the pinned Nu Html Checker vnu.jar 26.8.23 (9b5b796) running as an isolated Java child. MIT license plus bundled notices ship with the pin.
Scope
Non-goals
- Does not test accessibility
- Does not load, render or execute the document
- Does not follow links, images or other resources
- Does not fetch a URL or download a checker update
Properties
Capabilities
Cost & billing
Flat rate per invocation
File handling
File limits
Constraints this skill applies to your input and generated files. The “Limited by” column shows the static source of each cap; none of these can be raised by upgrading your plan.
| Limit | Value | Limited by |
|---|---|---|
| Maximum size per input file | 5 MiB | Skill maximum |
How we handle your data
What this means
This skill may receive sensitive content, but it does not target sensitive data and returns only a structured non-sensitive result.
Squillify guarantees
- Runs inside Squillify
- This skill runs inside Squillify.
- Payloads are not sent to an external service by this skill.
- Squillify does not permanently store submitted payloads.
- Telemetry records metadata only, not submitted content.
- Submitted payloads are not used for training.
- Submitted payloads are not reviewed by humans.
- This skill does not target sensitive data.
- The response does not contain submitted content.
Your responsibility
Squillify does not determine whether submitted content is sensitive. Your application is responsible for deciding what data it is allowed to submit. Your application is responsible for securing the response.
Input schema
| Field | Type | Required | Description |
|---|---|---|---|
| html | string | No | HTML markup sent inline. Required unless file_ref is supplied instead. |
| file_ref | string | No | Tenant-scoped opaque file reference to HTML already uploaded. Omit it when the html field is supplied instead. |
| documentMode | string | No | HTML or XHTML. Omit it for HTML. |
| includeWarnings | boolean | No | Whether warning-severity checker notes are returned. Omit it for true. |
| checkEmbeddedCss | boolean | No | Must stay false; embedded CSS checking is not exposed in this version. |
| maxDiagnostics | integer | No | Maximum diagnostics to return; runtime accepts at most 500. |
Output schema
| Field | Type | Required | Description |
|---|---|---|---|
| valid | boolean | Yes | True when no ERROR-severity diagnostic remains after filtering. |
| title | string | No | Collapsed title element text when present. |
| lang | string | No | html lang attribute when present. |
| doctype | string | No | Collapsed DOCTYPE payload when present. |
| documentMode | string | Yes | HTML or XHTML mode that was applied. |
| includeWarnings | boolean | Yes | Whether warnings were requested for this call. |
| checkerVersion | string | Yes | Pinned Nu Html Checker version string reported by the child. |
| checkerCommit | string | Yes | Frozen upstream git commit of the pinned vnu.jar. |
| diagnostics | array | Yes | Deterministically ordered diagnostics, 0 through 500 entries, with no host paths or raw extracts. |
| truncated | boolean | Yes | True when more diagnostics existed than maxDiagnostics. |
API contract
POST /v1/executecurl -sS -X POST "$BASE/v1/execute" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"skillKey":"web.validate_html","input":{"html":"<!DOCTYPE html><html lang=\"en\"><head><title>Hi</title></head><body><p>Hello</p></body></html>"}}'import { Squillify } from "@squillify/sdk";
const sq = new Squillify({ apiKey: process.env.SQUILLIFY_API_KEY });
const { output } = await sq.execute("web.validate_html", {"html":"<!DOCTYPE html><html lang=\"en\"><head><title>Hi</title></head><body><p>Hello</p></body></html>"});Errors
| Code | HTTP | Retryable | Description |
|---|---|---|---|
| VALIDATION_ERROR | 400 | No | The request payload failed schema validation. |
| UNAUTHORIZED | 401 | No | Missing or invalid API key. |
| SKILL_NOT_ACCESSIBLE | 403 | No | The API key is not granted access to this skill. |
| SKILL_NOT_AVAILABLE_FOR_PLAN | 403 | No | This skill is not included in your current plan. |
| PLAN_ELIGIBILITY_UNAVAILABLE | 503 | Yes | Plan eligibility could not be decided. Retry after backoff. |
| SKILL_NOT_FOUND | 404 | No | The requested skill or version does not exist. |
| TENANT_RATE_LIMITED | 429 | Yes | Request rate limit exceeded. Retry after backoff. |
| QUOTA_EXCEEDED | 429 | Yes | Plan quota exhausted. Retryable once the quota period resets. |
| EXECUTION_TIMEOUT | 504 | Yes | Execution exceeded the allowed time budget. |
| VNU_JAR_UNAVAILABLE | 503 | Yes | A dependency required by this skill is unavailable. |
| VNU_CAPACITY_EXCEEDED | 429 | Yes | A size, quota, rate, or time limit was exceeded. |
| VNU_EXECUTION_TIMEOUT | 503 | Yes | A dependency required by this skill is unavailable. |
| VNU_OUTPUT_TOO_LARGE | 429 | No | A size, quota, rate, or time limit was exceeded. |
| VNU_EXECUTION_FAILED | 503 | No | A dependency required by this skill is unavailable. |
Other limits
| Limit | Value |
|---|---|
| Recommended inline bytes | 32 KiB |
Limitations
- Does not test accessibility
- Does not load, render or execute the document
- Does not follow links, images or other resources
- Does not fetch a URL or download a checker update
- Accessibility audits
- Live page fetching
- XSS cleaning, which web.sanitize_html handles
How to call
POST /v1/execute (requires authentication)
{
"skillKey": "web.validate_html",
"input": {
"html": "<!DOCTYPE html><html lang=\"en\"><head><title>Hi</title></head><body><p>Hello</p></body></html>"
}
}Examples
A complete HTML5 document has no checker errors
{
"html": "<!DOCTYPE html><html lang=\"en\"><head><title>Hi</title></head><body><p>Hello</p></body></html>"
}{
"truncated": false,
"diagnostics": [],
"doctype": "html",
"title": "Hi",
"lang": "en",
"checkerVersion": "26.8.23 (9b5b796)",
"documentMode": "HTML",
"checkerCommit": "9b5b796640803ad85a3d3a9d1cb1825acf092672",
"includeWarnings": true,
"valid": true
}A fragment without a doctype is reported as invalid
{
"html": "<html><p>Hi</p></html>"
}{
"includeWarnings": true,
"checkerCommit": "9b5b796640803ad85a3d3a9d1cb1825acf092672",
"truncated": false,
"valid": false,
"diagnostics": [
{
"code": "HTML_97fae2f3b03f87e1",
"severity": "ERROR",
"message": "Start tag seen without seeing a doctype first. Expected \"<!DOCTYPE html>\".",
"path": "document",
"source": "nu-html-checker",
"location": {
"line": 1,
"column": 1,
"endLine": 1,
"endColumn": 6
}
},
{
"code": "HTML_495d1a0aad76488d",
"severity": "WARNING",
"message": "Consider adding a \"lang\" attribute to the \"html\" start tag to declare the language of this document.",
"path": "document",
"source": "nu-html-checker",
"location": {
"line": 1,
"column": 1,
"endLine": 1,
"endColumn": 6
}
},
{
"code": "HTML_c441d85bf090bb73",
"severity": "ERROR",
"message": "Element \"head\" is missing a required instance of child element \"title\".",
"path": "document",
"source": "nu-html-checker",
"location": {
"line": 1,
"column": 7,
"endLine": 1,
"endColumn": 9
}
}
],
"checkerVersion": "26.8.23 (9b5b796)",
"documentMode": "HTML"
}Recommended use cases
- Check a saved HTML5 document for syntax errors before publishing
- Collect checker warnings on an XHTML snapshot without opening a browser
Avoid for
- Accessibility audits
- Live page fetching
- XSS cleaning, which web.sanitize_html handles
Related skills
Composable with
Safety & privacy
- Runs without calling any external service.
- Your payloads are never stored permanently.
- Telemetry captures metadata only — never your payload contents.
- We never train models on your payloads.
- No human reviews your payloads.