# RIA Change Radar: Form ADV Alerts & GTM Triggers (`yungstentech/ria-adv-change-radar`) Actor

Watch the RIA firms you name (by CRD or name+state) or a state/AUM filter and get typed changes from the filed SEC Form ADV on your schedule: crossed AUM band, advisers added/removed, custody, new registrant, scope, disclosure. Per-firm memory dedupes so you never see a change twice.

- **URL**: https://apify.com/yungstentech/ria-adv-change-radar.md
- **Developed by:** [Paul Mikulskis](https://apify.com/yungstentech) (community)
- **Categories:** Lead generation, Automation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $750.00 / 1,000 firm watch-months

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

RIA Change Radar watches the **Form ADV filings** of the registered investment advisers (RIAs) you name and tells you **what changed**: a firm crossing an AUM band, adding or losing advisers, a custody status or dollar change, a new registrant, a registration-scope change, a new disclosure, or an office move, returned as typed, deduped events with per-firm memory. It is the cheap, self-serve, machine-readable **delta** the SEC does not publish, built for the GTM operator who cannot or will not seat an enterprise RIA database.

It reads the free, keyless SEC sources (the Form ADV compilation feed and the IAPD firm-search API) on **your** Apify schedule, keeps each firm's history in **your** account, and never shows you the same change twice.

> **What "change" means here:** this detects changes in a firm's **filed** Form ADV, not the day a firm economically changes. Advisers amend their ADV at least annually (within 90 days of fiscal year-end) plus promptly for certain items, so a row says "the filed ADV RAUM changed from X to Y," not "the firm grew." That filing _is_ the GTM signal; it is just labelled honestly.

### What does RIA Change Radar do?

- **Check mode** returns the current filed ADV record per firm, a point-in-time compliance or evidence artifact: legal name, CRD, current regulatory AUM, custody status and dollar amount, adviser/employee counts, disclosure flag, registration scope, latest filing date, and a source URL.
- **Watch mode** enrolls each firm (pinned to its CRD) in a standing watch. Each scheduled run diffs its filed ADV against the snapshot stored in your own key-value store and writes **typed trigger events** as dataset rows (plus an optional webhook): `crossed_aum_threshold` (an actual upward band crossing), `regulatory_aum_changed` (a filed RAUM move that stays within a band), `advisers_added`, `advisers_removed`, `custody_changed`, `new_registrant`, `registration_scope_changed`, `new_disclosure`, `office_moved`, and `deregistered`. A firm that did not change gets a visible `no_change` attestation row.
- **Cohort report** produces a forwardable one-off artifact by comparing **two point-in-time snapshots** of the SEC feed: it applies your state / AUM-band / registration-scope filter at both endpoints and lists every firm in the CRD union that filed a change over the window. It is **stateless** (it never touches your watch memory) and honest about its bounds: it compares the two dated snapshots, not the days between them. See the historical sample below.

The output is flat JSON keyed on your firm identifier, so it drops straight into a CRM or an AI agent's tool loop. Apify's MCP integration also exposes this actor to agents as a single callable tool.

#### v1 scope (stated plainly)

- The money fields (AUM, custody, adviser counts) cover the **SEC-registered** adviser universe: the firms in the SEC Form ADV feed. A purely **state-registered** firm (under $100M, state-only) has no SEC-published financials; it is watchable only at the light structural tier, and its money fields come back null. A firm that newly appears in the SEC feed (the UNDERDOG WEALTH case below) fires `new_registrant` plus a `regulatory_aum_changed` row recording the filed RAUM it entered the feed with. Entering the feed already reporting above a band is described as exactly that: first appearance in the feed at that filed size, not a threshold crossing and not measured growth.
- **Custodian NAME displacement** (e.g. Schwab → Fidelity) is a stated **v1.5**, not v1. Custodian names live in the quarterly Schedule D data set, not the daily feed. v1 ships custody **status and dollar-amount** change (`custody_changed`).

### Why use RIA Change Radar?

The teams that sell to, recruit from, and acquire RIAs all run the same manual play: watch Form ADV for the moment a target firm's situation turns into a buying signal. A firm crossing $100M must move to SEC registration (a custodian and compliance-vendor opportunity). New advisers added, or a succession-flavored disclosure, flags an M&A or recruiting target. The enterprise databases bundle this alert into a full CRM suite commonly priced in the low five figures a year; the alternative is an analyst diffing snapshots by hand. This actor prices the same metered, MCP-consumable delta far below that: a portfolio watch runs from the low tens to the low hundreds of dollars a month by size, and a one-off cohort report is a flat **$29** (see Pricing).

### How to use RIA Change Radar

1. **Try a check first.** Run with `{"mode":"check","firms":[105958]}` (Vanguard, a large adviser always present in the SEC feed). You get one ADV record row for that firm. Add more CRDs to check several at once, e.g. `{"mode":"check","firms":[105958,152998]}` (adds UNDERDOG WEALTH).
2. **Start a watch.** Set `mode` to `watch` and list your firms by CRD (or `{name, state}`). The first run stores a **baseline** snapshot per firm and alerts begin on the next run; this warm-up is by design.
3. **Put it on a schedule (important).** Open the Actor's **Schedules** tab and add a **daily** schedule for this watch. Each run compares your firms against the latest SEC filing and delivers only what changed. You do not sit and poll; the schedule does.
4. **Optionally add a webhook.** Set `webhookUrl` to an https endpoint to get a best-effort POST of each run's changes. The dataset is always the durable record.
5. **Run a cohort report** with `{"mode":"report","cohortFilter":{"state":"MA","minAum":100000000}}` for a forwardable exposure artifact over a window. Pin the two endpoints with `reportStartDate` / `reportEndDate`, or leave them blank for a trailing default window. A window with fewer than two distinct snapshots, an empty cohort, or zero filed changes returns a free "nothing to report" result and is not charged.

### Input

| Field                               | What it does                                                                                                                                                                                                                 |
| ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `mode`                              | `check` / `watch` / `unwatch` / `list-events` / `report` (default `check`).                                                                                                                                                  |
| `firms`                             | CRD numbers or `{name, state}` objects. A name resolves to a CRD only on an unambiguous match; an ambiguous name returns a `needs_confirmation` row and is **not** watched or charged.                                       |
| `cohortFilter`                      | `{state, minAum, maxAum, registrationScope}` for report / cohort watch. In report mode the filter is applied at both feed endpoints and the CRD union is diffed.                                                             |
| `confirmCohort`                     | A cohort watch enrolls only when `true`; otherwise it returns a free preview (matched count + monthly price).                                                                                                                |
| `reportStartDate` / `reportEndDate` | Report mode only: the two SEC feed snapshots to diff (`YYYY-MM-DD`). Leave blank for a trailing default window ending at the newest available feed.                                                                          |
| `triggers`                          | Subset of the trigger types to fire (default all).                                                                                                                                                                           |
| `aumBands`                          | Thresholds for `crossed_aum_threshold`: a firm fires it only when its filed RAUM crosses a band upward (`old < band <= new`); a move inside one band fires `regulatory_aum_changed` instead. Default `[100M, 250M, 1B, 5B]`. |
| `webhookUrl`                        | Optional https endpoint for change alerts.                                                                                                                                                                                   |
| `watchId`                           | Names this watch's memory namespace (one per portfolio you track).                                                                                                                                                           |

### Output

Example event rows from the 2026-07-01 → 2026-07-06 diff. UNDERDOG WEALTH newly appears in the SEC feed, so it fires `new_registrant` plus a `regulatory_aum_changed` row recording the filed RAUM it entered with (the null `old_value` marks first appearance, and `aum_band_crossed` is null, so no band was crossed):

```json
[
    {
        "row_type": "event",
        "event_type": "new_registrant",
        "firm_name": "UNDERDOG WEALTH MANAGEMENT, LLC",
        "crd": "152998",
        "field": "sec_feed_presence",
        "old_value": "absent",
        "new_value": "in_feed",
        "checked_at": "2026-07-06",
        "source_url": "https://adviserinfo.sec.gov/firm/summary/152998"
    },
    {
        "row_type": "event",
        "event_type": "regulatory_aum_changed",
        "firm_name": "UNDERDOG WEALTH MANAGEMENT, LLC",
        "crd": "152998",
        "field": "regulatory_aum",
        "old_value": null,
        "new_value": 111880222,
        "aum_band_crossed": null,
        "checked_at": "2026-07-06",
        "source_url": "https://adviserinfo.sec.gov/firm/summary/152998"
    }
]
````

You can download the dataset in JSON, HTML, CSV, or Excel.

### Demo datasets

Two public datasets, readable by anyone with the link:

- **Check-mode demo**: https://api.apify.com/v2/datasets/zvNeNv9omnoIuEAwH/items?format=json\&clean=true. Two point-in-time Form ADV `check` rows (Vanguard and UNDERDOG WEALTH), each showing the filed CRD, firm name, registration status, latest filing date, regulatory AUM, adviser and employee counts, custody fields, disclosure flag, checked date, and SEC source URL.
- **Historical cohort-exposure report sample**: https://api.apify.com/v2/datasets/Oai3ZWwSNRHvKyxmL/items?format=json (or `format=html`). A `report`-mode run over a **reduced six-firm fixture slice** of the SEC feed, filed as of 2026-07-01 and 2026-07-06, filtered to SEC-registered advisers above $100M. It shows the two dated feed URLs, the 6-firm cohort union, 5 firms that filed a change (9 change events: a same-band RAUM move for COLLER, RAUM + advisers for MISSION, RAUM + advisers + custody for WESTFIELD, UNDERDOG entering the feed above $100M, WARNKE leaving the feed), 1 unchanged firm, and a summary row with the window provenance and limitations. It is a bounded sample of the output shape, not a live run or the national feed.

#### Data fields

`row_type`, `event_type`, `firm_name`, `crd`, `field`, `old_value`, `new_value`, `aum_band_crossed`, `regulatory_aum`, `discretionary_aum`, `total_accounts`, `total_employees`, `advisory_employees`, `custody_status`, `custody_amount`, `registration_type`, `registration_status`, `disclosure_flag`, `latest_filing_date`, `matched_firms`, `computed_monthly_price`, `billed`, `note`, `checked_at`, `source_url`. Report summary rows additionally carry `report_window_start`, `report_window_end`, `start_gen_on`, `end_gen_on`, `cohort_predicate`, `start_matches`, `end_matches`, `union_matches`, `firms_with_events`, `events_fired`, `unchanged_firms`, `start_source_url`, `end_source_url`, and `limitations`.

### Pricing

Pay-per-event. Compute is bundled into these prices; there is no separate usage pass-through.

| Event                     | Price     | Fires                                                                                                                                                                                                                                                         |
| ------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `firm_watch_month`        | **$0.75** | Once per watched firm per month (firms 1–100 of a watch). Bundles that firm's trigger rows, attestation and webhook. Skipped in your first free month; deferred while the feed is stale.                                                                      |
| `firm_watch_month_volume` | **$0.40** | The volume step-down for firms 101–500 of a watch.                                                                                                                                                                                                            |
| `adv_check`               | **$0.02** | Once per firm result returned in `check` mode.                                                                                                                                                                                                                |
| `cohort_report`           | **$29**   | Once per delivered cohort-exposure report, charged only after a report with at least one filed change lands. A window with fewer than two distinct snapshots, an empty cohort, zero changes, or more than 500 firms returns a free result and is not charged. |
| Actor start               | **$0**    | No start fee.                                                                                                                                                                                                                                                 |

**Worst-case monthly bill for a watch:** portfolio size × the per-firm rate, once per month, plus any `adv_check` pulls. A 25-firm daily watch is ~$18.75/month (the watch fee is charged once per firm per month regardless of how often you run). A cohort watch bills per matched firm, so it runs a **free preview** first (matched count + computed price), enforces a **500-firm hard cap**, and applies the volume step-down above 100 firms, so an unguarded state-wide filter can never silently overshoot. Your run's max-charge setting is always respected: if the budget cannot cover the run, the actor stops cleanly and tells you, rather than partially charging.

### Tips

- **One `watchId` per portfolio.** Each `watchId` is an independent memory namespace. Use `default` for your main list and separate ids for other books.
- **Daily is plenty.** The feed refreshes daily. Running hourly does not multiply your bill: a run whose feed is unchanged since the last run does no money-tier work and charges nothing.
- **The first run is a baseline.** Alerts start on the second run; that is the warm-up, stated honestly.

### FAQ, disclaimers, and support

- **Where does the data come from?** Public SEC records: the Form ADV compilation feed (`reports.adviserinfo.sec.gov`) and the IAPD firm-search API (`api.adviserinfo.sec.gov`). Both are keyless and accessed politely with a declared User-Agent at fair request rates, per the SEC's scripted-access guidance. Commercial databases resell the same public record. This is public SEC data accessed politely, not a claim of unrestricted redistribution rights.
- **Is this investment advice?** No. It reports what firms filed with the SEC; it does not evaluate advisers.
- **Known limitation:** custodian-name displacement is a stated v1.5 (Schedule D), not a v1 trigger.
- **Support:** open an issue on the Actor's Issues tab. Custom cohorts and off-store reports are available on request.

# Actor input Schema

## `mode` (type: `string`):

check = point-in-time ADV pull per firm; watch = enroll firms in per-firm memory and get typed change events on your schedule; unwatch = drop firms from a watch; list-events = summarize a watch; report = a one-off cohort-exposure report.

## `firms` (type: `array`):

The RIA firms to check or watch. Each item is a CRD number (e.g. 105958) or a {"name": "...", "state": "XX"} object. Name+state resolves to a CRD only on an unambiguous match; an ambiguous name returns a needs\_confirmation row and is NOT watched or charged.

## `cohortFilter` (type: `object`):

Match a set of firms by {state, minAum, maxAum, registrationScope: 'sec'|'era'}. A cohort watch runs a free preview first (matched count + monthly price) and enrolls nothing until confirmCohort is true; a 500-firm hard cap and a volume step-down above 100 firms bound an unguarded filter. In report mode the predicate is applied at BOTH feed endpoints and the CRD union is diffed.

## `reportStartDate` (type: `string`):

report mode only: the earlier of the two SEC feed snapshots to diff, as YYYY-MM-DD. Leave blank to use a trailing default window ending at the newest available feed. The report compares these two point-in-time snapshots only; it does not claim coverage of the days between them.

## `reportEndDate` (type: `string`):

report mode only: the later of the two SEC feed snapshots to diff, as YYYY-MM-DD. Leave blank to use the newest available feed.

## `confirmCohort` (type: `boolean`):

A cohort watch enrolls (and starts billing per matched firm) only when this is true. Leave false to get the free preview first.

## `triggers` (type: `array`):

Subset of: crossed\_aum\_threshold (an actual upward band crossing, old < band <= new), regulatory\_aum\_changed (a filed RAUM move that stays within a band), advisers\_added, advisers\_removed, custody\_changed, new\_registrant, registration\_scope\_changed, new\_disclosure, office\_moved. Default is all. (deregistered is always reported.)

## `aumBands` (type: `array`):

Thresholds for crossed\_aum\_threshold: a firm fires it only when its filed RAUM crosses a band upward (old < band <= new), reporting the highest band actually crossed. A move that stays inside one band fires regulatory\_aum\_changed instead. Default \[100M, 250M, 1B, 5B].

## `webhookUrl` (type: `string`):

Optional https:// endpoint that receives a best-effort POST of the changes found this run. The dataset is always the durable record. Put a secret token in the URL if you need origin verification.

## `watchId` (type: `string`):

Names this watch's memory namespace (its own key-value store). Use one watchId per portfolio you track. Lowercase letters, digits and hyphens, 1-40 chars.

## Actor input object example

```json
{
  "mode": "check",
  "firms": [
    105958,
    152998
  ],
  "cohortFilter": {
    "state": "MA",
    "minAum": 100000000
  },
  "confirmCohort": false,
  "triggers": [
    "crossed_aum_threshold",
    "regulatory_aum_changed",
    "advisers_added",
    "advisers_removed",
    "custody_changed",
    "new_registrant",
    "registration_scope_changed",
    "new_disclosure",
    "office_moved"
  ],
  "aumBands": [
    100000000,
    250000000,
    1000000000,
    5000000000
  ],
  "watchId": "default"
}
```

# Actor output Schema

## `changes` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "firms": [
        105958,
        152998
    ],
    "cohortFilter": {
        "state": "MA",
        "minAum": 100000000
    },
    "triggers": [
        "crossed_aum_threshold",
        "regulatory_aum_changed",
        "advisers_added",
        "advisers_removed",
        "custody_changed",
        "new_registrant",
        "registration_scope_changed",
        "new_disclosure",
        "office_moved"
    ],
    "aumBands": [
        100000000,
        250000000,
        1000000000,
        5000000000
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("yungstentech/ria-adv-change-radar").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "firms": [
        105958,
        152998,
    ],
    "cohortFilter": {
        "state": "MA",
        "minAum": 100000000,
    },
    "triggers": [
        "crossed_aum_threshold",
        "regulatory_aum_changed",
        "advisers_added",
        "advisers_removed",
        "custody_changed",
        "new_registrant",
        "registration_scope_changed",
        "new_disclosure",
        "office_moved",
    ],
    "aumBands": [
        100000000,
        250000000,
        1000000000,
        5000000000,
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("yungstentech/ria-adv-change-radar").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "firms": [
    105958,
    152998
  ],
  "cohortFilter": {
    "state": "MA",
    "minAum": 100000000
  },
  "triggers": [
    "crossed_aum_threshold",
    "regulatory_aum_changed",
    "advisers_added",
    "advisers_removed",
    "custody_changed",
    "new_registrant",
    "registration_scope_changed",
    "new_disclosure",
    "office_moved"
  ],
  "aumBands": [
    100000000,
    250000000,
    1000000000,
    5000000000
  ]
}' |
apify call yungstentech/ria-adv-change-radar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=yungstentech/ria-adv-change-radar",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RIA Change Radar: Form ADV Alerts & GTM Triggers",
        "description": "Watch the RIA firms you name (by CRD or name+state) or a state/AUM filter and get typed changes from the filed SEC Form ADV on your schedule: crossed AUM band, advisers added/removed, custody, new registrant, scope, disclosure. Per-firm memory dedupes so you never see a change twice.",
        "version": "0.0",
        "x-build-id": "Wkynp7nTABfE4oXst"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/yungstentech~ria-adv-change-radar/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-yungstentech-ria-adv-change-radar",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/yungstentech~ria-adv-change-radar/runs": {
            "post": {
                "operationId": "runs-sync-yungstentech-ria-adv-change-radar",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/yungstentech~ria-adv-change-radar/run-sync": {
            "post": {
                "operationId": "run-sync-yungstentech-ria-adv-change-radar",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "check",
                            "watch",
                            "unwatch",
                            "list-events",
                            "report"
                        ],
                        "type": "string",
                        "description": "check = point-in-time ADV pull per firm; watch = enroll firms in per-firm memory and get typed change events on your schedule; unwatch = drop firms from a watch; list-events = summarize a watch; report = a one-off cohort-exposure report.",
                        "default": "check"
                    },
                    "firms": {
                        "title": "Firms (CRD numbers or {name, state})",
                        "type": "array",
                        "description": "The RIA firms to check or watch. Each item is a CRD number (e.g. 105958) or a {\"name\": \"...\", \"state\": \"XX\"} object. Name+state resolves to a CRD only on an unambiguous match; an ambiguous name returns a needs_confirmation row and is NOT watched or charged."
                    },
                    "cohortFilter": {
                        "title": "Cohort filter (report / cohort watch)",
                        "type": "object",
                        "description": "Match a set of firms by {state, minAum, maxAum, registrationScope: 'sec'|'era'}. A cohort watch runs a free preview first (matched count + monthly price) and enrolls nothing until confirmCohort is true; a 500-firm hard cap and a volume step-down above 100 firms bound an unguarded filter. In report mode the predicate is applied at BOTH feed endpoints and the CRD union is diffed."
                    },
                    "reportStartDate": {
                        "title": "Report start date (report mode)",
                        "type": "string",
                        "description": "report mode only: the earlier of the two SEC feed snapshots to diff, as YYYY-MM-DD. Leave blank to use a trailing default window ending at the newest available feed. The report compares these two point-in-time snapshots only; it does not claim coverage of the days between them."
                    },
                    "reportEndDate": {
                        "title": "Report end date (report mode)",
                        "type": "string",
                        "description": "report mode only: the later of the two SEC feed snapshots to diff, as YYYY-MM-DD. Leave blank to use the newest available feed."
                    },
                    "confirmCohort": {
                        "title": "Confirm cohort enrollment",
                        "type": "boolean",
                        "description": "A cohort watch enrolls (and starts billing per matched firm) only when this is true. Leave false to get the free preview first.",
                        "default": false
                    },
                    "triggers": {
                        "title": "Triggers to fire",
                        "type": "array",
                        "description": "Subset of: crossed_aum_threshold (an actual upward band crossing, old < band <= new), regulatory_aum_changed (a filed RAUM move that stays within a band), advisers_added, advisers_removed, custody_changed, new_registrant, registration_scope_changed, new_disclosure, office_moved. Default is all. (deregistered is always reported.)"
                    },
                    "aumBands": {
                        "title": "AUM bands for crossed_aum_threshold ($)",
                        "type": "array",
                        "description": "Thresholds for crossed_aum_threshold: a firm fires it only when its filed RAUM crosses a band upward (old < band <= new), reporting the highest band actually crossed. A move that stays inside one band fires regulatory_aum_changed instead. Default [100M, 250M, 1B, 5B]."
                    },
                    "webhookUrl": {
                        "title": "Webhook URL (optional)",
                        "type": "string",
                        "description": "Optional https:// endpoint that receives a best-effort POST of the changes found this run. The dataset is always the durable record. Put a secret token in the URL if you need origin verification."
                    },
                    "watchId": {
                        "title": "Watch ID",
                        "type": "string",
                        "description": "Names this watch's memory namespace (its own key-value store). Use one watchId per portfolio you track. Lowercase letters, digits and hyphens, 1-40 chars.",
                        "default": "default"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
