--- 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 . 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 . 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.