bulk_update_calls
Apply the same update to every call matching a filter.
Instructions
Apply the same update to every call matching a filter.
Useful for: "tag every Bing call this month as low-priority",
"mark all <30s unanswered calls from this number as spam",
"add a note to every call from a specific landing page". Replaces
dozens of sequential update_call invocations with one tool call.
Safety: dry_run=True by default, so this tool returns a preview
of which calls WOULD be updated without actually writing. Pass dry_run=False
to commit. Hard cap of 500 calls per invocation to prevent runaway
bulk operations.
Args:
company_id, days: filter (same semantics as list_calls). At least
one filter must be provided to avoid "update everything ever".
answer_status: server-side filter. One of 'answered', 'missed', or
'voicemail'.
answered: DEPRECATED alias ('true' -> answered, 'false' -> missed).
Before v1.2.0 this was forwarded as an answered query param
that CallRail does not implement: the filter was silently
dropped, so a commit run updated EVERY call in the window.
source: applied CLIENT-SIDE (exact, case-insensitive match on each
call's source field) because CallRail has no server-side
source filter. Matching happens before the 500-cap is applied.
set_tags_add: tag names to ADD to each matched call (preserves
existing tags). Mutually compatible with other set_* fields.
set_note: note text to set on each matched call (replaces existing).
set_lead_status: e.g. 'good_lead', 'not_a_lead'.
set_spam: True to mark spam. NOTE: CallRail does not support
un-marking spam via the API, so set_spam=False is rejected.
dry_run: If True (default), return preview only. False = commit.
account_id: Auto-resolves if omitted.
Returns:
- If dry_run: {"dry_run": true, "matched": N, "would_update_calls": [...], "set_fields": {...}}
- Else: {"dry_run": false, "matched": N, "updated": M, "failed_count": K, "failures": [...]}
Performance note: when set_tags_add is used, the commit phase
issues 1 extra GET per call to fetch fresh tags before merging
(race protection against concurrent tag writes). For a max
bulk of 500 calls, this is ~2× the latency vs other set_*
fields. Other update fields (note, lead_status, spam) skip the
extra GET.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| source | No | ||
| dry_run | No | ||
| answered | No | ||
| set_note | No | ||
| set_spam | No | ||
| account_id | No | ||
| company_id | No | ||
| set_tags_add | No | ||
| answer_status | No | ||
| set_lead_status | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |