# Frequently Asked Questions (/faq)



import { Accordion, Accordions } from "fumadocs-ui/components/accordion";

## Getting Started

<Accordions type="multiple">
  <Accordion title="How do I create an OnlyFans API account?" id="how-do-i-create-an-onlyfans-api-account">
    Follow the steps at [app.onlyfansapi.com/register](https://app.onlyfansapi.com/register). It takes less than 1 minute.
  </Accordion>

  <Accordion title="Can I work with OnlyFans API if I'm not a developer?" id="can-i-work-with-onlyfans-api-if-im-not-a-developer">
    Yes! You can use our no-code integrations with [Make](/integrations/make), [n8n](/integrations/n8n), or [Zapier](/integrations/zapier). If you need hands-on help, email us at [hello@onlyfansapi.com](mailto:hello@onlyfansapi.com).
  </Accordion>

  <Accordion title="Do you have a sandbox or demo account for testing?" id="do-you-have-a-sandbox-or-demo-account">
    No sandbox environment is available. However, you can simply create a new account on OnlyFans.com and connect it to OnlyFans API for testing purposes.
  </Accordion>

  <Accordion title="Which programming languages can I use?" id="which-programming-languages-can-i-use">
    All of our API endpoints can be used with any programming language. Click on any endpoint in our [API Reference](/api-reference) to view code examples in cURL, JavaScript/TypeScript, Go, Python, Java, and C#.
  </Accordion>

  <Accordion title="Can I use OnlyFans API with OnlyMonster / Infloww / CreatorHero / Any other OnlyFans CRM?" id="can-i-use-onlyfans-api-with-onlymonster-infloww-creatorhero">
    Yes, absolutely. Having your account connected to OnlyFans API doesn't affect your ability to use any other OnlyFans CRM and vice versa.
  </Accordion>
</Accordions>

## API Capabilities & Features

<Accordions type="multiple">
  <Accordion title="Can your API send and read messages?" id="can-your-api-send-and-read-messages">
    Yes, our API fully supports reading and sending messages. Refer to our [List Chats](/api-reference/chats/list-chats) and [Send Message](/api-reference/chats/send-message) endpoints for more details.
  </Accordion>

  <Accordion title="Is image generation supported?" id="is-image-generation-supported">
    Image generation is not natively supported at this time. However, we recommend third-party solutions like [fanscreator.ai](https://fanscreator.ai) for this functionality.
  </Accordion>

  <Accordion title="Can I upload media directly to the vault?" id="can-i-upload-media-directly-to-the-vault">
    Direct vault uploads aren't supported by OnlyFans. However, you have a few options:

    * **Recommended:** Upload media exactly when and where it needs to be posted — for example, directly to a post, message, or scheduled post — instead of preloading it into the vault. This keeps your workflow simple and avoids unnecessary steps.
    * If you still want to store media in the vault ahead of time, you can:
      * Upload media using our [OnlyFans CDN upload](/api-reference/media/upload-media-to-the-only-fans-cdn) endpoint.
      * [Create a post](/api-reference/posts/send-post) with the media, then delete it immediately - the media will remain in your vault
      * Use our [Send Message](/api-reference/chats/send-message) endpoint to include the media in a message, then delete the message — again, the media will stay in your vault.
  </Accordion>

  <Accordion title="Can I integrate with Supabase or similar tools?" id="can-i-integrate-with-supabase-or-similar-tools">
    Yes! Many customers successfully use tools like [n8n](https://n8n.io) and [Supabase](https://supabase.com) for faster development and deployment.
  </Accordion>

  <Accordion title="Is there an API endpoint for scheduling chat messages?" id="is-there-an-api-endpoint-for-scheduling-chat-messages">
    Use our [Send Mass Message](/api-reference/mass-messaging/send-mass-message) endpoint. Include just one user ID in the `userIds` array to effectively schedule a message for an individual chat. This behaves exactly like the native "Scheduled Messages" feature in OnlyFans.
  </Accordion>

  <Accordion title="How do I send a PPV (pay-per-view) message?" id="how-do-i-send-a-ppv-message">
    Refer to our dedicated guide on [setting a price for PPV content](/introduction/guides/composing-messages#setting-a-price-ppv).
  </Accordion>

  <Accordion title="Can your API retrieve Golden Response Times?" id="can-your-api-retrieve-golden-response-times">
    This will be available in our upcoming Advanced Endpoints feature.
  </Accordion>

  <Accordion title="Why do I get 404 errors on your endpoints?" id="why-do-i-get-404-errors-on-your-endpoints">
    You're likely missing the account prefix.

    * ❌ Wrong: `/api/fans/active`
    * ✅ Correct: `/api/acct_XXXXXXXX/fans/active`
  </Accordion>

  <Accordion title="Which endpoint should I use to build a creator directory?" id="which-endpoint-should-i-use-to-build-a-creator-directory">
    Use our [Search Profiles](/api-reference/public-profiles/search-profiles) endpoint with the `sort` query parameter to list and sort creators. For more frequent data updates on individual creators, use [Get Profile Details](/api-reference/public-profiles/get-profile-details). You can also use our [Create Data Export](/api-reference/data-exports/create-data-export) tool for bulk exports.
  </Accordion>

  <Accordion title="Can I add text, question stickers, or emoji elements on story posts through the API?" id="can-i-add-text-question-stickers-or-emoji-elements-on-story-posts">
    Not currently. When you add text, questions, or stickers to a story on OnlyFans, the browser actually renders those elements onto the image locally using an HTML Canvas, then uploads the composed image as a separate file.

    To achieve this through the API, you would need to compose the image yourself before uploading. You can use image processing libraries to render text onto your image, then upload the result via our media upload endpoint:

    * **PHP** — GD (built-in) or Imagick
    * **Node.js** — sharp, @napi-rs/canvas, node-canvas
    * **Python** — Pillow, pyvips
    * **Ruby** — MiniMagick, ruby-vips

    Once you've composed the image with your overlays, upload it normally and use the returned `ofapi_media_` ID in your story request.
  </Accordion>
</Accordions>

## Security & Safety

<Accordions type="multiple">
  <Accordion title="Is your API safe to use?" id="is-your-api-safe-to-use">
    Yes, absolutely. We have a 5-year track record with:

    * Zero accounts banned
    * Zero accounts red-flagged
    * Enterprise-grade security measures
  </Accordion>

  <Accordion title="Can I get banned for using the OnlyFans API as a chatbot?" id="can-i-get-banned-for-using-the-api-as-a-chatbot">
    No. We have a track record of zero account bans over the past 5 years, including many customers using OnlyFans API to build chatbots.
  </Accordion>

  <Accordion title="How are login credentials protected?" id="how-are-login-credentials-protected">
    Your security is our priority:

    * All passwords and cookies are hashed in our database
    * We use OpenSSL with AES-256-CBC encryption
    * All data is signed with MAC (Message Authentication Code)
  </Accordion>

  <Accordion title="How do you handle proxy configuration?" id="how-do-you-handle-proxy-configuration">
    We implement robust proxy protection:

    * Each connected account gets a dedicated IP address
    * Public endpoints use rotating residential proxies
    * This prevents detection and ensures account safety

    For more information, refer to our dedicated [proxies guide](introduction/essentials/proxies).
  </Accordion>

  <Accordion title="Does OnlyFans API store data from my connected accounts?" id="does-onlyfans-api-store-data-from-my-connected-accounts">
    No. We do not store any data from authenticated accounts on our servers. All credentials are encrypted using OpenSSL with the AES-256-CBC cipher and signed with a message authentication code (MAC) to prevent tampering.
  </Accordion>

  <Accordion title="What happens when my OnlyFans session expires?" id="what-happens-when-my-onlyfans-session-expires">
    When a session expires, we automatically attempt to re-login up to 3 times within a one-hour period. This ensures minimal disruption to your API usage without requiring any manual intervention.
  </Accordion>
</Accordions>

## API Stability & Performance

<Accordions type="multiple">
  <Accordion title="How stable is your API?" id="how-stable-is-your-api">
    Our API infrastructure includes:

    * Web Application Firewall (WAF)
    * Proxy management
    * Built-in rate limiting
    * No stability issues reported to date

    <Callout title="Please note we cannot control OnlyFans platform stability">
      Check our real-time status at: [status.onlyfansapi.com](https://status.onlyfansapi.com)
    </Callout>
  </Accordion>

  <Accordion title="What happens when OnlyFans updates their website?" id="what-happens-when-onlyfans-updates-their-website">
    Website updates have minimal impact:

    * Downtime only occurs if OnlyFans itself is down
    * We typically adapt to changes within minutes
    * No extended service interruptions
  </Accordion>

  <Accordion title="How long is the cache duration?" id="how-long-is-the-cache-duration">
    Cache duration varies per endpoint, though most endpoints are not cached. Check our [response structure guide](/introduction/essentials/response-structure) for specific cache durations.
  </Accordion>
</Accordions>

## Rate Limiting & Best Practices

<Accordions type="multiple">
  <Accordion title="How do I handle rate limiting errors?" id="how-do-i-handle-rate-limiting-errors">
    **Recommended approach:** Implement exponential backoff

    1. When you receive a 429 error, wait 1 second
    2. If it happens again, double the wait time (2s → 4s → 8s)
    3. Continue up to a maximum wait time
    4. Use queuing systems like AWS SQS, Laravel Queues, or Ruby Sidekiq

    <Callout title="Need more help?">
      Email us at [hello@onlyfansapi.com](mailto:hello@onlyfansapi.com) for code examples.
    </Callout>
  </Accordion>

  <Accordion title="Where can I find rate limit documentation?" id="where-can-i-find-rate-limit-documentation">
    Rate limits are documented in our [Rate Limits](/introduction/essentials/rate-limits) guide.
  </Accordion>
</Accordions>

## API Keys Management

<Accordions type="multiple">
  <Accordion title="How many API keys should I create?" id="how-many-api-keys-should-i-create">
    **Best practice:** One API key per service/integration

    * Create separate keys for different features
    * Assign dedicated keys to external developers
    * This improves security and tracking
  </Accordion>

  <Accordion title="Is there a limit on how many API key I can create?" id="is-there-a-limit-on-how-many-api-key-i-can-create">
    No, you can create as many API keys as you want, regardless of your subscription plan.
  </Accordion>

  <Accordion title="Can one API key access multiple endpoints?" id="can-one-api-key-access-multiple-endpoints">
    Yes, a single API key can access all available endpoints.
  </Accordion>

  <Accordion title="Are there specific scopes or permissions required for API keys?" id="are-there-specific-scopes-or-permissions-required">
    No. Every API key has full access to every account you've connected to OnlyFans API, including every endpoint.
  </Accordion>
</Accordions>

## Account Authentication & Management

<Accordions type="multiple">
  <Accordion title="Where do I find my account ID?" id="where-do-i-find-my-account-id">
    **Through our [Console](https://app.onlyfansapi.com):**

    1. Go to Dashboard -> Accounts
    2. Find the relevant account
    3. Click on the Account ID to copy it

    **Through our API:**

    1. Call our [List Accounts](/api-reference/account/list-accounts) endpoint
    2. The response includes the account ID in the `id` field

    <Callout className="pb-">
      OnlyFans API account IDs **always** start with `acct_`
    </Callout>
  </Accordion>

  <Accordion title="What's the correct format for {account} IDs in API calls?" id="whats-the-correct-format-for-account-ids-in-api-calls">
    Always use the format: `acct_XXXXXXXX`

    * Include the `acct_` prefix
    * Endpoint URL example: `https://app.onlyfansapi.com/api/acct_abc123/chats`
  </Accordion>

  <Accordion title="Can I create a platform for users to manage their accounts?" id="can-i-create-a-platform-for-users-to-manage-their-accounts">
    Yes! Use these endpoints for authentication:

    * [Start Authentication](/api-reference/connect-onlyfans-account/start-authentication)
    * [Poll Authentication Status](/api-reference/connect-onlyfans-account/poll-authenticationStatus)
    * Optionally, [Submit 2FA](/api-reference/connect-onlyfans-account/submit2fa)

    <Callout title="All done?" type="success">
      Use our [Get Current Account](/api-reference/account/get-current-account) endpoint to retrieve the authenticated account details.
    </Callout>

    No need to use our UI - integrate these endpoints directly with your platform.
  </Accordion>

  <Accordion title="Can I connect an OnlyFans account through the API?" id="can-i-connect-an-onlyfans-account-through-the-api">
    Yes! Use our [Start Authentication](/api-reference/connect-onlyfans-account/start-authentication) endpoint. We also have an authentication library available on NPM — see our [Auth documentation](/auth).
  </Accordion>

  <Accordion title="How to export cookies to authenticate an account?" id="how-to-export-cookies-to-authenticate">
    Follow the "Option 2: By providing cURL request" step in our [connect OnlyFans account guide](/introduction/guides/connect-onlyfans-account#option-2-by-providing-curl-request).
  </Accordion>

  <Accordion title="Can I retrieve the user agent used for authentication?" id="can-i-retrieve-the-user-agent">
    It is currently not possible to retrieve the user agent that OnlyFans API uses to make requests.
  </Accordion>

  <Accordion title="Is there a way to speed up the authentication process?" id="is-there-a-way-to-speed-up-authentication">
    Unfortunately, no — not without risking a red-flag from OnlyFans. Our authentication process is already optimized to be as fast as possible while maintaining safety.
  </Accordion>

  <Accordion title="How does face verification work?" id="how-does-face-verification-work">
    The experience is nearly identical to OnlyFans' native process:

    1. The QR code that the model normally scans during OF login will appear in our dashboard and via email (sent to both the OnlyFans API user and the model)
    2. After scanning the code and completing the selfie check, the account will be authenticated
  </Accordion>

  <Accordion title="I have the same OnlyFans account connected multiple times. What am I doing wrong?" id="same-account-connected-multiple-times">
    You're probably adding the account again instead of re-connecting it. Use the [Re-authenticate Account](/api-reference/connect-onlyfans-account/re-authenticate-account) endpoint instead of [Start Authentication](/api-reference/connect-onlyfans-account/start-authentication).
  </Accordion>

  <Accordion title="Is there an endpoint to list all connected creators?" id="is-there-an-endpoint-to-list-all-connected-creators">
    Yes! Use our [List Accounts](/api-reference/account/list-accounts) endpoint.
  </Accordion>

  <Accordion title="How can I see how many subscribers I have?" id="how-can-i-see-how-many-subscribers-i-have">
    You can retrieve this through:

    * The [Get Current Account](/api-reference/account/get-current-account) endpoint under `subscribersCount`
    * Or the [List User Lists](/api-reference/user-list-collections/list-user-lists) endpoint under `fans.usersCount`
  </Accordion>

  <Accordion title="How can I see my OnlyFans creator ranking?" id="how-can-i-see-my-onlyfans-creator-ranking">
    The "top X percentage of all creators" value can be retrieved through:

    * [Get Top Percentage](/api-reference/account/get-top-percentage) endpoint
    * Or [Get Current Account](/api-reference/account/get-current-account) under `performerTop`
  </Accordion>

  <Accordion title="How can I add a team member?" id="how-can-i-add-a-team-member">
    Go to our dashboard at [app.onlyfansapi.com](https://app.onlyfansapi.com) and click on "Invite & manage members" in the sidebar.
  </Accordion>
</Accordions>

## Fan Data & Analytics

<Accordions type="multiple">
  <Accordion title="Why do I sometimes get empty fan data?" id="why-do-i-sometimes-get-null-fan-data">
    This is normal behavior:

    * Chat lists return immediately
    * Fan details are scraped in the background (usually takes 2-3 seconds)

    <Callout title="Solution:" type="success">
      Either call our [Get User Details](/api-reference/users/get-user-details) endpoint, or retry the original endpoint after 10 seconds.
    </Callout>
  </Accordion>

  <Accordion title="How can I check if a fan is online?" id="how-can-i-check-if-a-fan-is-online">
    Use the lastSeen field from our [Get Profile Details](/api-reference/public-profiles/get-profile-details) or [Get User Details](/api-reference/users/get-user-details) endpoints. If the `lastSeen` value is recent, the fan is likely online.

    ```json
    {
        "lastSeen": "2025-05-01T15:01:07+00:00"
        ...
    }
    ```

    <Callout title="Response may be cached, so data might be slightly outdated.">
      [-> Read more about caching](/introduction/essentials/response-structure#cache-control)
    </Callout>
  </Accordion>

  <Accordion title="How do I track fan subscription duration?" id="how-do-i-track-fan-subscription-duration">
    There's two options available:

    * **Calculate manually:** Use `subscribedOnData.subscribeAt` on endpoints like [List Active Fans](/api-reference/fans/list-active-fans) or [Get User Details](/api-reference/users/get-user-details).
    * **Human-readable format:** Use `subscribedOnData.duration` (e.g., "3 months")
  </Accordion>

  <Accordion title="How can I see total fan spending?" id="how-can-i-see-total-fan-spending">
    Access comprehensive spending data through these fields:

    | Field            | Description                    |
    | ---------------- | ------------------------------ |
    | `totalSumm`      | Combined total of all spending |
    | `subscribesSumm` | Total spent on subscriptions   |
    | `tipsSumm`       | Total spent on tips            |
    | `messagesSumm`   | Total spent on paid messages   |
    | `postsSumm`      | Total spent on paid posts      |
    | `streamsSumm`    | Total spent on streams         |

    <Callout title="Useful endpoints:">
      * [Get User Details](/api-reference/users/get-user-details)
      * [List Active Fans](/api-reference/fans/list-active-fans)
    </Callout>
  </Accordion>

  <Accordion title="How can I get a list of subscribers with spending > 0?" id="how-can-i-get-list-of-subscribers-with-spending">
    Filter by fan spendings in our [List Active Fans](/api-reference/fans/list-active-fans), [List All Fans](/api-reference/fans/list-all-fans), and [List Expired Fans](/api-reference/fans/list-expired-fans) endpoints by adding `filter.total_spent` to the query parameters. You can even filter by minimum tips.
  </Accordion>

  <Accordion title="How can I filter users by subscriber count?" id="how-can-i-filter-users-by-subscriber-count">
    Use our [Search Profiles](/api-reference/public-profiles/search-profiles) endpoint with the `sort` query parameter set to `subscribers`.
  </Accordion>

  <Accordion title="How can I see my user following count?" id="how-can-i-see-my-user-following-count">
    Retrieve it through the [List User Lists](/api-reference/user-list-collections/list-user-lists) endpoint under `following.usersCount`.
  </Accordion>

  <Accordion title="How can I see fans with rebill enabled?" id="how-can-i-see-fans-with-rebill-enabled">
    Use the [Get User List](/api-reference/user-list-collections/get-user-list) endpoint with `rebill_on` as the `{userListId}`.
  </Accordion>

  <Accordion title="How can I calculate the percentage of fans with rebill enabled?" id="how-can-i-calculate-percentage-of-fans-with-rebill">
    Call the [List User Lists](/api-reference/user-list-collections/list-user-lists) endpoint and calculate the difference between `rebill_on.usersCount` and `rebill_off.usersCount`.
  </Accordion>

  <Accordion title="How can I change a fan's nickname?" id="how-can-i-change-a-fans-nickname">
    Use our [Set Fan's Custom Name](/api-reference/fans/set-fans-custom-name) endpoint.
  </Accordion>

  <Accordion title="Can I detect a fan's language preference?" id="can-i-detect-a-fans-language-preference">
    Sadly, OnlyFans doesn't store language preferences. Workaround:

    1. Fetch chat messages from the fan
    2. Use a third-party language detection API
    3. Store the detected language in your database
  </Accordion>

  <Accordion title="How do I see what content a fan has purchased?" id="how-do-i-see-what-content-a-fan-has-purchased">
    No direct endpoint exists, but you can:

    1. Retrieve chat messages using the [List ChatMessage](/api-reference/chats/list-chat-message) endpoint
    2. Check if `isOpened = true` AND `price > 0`, which indicates a purchased PPV
  </Accordion>

  <Accordion title="Does the OnlyFans API allow scraping of subscriber data?" id="does-the-api-allow-scraping-of-subscriber-data">
    Yes. Any data that you can retrieve through our API endpoints, you can programmatically scrape.
  </Accordion>

  <Accordion title="How can I get the account ID of a user from the chats endpoint?" id="how-can-i-get-account-id-from-chats-endpoint">
    `data.fan.id` is the OnlyFans User ID of the fan, which you can also use to get the chat's messages in the [List Chat Messages](/api-reference/chat-messages/list-chat-messages) endpoint.
  </Accordion>

  <Accordion title="Where can I find the chat_id for getting chat messages?" id="where-can-i-find-the-chat-id">
    Use our [List Chats](/api-reference/chats/list-chats) endpoint, where `data.fan.id` is the `chat_id` you need for the [List Chat Messages](/api-reference/chat-messages/list-chat-messages) endpoint.
  </Accordion>

  <Accordion title="How can I delete several users from a list with a single request?" id="how-can-i-delete-several-users-from-a-list">
    Currently, OnlyFans API doesn't support removing multiple users from a list in a single request. You have two options:

    1. Clear the entire list using [Clear User List](/api-reference/user-list-collections/clear-user-list)
    2. Send one DELETE request per user via [Remove User from a User List](/api-reference/user-list-collections/remove-user-from-a-user-list)
  </Accordion>

  <Accordion title="How can I tell if a fan has read my message?" id="how-can-i-tell-if-a-fan-has-read-my-message">
    Use the `isNew` field from the [List Chat Messages](/api-reference/chat-messages/list-chat-messages) endpoint:

    * `isNew: true` — the message has **not** been seen yet
    * `isNew: false` — the fan has read the message

    <Callout>
      A real-time read-receipt webhook is not available, as OnlyFans does not expose message-read events in real time. Polling the `isNew` field is the recommended workaround.
    </Callout>
  </Accordion>
</Accordions>

## Webhooks & Media Handling

<Accordions type="multiple">
  <Accordion title="How do webhooks work?" id="how-do-webhooks-work">
    * 📚 Documentation: [docs.onlyfansapi.com/webhooks](/webhooks)
    * 🎥 Video Demo: [cap.so/s/p2wfkj072yt2x96](https://cap.so/s/p2wfkj072yt2x96)
  </Accordion>

  <Accordion title="Why do media in webhooks have no URL?" id="why-do-media-in-webhooks-have-no-url">
    When `"isReady": false`, the media is still processing.

    **Solution:**

    1. Get the chat ID from the webhook
    2. Poll the [List ChatMessage](/api-reference/chats/list-chat-message) endpoint every 10-20 seconds
    3. Wait for `"isReady": true`
    4. The URL will then be available

    **Alternatively:** Download and store vault content internally for reverse searching by media ID, once the media is ready.
  </Accordion>

  <Accordion title="Can I use webhooks with no-code tools?" id="can-i-use-webhooks-with-no-code-tools">
    Yes, you can use webhooks with no-code tools like Make, n8n or Zapier. Just set up a webhook listener in your tool and configure it to receive data from our API.

    <Callout title="Want to get started in no time?">
      We have most webhook events available as Make and Zapier modules, which you can find in our [Make](/integrations/make/available-modules#instant-triggers) and [Zapier](/integrations/zapier/available-modules#instant-triggers) directories.
    </Callout>
  </Accordion>

  <Accordion title="How can I view the logs of my webhook connection?" id="how-can-i-view-webhook-logs">
    Click on the webhook in your dashboard. It will take you to a details page where you can view all events that have recently been sent to your webhook URL.
  </Accordion>

  <Accordion title="Is there a users.stopped_typing webhook event?" id="is-there-a-users-stopped-typing-event">
    No. Here's how OnlyFans handles typing indicators:

    * When `users.typing` is received, OnlyFans shows a typing indicator for exactly 5 seconds
    * If a user continues typing, consecutive `users.typing` events are sent every \~3 seconds, resetting the timer
    * If no new `users.typing` event is received after 5 seconds, the indicator is hidden
    * If a `messages.received` event is received while the indicator is active, it is hidden

    You can replicate this logic in your own UI. You may need to adjust the timing slightly due to webhook delivery delays.
  </Accordion>

  <Accordion title="Why am I receiving a webhook event multiple times?" id="why-am-i-receiving-webhook-events-multiple-times">
    We use **at-least-once delivery semantics** for webhooks. If your server doesn't respond within **15 seconds**, the event will be retried up to 5 times with exponential backoff.

    **Best practices:**

    * Return a 2xx status code as quickly as possible, then handle logic asynchronously
    * Implement **idempotency** by deduplicating events based on their unique `event_id`
    * Check the "Attempts" column in the dashboard to confirm if retries are occurring
  </Accordion>

  <Accordion title="Is there a webhook for follower events?" id="is-there-a-webhook-for-follower-events">
    OnlyFans uses the term "follow" when a user subscribes to a free account. There is no separate "follow" action — it's the same as subscribing, just with a $0 price.
    To get notified about new followers, use the [subscriptions webhooks](/webhooks/available-events#subscriptions) (e.g. `subscriptions.new`). These fire for both paid and free subscriptions.
  </Accordion>

  <Accordion title="Is there a webhook for message read receipts?" id="is-there-a-webhook-for-message-read-receipts">
    No. OnlyFans does not expose message-read events in real time — even their own UI only updates read indicators on page refresh, not via websockets.

    **Workaround:** Poll the `isNew` field on the [List Chat Messages](/api-reference/chat-messages/list-chat-messages) endpoint. When `isNew` changes from `true` to `false`, the fan has read the message.
  </Accordion>
</Accordions>

## Media & Downloads

<Accordions type="multiple">
  <Accordion title="I cannot access a cdn*.onlyfans.com URL" id="cannot-access-cdn-onlyfans-url">
    `cdn*.onlyfans.com` URLs cannot be accessed directly due to OnlyFans' security — they are tied to specific IPs (in this case, our proxy IP). Use our [Download Media from the OnlyFans CDN](/api-reference/media/download-media-from-the-only-fans-cdn) endpoint to successfully download media files.
  </Accordion>

  <Accordion title="What do I do when downloading a media file returns a 403 error?" id="what-to-do-when-media-download-returns-403">
    When a 403 occurs:

    1. Call the endpoint again that you retrieved the `cdn*.onlyfans.com` URL from
    2. Call the download endpoint again with the newly retrieved CDN URL

    **Important checks:**

    * Always use the **same Account ID** for both retrieving and downloading. For example, if you got the URL from `/api/acct_ABC123/chats/123/messages`, you must use `acct_ABC123` in your download request
    * Use the CDN URL immediately — don't wait longer than 1 minute, as CDN URLs expire quickly
  </Accordion>

  <Accordion title="Are there content restrictions for downloading media?" id="are-there-content-restrictions-for-downloading">
    No distinction between public vs. premium or owned vs. subscribed content. The only limitation is that the authenticated account must have access to view the media file on OnlyFans.
  </Accordion>

  <Accordion title="Does the media download endpoint require a specific account type?" id="does-media-download-require-specific-account-type">
    No. Any account type can download media as long as the authenticated account has access to view the media file.
  </Accordion>

  <Accordion title="My media file's files.full.url is null. Why?" id="my-media-files-full-url-is-null">
    This happens when `convertedToVideo` is set to `false`. The file is still being converted. Once the conversion completes and the status changes to `true`, you'll be able to download the video successfully.
  </Accordion>

  <Accordion title="Which OnlyFans user's content can I view?" id="which-onlyfans-users-content-can-i-view">
    You can only view content that is accessible to the connected account — either your own content (if it's a creator account) or content from creators the account is subscribed to.

    **TL;DR:** Through our API, you can view all content you can also see when logging into onlyfans.com. Our API does not bypass any subscription or PPV pricing.
  </Accordion>
</Accordions>

## Tracking & Free Trial Links

<Accordions type="multiple">
  <Accordion title="Is there a dashboard for tracking link data?" id="is-there-a-dashboard-for-tracking-links">
    Yes! In our dashboard at [app.onlyfansapi.com](https://app.onlyfansapi.com), click on "Trial & Tracking Links" in the sidebar. You'll see an overview with clicks, subscribers, revenue, spender count, ARPS, creation date, and expiration date.

    You can also create links and generate shareable URLs with optional revenue visibility.

    <Callout>
      For calculation logic details, see our [Free Trial Links documentation](/api-reference/free-trial-links).
    </Callout>
  </Accordion>

  <Accordion title="Are there limits on how many free trial or tracking links I can create?" id="are-there-limits-on-free-trial-or-tracking-links">
    No limits! We've created hundreds to thousands of links per day via our API with no restrictions:

    * 🎁 Free Trials: No limit per day
    * 🔗 Tracking Links: No limit per day
  </Accordion>

  <Accordion title="Why do my tracking link revenue totals differ from other tools?" id="why-do-my-tracking-link-revenue-totals-differ">
    Different services calculate tracking and free trial link revenue differently, since OnlyFans doesn't provide this data natively. Some discrepancies between tools (e.g., Infloww, FansMetrics) are expected and normal.

    We are continuously improving our calculation logic to be as accurate as possible.
  </Accordion>
</Accordions>

## API Troubleshooting

<Accordions type="multiple">
  <Accordion title="My API requests are failing with 401. Why?" id="my-api-requests-are-failing-with-401">
    A 401 error indicates an authorization problem — usually an invalid API key. Verify that:

    * Your API key is correct
    * The authorization header is set up correctly in your request

    Check your API key status at [app.onlyfansapi.com/api-keys](https://app.onlyfansapi.com/api-keys).
  </Accordion>

  <Accordion title="What does a 405 error code mean?" id="what-does-a-405-error-code-mean">
    You're using the wrong HTTP method. Check our [API Reference](/api-reference) to see which HTTP method (GET, POST, DELETE, etc.) is required for the endpoint.
  </Accordion>

  <Accordion title="What does a 404 error code mean?" id="what-does-a-404-error-code-mean">
    The API URL doesn't exist. This usually means:

    * You're missing the account prefix (use `/api/acct_XXXXXXXX/...`)
    * The endpoint URL is incorrect

    Check our [API Reference](/api-reference) for valid endpoint URLs.
  </Accordion>

  <Accordion title="My API call is failing with 'Failed to fetch' or 'ERR_NAME_NOT_RESOLVED'" id="api-call-failing-with-failed-to-fetch">
    Double-check that the URL has the correct parameters and there are no network issues on your side.
  </Accordion>

  <Accordion title="How can I see which API calls returned an error?" id="how-can-i-see-which-api-calls-returned-an-error">
    In our dashboard, click on "Logs" in the sidebar to see an overview of all requests and any errors. Click on a specific request to view the full details and response.
  </Accordion>

  <Accordion title="What does a 400 error or 'Input contains restricted words' mean?" id="what-does-a-400-error-or-restricted-words-mean">
    A `400 Bad Request` with the message "Input contains restricted words" is an error returned by OnlyFans itself — not by our API. It means your message contains words that OnlyFans has blocked.

    Review your message content and remove or rephrase any terms that may be flagged. The error response includes a `textHighLight` field showing which part of your message triggered the restriction.
  </Accordion>
</Accordions>

## Billing & Subscriptions

<Accordions type="multiple">
  <Accordion title="What subscription plans are available?" id="what-subscription-plans-are-available">
    All of our subscription plans, account pricing, and credit pricing are explained at [onlyfansapi.com/pricing](https://onlyfansapi.com/pricing).
  </Accordion>

  <Accordion title="How long can I use OnlyFans API for free?" id="how-long-can-i-use-onlyfans-api-for-free">
    For as long as you want, until you've consumed all of your 10 free credits. Afterwards, you'll need to subscribe to a plan.
  </Accordion>

  <Accordion title="What is the estimated cost for the Enterprise plan?" id="what-is-the-estimated-cost-for-enterprise">
    Pricing depends on your needs — the more accounts or credits you need, the better our pricing. Schedule a call at [cal.com/onlyfansapi/15min](https://cal.com/onlyfansapi/15min).
  </Accordion>

  <Accordion title="I need more than 5 accounts connected. How do I change this limit?" id="i-need-more-than-5-accounts-connected">
    We offer dynamic pricing for additional accounts, explained at [onlyfansapi.com/pricing](https://onlyfansapi.com/pricing). You can also pre-purchase account seats.
  </Accordion>

  <Accordion title="What plan do I have?" id="what-plan-do-i-have">
    View and change your current plan at [app.onlyfansapi.com/billing](https://app.onlyfansapi.com/billing).
  </Accordion>

  <Accordion title="How can I pause or cancel my subscription?" id="how-can-i-pause-or-cancel-my-subscription">
    You currently cannot pause your subscription. To cancel, go to [app.onlyfansapi.com/billing](https://app.onlyfansapi.com/billing).
  </Accordion>
</Accordions>

## Documentation & Resources

<Accordions type="multiple">
  <Accordion title="Do you have a full OpenAPI Schema available?" id="do-you-have-a-full-openapi-schema">
    Yes! Our OpenAPI schema is available at [app.onlyfansapi.com/scribe-docs/openapi.yaml](https://app.onlyfansapi.com/scribe-docs/openapi.yaml).
  </Accordion>

  <Accordion title="Is there an endpoint that shows all available endpoints?" id="is-there-an-endpoint-that-shows-all-endpoints">
    No. Please refer to our [API Reference](/api-reference) for a complete list of available endpoints.
  </Accordion>

  <Accordion title="Do you have documentation that AI/ChatGPT can read?" id="do-you-have-documentation-for-ai">
    Yes! Visit [docs.onlyfansapi.com/llms.txt](https://docs.onlyfansapi.com/llms.txt) for the canonical AI-friendly version of our documentation. We also keep [docs.onlyfansapi.com/llms-full.txt](https://docs.onlyfansapi.com/llms-full.txt) for backward compatibility.
  </Accordion>
</Accordions>
