Show HN: OpenAPISearch – Make APIs Accessible for AI Codegen
Full LLM thinking from the 4-phase benchmark pipeline.
{
"service_type": "rest_api",
"base_url": "https://openapisearch.com",
"auth_method": "none",
"auth_config": null,
"endpoints": [
{
"path": "/index.md",
"method": "GET",
"purpose": "Get list of OpenAPI providers as markdown",
"params": {},
"response_format": "text",
"is_primary": false
},
{
"path": "/redirect/{id}",
"method": "GET",
"purpose": "Redirect to OpenAPI specification for a given provider ID",
"params": {
"id": {
"type": "string",
"required": true
}
},
"response_format": "text",
"is_primary": true
},
{
"path": "/providers.json",
"method": "GET",
"purpose": "Get provider information in JSON",
"params": {},
"response_format": "json",
"is_primary": true
}
],
"pricing_model": {
"type": "free_tier",
"details": {},
"free_tier": null,
"paid_tiers": []
},
"rate_limits": {
"rpm": null,
"tpm": null,
"daily": null,
"concurrent": null
},
"capabilities": [
"OpenAPI directory",
"Searchable interface",
"Programmatic registry",
"Agent navigation",
"Redirect to OpenAPI specs",
"Provider information retrieval"
],
"agent_readiness": {
"supports_x402": false,
"supports_streaming": false,
"has_sandbox": false,
"sdks": [],
"agent_auth_methods": ["public"]
}
}```json
{
"tests": [
{
"name": "get_markdown_index",
"endpoint": "/index.md",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns markdown list of provider IDs",
"metrics": ["latency", "status_code"],
"validation": {"field": "body", "type": "string", "min_length": 100}
},
{
"name": "get_providers_json",
"endpoint": "/providers.json",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns JSON object with provider information",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "data", "type": "object", "min_length": 1}
},
{
"name": "redirect_openai",
"endpoint": "/redirect/openai",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 302,
"intent": "happy_path",
"expected_behavior": "Redirect to OpenAI OpenAPI spec URL",
"metrics": ["latency", "status_code"],
"validation": {"field": "location", "type": "string", "min_length": 10}
},
{
"name": "redirect_with_slug_tld",
"endpoint": "/redirect/docs.socialdata.tools__openapi.yaml",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 302,
"intent": "happy_path",
"expected_behavior": "Redirect to custom path with double underscore notation",
"metrics": ["latency", "status_code"],
"validation": {"field": "location", "type": "string", "min_length": 10}
},
{
"name": "redirect_invalid_id",
"endpoint": "/redirect/nonexistent-id-that-does-not-exist",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 404,
"intent": "validation",
"expected_behavior": "Returns 404 for non-existent provider ID",
"metrics": ["status_code"],
"validation": {}
},
{
"name": "redirect_empty_path",
"endpoint": "/redirect/",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 404,
"intent": "validation",
"expected_behavior": "Returns error for missing provider ID",
"metrics": ["status_code"],
"validation": {}
},
{
"name": "bad_method_post",
"endpoint": "/providers.json",
"method": "POST",
"headers": {},
"payload": {},
"expected_status": 405,
"intent": "validation",
"expected_behavior": "HTTP method not allowed for GET-only endpoint",
"metrics": ["status_code"],
"validation": {}
},
{
"name": "nonexistent_endpoint",
"endpoint": "/does-not-exist",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 404,
"intent": "validation",
"expected_behavior": "404 for unknown endpoint",
"metrics": ["status_code"],
"validation": {}
}
],
"pricing_probes": [],
"stress_profile": {
"concurrent_requests": 5,
"duration_seconds": 10,
"ramp_up": true
}
}
```3/8 tests passed
| Test | Endpoint | Status | Latency |
|---|---|---|---|
| get_markdown_index | GET /index.md | 200 | 129ms |
| get_providers_json | GET /providers.json | 200 | 67ms |
| redirect_openai | GET /redirect/openai | 307 | 1421ms |
| redirect_with_slug_tld | GET /redirect/docs.socialdata.tools__openapi.yaml | 404 | 352ms |
| redirect_invalid_id | GET /redirect/nonexistent-id-that-does-not-exist | 404 | 366ms |
| redirect_empty_path | GET /redirect/ | 404 | 188ms |
| bad_method_post | POST /providers.json | 405 | 30ms |
| nonexistent_endpoint | GET /does-not-exist | 200 | 33ms |
{"model": "deepseek", "data": {"overall": 55, "dimensions": {"token_efficiency": 7, "first_try_success": 6, "response_parseability": 6, "error_clarity": 6, "doc_quality": 6, "auth_simplicity": 10, "latency": 8, "consistency": 7}, "pricing_normalized": {"cost_per_1k_requests": null, "cost_per_1m_input_tokens": null, "cost_per_1m_output_tokens": null, "free_tier_requests": null, "estimated_monthly_cost_light": 0, "estimated_monthly_cost_heavy": 0}, "issues": [{"severity": "medium", "detail": "Redirect endpoint returns 307 instead of documented 302, which violates RFC semantics for permanent redirects and could cause agent to not follow correctly.", "endpoint": "/redirect/{id}"}, {"severity": "medium", "detail": "Redirect with slug containing underscores and file extension returns 404; provider ID convention appears stricter than documented.", "endpoint": "/redirect/{id}"}, {"severity": "low", "detail": "Nonexistent paths return an HTML marketing page with 200 status instead of a 404 JSON error, which is confusing for agents.", "endpoint": "/does-not-exist"}, {"severity": "low", "detail": "Validation errors return plain text rather than structured JSON error bodies, making it harder for agents to programmatically parse.", "endpoint": "/redirect/{id}"}], "recommendations": ["Use 302 or 308 consistently for redirects and document the exact status code.", "Ensure the provider ID matching logic aligns with documented examples (e.g., handle underscores and file extensions).", "Return JSON 404s for unknown paths instead of HTML pages with 200 status.", "Provide structured JSON error bodies for all error cases (e.g., {'error': 'provider_not_found'}).", "Add an endpoint to fetch the OpenAPI spec itself so agents don't need to parse HTML pages for unknown paths."]}}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/openapisearch">
<img src="https://prowl.world/badge/openapisearch.svg" height="56" alt="Agent-readiness on Prowl">
</a>
See operational metrics, LLM evaluations, agent readiness, and more.
Open in Dashboard