Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/hookdetector-com:hookdetector-com-channels-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Hook Detector Channels API
description: 'Find short-form hooks that already work.
Sign up with a beta access code (ask at https://hookdetector.com/access): one POST to
`/v1/accounts` with `access_code` gives an API key and free credits. The same operations are available as MCP tools at `/mcp`.
Full guide, always current, at `/llms.txt`.'
contact:
name: Hook Detector
url: https://hookdetector.com/
email: contact@hookdetector.com
version: 3.0.0
tags:
- name: Channels
paths:
/v1/channels/search:
get:
tags:
- Channels
summary: Find channels by name or handle, free
description: 'Channels by name or handle: the shared index first (with its usual views and how many
of its videos are indexed), then YouTube''s own channel search when the index holds fewer
than 5. Each result says its source. Free. MCP: search_channels.'
operationId: search_channels_v1_channels_search_get
parameters:
- name: q
in: query
required: true
schema:
type: string
minLength: 2
maxLength: 100
description: a channel's name or handle
title: Q
description: a channel's name or handle
- name: limit
in: query
required: false
schema:
type: integer
maximum: 50
minimum: 1
default: 20
title: Limit
- name: authorization
in: header
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
title: Authorization
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ChannelsOut'
'401':
description: missing, invalid, revoked or expired API key (code key_expired)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'403':
description: the key lacks the scope this call needs (insufficient_scope), or its credit_limit is spent (key_credit_limit_reached)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'413':
description: request body over the size cap
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'422':
description: invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'429':
description: rate limited; see Retry-After
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'500':
description: our fault; names the request id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
/v1/channels/{ref}:
get:
tags:
- Channels
summary: 'A channel page: every recent upload scored, outliers, momentum'
description: 'A YouTube channel (its UC id, @handle or address): its subscribers and totals, every
recent long upload scored against the channel itself (the multiple over the median of
its other recent uploads, outliers at 2x and over), and its momentum (the newest 10
uploads against the 10 before). Free. A channel read in the last day is served from the
shared index. MCP: get_channel.'
operationId: get_channel_v1_channels__ref__get
parameters:
- name: ref
in: path
required: true
schema:
type: string
title: Ref
- name: fresh
in: query
required: false
schema:
type: boolean
description: read it now even if the index read it in the last day
default: false
title: Fresh
description: read it now even if the index read it in the last day
- name: authorization
in: header
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
title: Authorization
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ChannelPageOut'
'401':
description: missing, invalid, revoked or expired API key (code key_expired)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'403':
description: the key lacks the scope this call needs (insufficient_scope), or its credit_limit is spent (key_credit_limit_reached)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'404':
description: not found on this account
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'413':
description: request body over the size cap
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'422':
description: invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'500':
description: our fault; names the request id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'429':
description: rate limited; see Retry-After
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'503':
description: the language model is unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
/v1/channels/{ref}/outliers:
get:
tags:
- Channels
summary: A channel's outliers, or outliers for a channel like it
description: 'scope=own: the channel''s own uploads at 2x its median and over. scope=niche: outliers
for my channel, the shared index''s videos from other channels closest to this channel''s
titles (by meaning, else by shared words), at 3x and over by default. Free. MCP:
channel_outliers.'
operationId: channel_outliers_v1_channels__ref__outliers_get
parameters:
- name: ref
in: path
required: true
schema:
type: string
title: Ref
- name: scope
in: query
required: false
schema:
type: string
description: own (this channel's) or niche (other channels like it)
default: own
title: Scope
description: own (this channel's) or niche (other channels like it)
- name: min_multiple
in: query
required: false
schema:
anyOf:
- type: number
maximum: 1000
minimum: 0
- type: 'null'
title: Min Multiple
- name: limit
in: query
required: false
schema:
type: integer
maximum: 50
minimum: 1
default: 24
title: Limit
- name: authorization
in: header
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
title: Authorization
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ResultsOut'
'401':
description: missing, invalid, revoked or expired API key (code key_expired)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'403':
description: the key lacks the scope this call needs (insufficient_scope), or its credit_limit is spent (key_credit_limit_reached)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'404':
description: not found on this account
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'413':
description: request body over the size cap
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'422':
description: invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'500':
description: our fault; names the request id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'429':
description: rate limited; see Retry-After
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'503':
description: the language model is unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
/v1/channels/{ref}/similar:
get:
tags:
- Channels
summary: Channels like this one
description: 'The channels in the shared index closest to this one: by the meaning of their titles
(mean title vectors), else by shared title words, with a similarity 0 to 1. Never the
channel itself. Free. MCP: similar_channels.'
operationId: similar_channels_v1_channels__ref__similar_get
parameters:
- name: ref
in: path
required: true
schema:
type: string
title: Ref
- name: limit
in: query
required: false
schema:
type: integer
maximum: 20
minimum: 1
default: 10
title: Limit
- name: authorization
in: header
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
title: Authorization
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ChannelsOut'
'401':
description: missing, invalid, revoked or expired API key (code key_expired)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'403':
description: the key lacks the scope this call needs (insufficient_scope), or its credit_limit is spent (key_credit_limit_reached)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'404':
description: not found on this account
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'413':
description: request body over the size cap
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'422':
description: invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'500':
description: our fault; names the request id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'429':
description: rate limited; see Retry-After
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'503':
description: the language model is unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
/v1/niches:
get:
tags:
- Channels
summary: 'The niche explorer: every niche reported, with its numbers'
description: 'Every niche a report was made for, biggest first, with its headline numbers (videos,
channels, median views, the share at 10x and over, the 75th percentile multiple). Free.
MCP: list_niches.'
operationId: list_niches_v1_niches_get
parameters:
- name: limit
in: query
required: false
schema:
type: integer
maximum: 200
minimum: 1
default: 50
title: Limit
- name: authorization
in: header
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
title: Authorization
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/NichesOut'
'401':
description: missing, invalid, revoked or expired API key (code key_expired)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'403':
description: the key lacks the scope this call needs (insufficient_scope), or its credit_limit is spent (key_credit_limit_reached)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'413':
description: request body over the size cap
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'422':
description: invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'500':
description: our fault; names the request id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
/v1/niches/{slug}:
get:
tags:
- Channels
summary: A niche report counted from the shared index
description: 'A niche (lowercase words joined by hyphens, like personal-finance) counted from the
shared index: videos and channels, median views, the share of measured videos at 10x their
channel and over, the median and 75th percentile multiple, the top outliers, the channels
with the most outliers, videos by month, each with its sample size. One report a month is
kept. Under 20 videos it says the niche is thin. Free. MCP: niche_report.'
operationId: niche_report_v1_niches__slug__get
parameters:
- name: slug
in: path
required: true
schema:
type: string
title: Slug
- name: authorization
in: header
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
title: Authorization
description: Bearer hd_... from POST /v1/accounts or POST /v1/keys
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/NicheOut'
'401':
description: missing, invalid, revoked or expired API key (code key_expired)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'403':
description: the key lacks the scope this call needs (insufficient_scope), or its credit_limit is spent (key_credit_limit_reached)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'404':
description: not found on this account
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'413':
description: request body over the size cap
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'422':
description: invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
'500':
description: our fault; names the request id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorOut'
components:
schemas:
ChannelsOut:
properties:
channels:
items:
additionalProperties: true
type: object
type: array
title: Channels
credits:
type: integer
title: Credits
default: 0
additionalProperties: true
type: object
required:
- channels
title: ChannelsOut
examples:
- channels:
- baseline_videos: 28
channel_id: UCoOae5nYA7VqaXzerajD0lg
channel_size: large
checked_at: '2026-10-26T13:00:00+00:00'
handle: aliabdaal
median_views: 210000
route: scrapecreators
subscribers: 6700000
title: Ali Abdaal
videos_total: 1497
views_total: 568960825
watch_url: https://www.youtube.com/channel/UCoOae5nYA7VqaXzerajD0lg
credits: 0
measures: {}
ResultsOut:
properties:
results:
items:
additionalProperties: true
type: object
type: array
title: Results
measures:
additionalProperties: true
type: object
title: Measures
credits:
type: integer
title: Credits
default: 0
additionalProperties: true
type: object
required:
- results
- measures
title: ResultsOut
examples:
- credits: 0
measures: {}
results:
- age_days: 366.2
band: 2x
baseline_videos: 30
channel: MrBeast
channel_handle: MrBeast
channel_id: UCX6OQ3DkcsbYNE6H8uQQuVA
channel_median_views: 104000000
comments: 64000
content_type: long
duration_s: 1056
first_seen_at: '2026-10-07T10:00:00+00:00'
language: en
likes: 3692975
matched_by: text
multiple: 2.4
observed_at: '2026-10-26T12:00:00+00:00'
outlier_score: 71
posted_at: '2025-10-25T16:00:01+00:00'
read:
title_device: challenge
thumbnail_url: https://i.ytimg.com/vi/Oo9EbArcQ1c/mqdefault.jpg
title: I Saved 1,000 Animals From Dying
video_id: Oo9EbArcQ1c
views: 251568830
watch_url: https://www.youtube.com/watch?v=Oo9EbArcQ1c
scope: own
ErrorOut:
properties:
detail:
type: string
title: Detail
description: one sentence a person can read
code:
type: string
title: Code
description: stable machine code; see the Errors section of /llms.txt
errors:
anyOf:
- items:
additionalProperties: true
type: object
type: array
- type: 'null'
title: Errors
description: 'on a 422 only: the field level list'
additionalProperties: true
type: object
required:
- detail
- code
title: ErrorOut
examples:
- code: run_not_found
detail: no such run for this account
ChannelPageOut:
properties:
channel:
additionalProperties: true
type: object
title: Channel
uploads:
items:
additionalProperties: true
type: object
type: array
title: Uploads
description: every recent long upload scored against the channel
outliers:
type: integer
title: Outliers
momentum:
additionalProperties: true
type: object
title: Momentum
source:
type: string
title: Source
description: fresh (read now) or index (read in the last day)
measures:
additionalProperties: true
type: object
title: Measures
credits:
type: integer
title: Credits
default: 0
additionalProperties: true
type: object
required:
- channel
- uploads
- outliers
- momentum
- source
- measures
title: ChannelPageOut
examples:
- channel:
baseline_videos: 28
channel_id: UCoOae5nYA7VqaXzerajD0lg
channel_size: large
checked_at: '2026-10-26T13:00:00+00:00'
handle: aliabdaal
median_views: 210000
route: scrapecreators
subscribers: 6700000
title: Ali Abdaal
videos_total: 1497
views_total: 568960825
watch_url: https://www.youtube.com/channel/UCoOae5nYA7VqaXzerajD0lg
credits: 0
measures: {}
momentum:
last10_median: 250000
prev10_median: 190000
ratio: 1.32
outliers: 3
source: fresh
uploads: []
NicheOut:
properties:
slug:
type: string
title: Slug
videos:
type: integer
title: Videos
thin:
type: boolean
title: Thin
credits:
type: integer
title: Credits
default: 0
additionalProperties: true
type: object
required:
- slug
- videos
- thin
title: NicheOut
examples:
- by_month:
2026-10: 31
channels: 160
credits: 0
generated_at: '2026-10-26T13:00:00+00:00'
measures: {}
median_multiple: 1.9
median_views: 84000
month: '2026-10-01'
outlier_rate_10x: 0.07
p75_multiple: 4.2
phrase: personal finance
sample:
videos: 412
slug: personal-finance
thin: false
top_channels: []
top_outliers:
- age_days: 366.2
band: 2x
baseline_videos: 30
channel: MrBeast
channel_handle: MrBeast
channel_id: UCX6OQ3DkcsbYNE6H8uQQuVA
channel_median_views: 104000000
comments: 64000
content_type: long
duration_s: 1056
first_seen_at: '2026-10-07T10:00:00+00:00'
language: en
likes: 3692975
matched_by: text
multiple: 2.4
observed_at: '2026-10-26T12:00:00+00:00'
outlier_score: 71
posted_at: '2025-10-25T16:00:01+00:00'
read:
title_device: challenge
thumbnail_url: https://i.ytimg.com/vi/Oo9EbArcQ1c/mqdefault.jpg
title: I Saved 1,000 Animals From Dying
video_id: Oo9EbArcQ1c
views: 251568830
watch_url: https://www.youtube.com/watch?v=Oo9EbArcQ1c
videos: 412
NichesOut:
properties:
niches:
items:
additionalProperties: true
type: object
type: array
title: Niches
credits:
type: integer
title: Credits
default: 0
additionalProperties: true
type: object
required:
- niches
title: NichesOut
examples:
- credits: 0
niches:
- slug: personal-finance
videos: 412