---
title: "Find TikTok spend with nothing to show for it"
method: POST
path: "/api/v1/tools/tiktok_analyze_wasted_spend/execute"
tags: ["TikTok Ads"]
---

# Find TikTok spend with nothing to show for it

`POST /api/v1/tools/tiktok_analyze_wasted_spend/execute`

## Request

- Base URL: `https://adako.ai`
- URL: `https://adako.ai/api/v1/tools/tiktok_analyze_wasted_spend/execute`
- Auth: HTTP bearer

Lists the ad groups and ads that spent real money over a window and produced no conversions, excluding anything still in its learning period or too thin to judge.
Use when: the user asks what to cut, where budget is leaking, or why the account's CPA is high. Run it before recommending any pause.
Do not pause anything from this list without showing it to the user first, and do not use it on a window shorter than a week — TikTok needs roughly 7 days per ad group before its numbers mean anything, and this tool excludes newer ones for exactly that reason.
Do not treat "no conversions" as proof of failure when the account has no working pixel: if every ad group shows zero, the problem is measurement, not delivery. Check tiktok_list_pixels before drawing any conclusion.
Returns each candidate with its spend, impressions, clicks and how long it has been running, plus the total that could be reclaimed. Anything under 1000 impressions is listed separately as "too thin to judge" rather than recommended — a cheap ad group that has barely run has not failed yet.
If the user wants to act, tiktok_pause_ad_group and tiktok_pause_ad do it one object at a time, each with its own confirmation.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `arguments` object
    - `advertiser_id` string: TikTok advertiser id (a long numeric string). Only needed when the user has authorised more than one advertiser. Omit it to use the primary one.
    - `campaign_id` string: Only inside this campaign.
    - `date_range` 'today' | 'yesterday' | 'last_7_days' | 'last_14_days' | 'last_30_days' | 'this_month' | 'last_month': Preset window. The "last N days" ones end yesterday, so no partial day is mixed in — it matters on TikTok, where video metrics settle for hours. Either this or start_date + end_date, never both.
    - `start_date` string: First day, YYYY-MM-DD. Needs end_date.
    - `end_date` string: Last day, YYYY-MM-DD, inclusive. Needs start_date.
    - `min_spend` number: Ignore objects that spent less than this (decimal in the account currency). Defaults to 3× the account CPA, or 2% of total spend.
    - `level` 'ad_group' | 'ad': Which level to inspect. Defaults to ad_group, where budget decisions are made.
    - `raw_data` boolean: Return compact JSON only (no markdown). Use when you will compute on the result.

## Response `200`

The tool ran. A write returns proposal_id and approve_url while the change waits for approval.

- SuccessEnvelope
  - `success` unknown, required
  - `tool` string, required
  - `data` object, required: Machine-readable result.
  - `markdown` string, required: The same result written for a person or a model.
  - `quota` Quota: Task usage for the current billing period.
    - `plan` string
    - `used` integer
    - `limit` integer
    - `period_end` string
    - `upgrade_url` string
  - `proposal_id` string: Present for writes. Nothing changes on the ad platform until it is approved.
  - `approve_url` string: Where a person approves the proposal.
  - `request_id` string, required

## Other responses

- `400`: Invalid arguments, or the ad account could not be resolved.
- `401`: Missing, invalid, revoked or expired API key.
- `402`: Monthly task quota used up, or the plan does not include this tool.
- `403`: The connected ad account lacks the access level this tool needs.
- `404`: Unknown tool name.
- `409`: Not connected, reconnect needed, confirmation required, a proposal already pending or no longer pending, an identical create that failed earlier today (proposal_failed_before), a create that duplicates an approved one (duplicate_create), the ad-account limit of the plan reached (account_limit), or an Idempotency-Key reused with different arguments.
- `429`: Rate limited by Adako or by the ad platform. See Retry-After.
- `500`: Unexpected error inside Adako.
- `502`: The ad platform returned an error.

---

[API](https://skmtc.dev/adako/apis/adako-rest-api.md) · [All operations](https://skmtc.dev/adako/apis/adako-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adako/apis/adako-rest-api/revisions/59ee60d48a56?raw)
