Hook Detector
by hookdetector.com in News & content
Real TikTok and Instagram hooks that already work, in any language, with why each travelled.
https://api.hookdetector.com/mcp- Tools
- 154
- open to any client
- Uptime
- 100%
- last 30 days
- Response time
- 475 ms
- 636 ms slowest 5%
- Last check
- Passed
- 4 h ago, next in 1 h
Reliability
Status and outage history · Atom feed · Watch with other listings
How to connect
Add it to any MCP client that supports remote servers.
{
"mcpServers": {
"hook-detector": {
"type": "http",
"url": "https://api.hookdetector.com/mcp"
}
}
}154 tools
- create_account
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…
- showcase
Real hooks this service has delivered, for a wait screen: talking heads only, each hook_id, still_url (a JPEG, no key needed), platform, creator, views and line (the banner on the video, else its opening line). The most viewed first, one per creator, only what is…
- find_hooks
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…
- get_run
A research run: its status, progress, charge and every hook it produced. wait_seconds 0 to 50: wait up to that long for the run to finish, returning the moment it is done or failed. Use wait_seconds=50 and call again while status is "queued" or "running"; a fresh…
- list_runs
Your research runs, newest first, without their results, limit 1 to 100 (default 20) per page. Each run says its kind: "short" (find_hooks), "long" (find_long_hooks) or "packaging" (find_packaging); pass kind to list only one. Returns {"runs": [...], "next_cursor"}…
- find_long_hooks
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…
- find_packaging
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…
- save_preset
Save filters under a name for one tab: "long", "packaging" or "library" (the bounds are those of find_packaging's filters; a library preset may also hold min_comments, max_comments, posted_within_days and language). The same name on the same tab replaces it. Start a…
- list_presets
Your saved filter presets, the newest change first; tab ("long", "packaging", "library") narrows. Same as GET /v1/presets. Free.
- delete_preset
Delete one of your presets. Same as DELETE /v1/presets/{preset_id}. Free. Errors: 404 preset_not_found.
- write_titles
Write 20 to 40 titles for your video, each borrowing the device and structure of one real outlier (a video that beat its own channel): the finds of one of your runs, or the shared index's videos nearest your topic by meaning. Each title: title, chars, first_40 (what…
- write_ideas
Write ideas for new videos: each a title, a thumbnail concept (one visible action) and the words to print, built on one to three real outliers (based_on, each with its video_id, title, multiple, find_id and bend niche when it came from another niche). constraints are…
- get_call
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.
- list_calls
Your calls of priced tools, newest first; tool ("titles", ...) narrows. Same as GET /v1/calls. Free.
- find_similar
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…
- search_thumbnails
Thumbnails in the shared index by what the picture shows (q), or like a picture (image_url: read once by the model as subject, action, words and setting, then searched). Each result has matched_by (text or meaning). Free; image reads at most 60 an hour. Same as GET…
- score_package
Score a package against the real outliers on its subject, part by part (title device, length, words on the picture, faces, the words' role, contrast, brightness): each part says how many outliers it matches; pattern_match (0 to 100) is the mean share: how much the…
- preview_package
Your package in a mock YouTube feed among a run's winners: view home, search, sidebar, phone (marks where a phone cuts the title) or tv; theme dark or light; look normal, grey or blur. Returns png_base64 and mine_at. Free. Same as POST /v1/packaging/preview.
- make_thumbnails
Make 2 to 12 thumbnails (default 4): 3 different concepts first, then images (Nano Banana 2.1, 1K or 4K), every printed word read back and checked letter by letter, a face only from your photos or your channel's own thumbnails. Answers at once with call_id and status…
- get_thumbnails
A thumbnails call: status, concepts and every image so far (url signed for 7 days, width, height, words, words_checked, cost_usd). Same as GET /v1/thumbnails/{call_id}. Free.
- edit_thumbnail
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…
- recreate_thumbnail
New thumbnails for your video with a YouTube video's own thumbnail as the layout reference (2 to 4 images, every printed word checked); priced as make_thumbnails. Same as POST /v1/thumbnails/recreate; read it with get_thumbnails.
- optimize_video
New packages (4, 8 or 12) for your published video: the original scored first against the real outliers on its subject, then each new package (title, thumbnail with every word checked, what it tests) scored the same way, best first, with vs_original. 10 credits a…
- get_optimize
An Optimize call: the original's score and every new package so far. Same as GET /v1/optimize/{call_id}. Free.
- ab_set
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.
- get_find
One result of a long or packaging run with every field: the video, its numbers and the opening or the package analysis. find_id comes from a run's finds (get_run) or from list_kept_finds. Same shape as GET /v1/finds/{find_id}. Free. Errors: 404 find_not_found, 422…
- keep_find
Keep or reject a find (a long-form hook or a package): verdict is "keep" (default) or "reject", and the last verdict wins. The verdict is the video's on that tab: every find of the same video you have there carries it, so a later run that finds the video again shows…
- clear_find_decision
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…
- list_finds
The index: every video your long and packaging runs found, across all runs, one entry a video on each tab (its newest read, with the keep or reject made on the video). Each is a full find object: the title and thumbnail_url as YouTube shows them, views…
- remix_find
Make it mine, for a long-form opening or a package: write up to n (1 to 5, default 3) new ones for your niche that keep one real find's structure. From a long find, `written` holds openings: hook (what the creator says first), then (what the next half minute has to…
- list_remixes
The remixes you paid for from one hook (hook_id) or one find (find_id), newest first, each as its answer held it, with remix_id and created_at. Returns {"remixes": [...]}. Free. 404 hook_not_found or find_not_found for one that is not yours. Same as GET…
- get_remix
One remix you paid for (from remix_hook, remix_find or a chat turn), as its answer held it. Free. 404 remix_not_found for one that is not yours. Same as GET /v1/remixes/{remix_id}.
- list_kept_finds
The videos you kept with keep_find (long-form hooks and packages), newest decision first: one entry a video on each tab across all runs, or the kept finds of one run_id, limit 1 to 100 (default 100) per page. Returns {"kept": [...], "count": n on this page…
- export_run
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…
- get_hook
One hook with every field: its opening line, transcript, watch_url and the vertical player_url (null only for an unusable id or a photo post found before 2026-09-26; runs deliver single videos only). hook_id comes from get_run. Free.
- embed_hook
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…
- keep_hook
Keep or reject a hook: verdict is "keep" (default) or "reject", and the last verdict wins. A reject may say why: reason is off_subject, weak_opening, wrong_language, low_quality, already_have or other, and note (up to 280 characters) your own words. Kept hooks come…
- clear_decision
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…
- remix_hook
Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche that keep a real hook's structure, the device that made it travel, with the subject swapped for yours. hook_id is one of your hooks (from get_run, get_hook or list_keeps); 404…
- list_keeps
The hooks you kept with keep_hook, newest decision first, across all runs or within one run_id, limit 1 to 100 (default 100) per page. Returns {"kept": [...], "count": n on this page, "next_cursor"} with full hook objects; pass next_cursor back as cursor for more…
Security scan
5 findings
- Unusually long description in tool:find_hooks
find_hooks (find hooks) Start hook research on a topic across TikTok, Instagram … - Unusually long description in tool:get_run
get_run (get run) A research run: its status, progress, charge and every hook it… - Unusually long description in tool:find_long_hooks
find_long_hooks (find long hooks) Find long-form hooks: how the YouTube videos t… - Unusually long description in tool:find_packaging
find_packaging (find packaging) Find packaging: the titles and thumbnails that e… - Unusually long description in tool:remix_find
remix_find (remix find) Make it mine, for a long-form opening or a package: writ…
Recent checks
| When | Result | HTTP | Time |
|---|---|---|---|
| 4 h ago | Passed | 200 | 559 ms |
| 16 h ago | Passed | 200 | 636 ms |
| 28 h ago | Passed | 200 | 421 ms |
| 38 h ago | Passed | 200 | 447 ms |
| 2 days ago | Passed | 200 | 464 ms |
Show 10 older checks
| 3 days ago | Passed | 200 | 547 ms |
| 3 days ago | Passed | 200 | 507 ms |
| 4 days ago | Passed | 200 | 505 ms |
| 4 days ago | Passed | 200 | 395 ms |
| 5 days ago | Passed | 200 | 438 ms |
| 5 days ago | Passed | 200 | 545 ms |
| 6 days ago | Passed | 200 | 489 ms |
| 6 days ago | Passed | 200 | 570 ms |
| 7 days ago | Passed | 200 | 537 ms |
| 8 days ago | Passed | 200 | 496 ms |