---
title: meta_list_custom_conversions
description: List the custom conversions of a Meta advertiser.
---

Ask which custom conversion an ad set can optimize for. A custom conversion is a rule on the events of a Pixel, such as a trial start on your welcome page.

> Which custom conversions does Northwind have, and which ones still receive events?

The agent calls `meta_list_custom_conversions`. A long list comes one part at a time. The agent reads each part. You see each custom conversion with its Pixel, its rule and the time of its last event. An archived custom conversion, and one that Meta made unavailable, cannot serve an ad set. The agent does not propose them. [Change what runs on Meta](/mcp/tools/change-what-runs-on-meta) shows where this step comes in the job.

## Reference

**Available on:** [![Meta](/providers/meta.svg)](https://docs.adcrunch.dev/connect/providers)

List the custom conversions of a Meta ad account. A custom conversion is a rule on the events of a Pixel, such as a `StartTrial` event on a URL that contains `/welcome`. Its `id` is the `customConversionId` of `meta_create_adset`. Returns `{ id, name, customEventType, pixelId, rule, lastFiredTime, usable }` per custom conversion. Pick one that is `usable` and that fired recently. When no answer holds a custom conversion, up to the answer with no `nextCursor`, the account has none. The answer holds at most `limit` rows (default 100, maximum 500). When it carries `nextCursor`, more rows exist: call this tool again with the same arguments and `cursor` set to that value. When it carries no `nextCursor`, you have every row.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `advertiserId` | string | yes | Advertiser account ID (`acc_<id>`). Must belong to the active organization — find one with `list_advertisers`. |
| `cursor` | string, at least 1 character | no | The `nextCursor` of the previous page. Omit it to get the first page. Send it with no change, and with the same filters as the request that answered it: a cursor from a different query gets a 400 `invalid_cursor`. Do not build or change a cursor. |
| `limit` | integer, 1 to 500 | no | The greatest number of rows on the page, from 1 to 500. The default is 100. A greater value gets a 400, with `error` of `invalid_request`. Default: `100`. |

### Output

A successful call returns this object in `structuredContent`.

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `customConversions` | array of object | yes | The custom conversions of the advertiser, in the order of Meta. The list can be empty when `nextCursor` is present. Then more custom conversions can exist. |
| `customConversions[].customEventType` | string or null | yes | The standard event that the custom conversion counts as, in the words of Meta: `START_TRIAL`, `LEAD`. Null when Meta sends none. |
| `customConversions[].id` | string | yes | The Meta id of the custom conversion. It is the `customConversionId` of `meta_create_adset`, to optimize an ad set for this custom conversion. |
| `customConversions[].lastFiredTime` | string or null | yes | The time of the last event that matched the rule, as Meta writes it (ISO 8601). Null for a custom conversion that never fired. |
| `customConversions[].name` | string | yes | The name of the custom conversion in Meta. |
| `customConversions[].pixelId` | string or null | yes | The Meta id of the Pixel whose events the rule reads. Null for a custom conversion of another source. |
| `customConversions[].rule` | string or null | yes | The rule of the custom conversion: the JSON of Meta, as a string. Null when Meta sends none. |
| `customConversions[].usable` | boolean | yes | False when Meta archived the custom conversion or made it unavailable. Do not optimize an ad set for a custom conversion that is not usable. |
| `nextCursor` | string | no | Send this value as `cursor` to get the next page. It is absent on the last page. |

### Failure codes

A failed call has `isError` set, and `structuredContent.error` holds one of these codes. [Errors](/mcp/errors) describes the shape of a failed call.

- `not_found`
- `provider_not_connected`
- `provider_error`
- `invalid_cursor`
- `organization_unentitled`
- `forbidden`
- `invalid_request`
- `internal_error`

### Scope

The token must hold `observe:read`. [Auth & scopes](/mcp/auth) lists each scope.

### Annotations

A client reads these hints. A hint that the tool does not declare has the default value of the MCP specification.

- **Read-only.** The tool changes nothing.
- **Open world.** The tool reaches a system outside AdCrunch, such as an ad platform.

### Example

The arguments:

```json
{
  "advertiserId": "acc_1485443900032333",
  "limit": 2
}
```

The result, in `structuredContent`:

```json
{
  "customConversions": [
    {
      "customEventType": "START_TRIAL",
      "id": "901234567890123",
      "lastFiredTime": "2026-09-24T07:58:40+0000",
      "name": "Trial started",
      "pixelId": "812345678901234",
      "rule": "{\"and\":[{\"event\":{\"eq\":\"StartTrial\"}},{\"url\":{\"i_contains\":\"/welcome\"}}]}",
      "usable": true
    },
    {
      "customEventType": "LEAD",
      "id": "901234567890124",
      "lastFiredTime": null,
      "name": "Old lead form",
      "pixelId": "812345678901234",
      "rule": "{\"and\":[{\"event\":{\"eq\":\"Lead\"}}]}",
      "usable": false
    }
  ]
}
```
