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

**If your Synthflow agent's calls end with a `spam` status, a 603 or 608 error, or just go unanswered, carriers are likely labeling or blocking your number.** A check shows what AT&T, Verizon and T-Mobile actually display. Your Synthflow number calls our test lines, and real phones on each carrier report the label, the caller name and a screenshot, about 5 seconds after the call rings.

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

## What it looks like in Synthflow

Synthflow's Get a call API (`GET /v2/calls/{call_id}`) returns a `status` for each call. The allowed values include **`spam`**, alongside `no-answer`, `busy`, `failed`, `hangup_on_voicemail` and `left_voicemail`. Synthflow's API reference lists `spam` as a status but doesn't describe when it's set.

Failed calls also carry an `error_message`. Synthflow's telephony errors page lists the ones that matter here:

- **Telephony - 603 - Decline**: rejected by the recipient's network or device.
- **Telephony - 608 - Rejected**: rejected due to policy.
- **Telephony - 608 - Termination needs STI IDHDR**: the call needs STIR/SHAKEN caller ID verification.

The `telephony_disconnect_reason` field can also read `forbidden`.

Since March 25, 2026, US carriers must use **SIP 603+ ("Network Blocked")** for analytics-based blocking, so a 603 is now a likely sign of a spam block. [What 603+ and 608 mean](/guides/sip-603-plus-608-network-blocked)

**Labels leave no trace.** A call that rings with "Spam Likely" on screen and goes unanswered looks like a normal `no-answer`.

## Why Synthflow numbers get flagged

Synthflow's help center says carriers and their analytics partners (Hiya, First Orion and TNS) label numbers whose patterns look like spoofing or high-volume bursts. In practice:

- **Bursts of volume** from one number.
- **Many short calls and low answer rates.**
- **Shared numbers.** Synthflow recommends dedicated numbers per region or team, instead of many agents with different use cases sharing one.
- **New or recycled numbers.**
- **Missing STIR/SHAKEN attestation, CNAM or analytics registration.**
- **People reporting or blocking your calls.**

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

## Place the test call from Synthflow

The check needs a real call **from the number you're checking**. We never spoof numbers, so Synthflow has to place it.

Use an outbound agent and the Make a call endpoint. Set `from_phone_number` to the number you're checking. It must be attached to the outbound agent. If you leave it out, Synthflow picks the agent's default number, which may not be the one you meant to check.

```bash
curl -X POST https://api.synthflow.ai/v2/calls \
  -H "Authorization: Bearer $SYNTHFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model_id": "YOUR_OUTBOUND_AGENT_ID",
    "phone": "+14695550123",
    "name": "Spam check",
    "from_phone_number": "+12145550100"
  }'
```

`phone` is our test line's `dial` value. `name` is required by Synthflow, so use any label. Our phone rings for a few seconds and then sends the call to voicemail, so a simple agent that ends the call on voicemail is enough.

## Run the check with Spam I Am

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

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

You get an `id`, a `token` and one `dial` number per carrier. You have 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"               # attached to your outbound agent
key = os.environ.get("SIA_API_KEY")   # optional for the first check
h = {"Authorization": f"Bearer {key}"} if key else {}
sf = {"Authorization": f"Bearer {os.environ['SYNTHFLOW_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.synthflow.ai/v2/calls", headers=sf, json={
        "model_id": os.environ["SYNTHFLOW_AGENT_ID"],
        "phone": line["dial"],
        "name": "Spam check",
        "from_phone_number": NUMBER,
    })
    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 Synthflow's current docs before you rely on them.

A `complete` carrier has `flagged`, `label`, `caller_name` and a `screenshot_url`. An `incomplete` carrier with `reason: "no_call"` got no call in time. Look up the Synthflow call. A `spam` status, a 603 or a 608 means the carrier blocked it, which is more urgent than a label. Incomplete carriers are free.

To skip polling, pass `webhook_url` when you start the check. We POST the result, signed with a `Spamiam-Signature` header.

### Use MCP

Synthflow agents can call tools on an external MCP server through **MCP Connectors**. Create an MCP server in your workspace with the URL `https://ismynumberspam.com/mcp` (it must be HTTPS), add an `Authorization: Bearer sia_...` header if you have a key, click **Discover Tools**, and attach only the tools you need. Synthflow notes Flow Designer support is planned, so this works on prompt-based agents today.

For agent builders, add our server to your coding agent and drive Synthflow through its API:

```bash
claude mcp add --transport http spam-i-am https://ismynumberspam.com/mcp \
  --header "Authorization: Bearer sia_..."
```

Without a key, the agent can run free first checks. When it needs to spend, it calls `request_approval` and sends you a link to approve a spending limit.

## Pre-campaign checklist

- **Check every number before it's attached** to an outbound agent or campaign.
- **Check each number in a pool.** Synthflow's outbound number pooling attaches several numbers to one agent. Each one has its own reputation.
- **Re-check after volume spikes**, and when `no-answer` or `spam` statuses climb.
- **Check active numbers on a schedule.** Weekly is a good default.
- **Count `spam`, 603 and 608 results** per `phone_number_from`.
- **One check per number per hour.** All three carriers cost $0.40.

## If it's flagged

Pause calls from that number. Then:

1. **Fix the cause.** Synthflow's own advice: keep volume steady with no sudden spikes, space out short bursts, use dedicated numbers per team, and honor opt-outs.
2. **Register the number with each analytics partner.** Synthflow's help center links Hiya (AT&T), First Orion (T-Mobile), TNS and Verizon's feedback form. The free [Free Caller Registry](https://freecallerregistry.com) covers Hiya, First Orion and TNS in one form.
3. **Set CNAM.** For Twilio numbers, Synthflow points to the Twilio Console under the number's Caller ID Name setting. Synthflow's docs don't list a paid branded-caller-ID or spam add-on of their own.
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.** Number pooling spreads normal volume across numbers. Don't use it to swap in fresh numbers whenever one gets flagged. That hides the problem, and the new numbers inherit the same pattern.
6. **Consider a reputation-management provider** for large fleets. None can guarantee removal.

Synthflow says registration changes typically take 24 hours to a few days, sometimes up to three weeks. Re-check every few days. We only check. We don't remove labels.

## FAQ

### What does Synthflow's `spam` status mean?
Synthflow lists it as a call status but doesn't define it in the API reference. Treat it as a sign the call didn't get through, and run a check to see each carrier.

### My calls show `no-answer`, not `spam`. Could I still be flagged?
Yes. A labeled call rings normally, so it looks like any unanswered call in your logs.

### Do I need to set `from_phone_number`?
For a check, yes. Without it, Synthflow uses the agent's default number selection, and the call has to come from the number you're checking.

### What does "608 Termination needs STI IDHDR" mean?
The carrier wanted STIR/SHAKEN caller verification. Make sure your number's carrier signs your calls.

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

## Sources

- [Synthflow: Make a call API](https://docs.synthflow.ai/api-reference/platform-api/calls/voice-call)
- [Synthflow: Get a call API](https://docs.synthflow.ai/api-reference/platform-api/calls/get-phone-call)
- [Synthflow: Telephony errors](https://docs.synthflow.ai/telephony-errors)
- [Synthflow: Outbound number pooling](https://docs.synthflow.ai/outbound-number-pooling)
- [Synthflow: MCP Connectors](https://docs.synthflow.ai/mcp-actions)
- [Synthflow Help Center: Outbound calls tagged as Spam Likely](https://helpcenter.synthflow.ai/articles/1634258670-outbound-calls-tagged-as-spam-likely)
- [Spam I Am API docs](/docs) · [MCP server](/docs/mcp)
