list_hooks
List the hooks this account has bought, newest first. Free (WP-G).
Retrievable for 90 days. Args: mode (instant|smart|research|remix, or a generate
alias such as template/search), since (ISO timestamp), tag (exact fleet-tag match),
topic (substring), request_id (recover one charged call's hooks), unreported (only
hooks a first outcome report can reward), limit (1-100), offset, api_key. Returns
{hooks:[{hook_id, text, archetype, mode, score_total, created_at, request_id}],
limit, offset, total}. Errors: unauthorized, invalid_request, rate_limited.Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter to hooks carrying EXACTLY this fleet tag: a lowercase slug of 1-40 chars of [a-z0-9_-], matched LITERALLY. `_` is a legal tag character and is NOT a wildcard here, and neither is `%`; there is no pattern matching. Omit for every tag. | |
| mode | No | Filter to hooks bought from this engine. Canonical stored values: instant|smart|research|remix; the generate aliases (template|off|quick, llm|on|fast, search|deep|deep_research) are accepted and resolved to their canonical value. Omit for every mode. | |
| limit | No | Max hooks to return, 1-200. Above the ceiling is an invalid_request, never a silent truncation. | |
| since | No | Return only rows created at or after this UTC timestamp. Compared LEXICALLY against stored 'YYYY-MM-DDTHH:MM:SSZ' values, so pass that exact format (a date-only string or a unix epoch silently selects the wrong window). Omit for no lower bound. | |
| topic | No | Case-insensitive SUBSTRING match against the topic a hook was generated for (unlike `tag`, which is exact). Omit for every topic. | |
| offset | No | Number of rows to skip for paging, 0-9223372036854775807. Page with offset += the limit you actually requested; `total` in the response is the unpaged count. The ceiling is SQLite's largest bindable integer: above it the read could only ever have been a 500, so it is a typed invalid_request instead. | |
| api_key | No | API key for this call. Omit to fall back to the Authorization: Bearer / X-API-Key request header (streamable-HTTP only), then the VHGENGINE_API_KEY env var (the stdio default). No key resolvable -> unauthorized. | |
| request_id | No | Return ONLY the hooks produced by this request_id. This is the exact recovery filter: an agent that lost a generate response reads the request_id off list_runs (or its own log) and gets back precisely the hooks that call was charged for, with no guessing by topic or timestamp. An unknown or foreign request_id returns an empty page, never an error. | |
| unreported | No | true = only hooks with no outcome yet, i.e. the ones a first report_outcome can still earn a reward on. false = only hooks already reported. Omit for both. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| hooks | No | This page: {hook_id, text, archetype, mode, score_total, created_at, request_id}. hook_id is what report_outcome and get_hook take. | |
| limit | No | Page size actually applied. | |
| total | No | Rows matching the filters IGNORING paging: the number to page through, not the number returned here. | |
| offset | No | Offset this page started at. |