36
/100
prowl
Benchmarked Apr 08, 2026

Todoist

Todo Lists

saas api_benchmark javascriptpython api_key
Benchmark Your API

Score Breakdown

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

Benchmark Analysis Log

Full LLM thinking from the 4-phase benchmark pipeline.

Analyze
Looking at this Todoist API specification, I can extract the following structured information:

```json
{
  "service_type": "rest_api",
  "base_url": "https://api.todoist.com",
  "auth_method": "bearer_token",
  "auth_config": {"header": "Authorization", "prefix": "Bearer"},
  "endpoints": [
    {
      "path": "/api/v1/workspaces/invitations/delete",
      "method": "POST",
      "purpose": "Delete a workspace invitation (admin only)",
      "params": {"invitation_id": {"type": "integer", "required": true}},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/api/v1/workspaces/invitations/all", 
      "method": "GET",
      "purpose": "Get all pending workspace invitations",
      "params": {"workspace_id": {"type": "integer", "required": true}},
      "response_format": "json",
      "is_primary": false
    }
  ],
  "pricing_model": {
    "type": "subscription",
    "details": {"note": "Free to use but features may be restricted based on user's Todoist account plan"},
    "free_tier": {"features": "limited", "period": "ongoing"},
    "paid_tiers": ["Todoist Pro", "Todoist Business"]
  },
  "rate_limits": {"rpm": null, "tpm": null, "daily": null, "concurrent": null},
  "capabilities": ["task_management", "project_management", "workspace_collaboration", "invitations", "team_management"],
  "agent_readiness": {
    "supports_x402": false,
    "supports_streaming": false,
    "has_sandbox": false,
    "sdks": ["python", "javascript"],
    "agent_auth_methods": ["api_key"]
  }
}
```
Plan
```json
{
  "tests": [
    {
      "name": "basic_auth_test",
      "endpoint": "/rest/v2/tasks",
      "method": "GET",
      "headers": {
        "Authorization": "Bearer {token}"
      },
      "payload": {},
      "expected_status": 200,
      "expected_behavior": "Returns user's tasks, verifying auth works",
      "metrics": ["latency", "status_code", "auth_success"],
      "validation": {
        "type": "response_structure",
        "check": "valid_json_response"
      }
    },
    {
      "name": "get_projects",
      "endpoint": "/rest/v2/projects",
      "method": "GET", 
      "headers": {
        "Authorization": "Bearer {token}"
      },
      "payload": {},
      "expected_status": 200,
      "expected_behavior": "Returns user's projects list",
      "metrics": ["latency", "accuracy", "status_code"],
      "validation": {
        "field": "root",
        "type": "array"
      }
    },
    {
      "name": "get_workspace_invitations",
      "endpoint": "/api/v1/workspaces/invitations/all",
      "method": "GET",
      "headers": {
        "Authorization": "Bearer {token}"
      },
      "payload": {},
      "expected_status": 200,
      "expected_behavior": "Returns workspace invitations (may be empty)",
      "metrics": ["latency", "status_code"],
      "validation": {
        "type": "json_response"
      }
    },
    {
      "name": "create_task",
      "endpoint": "/rest/v2/tasks",
      "method": "POST",
      "headers": {
        "Authorization": "Bearer {token}",
        "Content-Type": "application/json"
      },
      "payload": {
        "content": "Test task from Prowl benchmark",
        "description": "Automated test task"
      },
      "expected_status": 200,
      "expected_behavior": "Successfully creates a new task",
      "metrics": ["latency", "accuracy", "status_code"],
      "validation": {
        "field": "id",
        "type": "string",
        "required": true
      }
    },
    {
      "name": "invalid_auth_test",
      "endpoint": "/rest/v2/tasks",
      "method": "GET",
      "headers": {
        "Authorization": "Bearer invalid_token_12345"
      },
      "payload": {},
      "expected_status": 401,
      "expected_behavior": "Returns unauthorized error for invalid token",
      "metrics": ["status_code", "error_handling"],
      "validation": {
        "type": "error_response",
        "expected_status": 401
      }
    },
    {
      "name": "missing_auth_test",
      "endpoint": "/rest/v2/tasks",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 401,
      "expected_behavior": "Returns unauthorized error when no auth provided",
      "metrics": ["status_code", "error_handling"],
      "validation": {
        "type": "error_response",
        "expected_status": 401
      }
    },
    {
      "name": "malformed_request_test",
      "endpoint": "/rest/v2/tasks",
      "method": "POST",
      "headers": {
        "Authorization": "Bearer {token}",
        "Content-Type": "application/json"
      },
      "payload": {
        "invalid_field": "test"
      },
      "expected_status": 400,
      "expected_behavior": "Returns bad request error for missing required fields",
      "metrics": ["status_code", "error_handling"],
      "validation": {
        "type": "error_response",
        "expected_status": 400
      }
    }
  ],
  "pricing_probes": [
    {
      "name": "verify_subscription_access", 
      "description": "Check if API access varies by subscription tier",
      "endpoint": "/rest/v2/tasks",
      "method": "GET",
      "payload": {},
      "check": "response should succeed for valid token, features may vary by plan"
    },
    {
      "name": "check_rate_limiting",
      "description": "Test if rate limits are enforced",
      "endpoint": "/rest/v2/projects", 
      "method": "GET",
      "payload": {},
      "check": "monitor for 429 status codes or rate limit headers"
    }
  ],
  "stress_profile": {
    "concurrent_requests": 3,
    "duration_seconds": 15,
    "ramp_up": true
  }
}
```
Execute

0/7 tests passed

TestEndpointStatusLatency
basic_auth_testGET /rest/v2/tasks41072ms
get_projectsGET /rest/v2/projects41045ms
get_workspace_invitationsGET /api/v1/workspaces/invitations/all400457ms
create_taskPOST /rest/v2/tasks41041ms
invalid_auth_testGET /rest/v2/tasks41039ms
missing_auth_testGET /rest/v2/tasks41081ms
malformed_request_testPOST /rest/v2/tasks41087ms
Interpret
```json
{
  "overall": 0,
  "dimensions": {
    "token_efficiency": 2.0,
    "first_try_success": 0.0,
    "response_parseability": 3.0,
    "error_clarity": 8.0,
    "doc_quality": 5.0,
    "auth_simplicity": 5.0,
    "latency": 7.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": "Benchmark used wrong base URL — 6 out of 7 tests hit deprecated /rest/v2/ endpoints instead of current /api/v1/ API",
      "endpoint": "/rest/v2/*"
    },
    {
      "severity": "medium", 
      "detail": "The one v1 endpoint test failed due to missing required workspace_id parameter",
      "endpoint": "/api/v1/workspaces/invitations/all"
    }
  ],
  "recommendations": [
    "Re-run benchmark with correct API base URL (/api/v1/) from the vendor's guide",
    "Include required parameters like workspace_id when testing workspace-specific endpoints",
    "Test core task management endpoints like GET /api/v1/tasks and POST /api/v1/tasks",
    "Verify authentication setup against current API documentation"
  ]
}
```

Agent Readiness

x402 Payments
Not supported
Streaming
No
Sandbox
None
Agent Auth
api_key
SDKs
javascript, python
MCP Support
No

Want the full interactive view?

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

Open in Dashboard