OnlyFans Content Analytics API
Most agencies make content decisions on round numbers and gut feel. Post what seems right, at times that feel reasonable, priced at whatever worked last month. The API returns per-post revenue attribution: views, purchases, tips, and direct earnings for every piece of content your creators publish. Run this for 30 days and you will find one or two content types generating 60–70% of total revenue while consuming a fraction of the production budget. That single insight shifts strategy immediately. Agencies report +40% content ROI within 30 days of implementation.
Content ROI Increase
+40%
content ROI within 30 days of implementation
Insight Depth
Per-post ROI
revenue attribution down to individual content pieces
The problem: agencies making $50K decisions on gut feel
Most agencies make content decisions the same way: post what feels right, at times that seem reasonable, at prices that are round numbers. The OnlyFans dashboard gives you view counts and like totals. It does not tell you which content type earns the most per dollar of production cost, which posting window converts best for this specific creator's audience, or whether the $15 PPV is outperforming the $25 PPV. You are running a business on impressions.
A 3-minute video costs significantly more to produce than a photo set. Does it generate proportionally more revenue? Without per-post attribution data, you cannot answer that. Across 10 to 20 creators with different audiences and different content preferences, the compounding cost of guessing is not trivial — it is tens of thousands of dollars per month in misallocated production budget.
Posting time is the other blind spot. Subscriber audiences span multiple time zones, engagement patterns vary by creator, and the schedule that works for one account performs poorly for another. Manual experimentation takes weeks and produces noise because you cannot control for content quality, day of week, and seasonal effects at the same time.
Other tools offer scheduling and content calendars. They do not connect content decisions to revenue outcomes. Knowing when to post matters far less if you are posting the wrong content at the wrong price point. That connection — between production input and revenue output — is what the API gives you.
The solution: per-post revenue attribution through the API
The /content/performance endpoint returns granular data for every piece of content: views, likes, tips, PPV purchases, and direct revenue generated per post. The /media/stats endpoint aggregates by media type. Together they give you the input-to-output picture that makes actual content decisions possible — not intuition, not round numbers, data.
Start with content type ROI. Tag posts by type — photo set, short video, long video, behind-the-scenes — and calculate average revenue per post per category. Factor in estimated production cost. Most agencies that run this analysis find one or two content types generating 60 to 70% of total revenue while consuming a fraction of the production budget. That realization alone shifts strategy immediately.
Next: posting window optimization. Cross-reference post timestamps with engagement rates and purchase data. For each creator, the data reveals a performance heatmap — the specific hours and days when their audience opens, engages, and buys. Schedule future content for those windows. Stop posting when it is convenient and start posting when it converts.
Finally, price optimization. Pull PPV purchase rates at different price points across comparable content. A $20 PPV with a 15% purchase rate outperforms a $30 PPV with an 8% purchase rate — but only the data confirms which side your pricing is on. The API gives you the measurement infrastructure to run those comparisons systematically, not anecdotally.
API endpoints used
/content/performance Per-post performance data: views, likes, tips, comments, PPV purchases, revenue generated, and engagement rate. Supports date range filtering and content type filtering.
/media/stats Aggregated media performance: total views, average engagement rate, top-performing posts, and media type breakdown (photo vs. video vs. audio).
/statistics/overview High-level engagement and revenue statistics. Provides the macro context for interpreting per-post performance data — total revenue, subscriber count, and overall engagement rate.
Code example
A content performance report that calculates ROI by content type and identifies optimal posting windows.
import requests from collections import defaultdict from datetime import datetime API_BASE = "https://api.ofapi.dev/v1" HEADERS = {"Authorization": "Bearer your_api_key"} def content_performance_report(creator_id): # Pull per-post performance data content = requests.get( f"{API_BASE}/onlyfans/models/{creator_id}/content/performance", headers=HEADERS, params={"days": 30} ).json()["data"] # Analyze by content type by_type = defaultdict(lambda: { "count": 0, "revenue": 0, "views": 0, "engagement": 0 }) # Analyze by posting hour by_hour = defaultdict(lambda: { "count": 0, "avg_revenue": 0, "total_revenue": 0 }) for post in content: ctype = post["contentType"] by_type[ctype]["count"] += 1 by_type[ctype]["revenue"] += post["revenue"] by_type[ctype]["views"] += post["views"] by_type[ctype]["engagement"] += post["engagementRate"] hour = datetime.fromisoformat(post["postedAt"]).hour by_hour[hour]["count"] += 1 by_hour[hour]["total_revenue"] += post["revenue"] # Calculate averages report = {"content_types": {}, "best_hours": []} for ctype, data in by_type.items(): report["content_types"][ctype] = { "posts": data["count"], "total_revenue": round(data["revenue"], 2), "avg_revenue_per_post": round(data["revenue"] / data["count"], 2), "avg_engagement": round(data["engagement"] / data["count"], 3), } for hour, data in by_hour.items(): data["avg_revenue"] = data["total_revenue"] / data["count"] # Top 5 posting hours by average revenue best = sorted(by_hour.items(), key=lambda x: x[1]["avg_revenue"], reverse=True) report["best_hours"] = [ {"hour": h, "avg_revenue": round(d["avg_revenue"], 2)} for h, d in best[:5] ] return report # Run report report = content_performance_report("creator_001") for ctype, data in report["content_types"].items(): print(f"{ctype}: ${data['avg_revenue_per_post']}/post, {data['posts']} posts") print(f"Best posting hours: {report['best_hours']}")
Outcomes
+40% content ROI
Agencies report 40% higher content ROI within 30 days by shifting production toward high-performing categories.
Optimal posting windows
Per-creator posting heatmaps identify the exact hours when engagement and purchases peak.
Price optimization
A/B test PPV pricing with real conversion data to find the revenue-maximizing price for each content tier.
Per-post attribution
Revenue attributed to individual content pieces — know exactly which posts drive the most income.
Your best-performing content type is already in the data. You just cannot see it yet.
Pull 30 days of content performance for one creator and you will know more about what actually drives their revenue than months of manual observation can tell you. Agencies reporting +40% content ROI did not change what they were producing — they changed what they were producing more of.