# validate_activation_funnel

Validate a proposed definition and owned pinned references without writing.

## Purpose

Validate a proposed definition and owned pinned references without writing.

## Access and effects

Owner workspace credential only; member, partner and app-bound affiliate credentials cannot use these tools. Reads do not change definitions, start reconciliation, create events, run automations or send messages. Use the owned app UUID from [list_apps](/docs/mcp/list-apps).

## Example request

These identifiers are fictional. Replace them with your owned app, saved funnel/version and merchant.

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "validate_activation_funnel",
    "arguments": {
      "appId": "11111111-1111-4111-8111-111111111111",
      "definition": {
        "name": "Observed activation",
        "entry": {
          "kind": "install"
        },
        "mode": "requirements",
        "windowDays": 30,
        "stages": [
          {
            "id": "collected",
            "label": "First positive collection",
            "match": "all",
            "requirements": [
              {
                "kind": "collection"
              }
            ]
          }
        ]
      }
    }
  }
}
```

POST to `https://heycrust.com/api/mcp` with `Content-Type: application/json` and `Authorization: Bearer <YOUR_CREDENTIAL>`. Inspect JSON-RPC errors and `result.isError`, then parse the JSON text in `result.content`.

## Result and interpretation

Returns `valid`, structured `issues` and, for a valid definition, the normalized definition, owned pinned references and current coverage. A structurally valid proposal can still have incomplete tracking coverage. Validation stores no definition or event, queues no job and calls no provider. It does not verify that your app emitted a milestone correctly.

See [event observability](/docs/developers/event-observability) for definitions, deployment declarations and privacy boundaries.

## Query timeouts

A recognized PostgreSQL timeout returns `status: unavailable` and `reasons: [query_timeout]`, with no fabricated totals. Check status/reasons before interpreting the result; narrow the window or retry. A complete activation report can also be unavailable for fact/journey limits or `calculation_timeout`.
