Skip to main content
Two separate things are versioned on the Fanvue API, and they move independently. /v1 is the current URL version. The unversioned paths you call today (/chats, /posts, and so on) and their explicit /v0 twins are the previous version. They keep working, and they are still in this reference: use the version selector in the top bar of the API Reference to move between v1 and v0.
The date version and the URL version are independent. Keep sending X-Fanvue-API-Version: 2025-06-26 when you move to /v1.

Why move

Legacy lists page with page and size. The database has to scan past every earlier row to reach page 40, so a deep crawl gets slower the further it goes and costs the platform work proportional to depth. /v1 lists page with a cursor. Each page starts exactly where the previous one ended, so page 400 costs the same as page 1.
Rate limits on the legacy endpoints will be reduced for performance reasons. The date and the new limits are still to be confirmed and will be announced here and to integrators before they take effect. Limits on /v1 are not changing.

What actually changes

Most of the surface does not change at all. For the large majority of endpoints, /v1/<path> is the same path, the same request body, the same response fields and the same OAuth scopes as <path>. Prefix the path and you are done. The changes are concentrated in list endpoints.

Cursor pagination replaces page and size

The envelope changes with it:
Not every v1 list carries total. Many return only data and nextCursor:
To walk a collection, pass the nextCursor you were given as the cursor of the next request, and stop when nextCursor is null.
Three things to watch:
  • total is not always there. Roughly half of the v1 lists do not carry the field at all, and some of those that do return it as null where the count is too expensive to compute. The mapping table below shows which envelope each endpoint returns; read it rather than assuming. hasMore is gone; nextCursor === null is the end of the collection.
  • Keep size constant for the whole walk. A cursor is only valid for the page size it was issued with. Changing size mid-walk moves the page boundary.
  • A cursor is opaque. Do not parse it, store it long term, or build one yourself. Pass back exactly what you were given.

The two message endpoints change more

GET /v1/chats/{userUuid}/messages and GET /v1/creators/{creatorUserUuid}/chats/{userUuid}/messages do not use the standard cursor envelope. They take limit, sentBefore and receivedBefore in place of page, size, startDate and endDate, and answer with { data, dateFilter }.

Some lists gain filters

A few v1 lists accept filters their predecessor did not, for example search and filter on /v1/agencies/chats and a date range and sort on /v1/creators/{creatorUserUuid}/subscribers. These are additive. See the mapping below for the exact set per endpoint.

Endpoints with no v1

App Store endpoints (/apps/*) have no /v1 path, so they do not appear under v1 in the reference. Keep calling them on the unversioned path. Account health is split rather than absent. The self-scoped /account-health and /account-health/flagged-media are v0 only, but the creator-scoped pair does have a v1 form and is listed in the mapping below.

Endpoint mapping

Every endpoint not listed below is unchanged apart from the prefix: call /v1/<path> exactly as you call <path> today.
/checkout-links, /collections, /media-links, /creators/{creatorUserUuid}/checkout-links and /creators/{creatorUserUuid}/vault/folders accept page and size on the legacy version even though the legacy reference never listed them. On /v1 the cursor parameters are declared, so what you see is what the endpoint accepts.

Migration checklist

1

Prefix the paths

Change <path> to /v1/<path>. Keep the X-Fanvue-API-Version header exactly as it is.
2

Replace page loops with cursor loops

Stop incrementing page. Read nextCursor from each response, pass it as cursor on the next request, and stop when it is null. Hold size constant for the whole walk.
3

Stop reading pagination and hasMore

Read nextCursor instead. Only depend on total where you have checked it is not null for the endpoint you are calling.
4

Handle the two message endpoints separately

They take limit, sentBefore and receivedBefore and return { data, dateFilter }.
5

Check the endpoints with no v1

/apps/* stays on the unversioned path, as do the self-scoped /account-health and /account-health/flagged-media. The creator-scoped account-health endpoints do move to /v1.