19
/100
prowl
Benchmarked Sep 02, 2026

Bird

Omnichannel communications platform

messaging api_benchmark Sandbox cligopythontypescript email_signupoauth2_client_credentials
Benchmark Your API

Score Breakdown

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

Benchmark Analysis Log

Full LLM thinking from the 4-phase benchmark pipeline.

Analyze
{
  "service_type": "rest_api",
  "base_url": "https://{region}.platform.bird.com",
  "auth_method": "bearer_token",
  "auth_config": {
    "header": "Authorization",
    "prefix": "Bearer"
  },
  "endpoints": [
    {
      "path": "/health",
      "method": "GET",
      "purpose": "Service health check",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/email/messages",
      "method": "POST",
      "purpose": "Send transactional or marketing emails with explicit recipients",
      "params": {
        "to": {
          "type": "array",
          "required": true
        },
        "cc": {
          "type": "array",
          "required": false
        },
        "bcc": {
          "type": "array",
          "required": false
        },
        "category": {
          "type": "string",
          "required": true
        }
      },
      "response_format": "json",
      "is_primary": true
    },
    {
      "path": "/v1/email/broadcasts",
      "method": "POST",
      "purpose": "Create an email broadcast as a draft",
      "params": {},
      "response_format": "json",
      "is_primary": true
    },
    {
      "path": "/v1/email/broadcasts/{id}/send",
      "method": "POST",
      "purpose": "Send a scheduled or drafted email broadcast to an audience",
      "params": {
        "id": {
          "type": "string",
          "required": true
        }
      },
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/email/broadcasts/{id}",
      "method": "DELETE",
      "purpose": "Cancel a scheduled or in-progress email broadcast",
      "params": {
        "id": {
          "type": "string",
          "required": true
        }
      },
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/email/broadcasts/{id}/recipients",
      "method": "GET",
      "purpose": "List delivery state of a broadcast's recipients",
      "params": {
        "id": {
          "type": "string",
          "required": true
        }
      },
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/email/contacts",
      "method": "GET",
      "purpose": "List email contacts in workspace",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/email/contacts",
      "method": "POST",
      "purpose": "Create an email contact with optional custom properties",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/email/audiences",
      "method": "GET",
      "purpose": "List email audiences",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/email/audiences",
      "method": "POST",
      "purpose": "Create an email audience",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/email/stats",
      "method": "GET",
      "purpose": "Get email analytics (daily, hourly, tags, KPI summary)",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/sms/messages",
      "method": "POST",
      "purpose": "Send SMS message to one recipient",
      "params": {
        "body": {
          "type": "string",
          "required": true
        },
        "category": {
          "type": "string",
          "required": true
        }
      },
      "response_format": "json",
      "is_primary": true
    },
    {
      "path": "/v1/sms/messages",
      "method": "GET",
      "purpose": "List SMS messages and delivery status",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/sms/templates",
      "method": "GET",
      "purpose": "List available SMS templates",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/tcr/brands",
      "method": "POST",
      "purpose": "Register a 10DLC brand for US A2P SMS",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/tcr/brands",
      "method": "GET",
      "purpose": "List registered 10DLC brands",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/tcr/campaigns",
      "method": "POST",
      "purpose": "Register a 10DLC campaign under a brand",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/tcr/campaigns",
      "method": "GET",
      "purpose": "List registered 10DLC campaigns",
      "params": {},
      "response_format": "json",
      "is_primary": false
    },
    {
      "path": "/v1/sms/stats",
      "method": "GET",
      "purpose": "Get SMS analytics",
      "params": {},
      "response_format": "json",
      "is_primary": false
    }
  ],
  "pricing_
Plan
```json
{
  "tests": [
    {
      "name": "health_check_connectivity",
      "endpoint": "/health",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns JSON with status 'ok' confirming service connectivity",
      "metrics": ["latency", "status_code"],
      "validation": {"field": "status", "type": "string", "value": "ok"}
    },
    {
      "name": "auth_invalid_token",
      "endpoint": "/v1/workspace",
      "method": "GET",
      "headers": {"Authorization": "Bearer invalid-token-value"},
      "payload": {},
      "expected_status": 401,
      "intent": "auth",
      "expected_behavior": "Returns 401 with an 'auth_error' structured body when an invalid/missing bearer token is provided",
      "metrics": ["status_code", "accuracy"],
      "validation": {"field": "error.type", "type": "string", "value": "auth_error"}
    },
    {
      "name": "auth_missing_token",
      "endpoint": "/v1/workspace",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 401,
      "intent": "auth",
      "expected_behavior": "Returns 401 with a structured error when no Authorization header is provided",
      "metrics": ["status_code", "accuracy"],
      "validation": {"field": "error.type", "type": "string", "value": "auth_error"}
    },
    {
      "name": "email_messages_send_happy_path",
      "endpoint": "/v1/email/messages",
      "method": "POST",
      "headers": {"Idempotency-Key": "bench-email-send-1"},
      "payload": {
        "from": {"email": "onboarding@messagebird.dev", "name": "Bird"},
        "to": [{"email": "delivered@messagebird.dev", "name": "Jane Doe"}],
        "subject": "Hello from Prowl Benchmark",
        "text": "This is a benchmark email."
      },
      "expected_status": 202,
      "intent": "happy_path",
      "expected_behavior": "Returns 202 Accepted with a message containing an 'em_' prefixed ID, indicating acceptance for async delivery",
      "metrics": ["latency", "status_code", "accuracy"],
      "validation": {"field": "id", "type": "string", "pattern": "^em_"}
    },
    {
      "name": "email_messages_send_missing_subject",
      "endpoint": "/v1/email/messages",
      "method": "POST",
      "headers": {},
      "payload": {
        "from": {"email": "onboarding@messagebird.dev"},
        "to": [{"email": "delivered@messagebird.dev"}],
        "html": "<p>No subject here</p>"
      },
      "expected_status": 422,
      "intent": "validation",
      "expected_behavior": "Returns 422 with a structured validation error since a subject is required for inline content",
      "metrics": ["status_code", "accuracy"],
      "validation": {"field": "error.type", "type": "string", "value": "validation_error"}
    },
    {
      "name": "email_messages_send_invalid_from",
      "endpoint": "/v1/email/messages",
      "method": "POST",
      "headers": {},
      "payload": {
        "from": {"email": "invalid@unverified-domain.com"},
        "to": [{"email": "delivered@messagebird.dev"}],
        "subject": "Test",
        "html": "<p>Test body</p>"
      },
      "expected_status": 422,
      "intent": "validation",
      "expected_behavior": "Returns 422 with a structured validation/business error naming the failed 'from' domain since it is not verified",
      "metrics": ["status_code", "accuracy"],
      "validation": {"field": "error.type", "type": "string", "value": "validation_error"}
    },
    {
      "name": "email_messages_list_happy_path",
      "endpoint": "/v1/email/messages",
      "method": "GET",
      "headers": {},
      "payload": {},
      "expected_status": 200,
      "intent": "happy_path",
      "expected_behavior": "Returns 200 with a list of recently sent email messages and pagination cursors",
      "metrics": ["latency", "status_code"],
      "validation": {"field": "data", "type": "array"}
    },
    {
      "name": "sms_messages_send_happy_path",
      "endpoint": "/v1/sms/messages",
      "method": "POST",
      "headers": {"Idempotency-Key": "bench-sms-send-1"},
      "payload": {
        "to": "+31612345678",
        "text": "Hello from Prowl Benchmark!",
        "category": "transactional"
      },
      "expected_status": 202,
      "intent": "happy_path",
      "expected_behavior": "Returns 202 Accepted with a message containing an 'sms_' prefixed ID AND a segments object showing expected message segmentation, indicating acceptance for async delivery",
      "metrics": ["latency", "status_code", "accuracy"],
      "validation": {"field": "id", "type": "string", "pattern": "^sms_"}
    },
    {
      "name": "sms_messages_send_required_field_validation",
      "endpoint": "/v1/sms/messages",
      "method": "POST",
      "headers": {},
      "payload": {
        "to": "+31612345678",
        "text": "This is missing a category"
      },
      "expected_status": 422,
      "intent": "validation",
      "expected
Execute

0/14 tests passed

TestEndpointStatusLatency
health_check_connectivityGET /healthNone1ms
auth_invalid_tokenGET /v1/workspaceNone7ms
auth_missing_tokenGET /v1/workspaceNone1ms
email_messages_send_happy_pathPOST /v1/email/messagesNone1ms
email_messages_send_missing_subjectPOST /v1/email/messagesNone1ms
email_messages_send_invalid_fromPOST /v1/email/messagesNone1ms
email_messages_list_happy_pathGET /v1/email/messagesNone1ms
sms_messages_send_happy_pathPOST /v1/sms/messagesNone11ms
sms_messages_send_required_field_validationPOST /v1/sms/messagesNone1ms
sms_templates_list_happy_pathGET /v1/sms/templatesNone4ms
Interpret
{"model": "deepseek", "data": {"overall": 0, "dimensions": {"token_efficiency": 5.0, "first_try_success": 0.0, "response_parseability": 0.0, "error_clarity": 0.0, "doc_quality": 5.0, "auth_simplicity": 3.0, "latency": 0.0, "consistency": 0.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 \u2014 got DNS resolution errors instead of JSON API responses. All 14 requests failed with '[Errno -2] Name or service not known', indicating the test runner used an incorrect/unresolvable host, not that the service is broken.", "endpoint": "/health, /v1/email/messages, /v1/sms/messages, /v1/email/contacts, /v1/email/audiences, /v1/email/stats/summary, /v1/sms/stats/summary"}], "recommendations": ["Re-run the benchmark suite using the correct API base URL from the vendor's official API reference documentation.", "Verify the hostname resolves (e.g., check DNS records and reachability) before executing tests.", "Add a pre-flight connectivity check against /health to verify the endpoint is reachable before running the full benchmark.", "Consider the service may be a self-hosted or private deployment only \u2014 confirm access credentials and network path before scoring the API."]}}

Agent Readiness

x402 Payments
Not supported
Streaming
No
Sandbox
Available
Agent Auth
email_signup, oauth2_client_credentials
SDKs
cli, go, python, typescript
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/bird">
  <img src="https://prowl.world/badge/bird.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