# Why your Bland AI calls show Spam Likely, and how to check

**If your Bland calls go unanswered, or fail with "Service Provider Blocked Call due to Spam or Number Reputation," the number you're calling from has a reputation problem.** A check shows exactly what AT&T, Verizon and T-Mobile display for it: the label, the caller name and a screenshot from a real phone on each carrier, about 5 seconds after the call rings.

*Platform details checked October 2026. Spam I Am isn't affiliated with Bland AI.*

## What it looks like in Bland

Bland's Call Details API (`GET /v1/calls/{call_id}`) returns a `status` of `completed`, `failed`, `busy`, `no-answer`, `canceled` or `unknown`.

- **Blocked calls** come back as `failed`. Bland's docs list this `error_message` for a carrier spam block: *"Service Provider Blocked Call due to Spam or Number Reputation. Try a different number."*
- **Bland's agent quickstart warns** that a call a carrier blocked as spam can still come back `completed`, so check `answered_by` and `error_message` too.
- **Labeled calls** ring normally. They usually end as `no-answer`, or as short calls. No field says "spam."

If you send calls over your own SIP trunk, your carrier logs may also show **SIP 603+ ("Network Blocked")**, the code US carriers must use for analytics-based blocking since March 25, 2026. [What 603+ and 608 mean](/guides/sip-603-plus-608-network-blocked)

## Why Bland numbers get flagged

**First, know which number you're calling from.** By default, Bland sends outbound calls from its own pool of numbers. Unless you set `from`, you don't control the caller ID, and you can't check it. To check a number, it must be one you own in Bland or an imported Twilio number (BYOT).

Then the usual causes apply:

- **High volume from one number**, especially batch dispatch.
- **Short calls and low answer rates.** Bland hangs up on voicemail by default, which keeps calls short.
- **New or recycled numbers** with thin or bad history.
- **Missing registration and STIR/SHAKEN attestation** on the number's carrier.
- **Unexpected calls** that people report or block.

[Why numbers get flagged](/guides/why-number-shows-spam-likely)

## Place the test call from Bland

The check call must come **from the number being checked**. We never spoof numbers, so Bland places it, using `from`.

```bash
curl -X POST https://api.bland.ai/v1/calls \
  -H "Authorization: Bearer $BLAND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number": "+14695550123",
    "from": "+12145550100",
    "task": "This is a short test call. If anyone answers, say: Test call, goodbye. Then end the call.",
    "max_duration": 1,
    "voicemail": { "action": "hangup" },
    "metadata": { "purpose": "spam-label-check" }
  }'
```

- `phone_number` is our test line (`dial` from the check).
- `from` is the number you're checking.
- `max_duration` is in minutes.
- `"action": "hangup"` is Bland's default voicemail behavior anyway. Our phone sends the call to voicemail after a few seconds, so Bland will hang up.

Using your own Twilio account? Add the `encrypted_key` header. The `from` number must belong to that Twilio account.

## Run the check with Spam I Am

The first check on any number is free and needs no key.

```bash
curl -X POST https://ismynumberspam.com/v1/checks \
  -H "Content-Type: application/json" \
  -d '{"number": "2145550100"}'
```

The answer includes an `id`, a `token` and a `calls` list with one `dial` number per carrier. Call them within 2 minutes for one carrier, plus 1 minute per extra carrier.

The full flow in Python:

```python
import os, time, requests

SIA = "https://ismynumberspam.com/v1"
NUMBER = "+12145550100"               # your Bland or BYOT number
key = os.environ.get("SIA_API_KEY")   # optional for the first check
h = {"Authorization": f"Bearer {key}"} if key else {}
bland = {"Authorization": f"Bearer {os.environ['BLAND_API_KEY']}"}

check = requests.post(f"{SIA}/checks", json={"number": NUMBER}, headers=h).json()
q = {} if key else {"token": check["token"]}

def get_check():
    return requests.get(f"{SIA}/checks/{check['id']}", headers=h, params=q).json()

for line in check["calls"]:
    requests.post("https://api.bland.ai/v1/calls", headers=bland, json={
        "phone_number": line["dial"],
        "from": NUMBER,
        "task": "Short test call. Say 'Test call, goodbye' and end the call.",
        "max_duration": 1,
    })
    while True:  # wait for this carrier before dialing the next line
        c = next(x for x in get_check()["calls"] if x["carrier"] == line["carrier"])
        if c["status"] != "waiting":
            break
        time.sleep(5)

for c in get_check()["calls"]:
    print(c["carrier"], c["status"], c.get("label"), c.get("caller_name"), c.get("screenshot_url"))
```

