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. |
A measure is named differently depending on where you read it from. Match on this table rather than on the name, and read the caution below before combining two sources.
| Measure | Repository CSV | API CSV | API JSON |
|---|---|---|---|
| Month | month | month | month |
| Mean price charged | avg_price_real | avg_price_real_usd | avg_real |
| Mean price advertised | avg_price_advertised | avg_price_advertised_usd | avg_advertised |
| Median price charged | median_price_real | median_price_real_usd | median |
| Most common price charged | not carried here | most_common_price_real_usd | mode |
| Share of paid pages on discount | pct_on_discount | pct_on_discount | pct_on_discount |
| Discounts held 90 days or more | pct_discount_over_90d | pct_discount_over_90_days | not carried here |
| Median discount depth | median_discount_depth | median_discount_depth_pct | not carried here |
| Priced profiles behind the row | price_sample_n | price_sample_n | n |
Shares are a fraction of 1 in the repository files and a percentage in the API. The same month reads 0.5645 in one and 56.45 in the other, so mixing the two silently multiplies a result by 100.
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 August 2026 and was frozen on Sep 01, 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 https://doi.org/10.5281/zenodo.22094426
@dataset{luvsone-creator-price-index,
title = {Luvs Creator Price Index},
author = {LuvsOne},
year = {2026},
version = {2026-08},
publisher = {LuvsOne},
doi = {10.5281/zenodo.22094426},
url = {https://doi.org/10.5281/zenodo.22094426},
note = {CC BY 4.0}
}LuvsOne. (2026). Luvs Creator Price Index (Version 2026-08) [Data set]. https://doi.org/10.5281/zenodo.22094426
LuvsOne (2026): Luvs Creator Price Index. V. 2026-08. LuvsOne. (dataset). https://doi.org/10.5281/zenodo.22094426
Citing the live page instead of a frozen release? Add the date you accessed it; the live figures change monthly.
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 dataEvery figure on this page came from evaluating real creator pages one at a time. That is the part you can actually use.