Agents-first viral-hook engine: generate, score, and remix short-form hooks over MCP.
healthy
status
32
tools exposed
625ms
connect latency
6026593a78a5
schema fingerprint
Tools (32)
signup
Create an account and return your API key exactly once. No auth needed.
The entry point: an agent with nothing calls this and is productive immediately
(no CAPTCHA); new accounts get 500 credits. Args: name (1-100 chars), email
(OPTIONAL contact hint, never required), idempo
getting_started
The 5-step agent quickstart: modes, wait guidance, links. Free, no auth.
Written to be parsed and acted on. Returns {what_this_is, five_steps, modes
(cost + live latency + when to use), wait_guidance (expected_wait, estimates,
progressToken, jobs), links}.
list_archetypes
List the hook archetypes with psychology, platforms, and templates. Free, no auth.
Returns {archetypes:[{id, name, description, psychological_trigger, best_for,
templates}]}. Use an id for generate_hooks(archetypes=[...]) or
remix_hook(target_archetype=...).
pricing
The machine-readable price list, with per-mode expected_wait. Free, no auth.
Returns {unit, usd_per_credit (0 while credits are free), operations,
pricing_modes:{instant:{base:0,per_hook:1},smart:{base:0,per_hook:2},
research:{base:10,per_hook:4}} each with a formula, expect
get_estimates
The measured/expected wait per generation mode. Free, no auth.
Size a call before spending. Returns {op, modes:{instant|smart|research:
{p50_ms, p90_ms, samples, source ("measured" once enough samples, else
"default"), advice}}}.
health
Deep health: a real DB ping plus whether an LLM key is configured. Free.
Returns {status ("ok"|"unavailable"), version, time, llm_configured,
outcomes_reported_total (the compounding-corpus counter, a 60s-cached COUNT)}.
llm_configured is a pure config read; this NEVER makes
get_account
Return this account's state (no API key echoed back). Free read.
Returns {account_id, name, credits, api_key_prefix, created_at}.
Errors: unauthorized, rate_limited.
get_usage
Return the credit balance, per-operation totals, and recent ledger. Free.
Args: recent_limit (1-200, default 50), request_id (scope recent to that call's
charges), tag + key_prefix (WP-J fleet filters), api_key. Returns {credits,
totals:{by_operation}, recent:[...]} (each ro
add_credits
Top up your credit balance (1-10000). Self-serve by default.
When VHGENGINE_ADMIN_KEY is configured on the deployment this requires a
matching admin_key argument; otherwise it stays self-serve (unless
VHGENGINE_FREE_CREDITS is off). Idempotent on idempotency_key (replay does
create_checkout
Get a Stripe hosted-checkout link for a credit pack. You never touch a card (WP-PAY).
Hand the returned checkout_url to your human; the webhook credits you after they pay.
Args: pack (a credits amount from pricing.credit_packs), success_url/cancel_url
(optional), api_key (sp
create_key
Mint a new named API key; the plaintext is returned ONCE. Requires admin scope.
Delegate safely (WP-SCOPE): optional scopes (subset of read|spend|admin; omit for
full power) + daily_credit_cap (credits/day; omit for uncapped) hand a sub-agent a
key that can only do what you
list_keys
List this account's API keys as PREFIXES only (never the raw key). Admin scope.
Returns {keys:[{prefix, name, scopes, daily_credit_cap, spent_today, created_at,
revoked_at}]}, oldest first; revoked_at is null for an active key, scopes lists the
key's grant (WP-SCOPE), spent_
revoke_key
Revoke the key with `prefix` (from list_keys): it stops working, others keep working.
Use to kill a leaked or old key. Args: prefix (the 12-char key prefix, e.g.
vhg_sk_ab12), api_key (a DIFFERENT active key to authenticate this call).
Returns {prefix, name, revoked, revoked
delete_account
Permanently delete this account. TERMINAL, not reversible. Admin scope (WP-LIFE).
Pass confirm="delete" (guards an accidental call). Revokes ALL your keys (every key
401s), deletes your hooks, webhook, deliveries, jobs, and idempotency rows, KEEPS the
immutable financial led
generate_hooks
Generate ranked, scored viral hooks for a topic. Charged by mode.
Cost = base + per_hook * hooks_returned: instant 0+1, smart 0+2, research 10+4 (~50 at
count=10); a pre-flight gate reserves base + per_hook * count, never billing a broke
account. Deterministic only in instan
generate_hooks_batch
Generate hooks for many topics in ONE call, charged all-or-nothing.
One transaction: over-balance charges nothing; each item bills base + per_hook *
hooks_returned for the engine that ran (divergent tiers -> pricing_mode "mixed"). One mode
+ idempotency_key + tags cover the
score_hook
Score any hook text on 5 dimensions with rewrite tips. 1 credit.
Deterministic heuristic scorer (no LLM). Args: text (3-300), platform, tags
(1-5 fleet slugs, WP-J), verbosity (full keeps per-dimension attribution),
api_key, idempotency_key (replay not re-charged).
R
score_hooks_batch
Score many hooks ranked with `best`, or compare named SETS. 1 credit per text.
All-or-nothing charge. Plain: texts (1-25, each 3-300 chars). Self-test (E13):
compare=true + sets (2-4 named lists, <=25 texts total) INSTEAD of texts -> per-set
rankings + avg_score + winner + a
remix_hook
Rewrite an existing hook into a target archetype. 2 credits per variant.
Deterministic per input. Args: text (3-300), target_archetype (an id; see
list_archetypes), count (1-5), tags (1-5 fleet slugs, WP-J), verbosity, api_key,
idempotency_key. Billed only for variants retur
list_hooks
List the hooks this account has bought, newest first. Free (WP-G).
Persisted hooks stay retrievable for 90 days. Args: mode (instant|smart|research|
remix), since (ISO timestamp), tag (exact fleet-tag match), topic (substring),
unreported (true: only hooks a first outcome re
get_hook
Fetch one bought hook in full, including its parsed score. Free (WP-G).
Account-scoped: a foreign or unknown id is not_found (no existence leak). Args:
hook_id (from a generate/batch/remix response or list_hooks), api_key. Returns
{hook_id, text, archetype, claim_type, mode,
list_outcomes
List the posted outcomes THIS account has reported, newest first. Free (WP-LIFE).
Retrieve your own submitted telemetry in bulk (per-hook it rides get_hook). Args:
platform (tiktok|instagram|youtube|x|other), since (ISO timestamp), hook_id (one
hook), limit (1-200, default 5
report_outcome
Report what a bought hook actually did once posted. FREE (WP-H).
Honest telemetry feeding the outcome corpus (no view prediction claimed). Args:
hook_id, platform (tiktok|instagram|youtube|x|other), posted_at (ISO, not >48h
future), views/likes (0..1e11), retention_pct? (0-1
start_generate_job
Submit a generate as an async job; poll get_job for the result.
Same args as generate_hooks (tags persist); charge runs on the worker; results
are always full-verbosity; prefer for research. EITHER topic OR topics (1-20
subjects, ONE job + one atomic charge, result = the bat
get_job
Poll an async job: status, real engine stage, progress, ETA, result/error.
Poll after poll_after_seconds until status is "succeeded" (result holds the full
generate body) or "failed" (error holds the typed envelope). Only the owning
account can read a job; a foreign/unknown
list_jobs
List this account's jobs, newest first (summaries without the result blob).
Args: limit (1-200, default 50), offset (>=0), api_key. Returns {jobs:[{job_id,
status, stage, progress_pct, created_at, started_at, finished_at}], limit,
offset, total}. Errors: unauthorized, rate_l
set_webhook
Register (or replace) this account's webhook; the secret is returned ONCE. Admin scope.
VHGENGINE POSTs signed job.succeeded/job.failed/credits.low (WP-M). `url` https, no
creds, public host; re-registering ROTATES the secret (a repeat call is not a no-op).
Verify via X-VHG-
get_webhook
This account's webhook (url + last delivery status; never the secret). Free read.
Args: api_key (read scope). Cost=free. Returns {url, created_at, last_delivery_status,
last_delivery_at, events}. Errors: unauthorized, not_found (none registered),
rate_limited.
List this account's webhook deliveries, newest first. Free read (WP-HOOKS).
Verify your receiver end-to-end (a webhook.test ping is enqueued at registration) and
diagnose failures without waiting out a real event. Args: status (pending|retrying|
delivered|dead|retired), limi
redrive_webhook_delivery
Requeue a dead-lettered webhook delivery: reset to pending, due now. Admin scope.
Valid ONLY on a `dead` delivery (a live receiver that exhausted its retries); any other
status is a 409 conflict and a delivery you do not own is not_found. It re-attempts
through the normal pi
get_activity
See what this account's agents are doing: in-flight ops + recent ops. Free.
`in_flight` merges the live-ops registry (real stage/pct/eta mid-run) with your
queued/running jobs; `recent` is the last completed charged ops. Every row has a
human-readable message. The REST surfa
Endpoint
https://engine-production-3bdc.up.railway.app/mcp Category: Dev & Git · Last checked: 2026-07-30T12:47:49Z
Monitor your own MCP server
Get alerted the moment yours goes down, a tool schema drifts, or an upstream silently breaks.
What this means. This server responded to the MCP handshake and listed its tools without authentication. The schema fingerprint lets us flag if tool signatures silently change (schema drift) between checks.