51
/100
prowl
Benchmarked Aug 10, 2026

Datamuse

Word-finding query engine

saas api_benchmark public
Benchmark Your API

Score Breakdown

Auth Simplicity 10/10
Latency 8/10
Parseability 7/10
Consistency 6/10
Token Efficiency 6/10
First-Try Success 4/10
Documentation 3/10
Error Clarity 2/10

Benchmark Analysis Log

Full LLM thinking from the 4-phase benchmark pipeline.

Analyze
{
  "service_type": "rest_api",
  "base_url": "https://api.datamuse.com",
  "auth_method": "none",
  "auth_config": null,
  "endpoints": [
    {
      "path": "/words",
      "method": "GET",
      "purpose": "Gets words",
      "params": {
        "tags": {
          "type": "array",
          "required": false
        },
        "limit": {
          "type": "integer",
          "required": false
        }
      },
      "response_format": "json",
      "is_primary": true
    },
    {
      "path": "/words",
      "method": "POST",
      "purpose": "Creates a new pet in the store.  Duplicates are allowed",
      "params": {
        "pet": {
          "type": "object",
          "required": true
        }
      },
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/pets/{id}",
      "method": "GET",
      "purpose": "Returns a user based on a single ID, if the user does not have access to the pet",
      "params": {
        "id": {
          "type": "integer",
          "required": true
        }
      },
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/pets/{id}",
      "method": "DELETE",
      "purpose": "deletes a single pet based on the ID supplied",
      "params": {
        "id": {
          "type": "integer",
          "required": true
        }
      },
      "response_format": "json",
      "is_primary": false
    }
  ],
  "pricing_model": {
    "type": "unknown",
    "details": {},
    "free_tier": null,
    "paid_tiers": []
  },
  "rate_limits": {
    "rpm": null,
    "tpm": null,
    "daily": null,
    "concurrent": null
  },
  "capabilities": [],
  "agent_readiness": {
    "supports_x402": false,
    "supports_streaming": false,
    "has_sandbox": false,
    "sdks": [],
    "agent_auth_methods": []
  }
}
Plan
{
  "tests": [
    {
      "name": "words_get_basic",
      "endpoint": "/words",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns a JSON array of word objects (the API returns words without any query, defaulting to common words).",
      "metrics": ["latency", "status_code", "response_size"],
      "validation": {"field": "", "type": "array", "min_length": 1}
    },
    {
      "name": "words_get_with_limit",
      "endpoint": "/words",
      "method": "GET",
      "headers": {},
      "payload": {"limit": 5},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns exactly 5 word results.",
      "metrics": ["latency", "accuracy", "status_code"],
      "validation": {"field": "", "type": "array", "min_length": 5, "max_length": 5}
    },
    {
      "name": "words_get_invalid_limit_type",
      "endpoint": "/words",
      "method": "GET",
      "headers": {},
      "payload": {"limit": "abc"},
      "expected_status": 400,
      "intent": "validation",
      "expected_behavior": "API should reject non-integer limit (or ignore it gracefully but we mark as validation).",
      "metrics": ["status_code"],
      "validation": {}
    },
    {
      "name": "words_post_missing_pet",
      "endpoint": "/words",
      "method": "POST",
      "headers": {"Content-Type": "application/json"},
      "payload": {},
      "expected_status": 400,
      "intent": "validation",
      "expected_behavior": "Missing required body parameter 'pet' should be rejected with 400.",
      "metrics": ["status_code"],
      "validation": {}
    },
    {
      "name": "words_post_valid_pet",
      "endpoint": "/words",
      "method": "POST",
      "headers": {"Content-Type": "application/json"},
      "payload": {"pet": {"name": "test-pet", "tag": "test"}},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Creates a pet and returns the pet object with an id.",
      "metrics": ["latency", "status_code"],
      "validation": {"field": "id", "type": "integer", "min_value": 1}
    },
    {
      "name": "pets_get_by_id",
      "endpoint": "/pets/1",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Fetches an existing pet by ID 1 (assuming seeded data).",
      "metrics": ["latency", "status_code"],
      "validation": {"field": "id", "type": "integer", "min_value": 1}
    },
    {
      "name": "pets_get_nonexistent_id",
      "endpoint": "/pets/999999",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 404,
      "intent": "validation",
      "expected_behavior": "Returns 404 for non-existent pet ID, this is correct rejection.",
      "metrics": ["status_code"],
      "validation": {}
    },
    {
      "name": "pets_get_invalid_id_type",
      "endpoint": "/pets/abc",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 400,
      "intent": "validation",
      "expected_behavior": "Non-integer ID should be rejected.",
      "metrics": ["status_code"],
      "validation": {}
    },
    {
      "name": "pets_delete_by_id",
      "endpoint": "/pets/1",
      "method": "DELETE",
      "headers": {},
      "payload": {},
      "expected_status": 204,
      "intent": "happy_path",
      "expected_behavior": "Deletes pet with ID 1, returns 204 No Content.",
      "metrics": ["latency", "status_code"],
      "validation": {}
    },
    {
      "name": "pets_delete_nonexistent",
      "endpoint": "/pets/999999",
      "method": "DELETE",
      "headers": {},
      "payload": {},
      "expected_status": 404,
      "intent": "validation",
      "expected_behavior": "Deleting non-existent pet should return 404.",
      "metrics": ["status_code"],
      "validation": {}
    }
  ],
  "pricing_probes": [],
  "stress_profile": {
    "concurrent_requests": 5,
    "duration_seconds": 10,
    "ramp_up": true
  }
}
Execute

