The definitive self-hosted URL shortener
Full LLM thinking from the 4-phase benchmark pipeline.
{
"service_type": "defi_protocol",
"base_url": "https://shlink.io",
"auth_method": "none",
"auth_config": {},
"endpoints": [],
"pricing_model": {
"type": "free",
"details": {
"note": "Self-hosted open source URL shortener; not a DeFi protocol."
}
},
"rate_limits": {},
"capabilities": [],
"defi_specifics": {
"chains": [],
"protocols": [],
"yield_types": [],
"has_tvl_data": false,
"has_apy_data": false,
"has_price_feeds": false,
"contract_verified": false
}
}{
"tests": [
{
"name": "connectivity_root",
"endpoint": "/",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Website homepage / landing page loads successfully",
"metrics": ["latency", "status_code"],
"validation": {"field": "response_body", "type": "string", "min_length": 1}
},
{
"name": "docs_page_accessible",
"endpoint": "/documentation/",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Documentation page for Shlink is reachable and returns HTML content",
"metrics": ["latency", "status_code"],
"validation": {"field": "response_body", "type": "string", "min_length": 1}
},
{
"name": "rest_api_health_or_shorten",
"endpoint": "/rest/v3/short-urls",
"method": "GET",
"headers": {"Accept": "application/json"},
"payload": null,
"expected_status": 401,
"intent": "auth",
"expected_behavior": "Shlink REST API requires an X-Api-Key header; missing auth should return 401 rather than 200 or 500",
"metrics": ["status_code"],
"validation": {"field": "status", "type": "integer", "min_length": null}
},
{
"name": "create_short_url_missing_payload",
"endpoint": "/rest/v3/short-urls",
"method": "POST",
"headers": {"Content-Type": "application/json", "Accept": "application/json"},
"payload": {},
"expected_status": 400,
"intent": "validation",
"expected_behavior": "Rejects a POST with no body / missing longUrl with a structured 4xx error, not a 5xx",
"metrics": ["status_code", "accuracy"],
"validation": {"field": "error", "type": "string", "min_length": 1}
},
{
"name": "unknown_route_returns_404",
"endpoint": "/rest/v3/this-endpoint-does-not-exist",
"method": "GET",
"headers": {"Accept": "application/json"},
"payload": null,
"expected_status": 404,
"intent": "validation",
"expected_behavior": "Unknown REST path returns 404 with a structured error body rather than 5xx or a 200 web page",
"metrics": ["status_code"],
"validation": {"field": "error", "type": "string", "min_length": 1}
},
{
"name": "pricing_tokens_not_applicable",
"endpoint": "/rest/v3/short-urls",
"method": "GET",
"headers": {"Accept": "application/json"},
"payload": null,
"expected_status": 401,
"intent": "auth",
"expected_behavior": "Confirms service is a free self-hosted URL shortener with no token-usage headers or pricing metadata; no usage/price fields expected in response",
"metrics": ["status_code", "accuracy"],
"validation": {"field": "response_headers", "type": "object", "min_length": null}
},
{
"name": "stress_rest_read_smoke",
"endpoint": "/rest/v3/short-urls",
"method": "GET",
"headers": {"Accept": "application/json"},
"payload": null,
"expected_status": 401,
"intent": "stress",
"expected_behavior": "Unauthenticated GETs stay fast and consistently 401 under low concurrency; no 429s or 5xxs within default limits",
"metrics": ["latency", "status_code"],
"validation": {"field": "status", "type": "integer", "min_length": null}
}
],
"pricing_probes": [
{
"name": "verify_free_no_usage_headers",
"description": "Shlink is free/self-hosted; verify that no token-usage or billing headers/trailers are returned on a REST call",
"endpoint": "/rest/v3/short-urls",
"method": "GET",
"payload": null,
"check": "response.headers must NOT contain usage/pricing fields (e.g. x-usage, x-token-count, x-price). Any such header would contradict the declared 'free' pricing model."
},
{
"name": "rate_limit_disclosure_check",
"description": "Check for rate-limit disclosure headers since rate_limits is empty in the analysis; absence confirms undocumented/none",
"endpoint": "/rest/v3/short-urls",
"method": "GET",
"payload": null,
"check": "Inspect for x-ratelimit-* / retry-after headers. If present, record values; if absent, treat as no declared rate limit and avoid exceeding 5 concurrent requests."
}
],
"stress_profile": {
"concurrent_requests": 5,
"duration_seconds": 10,
"ramp_up": true
}
}3/8 tests passed
| Test | Endpoint | Status | Latency |
|---|---|---|---|
| connectivity_root | GET / | 200 | 151ms |
| docs_page_accessible | GET /documentation/ | 200 | 124ms |
| rest_api_health_or_shorten | GET /rest/v3/short-urls | 404 | 123ms |
| create_short_url_missing_payload | POST /rest/v3/short-urls | 404 | 121ms |
| unknown_route_returns_404 | GET /rest/v3/this-endpoint-does-not-exist | 404 | 125ms |
| pricing_tokens_not_applicable | GET /rest/v3/short-urls | 404 | 111ms |
| stress_rest_read_smoke | GET /rest/v3/short-urls | 404 | 120ms |
| defillama_tvl_crossref | GET https://api.llama.fi/protocols | 200 | 0ms |
{
"overall": 12,
"dimensions": {
"token_efficiency": 0.0,
"first_try_success": 0.0,
"response_parseability": 0.0,
"error_clarity": 4.0,
"doc_quality": 1.0,
"auth_simplicity": 8.0,
"latency": 8.0,
"consistency": 3.0
},
"pricing_normalized": {
"cost_per_1k_requests": null,
"free_tier_requests": null
},
"issues": [
"FUNDAMENTAL MISMATCH: The target was benchmarked as a DeFi protocol, but every endpoint returns HTML for 'Shlink — The URL shortener', an unrelated PHP URL-shortening application. This service has zero DeFi capability.",
"No DeFi endpoints exist: no yield/APY, no staking, no TVL, no pool, no token price endpoints were reachable. All 'short-url' REST paths returned 404 HTML.",
"Response parseability is 0: all responses are Astro-generated HTML pages (text/html), not JSON. Agents cannot parse yields, TVL, or prices from HTML marketing pages.",
"first_try_success = 0: 7 of 8 tests returned wrong content type (HTML not JSON) or 404. Not a single DeFi data call succeeded.",
"defillama_tvl_crossref test returned trivially/unreliably: protocol='Re' with no recognizable DeFi protocol name, and latency_ms=0 which is implausible for a live cross-reference — cross-reference cannot validate any advertised TVL because none exists.",
"No advertised yield/APY/TVL figures to sanity-check against DeFiLlama (no >100% APY flags raised only because no DeFi data is returned at all).",
"Error clarity limited: errors are generic content-type mismatch wrapper messages; the 404 responses carry no JSON error schema or rate-limit/unsupported-chain explanation."
],
"recommendations": [
"CRITICAL: Verify the base URL. This endpoint is shlink.io (a URL shortener), not a DeFi API. The benchmark target appears misconfigured — point scoring at the actual DeFi service.",
"If this really is the intended service, it does not qualify as a DeFi service and should be reclassified/removed from the DeFi benchmark set.",
"Expose DeFi data as clean JSON: /yields, /pools, /protocol/{id}/tvl, /tokens/{address}/price with numeric APY/APR and TVL fields.",
"Serve JSON with proper Content-Type: application/json and honor Accept headers; return 404 as JSON error objects, not HTML pages.",
"Document APY vs APR calculation methodology, compounding assumptions, and data refresh cadence.",
"Add consistent error schemas explaining rate limits, unsupported chains, and invalid pool identifiers.",
"Ensure TVL figures match DeFiLlama within tolerance and stamp responses with a data freshness timestamp."
]
}Show your live agent-readiness score on your own site. Free, no auth — it updates as your score changes.
<a href="https://prowl.world/service/shlink">
<img src="https://prowl.world/badge/shlink.svg" height="56" alt="Agent-readiness on Prowl">
</a>
See operational metrics, LLM evaluations, agent readiness, and more.
Open in Dashboard