Niche.io
Inspiration
Content creators — especially small and mid-tier ones — face a frustrating chicken-and-egg problem: they need brand deals to grow, but they don't know which brands to approach, how to price themselves, or how to write a pitch that doesn't get ignored. Most end up copying generic email templates or aiming way out of their league. We wanted to build something that removes the guesswork entirely — a tool that uses real channel data to tell creators exactly who to pitch, what to say, and what to charge.
What We Learned
The biggest lesson was that AI is most impressive when it's not doing everything. Our scoring system is pure math — explicit, transparent formulas that we can explain and defend. AI handles what it's actually good at: understanding content themes, writing persuasive copy, and reasoning about brand-creator fit. Keeping that boundary clean made the product more trustworthy and the demo more compelling.
We also learned how quickly YouTube API quotas add up. Each creator analysis requires multiple API calls across channels, search, and video endpoints, so batching and caching became essential early on.
How We Built It
Data layer: The YouTube Data API pulls real channel stats (subscribers, total views) and the last 12 videos (titles, descriptions, views, likes, comments). Optional Instagram and TikTok inputs supplement the data.
Scoring engine: We calculate a creator fame score on a 1–10 scale using three sub-scores:
Audience (0–100):
$$A = \min\left(100, \frac{\log_{10}(S_{YT} + F_{TT} + F_{IG} + 1)}{\log_{10}(10^{9})} \times 100\right)$$
Where \(S_{YT}\) = YouTube subscribers, \(F_{TT}\) = TikTok followers, \(F_{IG}\) = Instagram followers.
Reach (0–100):
$$R = \min\left(100, \frac{\log_{10}(V_{total} + 1)}{\log_{10}(10^{12})} \times 100\right)$$
Where \(V_{total}\) = total YouTube views.
Engagement (0–100):
$$E = \min\left(100, \frac{\sum_{i=1}^{12}(L_{i} + C_{i})}{\sum_{i=1}^{12}V_{i}} \times 1000\right)$$
Where \(L_{i}\), \(C_{i}\), \(V_{i}\) = likes, comments, and views for each of the last 12 videos.
Creator Fame (1–10):
$$Fame = \max\left(1, \text{round}\left(\frac{0.4A + 0.3R + 0.3E}{10}\right)\right)$$
Brand matching: A curated brands.json database stores real companies across six niches. We match creators to brands using fame-range filtering and an AI-computed compatibility score based on niche similarity, audience overlap, and content tone. The final score combines both:
$$Score = 0.5 \times Compatibility + 0.5 \times (Fame \times 10)$$
Target companies must satisfy \(\max(1, F_{b} - 1) \leq F_{c} \leq \min(10, F_{b} + 2)\) where \(F_{c}\) is creator fame and \(F_{b}\) is brand fame. Reach companies relax this to \(F_{c} < \min(10, F_{b} + 4)\).
AI generation: For each matched company, Claude generates a tailored professional bio, a ready-to-send partnership email referencing the creator's actual stats, and a pricing recommendation — all run in parallel.
Frontend: Three-page Next.js app — landing page, input form, and a split-panel results view where clicking a company on the left reveals detailed pitch materials on the right.
Challenges
Not being a GPT wrapper. This was a deliberate constraint from the start. We forced ourselves to build real logic — the scoring formulas, the matching algorithm, the fame tiers — in code. AI generates copy, not decisions.
YouTube API quotas. The free tier gives 10,000 units per day and each analysis uses several calls. We had to be strategic about batching video data requests and caching results in state to avoid hitting limits during development and demos.
Prompt engineering under time pressure. Getting Claude to return well-structured JSON with consistently good pitch emails across different niches and creator sizes took multiple iterations. The prompt for compatibility scoring was especially tricky — we needed a numeric score and reasoning, formatted reliably every time.
Parallel AI calls. Generating content for four companies sequentially was painfully slow. Switching to Promise.all cut our output page load time significantly, but introduced error handling complexity when one call failed and the others succeeded.
Built With
- anthropic-claude-api
- matplotlib
- next.js
- python
- scikit-learn
- tailwind-css
- typescript
- youtube-data-api
Log in or sign up for Devpost to join the conversation.