call_export
Export filtered call records as CSV with custom fields, date ranges, and status/source filters. Get reliable row-level call data across dates without per-call API loops.
Instructions
Export a filtered, row-level list of individual calls as CSV.
Use this — not search_calls, not a get_call loop — any time the ask is for actual call records matching a filter (e.g. "answered calls over 60s yesterday with ID/Name/City/State", "give me the calls from Google Ads last week with caller number and city"). It replaces two things people otherwise reach for and both are worse:
Paging through search_calls with a status/disposition filter — that tool only filters within whatever single page it fetched, not across the full date range, so a "321 matching calls" answer from paging is unreliable; the total at the bottom of search_calls output is always the unfiltered count.
Looping get_call once per matching call to read name/city/state — unnecessary. CTM's calls-list endpoint already returns name, city, and state on every call record; this tool fetches once (paginated server-side, same mechanism as call_disposition_report and call_crosstab) and reads those fields directly off the already-fetched payload. No per-call round trip.
Filters (all optional, AND together): min_duration/max_duration (seconds), status (matches call_status/status/dial_status, exact, case-insensitive — e.g. "answered"), source (substring match against the marketing source name, case-insensitive). These are applied client-side across the entire fetched set (bounded by max_calls), not per-page — this is what makes the count reliable, matching what call_disposition_report would report for the same filters. Cross-check against call_disposition_report's "Calls analyzed" count if you want a sanity check before trusting the row count here.
fields: comma-separated columns, in order, forming the CSV header. Supported: id, source, name, city, state, called_at, duration, status, dial_status, disposition, caller_number, tracking_number, receiving_number, agent, tag, day_of_week, campaign, campaign_id, keyword, ad_group, ad_group_id, medium, ad_network, ad_match_type, paid_source. The last several are CTM's per-call "paid" ad-attribution fields (see call_crosstab's docstring for caveats about campaign/keyword sometimes coming back "(not provided)").
sort: field to order rows by, prefix "-" for descending (default "-called_at", most recent first). Only "called_at" and "duration" are supported as sort keys; anything else leaves rows in fetch order.
Use start_date/end_date (ISO format) or time_duration (e.g. 'today', 'yesterday', 'wtd', 'last7days' — see call_crosstab's docstring for the full list of accepted values).
Returns raw CSV text — header row plus one row per matching call. Hand it straight to the user as a file, or paste into a spreadsheet. Rows are capped at max_calls fetched per account (raise it for high-volume accounts/date ranges); a truncation warning is included as a leading comment line if any account hit the cap.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | -called_at | |
| fields | No | id,source,name,city,state,called_at,duration | |
| source | No | ||
| status | No | ||
| end_date | No | ||
| max_calls | No | ||
| start_date | No | ||
| account_ids | No | ||
| max_duration | No | ||
| min_duration | No | ||
| time_duration | No | ||
| account_status | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |