The population
The published catalogue: the creator pages that exist on LuvsOne. It is a curated sample of the market, not a census of it, and it grows as we publish.
How the sample is defined, how every published figure is computed, where its edges are, and how to download and cite it.
LuvsOne is a creator intelligence platform. Every creator gets a page that answers one question: is this subscription worth the money? The LUVS Score, the price history, the content mix and the fan tools all exist to answer it, for anyone, without an account. Start at the home page or go straight to creator search.
Answering that question at scale produces a dataset, and this page is about the dataset. We measure the publicly visible page information of subscription creator profiles and publish it as monthly aggregates: a new release on the 2nd of each month, frozen when the month closes and never revised. It is free under CC BY 4.0, mirrored on GitHub, and readable through a public API. The live figures are on the stats page.
Sample first, then each published measure, then the limits you should read them against.
The published catalogue: the creator pages that exist on LuvsOne. It is a curated sample of the market, not a census of it, and it grows as we publish.
A profile counts as active in a month when its public page was observed at least once during that month. A figure is computed from the observations that exist, never from an assumption about the ones that do not.
Data comes from publicly visible page information and is aggregated. We do not collect or publish personal data, and released datasets contain aggregates only.
The flagship series: what a paid subscription costs per month, listed and charged, across the sample.
Price is point in time, not averaged within the month: the last observation carrying a known price, meaning what the page cost as the month closed. Averaging within a month would invent prices that never existed. Listed and charged prices come from the same observation, so the gap between them is observed discount rather than an artefact of different denominators. A month publishes an index only when at least 100 profiles carried a price and they cover at least half of the observed sample.
Share of subscription pages that are free to follow versus paid, measured monthly.
A page counts as paid when a subscription price above zero was observed in the month, and as free when only a free to follow page was seen and no paid page was. Profiles whose page type could not be determined are excluded from the denominator rather than counted as free, so a month where prices were harder to observe does not read as a month when the market got cheaper.
The centre and the spread of paid subscription prices this month, in fixed bands that never move between releases.
Computed on paid profiles only. Deciles use linear interpolation between order statistics (R type 7, the default of numpy.percentile), so a figure recomputed from the raw data matches exactly. Band edges are fixed and never re-derived from the data, which is what keeps two releases comparable. The lowest band starts at one cent: free pages are a different kind of page, not the cheapest band.
How concentrated audience attention is across creators, measured by likes. This is an engagement measure, not an income measure.
The Gini coefficient is computed over observed likes with the standard sorted-data formula. Profiles with no observed likes are included: zero attention is part of the distribution, not a missing observation. Top shares are the fraction of all observed likes held by the highest ranked 1% and 10%.
How much of the paid market runs a promotion in the month, and how deep those promotions cut.
Depth is the reduction against the list price, taken from the source page’s own reported percentage where it publishes one and derived from list against current price otherwise. Median and mean are published together because depths cluster hard on half off, so the median alone hides the tail of deeper cuts. A promotion counts as long running when it has held without interruption for 90 days or more, and a single observation without it resets the clock.
Share of paid pages that changed price since last month, split by direction, among pages priced in both months.
Only profiles with an observed price in both months are counted. Movement is measured on the price actually charged, so entering or leaving a promotion is a price change: this publication describes what a subscription costs, not what a page advertises. The size of a move is reported among changers only.
Share of profiles first observed in a given month that are still observed active later, within our sample.
Not published for the current population. A creator who stops posting is removed from the published catalogue automatically, so a cohort measured on it stays close to fully active by construction, and the resulting curve would describe our own visibility rules rather than creator behaviour. Any figure we ever publish here would describe observed activity within our sample, never platform-wide account closure.
Median paid subscription price by top level category, for the latest month.
Categories are top level only. A category needs a minimum number of priced profiles before any figure is published for it, and one that falls below is omitted from the page and from the files entirely rather than shown with blank cells. The finer attribute taxonomy behind the top level categories is never exposed, in aggregate or otherwise.
The published catalogue is selected, not random. It skews toward creators who are active and findable, so figures describe this sample rather than the platform as a whole, and nothing here should be read as a market total.
A page can go unobserved in a month for reasons that have nothing to do with the creator. An empty cell always means the measure could not be computed, never that it measured zero, and a figure is never carried forward from a previous month to fill a gap.
Anything measured over the life of a profile is right-censored: a profile first seen recently has had less time to be observed. This is the main reason account survival is withheld rather than estimated.
Category and country labels are applied as they stand today, including to earlier months. They change rarely, but a creator who was relabelled will appear under the current label throughout the series.
The concentration figures are computed over likes, which measure visibility. They say nothing about revenue, and no earnings estimate can be derived from them.
The same definitions ship as CODEBOOK.md with the public dataset, generated from this list.
| Column | Type | Definition |
|---|---|---|
month | month | Calendar month of the release, YYYY-MM. |
median_price_real_usd | usd | Median price actually charged for a paid subscription. The primary price figure. |
avg_price_real_usd | usd | Mean price actually charged. Published beside the median, never instead of it. |
avg_price_advertised_usd | usd | Mean list price, computed on the same profiles as the real average so the gap between them is discount rather than a difference of denominators. |
most_common_price_real_usd | usd | Modal charged price, rounded to the cent. |
price_sample_n | number | Profiles with an observed price behind that month, the sample size for every price figure in the row. |
gini_likes | number | Gini coefficient of the like distribution, 0 to 1. An attention measure, not an income measure. |
top1_share | share | Share of all observed likes held by the top 1% of profiles ranked by likes. |
top10_share | share | Share of all observed likes held by the top 10%. |
| Column | Type | Definition |
|---|---|---|
free_share | share | Share of classifiable pages that are free to follow. |
paid_share | share | Share of classifiable pages that charge a subscription. Sums with free_share to 1. |
| Column | Type | Definition |
|---|---|---|
band | string | Fixed price band key: 0.01-4.99, 5-9.99, 10-14.99, 15-19.99, 20-29.99, 30-49.99, 50+. Edges never move, so releases stay comparable. |
n | number | Priced profiles falling in the band that month. |
share | share | Band share of all priced profiles that month. |
is_modal | number | 1 on the fullest band of the month, 0 otherwise. |
p10 … p90 | usd | Deciles of the charged price, by linear interpolation between order statistics (R type 7). |
| Column | Type | Definition |
|---|---|---|
lorenz_p | share | Cumulative share of profiles, ascending by likes, at 21 points from 0 to 1. |
lorenz_share | share | Cumulative share of likes held by that fraction of profiles. |
| Column | Type | Definition |
|---|---|---|
pct_on_discount | percent | Share of paid profiles running a promotion that month. |
median_discount_depth_pct | percent | Median depth of active discounts: (regular minus promotional) over regular. |
mean_discount_depth_pct | percent | Mean depth. Depths cluster hard on 50%, so the distance from the median is the finding. |
pct_discount_over_90_days | percent | Share of active discounts that had run without interruption for 90 days or more. A gap resets the clock. |
| Column | Type | Definition |
|---|---|---|
changed_share | share | Share of profiles priced in both months whose charged price moved by a cent or more. |
increased_share | share | Share that moved up, on the same denominator. |
decreased_share | share | Share that moved down, on the same denominator. |
median_abs_change_pct | percent | Median size of the move, in percent, among changers only. |
mean_abs_change_pct | percent | Mean size of the move, among changers only. |
n | number | Profiles priced in both months, the denominator for the three shares. |
| Column | Type | Definition |
|---|---|---|
available | number | Always 0 for the current population. The measurement is withheld rather than published; see Known limitations. |
| Column | Type | Definition |
|---|---|---|
category | string | Top level category label. Finer attribute taxonomy is never exposed. |
median_price_real_usd | usd | Median charged price within the category. |
avg_price_real_usd | usd | Mean charged price within the category. |
n_priced | number | Priced profiles behind the row. Rows below the minimum cell size are omitted from the file entirely. |
An empty cell means the measure was not computable for that month. It never means zero.
Free under CC BY 4.0. Attribution with a link is all we ask.
The newest release covers July 2026 and was frozen on Aug 20, 2026.
For a specific figure, use the Cite this button on its section: it points at the frozen month rather than at the live page.
LuvsOne (2026). Luvs Creator Price Index. https://luvs.one/stats
@misc{luvsone-creator-price-index,
title = {Luvs Creator Price Index},
author = {LuvsOne},
year = {2026},
howpublished = {\url{https://luvs.one/stats}},
note = {CC BY 4.0}
}Read only, aggregates only, no key required, open CORS.
?release=YYYY-MM on any endpoint pins it to a frozen month. Without it you get the newest release, which rolls forward on the 2nd.
GET /api/v1/stats/free-shareOn the stats pageFree versus paid share, as a monthly series.
{
"release": "2026-07",
"metric": "free_vs_paid",
"free_share": 0.2075,
"paid_share": 0.7925,
"series": [ { "month": "2026-07", "free_share": 0.2075, "paid_share": 0.7925 } ],
"license": "CC-BY-4.0"
}GET /api/v1/stats/price-bandsOn the stats pageMedian, mean, deciles and the fixed price bands for one month.
{
"release": "2026-07",
"median": 6.66,
"mean": 8.53,
"deciles": [ { "p": 10, "value": 3.0 }, { "p": 90, "value": 15.0 } ],
"bands": [ { "key": "5-9.99", "n": 118, "share": 0.3722 } ],
"modal_band": "5-9.99"
}GET /api/v1/stats/attention-concentrationOn the stats pageGini over likes, top 1% and top 10% shares, the Lorenz curve, and the series.
{
"release": "2026-07",
"measures": "attention, not income",
"gini": 0.6283,
"top1_share": 0.1928,
"top10_share": 0.5501,
"lorenz": [ [0, 0], [0.5, 0.1266], [1, 1] ]
}GET /api/v1/stats/discountsOn the stats pagePromotion prevalence and discount depth, median and mean, as a series.
{
"release": "2026-07",
"pct_on_discount": 51.42,
"median_depth": 50,
"mean_depth": 47.8,
"pct_running_over_long_period": 58.9,
"long_run_days": 90
}GET /api/v1/stats/price-changesOn the stats pageMonth over month price movement: how many moved, which way, by how much.
{
"release": "2026-07",
"changed_share": 0.281,
"increased_share": 0.094,
"decreased_share": 0.187,
"median_abs_change_pct": 33.4,
"mean_abs_change_pct": 38.1
}GET /api/v1/stats/survivalCohort survival. Returns available: false with the reason, rather than a 404.
{
"release": "2026-07",
"available": false,
"curve": null,
"notes": { "withheld": "Not published for the current population." }
}GET /api/v1/stats/niche-benchmarksOn the stats pageMedian price by top level category. Suppressed cells are omitted.
{
"release": "2026-07",
"minimum_n": 15,
"niches": [
{ "slug": "fetish_focus", "label": "Fetish Focus",
"median_real": 7.99, "avg_real": 9.39, "n_priced": 75 }
]
}GET /api/v1/price-index.csvThe whole monthly series as a spreadsheet. Append-only columns.
month,median_price_real_usd,avg_price_real_usd,pct_on_discount,… 2026-07,6.66,8.53,51.42,…
We prepare custom aggregate cuts for journalists and researchers, free, with the methodology attached. Tell us the question and the breakdown you need.
Request research dataA series may be extended backwards. It may not be changed quietly.
July 2026 was originally frozen before the current metric set existed, and the metrics added afterwards were computed against a panel that had grown in the meantime. That left one release describing two different samples: its headline averages came from the original freeze, its distribution from the later computation, and the two disagreed with each other. The month has been recomputed in full, so every figure in it now comes from one calculation over one panel. The published median moved from 6.66 to 6.30 US dollars and the mean from 8.53 to 8.19, both because the sample is larger, not because the market moved. Anyone who cited the earlier figures should treat them as superseded by this release. No other month was touched.
Four calendar months that met the publication threshold but had never been released were frozen and published, so the series now carries several observations rather than one. They are new releases, not revisions: nothing already published was recomputed or overwritten. Because they were generated after the metric set was complete, every figure in them comes from a single computation over one panel. The most recent month predated that set and was reconciled separately, in the correction recorded above.
Free versus paid share, the price distribution (deciles and fixed bands), price change dynamics, and mean discount depth were added to the release generator, and the existing attention and category measures were given their own anchors, definitions and citations. The new series were computed retroactively for months that were already frozen: their previously published figures are unchanged and their freeze dates were not touched, but the new columns for those months were computed against the panel as it stands today rather than as it stood then. Separately, counts of tracked and scored profiles were removed from the site, from the JSON endpoints and from the structured data. The published CSV keeps its columns so that figures already cited from it remain reproducible.
Every figure on this page came from evaluating real creator pages one at a time. That is the part you can actually use.