# Feedhook > Turn a YouTube channel into a webhook: register a channel id + callback URL and your > endpoint receives a signed JSON POST ~8 seconds after every new video. YouTube WebSub > underneath (hub subscription, verification handshake, ~5-day lease renewals, retries) — > no polling, no YouTube API quota. Free: 1 feed. Pro: $9/mo, 10 feeds. Base URL: https://feedhook.walls.sh Auth: Authorization: Bearer fh_… (get a key once via POST /accounts) ## API - POST /accounts {"email"} → account + apiKey (shown once; free plan: 1 feed) - GET /account → plan, feed limit, feeds in use (auth) - POST /subscriptions {"channel":"@handle | UC… id | channel URL","callbackUrl":"https://…"} → subscription + per-subscription secret (shown once) (auth) - GET /subscriptions → your subscriptions (auth) - GET /subscriptions/:id → one subscription incl. recent delivery log (auth) - POST /subscriptions/:id/test → send a signed test.ping through the real delivery pipeline to verify your receiver (auth) - DELETE /subscriptions/:id → unsubscribe (auth) - POST /billing/checkout → Stripe Checkout URL for Pro $9/mo, 10 feeds (auth) - GET /openapi.json → full OpenAPI 3.1 spec - GET /metrics → live usage numbers (public) ## The webhook you receive POST to your callbackUrl with headers x-feedhook-event, x-feedhook-delivery, and x-feedhook-signature: sha256=. Body: {"event":"video.published","subscriptionId","videoId","channelId","title", "author","publishedAt","url","receivedAt"}. Non-2xx → 5 retries with backoff. Reply in 15s. ## MCP (agents) npx -y feedhook-mcp — tools: create_account, get_account, create_subscription, list_subscriptions, get_subscription, delete_subscription. Env: FEEDHOOK_API_KEY. Registry: io.github.patwalls/feedhook-mcp A walls.sh product. "channel" accepts an @handle, a youtube.com channel URL, or the raw UC… id.