Hook Detector
REMOTE · API.HOOKDETECTOR.COM
Real TikTok and Instagram hooks that already work, in any language, with why each travelled.
Available components
Last scanned (2 hours ago)
Scores higher than 64% of remote servers
Reachable. Last reached 11 Nov 2026.
Category Marketing and SEO
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security66
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to call this server, and 154 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability55
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 29041 tokens (~188/item across 154 items; 154 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage82
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 38% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 15 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_preset" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 155 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Checks we ran (12)
- TLS certificate
- HTTPS
- HSTS header
- DNSSEC
- Transport
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Checks we could not complete (1)
These are gaps on our side, not findings about this hosted endpoint. We only credit what we can confirm, so a category made up entirely of them scores 0.
- Authorization in Endpoint SecurityAuthorisation not fully verified: no authorisation is required to call this server, and 154 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
Does not apply to this hosted endpoint (2)
- Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
- Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 11 Nov 26 0
- Tool “get_skeleton” rewrote its description, which is the text the model reads security
- Tool “review_hook” rewrote its description, which is the text the model reads security
- Tool “review_short” rewrote its description, which is the text the model reads security
- Tool “trending_shorts” rewrote its description, which is the text the model reads security
- 9 Nov 26 0
- Stability: 0.97 → pass security
- 8 Nov 26 0
- Stability: pass → 0.97 functional
- 7 Nov 26 0
- Endpoint reachability: unreachable → reachable ▲ functional
- 6 Nov 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 5 Nov 26 0
- Endpoint reachability: reachable → unreachable ▼ security
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- TLS certificate: pass → unverified ▼ security
- HSTS header: pass → unverified ▼ security
- Transport: pass → fail ▼ security
- Authorization: Authorisation not yet verified: we couldn't confirm whether this endpoint requires it. security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- 28 Oct 26 0
- Tool “invite_to_team” rewrote its description, which is the text the model reads security
- Tool “list_formats” rewrote its description, which is the text the model reads security
- Tool “save_to_folder” rewrote its description, which is the text the model reads security
- Tool “score_package” rewrote its description, which is the text the model reads security
- Tool “update_tracker” rewrote its description, which is the text the model reads security
- Schema quality: 25634 → 29041 ▼ functional
- New tool “clean_recording” functional
- New tool “close_poll” functional
- New tool “create_agent” functional
- New tool “create_poll” functional
- New tool “daily_ideas” functional
- New tool “delete_agent” functional
- New tool “delete_poll” functional
- New tool “get_agent” functional
- New tool “get_poll” functional
- New tool “get_research” functional
- New tool “get_skeleton” functional
- New tool “list_agents” functional
- New tool “list_polls” functional
- New tool “list_research” functional
- New tool “list_strategies” functional
- New tool “next_poll” functional
- New tool “read_retention_graph” functional
- New tool “review_edit” functional
- New tool “review_hook” functional
- New tool “review_script” functional
- New tool “review_video” functional
- New tool “thumbnail_attention” functional
- New tool “update_agent” functional
- New tool “video_badges” functional
- New tool “vote_poll” functional
- New tool “write_hook” functional
- New tool “write_script” functional
- New tool “write_upload_pack” functional
- “list_formats” added an optional parameter “include_small” cosmetic
- “save_to_folder” added an optional parameter “video_id” cosmetic
- “update_alert” added an optional parameter “daily_ideas” cosmetic
- “update_tracker” added an optional parameter “daily_ideas” cosmetic
- 27 Oct 26 −1
- Tool “find_packaging” rewrote its description, which is the text the model reads security
- Tool “get_run” rewrote its description, which is the text the model reads security
- Tool “list_finds” rewrote its description, which is the text the model reads security
- Tool coverage: 49% → 38% ▼ functional
- Schema quality: 343 → 203 ▲ functional
- Schema quality: excellent → good functional
- New tool “ab_set” functional
- New tool “accept_team_invite” functional
- New tool “add_to_tracker” functional
- New tool “channel_outliers” functional
- New tool “clone_tracker” functional
- New tool “comment_insights” functional
- New tool “create_alert” functional
- New tool “create_folder” functional
- New tool “create_team” functional
- New tool “create_tracker” functional
- New tool “create_webhook” functional
- New tool “delete_alert” functional
- New tool “delete_folder” functional
- New tool “delete_preset” functional
- New tool “delete_tracker” functional
- New tool “delete_webhook” functional
- New tool “edit_folder_item” functional
- New tool “edit_thumbnail” functional
- New tool “find_similar” functional
- New tool “find_sponsors” functional
- New tool “format_videos” functional
- New tool “get_alert” functional
- New tool “get_call” functional
- New tool “get_channel” functional
- New tool “get_folder” functional
- New tool “get_job” functional
- New tool “get_optimize” functional
- New tool “get_shared_folder” functional
- New tool “get_team” functional
- New tool “get_thumbnails” functional
- New tool “get_tracker” functional
- New tool “invite_to_team” functional
- New tool “list_alerts” functional
- New tool “list_calls” functional
- New tool “list_folders” functional
- New tool “list_formats” functional
- New tool “list_jobs” functional
- New tool “list_niches” functional
- New tool “list_presets” functional
- New tool “list_trackers” functional
- New tool “list_trends” functional
- New tool “list_webhooks” functional
- New tool “list_winners” functional
- New tool “make_thumbnails” functional
- New tool “move_team_credits” functional
- New tool “niche_report” functional
- New tool “optimize_video” functional
- New tool “preview_package” functional
- New tool “random_outliers” functional
- New tool “recreate_thumbnail” functional
- New tool “remove_from_folder” functional
- New tool “remove_from_tracker” functional
- New tool “remove_team_member” functional
- New tool “rename_folder” functional
- New tool “research_keywords” functional
- New tool “review_short” functional
- New tool “revoke_team_invite” functional
- New tool “run_alert” functional
- New tool “save_preset” functional
- New tool “save_to_folder” functional
- New tool “score_package” functional
- New tool “search_channels” functional
- New tool “search_index” functional
- New tool “search_thumbnails” functional
- New tool “set_team_member_cap” functional
- New tool “share_folder” functional
- New tool “share_run” functional
- New tool “similar_channels” functional
- New tool “start_job” functional
- New tool “swipe_file” functional
- New tool “test_webhook” functional
- New tool “tracker_alerts” functional
- New tool “tracker_feed” functional
- New tool “trending_shorts” functional
- New tool “unshare_folder” functional
- New tool “update_alert” functional
- New tool “update_tracker” functional
- New tool “video_scorecard” functional
- New tool “video_stats” functional
- New tool “view_team_invite” functional
- New tool “webhook_deliveries” functional
- New tool “write_ideas” functional
- New tool “write_titles” functional
- “find_long_hooks” added an optional parameter “filters” cosmetic
- “find_long_hooks” added an optional parameter “preset_id” cosmetic
- “find_packaging” added an optional parameter “content_type” cosmetic
- “find_packaging” added an optional parameter “filters” cosmetic
- “find_packaging” added an optional parameter “preset_id” cosmetic
- “list_finds” added an optional parameter “language” cosmetic
- “list_finds” added an optional parameter “max_channel_median” cosmetic
- “list_finds” added an optional parameter “max_comments” cosmetic
- “list_finds” added an optional parameter “max_duration_s” cosmetic
- “list_finds” added an optional parameter “max_multiple” cosmetic
- “list_finds” added an optional parameter “max_views” cosmetic
- “list_finds” added an optional parameter “min_channel_median” cosmetic
- “list_finds” added an optional parameter “min_comments” cosmetic
- “list_finds” added an optional parameter “min_duration_s” cosmetic
- “list_finds” added an optional parameter “min_multiple” cosmetic
- “list_finds” added an optional parameter “min_views” cosmetic
- “list_finds” added an optional parameter “posted_within_days” cosmetic
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 11 Nov 2026 · Probed https://api.hookdetector.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=api.hookdetector.com | CN=YR2,O=Let's Encrypt,C=US | 22 Sept 2026 | 21 Dec 2026 | RSA 2048 | SHA256-RSA | 585b078a9a9ec8f997a261e8114ae84cd05 |
| SANs: api.hookdetector.com | ||||||
| CN=YR2,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | 4ebd24947e24d394802d84a52fd5b319 |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of api.hookdetector.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | Trust anchor | 20326, 38696 | 8, 8 | Verified |
| com. | DS published | 19718 | 13 | Verified |
| hookdetector.com. | DS published | 1191 | 13 | Verified |
| api.hookdetector.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=31536000; includeSubDomains |
| content-security-policy | frame-ancestors 'none' |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | no-referrer |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.hookdetector.com/mcp | Verified | 200 | |
| http (plaintext) | http://api.hookdetector.com/mcp | HTTPS enforced | 301 | https://api.hookdetector.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
ab_set ~98
Pack 2 or 3 images of one of your thumbnails, edit or Optimize calls for YouTube Studio's Test and Compare: a zip of A, B, C (1280x720, under 2 MB) and a note of what each tests. Free. Same as POST /v1/ab.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| picks | array | yes | – |
| source_call_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
accept_team_invite ~112
Join the team an invite names. From then on what you spend comes from the team's pool; your own runs stay private and your own balance waits for you. Each link works once (409 invite_used) for 7 days (410 invite_expired). Needs admin. Free. Same as POST /v1/team/invites/{token}/accept.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| token | string | yes | the hdt_... token, the part of the link after # |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
add_to_tracker ~53
Add channels to one of your trackers. Same as POST /v1/trackers/{tracker_id}/channels.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| channels | array | yes | – |
| tracker_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
admin_adjust_credits ~154
Owner only: add or remove an account's credits, as POST /v1/admin/accounts/{account_id}/credits. A change that would take the balance below zero is 422 credits_below_zero and nothing changes; an unknown account is 404 account_not_found. Every change is audited (admin_list_actions). Returns {account_id, credits, delta}.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | the id from admin_list_accounts |
| api_key | – | – | – |
| delta | – | – | credits to add (positive) or remove (negative), -1000000 to 1000000, not zero |
| note | – | – | why, for the audit: 1 to 200 characters, required |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
admin_list_accounts ~129
Owner only: every account, newest first, as GET /v1/admin/accounts: {total, accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hooks, charged_total, is_admin, admitted_by, keys_active}]}. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| limit | – | – | page size, 1 to 200 (default 50) |
| offset | – | – | how many to skip |
| q | – | – | up to 200 characters: part of an email or label (any case), or the start of an id |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
admin_list_actions ~82
Owner only: the audit of password sign-ins and credit changes, newest first, as GET /v1/admin/actions: {actions: [{id, action, actor_email, target_account_id, detail, created_at}]}. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| limit | – | – | page size, 1 to 200 (default 50) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
admin_list_runs ~125
Owner only: every account's research runs, newest first, as GET /v1/admin/runs: {runs: [{run_id, account_id, email, topic, language, country, status, requested, hooks, reserved, charged, failure_kind, error, created_at, finished_at}]}. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | only this account's |
| api_key | – | – | – |
| limit | – | – | page size, 1 to 200 (default 50) |
| status | – | – | only runs with this status: queued, running, done, failed |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
admin_overview ~140
Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight); hooks; credits (charged_24h, charged_7d, charged_total, balance_total); access (pending_requests, active_codes, redemptions); search (credits_left, low, accepting_runs; null when not read yet); and the running commit. Needs the admin scope and an admin account (403 admin_required otherwise). Free.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
approve_access_request ~100
Owner only: approve an access request. Makes a one-use code, marks the request approved and emails the code. The code is in this result once, with emailed true or false; when false, send it yourself or approve again (the unused code is revoked and a new one sent). 409 request_already_decided once its code was used. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| request_id | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
balance ~118
Your account and remaining credits right now: account_id, credits, key_prefix and key_id of the key making this call, label, created_at, and that key's scopes, credit_limit and expires_at, and user (the person signed in with Google, or null). Same shape as GET /v1/me. A run needs at least 40 credits and reserves up to 200. For spend, credits held by in-flight runs and daily history, call usage. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
channel_outliers ~102
A channel's own outliers (scope own), or outliers for a channel like it from other channels in the shared index (scope niche, 3x and over by default). Free. Same as GET /v1/channels/{ref}/outliers.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| limit | integer | – | – |
| min_multiple | – | – | – |
| ref | string | yes | – |
| scope | string | – | own or niche |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
chat ~1,280
One conversational turn, for an agent relaying a person's words. It either asks ONE clarifying question (action "clarify"), answers about delivered hooks or the tool (action "answer", run null, no credits), or starts a research run (action "research", with the started run under "run"), exactly like POST /v1/chat. Every response has suggestions: 0 to 4 follow-ups, [] for research. A deck size typed into the message ("..., 15 hooks") and a recency phrase ("this month", "last week") set the run's count and posted_within_days; the count argument sets the deck size when the message states none. Asked to make one of the conversation's hooks yours for a niche ("make hook 2 mine for dentists"), the turn writes lines from that hook's structure (1 credit, like remix_hook) and answers them labelled, the full result under "remix". language and country select the search locale: omitted or null keeps the current conversation setting; a value sets it for this and later turns; an empty string clears it to any language / any country. The picker wins over the message's locale; replies stay in the language the person writes in. Invalid locale: 422 invalid_request. message is 1 to 4000 characters. Pass conversation_id from an earlier turn to keep the context; leave it out to start a conversation. Cost: a turn itself is free but is a model call, so turns are limited per account per hour (429 rate_limited); a turn that starts a run reserves credits like find_hooks. Next step: on "research", call get_run with run.run_id and wait_seconds=50. Errors: 503 model_unavailable when the model is down (nothing charged, try again), 402 insufficient_credits. For direct research without the question step, call find_hooks instead. Needs the write permission, and research for a turn that starts a run (403 insufficient_scope, nothing reserved).
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| conversation_id | – | – | – |
| count | – | – | how many hooks a run this turn starts should deliver, 1 to 30; a size typed into the message ("15 hooks") wins over it, and it wins over the turn's own guess; null or omitted lets the turn decide. Fe… |
| country | – | – | optional: only clips from creators in this country, as an assigned ISO 3166-1 alpha-2 code: MA, EG, BR, US (UK is read as GB). For a region that is not a country, send its country's code and name the… |
| idempotency_key | – | – | retry safely: a turn that started a run with this key within 24 hours answers that run again, no model call, nothing reserved |
| language | – | – | optional, up to 60 characters: only clips spoken or written in this language or dialect, in words or as a tag: "Moroccan Darija", "ar-MA", "Egyptian Arabic", "Brazilian Portuguese". Any language work… |
| message | string | yes | – |
| platforms | array|null | – | since 2026-10-10: optional, which platforms to search and deliver from, a non-empty list of "tiktok", "instagram" and "youtube" (YouTube Shorts); left out (or all three) searches all three. ["instagr… |
| posted_within_days | integer|null | – | since 2026-10-01: optional, how recent the clips must be, as days: 7, 30, 90, 365. The search asks the platforms for that window and the floor for a clip under 7 days old uses views per day (10,000 a… |
| seed_hook_ids | array|null | – | since 2026-10-01: optional, up to 10 hook ids from your runs (a kept hook from GET /v1/keeps, or any hook you can read): "find more like these". The engine reads their lines, topics, creators and lan… |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
clean_recording ~180
The talking-head cleaner (15 credits), like 1of10's AutoCut: silences tightened, retakes, false starts, stutters and fillers cut with a reason on every cut, other microphones or cameras synced to the first, as Premiere XML, FCPXML and a CMX 3600 EDL. Takes 1 to 4 file_id values staged with POST /v1/clean/files (a chat cannot send the file itself). Runs as a job; get_call reads it. Same as POST /v1/clean.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| files | – | – | – |
| idempotency_key | – | – | 1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
clear_decision ~119
Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and its export row carries none. Returns {"hook_id", "verdict": null}. Clearing a hook with no decision is the same success, so a retry is safe. Same as DELETE /v1/hooks/{hook_id}/decision. Free. Errors: 404 hook_not_found, 422 for an id that is not a UUID.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| hook_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
clear_find_decision ~100
Undo keep_find: the video goes back to having no verdict, on every find of it, and leaves list_kept_finds. Returns {"find_id", "verdict": null}. Clearing a find with no decision is the same success, so a retry is safe. Same as DELETE /v1/finds/{find_id}/decision. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| find_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
clone_tracker ~57
Copy a public or shared tracker into a private one of yours. Same as POST /v1/trackers/{tracker_id}/clone.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| token | – | – | – |
| tracker_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
close_poll ~62
End your poll now: no more votes, the votes so far kept with its results. Free. Same as POST /v1/polls/{poll_id}/close.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| poll_id | string | yes | the poll's id |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
comment_insights ~348
What a subject's audience asks and struggles with: the top comments of its outliers (videos that beat their own channel; or your video_ids, or a channel's best uploads), grouped into questions, pain points and requests. clusters: label, kind (question, pain_point, request, other), count (comments in the group, counted in code, never by the model), likes, videos, and quotes: two real comments found word for word, each with its link (url opens the comment). videos: what was read, with views, multiple (views over the channel's usual), comments_read and comments_off. basis says what the counts are from. Costs 3 credits, refunded when the read fails; a request naming nothing or two things is 422 and costs nothing. Takes about 60 to 100 seconds (measured 2026-10-26). Same as POST /v1/comments/insights. Read it back with get_call.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| channel | – | – | a YouTube @handle or channel link: its uploads that beat its usual views |
| idempotency_key | – | – | 1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused |
| subject | – | – | what the videos are about, 3 to 120 characters: its outliers are read. Send this, video_ids or channel |
| video_ids | – | – | 1 to 8 YouTube video ids or links whose comments to read |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_access_code ~132
Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1), expires_in_days 1 to 365 (optional), note your own. email binds it to one person: then only Google sign-in with that verified email redeems it, never the API or MCP; leave it out for a code that works on every door. The code is in this result only. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| – | – | – | |
| expires_in_days | – | – | – |
| max_uses | – | – | – |
| note | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_account ~182
Create an account and get an API key with free credits. Needs a beta access code (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the error is 403 access_code_required, and a code that does not work is 403 invalid_access_code. Ask for a code with request_access, or at hookdetector.com/access. No key needed for this call. label is an optional note up to 120 characters. Keep the api_key it returns: it is the only copy. Send it as the header 'Authorization: Bearer hd_...' or pass it as api_key on every other tool. Signups, and wrong codes, are limited per address per hour. Next step: find_hooks.
| Name | Type | Req | Description |
|---|---|---|---|
| access_code | – | – | – |
| label | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_agent ~71
An agent that runs a Video Review on each new long upload of a tracker's channels, inside a monthly credit budget. Same as POST /v1/agents.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| monthly_budget | integer | yes | – |
| name | string | yes | – |
| tracker_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_alert ~99
Save a search checked daily or weekly; a new video at your line (default 3x its channel) is a hit, emailed, with a Monday digest. 1 credit a check. Same as POST /v1/alerts.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| – | – | – | |
| frequency | – | – | daily or weekly |
| min_multiple | – | – | – |
| min_vph | – | – | – |
| query | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_folder ~212
Make a named folder on one tab to file hooks or finds in. The same name again on that tab (case and spaces aside) returns the folder already there with created false, so a retry never makes two. At most 200 folders an account (409 folder_limit_reached). Returns the folder: folder_id, kind, name, item_count, cover, shared, share_url, created. Same as POST /v1/folders. Free. Next: save_to_folder.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| description | – | – | optional, up to 280 characters |
| kind | – | – | the tab: "short" (Short form hooks), "long" (Long form finds) or "packaging" (Packaging finds) |
| name | – | – | 1 to 80 characters; the same name again on the tab is the folder already there |
| team | boolean | – | true: your team's folder, which every member sees and edits (404 not_in_team without a team) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_key ~296
Create another API key on your account, for example one per agent or machine, so you can revoke one without touching the others. name is up to 60 characters. Give the key only what it needs. scopes: any of "read" (read runs, hooks, keeps, usage), "write" (keep, reject, undo, chat), "research" (start runs, which spend credits), "admin" (manage keys, delete the account); all four when left out. An agent that finds hooks needs ["read", "write", "research"]. credit_limit: the most credits runs started with this key may spend over its life, 1 to 100000 (a run then reserves at most what is left). expires_in_days: 1 to 365; the key then stops working (401 key_expired). The new key is in this result once and never again: store it now. Needs admin. An account holds at most 10 active keys (409 beyond) and may create 20 per hour by default (429 beyond). Free. Next step: use the returned api_key; revoke old ones with revoke_key.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| credit_limit | integer | – | – |
| expires_in_days | integer | – | – |
| name | – | – | – |
| scopes | array | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_poll ~213
Put 2 to 4 packages to Hook Detector's users, who pick the one they would click, blind. Closes at votes_wanted or after 7 days. 2 credits, given back when a picture cannot be stored. Results with get_poll. Same as POST /v1/polls.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| idempotency_key | – | – | 1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused |
| options | array | yes | 2 to 4 packages, each {title, thumbnail}: a title of 1 to 100 characters and a JPEG, PNG or WebP in base64 or an i.ytimg.com URL |
| question | – | – | default: Which would you click? |
| subject | – | – | what the video is about |
| votes_wanted | – | – | 10 to 200, default 30 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_team ~115
Create a team this account owns, funding its pool from your balance with credits (402 when you hold less). Members' spending comes from the pool; you keep spending your own balance. 409 already_in_team. Needs admin. Free. Same as POST /v1/team.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| credits | – | – | credits to move from your balance into the team's pool now; 0 or left out moves none |
| name | string | yes | the team's name, 1 to 80 characters |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_tracker ~149
Make a tracker of up to 50 channels: hourly reads of their newest uploads, alerts when one reaches the multiple (default 3x its channel) or views per hour, in the app and by email. 1 credit a tracked channel a day. Same as POST /v1/trackers.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_email | – | – | – |
| api_key | – | – | – |
| channels | – | – | UC ids, @handles or addresses |
| multiple_threshold | – | – | – |
| name | string | yes | – |
| team | boolean | – | true: your team's tracker, which every member sees and edits |
| visibility | string | – | private, shared or public |
| vph_threshold | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_webhook ~79
Post every new tracker alert and saved-search hit to your https URL, signed with the secret this returns once (X-HD-Signature). Same as POST /v1/webhooks.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| events | – | – | tracker.alert, search.hit |
| url | string | yes | https, port 443, public host |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
daily_ideas ~76
Your daily idea sets (turn them on per saved search or tracker with daily_ideas), each idea with the real finds behind it, none repeated within a week. Same as GET /v1/ideas/daily.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| days | integer | – | – |
| source_id | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_account ~164
Erase your account and everything in it, for good: every API key, run, hook, keep or reject decision, conversation and message. Unspent credits go with it. It cannot be undone. confirm must be exactly "delete my account", or nothing happens (422 confirmation_required). Refused with 409 run_in_flight while a run is queued or running: wait for it with get_run first. Returns {"deleted": true, "account_id", "erased": {counts per kind}, "message"}. Every key of the account stops working at once; create_account starts a new one. Same as DELETE /v1/account. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| confirm | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_agent ~40
Delete one of your agents. Same as DELETE /v1/agents/{agent_id}.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | string | yes | – |
| api_key | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_alert ~39
Delete a saved search. Same as DELETE /v1/alerts/{alert_id}.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_id | string | yes | – |
| api_key | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_folder ~98
Delete a folder, its items and its share link at once (the link stops working). The hooks and finds in it, and their keeps, stay. Returns {"folder_id", "deleted": true}. Same as DELETE /v1/folders/{folder_id}. Free. Errors: 404 folder_not_found.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| folder_id | – | – | one of your folders (from list_folders or create_folder) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_poll ~50
Delete your poll, its votes and its pictures. Free. Same as DELETE /v1/polls/{poll_id}.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| poll_id | string | yes | the poll's id |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_preset ~53
Delete one of your presets. Same as DELETE /v1/presets/{preset_id}. Free. Errors: 404 preset_not_found.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| preset_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_tracker ~41
Delete one of your trackers. Same as DELETE /v1/trackers/{tracker_id}.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| tracker_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_webhook ~43
Delete one of your webhooks. Same as DELETE /v1/webhooks/{webhook_id}.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| webhook_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
edit_folder_item ~115
Set the note on one item of a folder. Returns the item. Same as PATCH /v1/folders/{folder_id}/items/{item_id}. Free. Errors: 404 item_not_found.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| folder_id | – | – | one of your folders (from list_folders or create_folder) |
| item_id | – | – | an item of that folder (from get_folder or save_to_folder) |
| note | – | – | the note, up to 1000 characters; "" or null clears it |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
edit_thumbnail ~235
Edit one thumbnail (an image of your thumbnails call, or a picture you send): op erase, edit, face_swap, text, text_variations, upscale, fix, crop or color. crop and color are free; upscale 12; the rest 4 (a version each for text_variations), charged only for what is delivered. Answers at once; read it with get_thumbnails. Same as POST /v1/thumbnails/edit.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| brightness | – | – | – |
| contrast | – | – | – |
| faces | – | – | – |
| fixes | – | – | – |
| idempotency_key | – | – | 1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused |
| op | string | yes | – |
| prompt | – | – | – |
| region | – | – | – |
| saturation | – | – | – |
| score_call_id | – | – | – |
| source | – | – | – |
| source_call_id | – | – | – |
| source_n | – | – | – |
| variations | – | – | – |
| words | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
embed_hook ~114
Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your own page. kind is "embed", or "fallback" when the creator disabled embedding or the clip is a photo post found before 2026-09-26 (then show thumbnail, which falls back to the hook's still_url, and the transcript). For a plain vertical iframe use the hook's player_url instead. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| hook_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
export_run ~191
A finished run's hooks as a file a creator can open: format "csv" (default; one row per hook, opens in any spreadsheet, formula-like cells defused with a leading quote), "json" (the full hook objects) or "md" (Markdown notes, one section per hook). Returns {"filename", "content_type", "format", "content"}, where content is the whole file as text: write it to filename. The same bytes as GET /v1/runs/{run_id}/export?format=... . Free. Errors: 404 run_not_found, 409 run_not_finished while the run is queued or running (call get_run with wait_seconds=50 first), 422 invalid_request for another format.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| format | string | – | – |
| run_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
find_hooks ~2,291
Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts only, never long-form YouTube; platform "youtube"). platforms (since 2026-10-10, any of "tiktok", "instagram", "youtube"; all three when left out) searches and delivers only those: ["instagram"] is Instagram reels only. What it does: searches both platforms, reads what each clip says and shows, and returns ranked hooks. Each hook has its verbatim opening line, most quotable line, main idea, why it travelled, topic, on-screen text, full transcript, a watch link and a vertical player_url (9:16 iframe). Talking heads only (since 2026-09-29): `hooks` holds only clips where a person on camera is talking (talking head, podcast, interview). A clip where nobody talks is dropped; Bonus was removed on 2026-10-08 and `bonus` is always []. Every hook carries format (talking_head, podcast, interview, stage; null on older hooks) and section (always "main"). A run that finds fewer talking heads than count says so in outcome; it never fills hooks with clips that do not talk. Where it comes from (since 2026-09-30): every hook has creator_country (ISO alpha-2 of the creator's TikTok account; always null on Instagram, which states none), place (the place the creator tagged, or null) and place_country (that place's country when the platform states it). Never guessed. Banner (since 2026-09-30): every hook has banner, the title-style text the creator placed on the video to hook the viewer, verbatim (at most 200 characters), or null when it has none; subtitles are never a banner. onscreen_text keeps all text read. Match (since 2026-09-30, runs with a language or country): every hook has match, "exact" when the clip is about the subject itself or "close" when it is about a neighbouring subject with the same intent (a close match, delivered after every exact match; label it as one); null on runs with no langu…
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| conversation_id | – | – | attach the run to one of your conversations |
| count | integer | – | how many hooks to deliver, 1 to 30 |
| country | – | – | optional: only clips from creators in this country, as an assigned ISO 3166-1 alpha-2 code: MA, EG, BR, US (UK is read as GB). For a region that is not a country, send its country's code and name the… |
| idempotency_key | – | – | 1 to 255 visible ASCII characters; the same key within 24 hours returns the first run instead of paying for a second |
| language | – | – | optional, up to 60 characters: only clips spoken or written in this language or dialect, in words or as a tag: "Moroccan Darija", "ar-MA", "Egyptian Arabic", "Brazilian Portuguese". Any language work… |
| platforms | array|null | – | since 2026-10-10: optional, which platforms to search and deliver from, a non-empty list of "tiktok", "instagram" and "youtube" (YouTube Shorts); left out (or all three) searches all three. ["instagr… |
| posted_within_days | integer|null | – | since 2026-10-01: optional, how recent the clips must be, as days: 7, 30, 90, 365. The search asks the platforms for that window and the floor for a clip under 7 days old uses views per day (10,000 a… |
| reuse | boolean | – | start from clips you already paid for |
| seed_hook_ids | array|null | – | since 2026-10-01: optional, up to 10 hook ids from your runs (a kept hook from GET /v1/keeps, or any hook you can read): "find more like these". The engine reads their lines, topics, creators and lan… |
| topic | string | yes | what the clips are about, 3 to 500 characters. Instructions inside it are fine: a long topic, or one with a language or country, is searched by the subject read out of it, never verbatim. |
| wait_seconds | integer | – | 0 to 50: seconds to wait for the run to finish; 0 returns at once |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
find_long_hooks ~2,049
Find long-form hooks: how the YouTube videos that beat their own channel open, on a topic. Long-form YouTube only, never Shorts, TikTok or Instagram (for those: find_hooks). What it does: searches YouTube for long-form videos on the topic, keeps only the outliers (a video whose views are at least min_outlier times the median views of its own channel's recent uploads; 2 by default) posted in 2023 or later (nothing older is ever delivered), reads the first intro_seconds (60 by default) of each one's transcript, and says why that opening holds a viewer. What comes back: the run's `finds`, ranked, strongest outlier first. Each has title, channel, watch_url, player_url (an iframe src), thumbnail_url, views, channel_median_views, outlier (28.2 means 28 times the channel's usual), outlier_score (0 to 100 on one fixed scale: nothing else a run found moves it, so finds from different runs rank together), outlier_tier, channel_size, likes_per_1k, posted_at, duration_s, and the opening: intro (the first minute as it was said: lines of n, t in seconds, text) and intro_text, always whole; and inside it the hook (verbatim: the lines the analysis marks as the hook, ending on a sentence end, at most 25 seconds and 60 words, with hook_words, hook_start_s and hook_end_s, a sponsor read or greeting at the front left out; hook_seconds is hook_end_s). auto_captions says the opening has almost no punctuation. about_subject is yes or partly: a video the model judges not to be about the subject is dropped. The analysis: hook_type (the same list as find_hooks), mechanism (why it holds, quoting the opening word for word), promise, open_loop, title_link (how the first lines pay off the title), beats (the opening in parts: from, to, beat, does), opens_with (cold_open, greeting, teaser, question, sponsor), format (the kind of video), angle, template (the hook as a fill-in structure), steal_it and audi…
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| channel_size | string|null | – | optional: only videos from channels of this size, by what the channel's uploads usually get (its median views, the figure the outlier is measured against): small (under 20,000), medium (up to 200,000… |
| count | integer | – | how many long-form hooks to deliver, 1 to 30 |
| country | – | – | optional, an assigned ISO 3166-1 alpha-2 code (US, GB, MA): searches YouTube as seen from this country. It steers the search; it does not filter the channels |
| filters | object|null | – | optional bounds, every one optional: min_multiple and max_multiple (views over the channel's median, 1 to 1000), min_views, max_views, min_channel_median, max_channel_median, min_duration_s, max_dura… |
| idempotency_key | – | – | 1 to 255 visible ASCII characters; the same key within 24 hours returns the first run instead of paying for a second |
| intro_seconds | integer|null | – | optional, 20 to 120 (default 60): how many seconds of each video's opening to read and return |
| language | – | – | optional, up to 60 characters: the language the videos should be spoken in, in words or as a tag ("Spanish", "pt-BR"). Left out, it is read from the topic's own language |
| min_outlier | number|null | – | optional, 1.5 to 100 (default 2): how many times its own channel's usual views a video must have to count as an outlier. Only outliers are ever delivered |
| openers | integer|null | – | optional, 0 to 6 (default 3): how many openings to write for the subject from the structure of the real ones; 0 for none |
| posted_within_days | integer|null | – | optional, how recent the videos must be, as days: 30, 90, 365, 730. Null or left out means everything since 2023-01-01; nothing older is ever delivered |
| preset_id | – | – | optional: start from a saved preset of this tab (save_preset); filters sent with it win over the preset's |
| reuse | boolean | – | start from the videos your last long or packaging run on this topic already bought (within a week), so the second tab on a topic costs little |
| topic | string | yes | the subject to research, 3 to 500 characters, in any language. Or a YouTube address instead of a subject: a channel's (https://www.youtube.com/@name, or just @name) returns that channel's own outlier… |
| wait_seconds | integer | – | 0 to 50: seconds to wait for the run to finish; 0 returns at once |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
find_packaging ~1,983
Find packaging: the titles and thumbnails that earned the click on a topic, from long-form YouTube videos that beat their own channel. What it does: runs the same outlier search as find_long_hooks (long-form YouTube, 2023 or later, views at least min_outlier times the channel's usual), then looks at each video's thumbnail beside its title and says what the pair is doing. What comes back: the run's `finds`, ranked. Each is a real package, as YouTube shows it: title (verbatim) and thumbnail_url (the size YouTube really served, the picture the analysis looked at; thumbnail_checked says so), channel, watch_url, views, channel_median_views, outlier, outlier_score (0 to 100 on one fixed scale, so finds from different runs rank together), outlier_tier, channel_size and posted_at, plus the analysis: title_device (curiosity_gap, contrarian_claim, specific_number, how_to, listicle, challenge, story, question, warning, comparison, authority, timeliness, identity_callout, other), title_template (the title as a fill-in structure), thumbnail_text (the words printed on the thumbnail, read by a vision model; null when none), thumbnail_text_role (repeats_title, adds_to_title, contrasts_title, no_text; counted from title_overlap, the share of the thumbnail's words that are also in the title, where that can be), thumbnail_subject, thumbnail_faces, thumbnail_emotion, thumbnail_colors, thumbnail_composition, thumbnail_devices, angle, gap (what the picture shows that the title does not say, and the question that leaves), promise, steal_it and audience, visible_action (the single thing happening in the picture), title_carries and picture_adds (what only the title says, what only the picture adds), text_box, and thumb_metrics (measured in code from the pixels: palette, brightness, contrast, saturation, busyness, the biggest words' height at 210 px wide and whether the length corner is clear), plus cu…
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| channel_size | string|null | – | optional: only videos from channels of this size, by what the channel's uploads usually get (its median views, the figure the outlier is measured against): small (under 20,000), medium (up to 200,000… |
| content_type | string|null | – | optional: "long" (long-form videos, the default) or "short" (YouTube Shorts): the kind of video whose packages to find. A Short is measured against its own channel's Shorts |
| count | integer | – | how many packages to deliver, 1 to 30 |
| country | – | – | optional, an assigned ISO 3166-1 alpha-2 code (US, GB, MA): searches YouTube as seen from this country. It steers the search; it does not filter the channels |
| filters | object|null | – | optional bounds, every one optional: min_multiple and max_multiple (views over the channel's median, 1 to 1000), min_views, max_views, min_channel_median, max_channel_median, min_duration_s, max_dura… |
| ideas | integer|null | – | optional, 0 to 10 (default 6): how many written packages (a title and a thumbnail concept) to add for the subject; 0 for none |
| idempotency_key | – | – | 1 to 255 visible ASCII characters; the same key within 24 hours returns the first run instead of paying for a second |
| language | – | – | optional, up to 60 characters: the language the videos should be spoken in, in words or as a tag ("Spanish", "pt-BR"). Left out, it is read from the topic's own language |
| min_outlier | number|null | – | optional, 1.5 to 100 (default 2): how many times its own channel's usual views a video must have to count as an outlier. Only outliers are ever delivered |
| posted_within_days | integer|null | – | optional, how recent the videos must be, as days: 30, 90, 365, 730. Null or left out means everything since 2023-01-01; nothing older is ever delivered |
| preset_id | – | – | optional: start from a saved preset of this tab (save_preset); filters sent with it win over the preset's |
| reuse | boolean | – | start from the videos your last long or packaging run on this topic already bought (within a week), so the second tab on a topic costs little |
| topic | string | yes | the subject to research, 3 to 500 characters, in any language. Or a YouTube address instead of a subject: a channel's (https://www.youtube.com/@name, or just @name) returns that channel's own outlier… |
| wait_seconds | integer | – | 0 to 50: seconds to wait for the run to finish; 0 returns at once |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
find_similar ~211
The videos in the shared index nearest one of your finds (find_id from a Packaging or Long form run), nearest first, never the find's own video. Each has distance (0 is the same; measures says how it is computed), its numbers and its multiple over its channel's median. A find not indexed yet is matched by its own words (matched_from). Free. Same as GET /v1/finds/{find_id}/similar. Errors: 404 find_not_found.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| content_type | – | – | long or short |
| find_id | string | yes | – |
| limit | – | – | 1 to 50 (default 12) |
| min_multiple | – | – | – |
| posted_within_days | – | – | 30, 90, 365 or 730 |
| type | – | – | video (default): by the title's meaning on any channel; title: on other channels; thumbnail: by our read of the picture on other channels |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
find_sponsors ~218
Who sponsors the channels on a subject: in the descriptions of its outliers, sponsor lines, promo codes and offer links found in code, plus Scrape Creators' sponsor read of videos YouTube marks as paid promotion, each named by one model read and kept only when the brand's name is in its own line. sponsors: brand, kind (sponsor, affiliate, other), channel_count and video_count (counted in code), channels, and videos with the evidence line as written, the code and the link. Costs 1 credit, refunded when the read fails. Same as POST /v1/sponsors. Read it back with get_call.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| idempotency_key | – | – | 1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused |
| subject | – | – | 3 to 120 characters |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
format_videos ~53
One title format's videos, strongest first. Free. Same as GET /v1/formats/{format_id}.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| format_id | string | yes | – |
| limit | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_agent ~51
One agent and its reviews (done, skipped or failed, and why). Same as GET /v1/agents/{agent_id}.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | string | yes | – |
| api_key | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_alert ~41
One saved search and its hits. Same as GET /v1/alerts/{alert_id}.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_id | string | yes | – |
| api_key | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_call ~78
One call of a priced tool (titles and the tools after it): tool, credits, charged, status (pending, done, failed), request and result. Same as GET /v1/calls/{call_id}. Free. Errors: 404 call_not_found.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| call_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
How do I install the Hook Detector MCP server?
Hook Detector is a hosted endpoint at https://api.hookdetector.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.hookdetector.com
claude mcp add --transport http com-hookdetector-hookdetector 'https://api.hookdetector.com/mcp'
What is the Hook Detector MCP server?
Hook Detector is an MCP server listed in the public MCP registry as com.hookdetector/hookdetector. Real TikTok and Instagram hooks that already work, in any language, with why each travelled. This page covers its hosted endpoint (https://api.hookdetector.com/mcp).
Is the Hook Detector MCP server safe to use?
Hook Detector scores 75 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Hook Detector MCP server expose?
Hook Detector exposes 154 tools: create_account, showcase, find_hooks, get_run, list_runs, and 149 more. Their descriptions and schemas cost roughly 28,706 tokens of context every time the server is loaded.
Does the Hook Detector MCP server require authentication?
No. We connected to Hook Detector without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Hook Detector MCP server still maintained?
Hook Detector is still listed as active in the MCP registry. We last reached this channel on 11 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What did VerifyMCP test on the Hook Detector MCP server?
VerifyMCP ran 12 checks on Hook Detector, covering TLS certificate, HTTPS, HSTS header, DNSSEC and 8 more. One item could not be completed, a gap on our side rather than a finding about Hook Detector: Authorization. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.