Analyze URL SSRF Risk
security.check_url_safety
Overview
You pass a URL string; we lexically classify disallowed schemes, embedded credentials, IP literals (including decimal/octal/hex and IPv4-mapped IPv6), private/loopback/link-local targets, cloud metadata endpoints, internal hostnames, and control-character obfuscation. We never perform DNS resolution, never fetch the URL, and never follow redirects. A policy-clean result means no lexical finding fired — it does not certify the resolved target is safe. Do not use this as your sole SSRF control or for reachability checks.
Agents must not blindly pass user- or model-supplied URLs to fetchers — you need a fast lexical preflight before any network call.
Reliability
VERIFIABLE and deterministic for a given URL and policy. Lexical classification only — safe does not mean reachable or permanently safe. Input validation (not retryable): missing url; url exceeds maximum length; empty allowedSchemes array.
Context footprint
Structured findings replace ad-hoc URL reasoning. A successful call costs 1 execution credit.
When to use it
Before any URL is fetched or forwarded to an internal service.
To confirm reachability — we never touch the network. Not as the sole SSRF control — re-check the resolved IP at fetch time.
Scope
Non-goals
- Does not perform DNS resolution
- Does not fetch the URL
- Does not follow redirects
- Does not assert absolute safety — a policy-clean URL can still resolve to an unsafe target via DNS rebinding, redirects, or TOCTOU; enforce SSRF at fetch time
Properties
Capabilities
Cost & billing
Flat rate per invocation
File handling
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 |
|---|---|---|---|
| url | string | Yes | URL string to classify without fetching. |
| allowedSchemes | array | No | From 1 through 32 accepted schemes; omit it for http and https. |
| blockPrivateNetworks | boolean | No | Whether private targets are high severity; omit it for true. |
| blockCredentials | boolean | No | Whether embedded credentials are high severity; omit it for true. |
| blockIpLiterals | boolean | No | Whether every IP literal is flagged; omit it for false. |
| normalizeIdna | boolean | No | Whether hostnames are IDNA-normalized; omit it for true. |
Output schema
| Field | Type | Required | Description |
|---|---|---|---|
| safe | boolean | Yes | Whether no high or critical finding exists. |
| riskLevel | string | Yes | Worst lexical finding severity. |
| normalized | object | Yes | Closed lexical URL parse receipt with scheme, host, port, path, and asciiHost. |
| findings | array | Yes | From 0 through 32 bounded lexical findings, each with a stable code, severity, and safe message. |
API contract
POST /v1/executecurl -sS -X POST "$BASE/v1/execute" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"skillKey":"security.check_url_safety","input":{"url":"https://example.com"}}'import { Squillify } from "@squillify/sdk";
const sq = new Squillify({ apiKey: process.env.SQUILLIFY_API_KEY });
const { output } = await sq.execute("security.check_url_safety", {"url":"http://169.254.169.254/latest/meta-data"});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. |
Other limits
| Limit | Value |
|---|---|
| Recommended inline bytes | 32 KiB |
Limitations
- Does not perform DNS resolution
- Does not fetch the URL
- Does not follow redirects
- Does not assert absolute safety — a policy-clean URL can still resolve to an unsafe target via DNS rebinding, redirects, or TOCTOU; enforce SSRF at fetch time
- Verifying that a URL is reachable (requires network)
How to call
POST /v1/execute (requires authentication)
{
"skillKey": "security.check_url_safety",
"input": {
"url": "http://169.254.169.254/latest/meta-data"
}
}Examples
Cloud metadata endpoint blocked
{
"url": "http://169.254.169.254/latest/meta-data"
}{
"safe": false,
"riskLevel": "critical",
"normalized": {
"asciiHost": "169.254.169.254",
"host": "169.254.169.254",
"path": "/latest/meta-data",
"scheme": "http",
"port": -1
},
"findings": [
{
"code": "CLOUD_METADATA_ENDPOINT",
"severity": "critical",
"message": "Host targets a cloud metadata endpoint."
}
]
}Public HTTPS URL with no findings
{
"url": "https://example.com/path"
}{
"safe": true,
"riskLevel": "low",
"normalized": {
"asciiHost": "example.com",
"host": "example.com",
"path": "/path",
"scheme": "https",
"port": -1
},
"findings": []
}Recommended use cases
- Preflight a URL before handing it to a fetcher
- Block SSRF targets from user- or model-supplied URLs
Avoid for
- Verifying that a URL is reachable (requires network)
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.