Query OnlyFans data and analytics via the OnlyFansAPI.com platform. Get revenue summaries across all models, identify top-performing models, analyze Free Trial and Tracking Link conversion rates, compare link earnings, and much more! Use when users ask about anything related to OnlyFans.
Scanned 9/7/2026
Install to Claude Code
npx -y skills add modbender/skill-library-mcp --skill onlyfans-api --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Onlyfans Api?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/modbender-onlyfans-api)More formats (shields.io, HTML) on the badges page.
---
name: onlyfansapi-skill
description: >-
Query OnlyFans data and analytics via the OnlyFansAPI.com platform. Get revenue
summaries across all models, identify top-performing models, analyze
Free Trial and Tracking Link conversion rates, compare link earnings, and much more!
Use when users ask about anything related to OnlyFans.
compatibility: Requires curl, jq, and network access to app.onlyfansapi.com
metadata:
author: OnlyFansAPI.com
version: "1.0"
allowed-tools: Bash(curl:*) Bash(jq:*) Read
---
# OnlyFans API Skill
This skill queries the OnlyFansAPI.com platform to answer questions about OnlyFans agency analytics — revenue, model performance, and link conversion metrics.
## Prerequisites
The user must set the environment variable `ONLYFANSAPI_API_KEY` with their API key from <https://app.onlyfansapi.com/api-keys>.
If the key is not set, remind the user:
```
Export your OnlyFansAPI key:
export ONLYFANSAPI_API_KEY="your_api_key_here"
```
## API Basics
- **Base URL:** `https://app.onlyfansapi.com`
- **Auth header:** `Authorization: Bearer $ONLYFANSAPI_API_KEY`
- All dates use URL-encoded format: `YYYY-MM-DD HH:MM:SS`
- If not specific time is specified use start of day or end of day (for date range ending date)
- Pagination: use `limit` and `offset` query params. Check `hasMore` or `_pagination.next_page` in responses.
- Whenever possible use User-Agent with value: OnlyFansAPI-Skill
- Try your best to infer schema from the example response of the endpoint. Eg "data.total.total" for earnings scalar value from endpoint.
## Workflows
### 1. Get revenue of all models for the past N days
**Steps:**
1. **List all connected accounts:**
```bash
curl -s -H "Authorization: Bearer $ONLYFANSAPI_API_KEY" \
"https://app.onlyfansapi.com/api/accounts" | jq .
```
Each account object has `"id"` (e.g. `"acct_xxx"`), `"onlyfans_username"`, and `"display_name"`.
2. **For each account, get earnings:**
```bash
START=$(date -u -v-7d '+%Y-%m-%d+00%%3A00%%3A00') # macOS
# Linux: START=$(date -u -d '7 days ago' '+%Y-%m-%d+00%%3A00%%3A00')
END=$(date -u '+%Y-%m-%d+23%%3A59%%3A59')
curl -s -H "Authorization: Bearer $ONLYFANSAPI_API_KEY" \
"https://app.onlyfansapi.com/api/{account_id}/statistics/statements/earnings?start_date=$START&end_date=$END&type=total" | jq .
```
Response fields:
- `data.total` — net earnings
- `data.gross` — gross earnings
- `data.chartAmount` — daily earnings breakdown array
- `data.delta` — percentage change vs. prior period
3. **Summarize:** Present a table of each model's display name, username, net revenue, and gross revenue. Sum the totals.
### 2. Which model is performing the best
Use the same workflow as above. Rank models by `data.total` (net earnings) descending. The model with the highest value is the best performer.
Optionally also pull the statistics overview for richer context:
```bash
curl -s -H "Authorization: Bearer $ONLYFANSAPI_API_KEY" \
"https://app.onlyfansapi.com/api/{account_id}/statistics/overview?start_date=$START&end_date=$END" | jq .
```
This adds subscriber counts, visitor stats, post/message earnings breakdown.
### 3. Which Free Trial Link has the highest conversion rate (subscribers → spenders)
1. **List free trial links:**
```bash
curl -s -H "Authorization: Bearer $ONLYFANSAPI_API_KEY" \
"https://app.onlyfansapi.com/api/{account_id}/trial-links?limit=100&offset=0&sort=desc&field=subscribe_counts&synchronous=true" | jq .
```
Key response fields per link:
- `id`, `trialLinkName`, `url`
- `claimCounts` — total subscribers who claimed the trial
- `clicksCounts` — total clicks
- `revenue.total` — total revenue from this link
- `revenue.spendersCount` — number of subscribers who spent money
- `revenue.revenuePerSubscriber` — average revenue per subscriber
2. **Calculate conversion rate:**
```
conversion_rate = spendersCount / claimCounts
```
Rank links by conversion rate descending.
3. **Present results** as a table: link name, claims, spenders, conversion rate, total revenue.
### 4. Which Tracking Link has the highest conversion rate
1. **List tracking links:**
```bash
curl -s -H "Authorization: Bearer $ONLYFANSAPI_API_KEY" \
"https://app.onlyfansapi.com/api/{account_id}/tracking-links?limit=100&offset=0&sort=desc&sortby=claims&synchronous=true" | jq .
```
Key response fields per link:
- `id`, `campaignName`, `campaignUrl`
- `subscribersCount` — total subscribers from this link
- `clicksCount` — total clicks
- `revenue.total` — total revenue
- `revenue.spendersCount` — subscribers who spent
- `revenue.revenuePerSubscriber` — avg revenue per subscriber
- `revenue.revenuePerClick` — avg revenue per click
2. **Calculate conversion rate:**
```
conversion_rate = revenue.spendersCount / subscribersCount
```
3. **Present results** as a table: campaign name, subscribers, spenders, conversion rate, total revenue, revenue per subscriber.
### 5. Which Free Trial / Tracking Link made the most money
Use the same listing endpoints above. Sort by `revenue.total` descending. Present the top links with their name, type (trial vs. tracking), total revenue, and subscriber/spender counts.
## Multi-Account (Agency) Queries
For agency-level queries that span all models, always:
1. First fetch all accounts via `GET /api/accounts`
2. Loop through each account and gather the relevant data
3. Aggregate and present combined results with per-model breakdowns
## Earnings Type Filters
When querying `GET /api/{account}/statistics/statements/earnings`, the `type` parameter filters by category:
- `total` — all earnings combined
- `subscribes` — subscription revenue
- `tips` — tips received
- `post` — paid post revenue
- `messages` — paid message revenue
- `stream` — stream revenue
## When In Doubt
If you are unsure about an endpoint, parameter, response format, or how to accomplish a specific task with the OnlyFans API, consult the official documentation at <https://docs.onlyfansapi.com>. The site contains full API reference details, guides, and examples for all available endpoints. Always check the docs before guessing.
## Error Handling
- If `ONLYFANSAPI_API_KEY` is not set, stop and ask the user to configure it.
- If an API call returns a non-200 status, show the error message and HTTP status code.
- If `_meta._rate_limits.remaining_minute` or `remaining_day` is 0, warn the user about rate limits.
- If an account has `"is_authenticated": false`, note that the account needs re-authentication.
## Output Formatting
- Always present data in markdown tables for readability.
- Include currency values formatted to 2 decimal places.
- When showing percentages (conversion rates, deltas), format as `XX.X%`.
- For multi-model summaries, include a **Total** row at the bottom.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!