71
/100
prowl
Benchmarked Aug 11, 2026

Open Science Framework

Repository and archive for study designs, research materials, data, manuscripts, etc

searchdata api_benchmark Sandbox oauth2_client_credentials
Benchmark Your API

Score Breakdown

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

Benchmark Analysis Log

Full LLM thinking from the 4-phase benchmark pipeline.

Analyze
{
  "service_type": "rest_api",
  "base_url": "https://api.test.osf.io/v2",
  "auth_method": "oauth2",
  "auth_config": {
    "header": "Authorization",
    "prefix": "Bearer"
  },
  "endpoints": [],
  "pricing_model": {
    "type": "free_tier",
    "details": {},
    "free_tier": null,
    "paid_tiers": []
  },
  "rate_limits": {
    "rpm": null,
    "tpm": null,
    "daily": null,
    "concurrent": null
  },
  "capabilities": [
    "RESTful resource-oriented API",
    "Pagination",
    "Filtering",
    "Sparse fieldsets",
    "Embedding",
    "Comprehensive error handling",
    "OAuth-based authentication"
  ],
  "agent_readiness": {
    "supports_x402": false,
    "supports_streaming": false,
    "has_sandbox": true,
    "sdks": [],
    "agent_auth_methods": [
      "oauth2_client_credentials"
    ]
  }
}
Plan
```json
{
  "tests": [
    {
      "name": "root_endpoint_health_check",
      "endpoint": "/",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns service metadata and a welcome message",
      "metrics": ["latency", "status_code"],
      "validation": {"field": "meta", "type": "object"}
    },
    {
      "name": "list_addons_success",
      "endpoint": "/addons/",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns a paginated list of addons",
      "metrics": ["latency", "status_code", "accuracy"],
      "validation": {"field": "data", "type": "array", "min_length": 1}
    },
    {
      "name": "get_current_user_success",
      "endpoint": "/users/me/",
      "method": "GET",
      "headers": {"Authorization": "Bearer ${OSF_TOKEN}"},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns the authenticated user's profile",
      "metrics": ["latency", "status_code"],
      "validation": {"field": "data.type", "type": "string", "equals": "users"}
    },
    {
      "name": "get_current_user_authenticated",
      "endpoint": "/users/me/",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 401,
      "intent": "auth",
      "expected_behavior": "Rejects unauthenticated request to a protected endpoint",
      "metrics": ["status_code"],
      "validation": {"field": "errors", "type": "array", "min_length": 1}
    },
    {
      "name": "list_nodes_success",
      "endpoint": "/nodes/",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns a paginated list of public nodes",
      "metrics": ["latency", "status_code", "accuracy"],
      "validation": {"field": "data", "type": "array"}
    },
    {
      "name": "list_nodes_filtered_success",
      "endpoint": "/nodes/?filter[title]=reproducibility",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns nodes filtered by title substring",
      "metrics": ["latency", "status_code"],
      "validation": {"field": "data", "type": "array"}
    },
    {
      "name": "list_nodes_paginated_success",
      "endpoint": "/nodes/?page=2",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns the second page of nodes",
      "metrics": ["latency", "status_code"],
      "validation": {"field": "data", "type": "array"}
    },
    {
      "name": "get_specific_node_success",
      "endpoint": "/nodes/ezcuj/",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns the specified public node",
      "metrics": ["latency", "status_code"],
      "validation": {"field": "data.id", "type": "string", "equals": "ezcuj"}
    },
    {
      "name": "get_nonexistent_node_404",
      "endpoint": "/nodes/nonexistent/",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 404,
      "intent": "validation",
      "expected_behavior": "Returns a structured error for a non-existent node ID",
      "metrics": ["status_code"],
      "validation": {"field": "errors", "type": "array", "min_length": 1}
    },
    {
      "name": "create_node_missing_required_fields",
      "endpoint": "/nodes/",
      "method": "POST",
      "headers": {"Authorization": "Bearer ${OSF_TOKEN}"},
      "payload": {
        "data": {
          "type": "nodes",
          "attributes": {}
        }
      },
      "expected_status": 400,
      "intent": "validation",
      "expected_behavior": "Rejects node creation without required 'title' and 'category' fields",
      "metrics": ["status_code"],
      "validation": {"field": "errors", "type": "array", "min_length": 1}
    },
    {
      "name": "list_institutions_success",
      "endpoint": "/institutions/",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns a paginated list of institutions",
      "metrics": ["latency", "status_code"],
      "validation": {"field": "data", "type": "array"}
    },
    {
      "name": "get_institution_success",
      "endpoint": "/institutions/cos/",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns the specified institution",
      "metrics": ["latency", "status_code"],
      "validation": {"field": "data.id", "type": "string", "equals": "cos"}
    
Execute

13/20 tests passed

TestEndpointStatusLatency
root_endpoint_health_checkGET /20092ms
list_addons_successGET /addons/20060ms
get_current_user_successGET /users/me/401258ms
get_current_user_authenticatedGET /users/me/40166ms
list_nodes_successGET /nodes/200879ms
list_nodes_filtered_successGET /nodes/?filter[title]=reproducibility200819ms
list_nodes_paginated_successGET /nodes/?page=22001137ms
get_specific_node_successGET /nodes/ezcuj/40468ms
get_nonexistent_node_404GET /nodes/nonexistent/40466ms
create_node_missing_required_fieldsPOST /nodes/401385ms
Interpret
{"model": "deepseek", "data": {"overall": 72, "dimensions": {"token_efficiency": 7.0, "first_try_success": 7.0, "response_parseability": 8.0, "error_clarity": 8.0, "doc_quality": 6.0, "auth_simplicity": 5.0, "latency": 6.0, "consistency": 8.0}, "pricing_normalized": {"cost_per_1k_requests": 0, "cost_per_1m_input_tokens": 0, "cost_per_1m_output_tokens": 0, "free_tier_requests": null, "estimated_monthly_cost_light": 0, "estimated_monthly_cost_heavy": 0}, "issues": [{"severity": "medium", "detail": "Unauthenticated endpoints like /users/me/ return 401 even for non-sensitive data; this is expected but agents need to know auth is mandatory for user-specific resources. The validation test for POST /nodes/ expected 400 but got 401 (auth failure), so validation logic was not tested.", "endpoint": "/users/me/, /nodes/ (POST)"}, {"severity": "medium", "detail": "Specific resource lookups (get_specific_node_success, get_user_success) failed with 404 because the hardcoded IDs (ezcuj, q7fts) did not exist in the test environment. This is a test environment/data dependency issue rather than an API design flaw, but it means the happy-path tests for existing resources could not be validated.", "endpoint": "/nodes/ezcuj/, /users/q7fts/"}, {"severity": "low", "detail": "Responses use JSON:API content type (application/vnd.api+json). While parseable, the structure is more verbose than plain JSON, increasing token consumption for the agent to parse relationships and links sections.", "endpoint": "all"}], "recommendations": ["Provide a sandbox environment with seeded, stable resource IDs so happy-path tests can verify single-resource retrieval without depending on external data.", "Add a public OAuth2 token for the test environment or allow anonymous read access to /users/me/ so agents can test authenticated flows without registration.", "Document the full OpenAPI spec with examples in the vendor guide, especially showing how to create resources (POST /nodes/) without triggering auth errors first.", "Consider adding a simple API-key-based auth option in addition to OAuth2 for programmatic agent access to reduce onboarding friction."]}}

Agent Readiness

x402 Payments
Not supported
Streaming
No
Sandbox
Available
Agent Auth
oauth2_client_credentials
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/open-science-framework">
  <img src="https://prowl.world/badge/open-science-framework.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