Vibe-Coded Apps: Real Search Costs (2026)
3 vibe-coded apps, $100 MRR. Vercel $20, FMP $20, Tavily ~$40/mo. 80% COGS. Search API is the biggest variable cost. Alternatives that preserve margins.
A post on r/sideprojects described 3 vibe-coded apps generating $100 MRR combined. The celebration was real: shipping fast, making money, building in public. What the post did not break down was the infrastructure costs eating into that $100. When your MRR is small, every $20/month service is a material cost.
The real cost stack
Vercel Pro: $20/month. You need Pro for custom domains, analytics, and reasonable build limits across 3 apps. Free tier runs out fast with multiple projects.
Financial Market API (FMP or similar): $20/month for stock data, earnings calendars, and company fundamentals. If any of the 3 apps touches financial data, this is non-negotiable.
Search API (Tavily pay-as-you-go): ~$10/week or $40/month at moderate usage. Tavily charges $0.008 per credit on PAYG. If your app makes 5,000 search calls per month, that is $40. Search is the biggest variable cost because it scales with usage.
Total: $80/month overhead on $100 MRR. That is 80% cost ratio before taxes, domain renewals, or your own time.
Search is the swing cost
Hosting and data APIs are fixed costs. You pay $20/month for Vercel regardless of traffic. But search costs scale with every user query. More users means more search calls. At $0.008/credit on Tavily PAYG, a popular feature that triggers 3 search calls per user action can blow up your costs before you notice.
# Cost modeling for vibe-coded apps
def monthly_search_cost(daily_users, searches_per_user, cost_per_credit):
monthly_searches = daily_users * searches_per_user * 30
return monthly_searches * cost_per_credit
# Tavily PAYG at $0.008/credit
tavily_cost = monthly_search_cost(
daily_users=50, searches_per_user=3, cost_per_credit=0.008
)
print("Tavily PAYG: $%.0f/mo" % tavily_cost)
# Scavio at $0.005/credit ($30 for 7K credits, then overage)
scavio_cost = monthly_search_cost(
daily_users=50, searches_per_user=3, cost_per_credit=0.005
)
print("Scavio: $%.0f/mo" % scavio_cost)
# Difference
print("Monthly savings: $%.0f" % (tavily_cost - scavio_cost))
Comparing search API costs
Tavily: 1,000 free credits/month, then $0.008/credit PAYG. For 4,500 monthly searches: (4,500 - 1,000) * $0.008 = $28/month. Scavio: 500 free credits/month, $30 flat for 7,000 credits. For 4,500 monthly searches: $30/month flat (within the 7K limit). At this usage level, both land around $28-30/month. The difference shows at higher volume.
import requests, os
# Efficient search: batch queries to minimize credit usage
API = 'https://api.scavio.dev/api/v1/search'
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def efficient_search(query, num_results=5):
"""Single search call, cache the results."""
r = requests.post(API, headers=H, json={
'query': query,
'num_results': num_results
})
return r.json().get('results', [])
# Tip: cache results for 1-6 hours depending on freshness needs
# A search result for "best project management tools" does not
# change every minute. Cache it and save 90% of your search costs.
The cost optimization playbook
Cache aggressively. Most search results are valid for hours, not seconds. A Redis cache with 6-hour TTL can reduce your search API calls by 80% if users search similar queries.
Use fewer results per call. If your app only shows 3 results, do not fetch 10. Fewer results per call means less data transferred and often lower costs on metered APIs.
Debounce user searches. Do not fire an API call on every keystroke. Wait for the user to stop typing for 300ms. This alone cuts unnecessary calls by 50% or more.
When $100 MRR is actually profitable
At $80/month overhead, $100 MRR gives you $20/month profit. That is not a business. But the point of vibe-coded side projects is not profit at $100 MRR. It is proving the concept cheaply enough to find the path to $500 or $1,000 MRR where the cost ratio drops to 20-30%. The search API cost is the one lever you can pull right now without changing the product.