list_bulk_audits
list_bulk_audits MCP tool: bulk GEO Audit campaigns of a workspace, with status, target count, LLMs, credits and progress. Inputs, response shape, JSON example.
Updated 2026-09-21
list_bulk_audits returns the bulk GEO Audit campaigns of your workspace, newest first. A bulk campaign runs one mutualised scan across N target brands and produces one report per target, so the campaign is the parent and each target is an ordinary GEO Audit.
When to use
Use it as the entry point of anything campaign-level: finding the campaign an agent should monitor, spotting the ones stuck at competitor curation, or tallying how many targets a batch produced. The targets themselves are not returned here: list them with list_geo_audits({ filters: { bulkAuditId } }).
Input
| Field | Type | Default | Description |
|---|---|---|---|
limit |
integer (1-100) | 20 | Max campaigns per page. |
cursor |
string | - | Opaque cursor from a previous page's pageInfo.nextCursor. |
filters.status |
string[] | - | Any of PENDING, REVIEWING, CONFIGURING, SCANNING, CURATING, GENERATING, COMPLETED. Omit to return every status. |
filters.dateRange |
{from?, to?} |
- | ISO date or datetime, applied on the campaign's createdAt. |
Bulk campaigns are workspace-scoped, like single GEO Audits, so this tool takes no projectId and rejects API keys restricted to specific projects.
Response
{
"data": [
{
"id": "clx_bulk_42",
"segmentTopic": "Plumbers in Lyon",
"label": "Plumbers in Lyon",
"status": "CURATING",
"targetCount": 12,
"llms": ["CHATGPT", "PERPLEXITY"],
"occurrences": 1,
"creditsCost": 420,
"progress": { "received": 120, "expected": 120 },
"createdAt": "2026-09-14T09:12:00.000Z",
"completedAt": null
}
],
"pageInfo": { "hasMore": false, "nextCursor": null, "totalCount": 1 }
}
Field notes:
statusfollows the campaign lifecycle:PENDING(targets collected, brands being extracted) →REVIEWING(low-confidence targets awaiting review) →CONFIGURING(LLMs, personas and prompts being picked) →SCANNING(shared scan running) →CURATING(paused for campaign-level competitor curation) →GENERATING(segment insights being written) →COMPLETED.labelis the inferredsegmentTopic, falling back to the first target's normalised domain when the topic has not been inferred yet. It isnullon a campaign with no target.creditsCostis what was charged when the shared scan was triggered.progresscounts scan results received against expected, across the whole campaign.
Tips and patterns
- Poll on
CURATING. That status is the only point where an agent can act: calllist_bulk_audit_competitors, thenselect_bulk_audit_competitorsto unblock insight generation for all targets at once. - Filter server-side.
filters.status: ["CURATING"]is cheaper than paging through every campaign and filtering client-side. - Campaign, then targets. Read the campaign with
get_bulk_audit, then page its targets withlist_geo_audits({ filters: { bulkAuditId } }). That list acceptsfilters.statustoo, so you can pull only the finished targets.
Related tools
- get_bulk_audit: a single campaign's state and per-status target headcount.
- list_geo_audits: the campaign's targets, and single audits.
- list_bulk_audit_competitors: candidates to curate while the campaign is CURATING.