---
title: "Explain a change in Meta performance"
method: POST
path: "/api/v1/tools/meta_explain_anomaly/execute"
tags: ["Meta Ads"]
---

# Explain a change in Meta performance

`POST /api/v1/tools/meta_explain_anomaly/execute`

## Request

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

Compares a window with the equally long window before it and attributes the change to the ad sets, placements, countries or age-and-gender groups that caused it.
Use when: a number moved and the user wants to know why, before changing anything.
Do not present the biggest row as the cause on its own — check its share of the move, which the table reports. A change spread thinly across everything usually means an auction or seasonality shift, not something inside the account.
Do not use it to compare two arbitrary periods of different lengths; the comparison window is always the same number of days, immediately before.
Returns the total before and after, the rows that account for most of the move, and each row's contribution.
If nothing explains more than about a sixth of the change, the tool says so instead of inventing a cause.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `arguments` object
    - `ad_account_id` string: Meta ad account id such as act_1234567890. Omit it to use the primary account; if several accounts are active and none is primary the call fails and lists the valid ids.
    - `campaign_id` string: Limit the analysis to one campaign.
    - `metric` 'spend' | 'results' | 'impressions' | 'clicks' | 'revenue': What moved. Default spend. "results" uses the objective’s own KPI.
    - `dimension` 'ad_set' | 'placement' | 'age_gender' | 'country': How to split the change. Default ad_set, which is usually where a real change lives.
    - `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. 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.
    - `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)