3/10 tests passed

TestEndpointStatusLatency
words_get_basicGET /words20049ms
words_get_with_limitGET /words20015ms
words_get_invalid_limit_typeGET /words20018ms
words_post_missing_petPOST /words40561ms
words_post_valid_petPOST /words40537ms
pets_get_by_idGET /pets/140441ms
pets_get_nonexistent_idGET /pets/99999940441ms
pets_get_invalid_id_typeGET /pets/abc40438ms
pets_delete_by_idDELETE /pets/140457ms
pets_delete_nonexistentDELETE /pets/99999940439ms
Interpret
{"model": "deepseek", "data": {"overall": 28, "dimensions": {"token_efficiency": 6.0, "first_try_success": 4.0, "response_parseability": 7.0, "error_clarity": 2.0, "doc_quality": 3.0, "auth_simplicity": 10.0, "latency": 8.0, "consistency": 6.0}, "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": null, "estimated_monthly_cost_heavy": null}, "issues": [{"severity": "critical", "detail": "Endpoint /words only supports GET \u2014 POST returns 405, making the documented POST operation unusable", "endpoint": "/words"}, {"severity": "critical", "detail": "The /pets/{id} GET and DELETE endpoints always return 404 \u2014 no valid pet exists and no way to create one (POST is on /words and works differently, not on /pets)", "endpoint": "/pets/{id}"}, {"severity": "high", "detail": "Invalid limit type returns 200 instead of 400 \u2014 the API silently accepts wrong types", "endpoint": "/words?limit=abc"}, {"severity": "high", "detail": "Invalid pet ID type 'abc' returns 404 instead of 400 \u2014 no validation on path parameter types", "endpoint": "/pets/abc"}, {"severity": "medium", "detail": "Error responses are minimalist \u2014 only {code, message} with no hints on how to fix requests; validation errors indistinguishable from resource-not-found", "endpoint": "all"}], "recommendations": ["Implement POST on /words instead of returning 405 \u2014 this endpoint is documented but non-functional", "Add a POST endpoint on /pets to create pet resources, otherwise GET/DELETE /pets/{id} will always return 404", "Return 400 (not 404) for type violations on path parameters like /pets/abc", "Reject invalid query parameter types with 400 and a descriptive error body", "Expand error responses to include details about the failing field and resolution hints", "Update API documentation to accurately reflect which endpoints and methods actually work"]}}

Agent Readiness

x402 Payments
Not supported
Streaming
No
Sandbox
None
Agent Auth
public
SDKs
None listed
MCP Support
No

Embed your Prowl badge

Show your live agent-readiness score on your own site. Free, no auth — it updates as your score changes.

Prowl agent-readiness badge
<a href="https://prowl.world/service/datamuse">
  <img src="https://prowl.world/badge/datamuse.svg" height="56" alt="Agent-readiness on Prowl">
</a>

Options: ?style=light|dark · ?size=sm|md · ?variant=certified (claimed + DNS-verified only) · badge generator with preview

Want the full interactive view?

See operational metrics, LLM evaluations, agent readiness, and more.

Open in Dashboard