These examples are a starting point. Check field names against Bland's current docs before you rely on them.

Each carrier comes back `complete`, with `flagged`, `label`, `caller_name` and a screenshot, or `incomplete`. If it's incomplete with `reason: "no_call"`, look up the Bland call. A `failed` status with the spam `error_message` means the call was blocked before it rang. That's more serious than a label. Incomplete carriers are free.

Want a push instead of polling? Pass `webhook_url` when you start the check. We POST the finished check, signed with a `Spamiam-Signature` header.

### Use MCP

Bland runs a hosted MCP server at `https://api.bland.ai/v1/mcp` that can place and inspect calls. Connect it next to ours in your coding agent:

```bash
claude mcp add --transport http spam-i-am https://ismynumberspam.com/mcp
claude mcp add --transport http bland https://api.bland.ai/v1/mcp \
  --header "Authorization: Bearer $BLAND_API_KEY"
```

Then ask: "Start a spam check for +1 214 555 0100. Use Bland to call each test line from that number, then report each carrier." Our `get_check` tool can wait up to 25 seconds for results. When the agent needs to spend beyond the free check, it calls `request_approval` and sends you a link. It never pays on its own.

## Pre-campaign checklist

- **Set `from` on every campaign.** If you rely on Bland's pool, you can't see or manage the reputation of the numbers calling for you.
- **Check each number before a campaign.** $0.40 covers all three carriers.
- **Re-check after volume spikes** or when `no-answer` rates climb.
- **Watch `error_message`** for the spam-block text, grouped by `from` number.
- **Check active numbers on a schedule.** Weekly is a good default.
- **One check per number per hour.**

## If it's flagged

Pause calls from that number. Then:

1. **Fix the cause.** Slow down, call people who expect you, and make sure the agent speaks promptly.
2. **Work with the number's carrier.** For BYOT numbers, that's your Twilio account, which offers STIR/SHAKEN, CNAM and Voice Integrity registration through Trust Hub. Bland's public docs don't list a paid spam-remediation or branded-caller-ID add-on, so ask Bland support what's available for Bland-owned numbers.
3. **Register with the Free Caller Registry** at [freecallerregistry.com](https://freecallerregistry.com), which reaches Hiya, First Orion and TNS.
4. **Request a review** for each flagged carrier: [AT&T](/guides/remove-spam-label-att) · [Verizon](/guides/remove-spam-label-verizon) · [T-Mobile](/guides/remove-scam-likely-tmobile)
5. **Rest the number.** Bland's error text suggests trying a different number. That gets calls out today, but a fresh number with the same calling pattern usually ends up flagged too. Fix the cause before you swap.
6. **Consider a reputation-management provider** if you run many numbers. None can guarantee a label is removed.

Re-check every few days. Reviews commonly take days to weeks. We only check. We don't remove labels.

## FAQ

### Can I check the numbers in Bland's default pool?
Not usefully. The check must come from a specific number, and you don't choose which pool number Bland uses. Set `from` to a number you control.

### Bland says the call `completed`. Why is the result incomplete?
Bland's docs note that blocked calls can still show `completed`. Check `error_message` and `answered_by` for that call.

### Does local dialing help?
Bland's `dialing_strategy` with `local` picks a number matching the callee's area code. It's a paid add-on. Each number still has its own reputation, so check each one.

### Does the test call cost anything on Bland?
Yes. It's a short outbound call billed at your normal Bland rate.

### What does a check cost?
The first check on a number is free. Then $0.25 for one carrier or $0.40 for two or three.

## Sources

- [Bland: Send Call API](https://docs.bland.ai/api-v1/post/calls)
- [Bland: Call Details API](https://docs.bland.ai/api-v1/get/calls-id)
- [Bland: Agent quickstart](https://docs.bland.ai/platform/agent-quickstart)
- [Bland: Bring your own Twilio](https://docs.bland.ai/tutorials/custom-twilio)
- [Bland: MCP server](https://docs.bland.ai/integrations/mcp/overview)
- [Twilio: Voice Integrity](https://www.twilio.com/docs/trust-hub/registrations/voice-integrity)
- [Spam I Am API docs](/docs) · [MCP server](/docs/mcp)
