The dataset behind the numbers

How the sample is defined, how every published figure is computed, where its edges are, and how to download and cite it.

CC BY 4.0New release on the 2ndAggregates only
Start here

What LuvsOne is

Search creators

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.

Methodology

How every figure is produced

Sample first, then each published measure, then the limits you should read them against.

See it on the stats page

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.

Active in a month

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.

Aggregates only

Data comes from publicly visible page information and is aggregated. We do not collect or publish personal data, and released datasets contain aggregates only.

Luvs Creator Price Index

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.

  1. Free versus paid share

    Share of subscription pages that are free to follow versus paid, measured monthly.

    See it on the stats page

    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.

  2. Median and price distribution

    The centre and the spread of paid subscription prices this month, in fixed bands that never move between releases.

    See it on the stats page

    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.

  3. Attention concentration

    How concentrated audience attention is across creators, measured by likes. This is an engagement measure, not an income measure.

    See it on the stats page

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

  4. Discount tracker

    How much of the paid market runs a promotion in the month, and how deep those promotions cut.

    See it on the stats page

    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.

  5. Price change dynamics

    Share of paid pages that changed price since last month, split by direction, among pages priced in both months.

    See it on the stats page

    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.

  6. Account survival withheld

    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.

  7. Price by category

    Median paid subscription price by top level category, for the latest month.

    See it on the stats page

    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.

Known limitations

The sample is curated

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.

Observation gaps are real

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.

Recent cohorts are censored

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.

Attributes are treated as fixed

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.

Likes are attention, not income

The concentration figures are computed over likes, which measure visibility. They say nothing about revenue, and no earnings estimate can be derived from them.

Data definitions

Every column, defined

The same definitions ship as CODEBOOK.md with the public dataset, generated from this list.

price_index.csv

ColumnTypeDefinition
monthmonthCalendar month of the release, YYYY-MM.
median_price_real_usdusdMedian price actually charged for a paid subscription. The primary price figure.
avg_price_real_usdusdMean price actually charged. Published beside the median, never instead of it.
avg_price_advertised_usdusdMean 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_usdusdModal charged price, rounded to the cent.
price_sample_nnumberProfiles with an observed price behind that month, the sample size for every price figure in the row.
gini_likesnumberGini coefficient of the like distribution, 0 to 1. An attention measure, not an income measure.
top1_shareshareShare of all observed likes held by the top 1% of profiles ranked by likes.
top10_shareshareShare of all observed likes held by the top 10%.

free_share.csv

ColumnTypeDefinition
free_shareshareShare of classifiable pages that are free to follow.
paid_shareshareShare of classifiable pages that charge a subscription. Sums with free_share to 1.

price_bands.csv

ColumnTypeDefinition
bandstringFixed 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.
nnumberPriced profiles falling in the band that month.
shareshareBand share of all priced profiles that month.
is_modalnumber1 on the fullest band of the month, 0 otherwise.
p10 … p90usdDeciles of the charged price, by linear interpolation between order statistics (R type 7).

attention_concentration.csv

ColumnTypeDefinition
lorenz_pshareCumulative share of profiles, ascending by likes, at 21 points from 0 to 1.
lorenz_shareshareCumulative share of likes held by that fraction of profiles.

discounts.csv

ColumnTypeDefinition
pct_on_discountpercentShare of paid profiles running a promotion that month.
median_discount_depth_pctpercentMedian depth of active discounts: (regular minus promotional) over regular.
mean_discount_depth_pctpercentMean depth. Depths cluster hard on 50%, so the distance from the median is the finding.
pct_discount_over_90_dayspercentShare of active discounts that had run without interruption for 90 days or more. A gap resets the clock.

price_changes.csv

ColumnTypeDefinition
changed_shareshareShare of profiles priced in both months whose charged price moved by a cent or more.
increased_shareshareShare that moved up, on the same denominator.
decreased_shareshareShare that moved down, on the same denominator.
median_abs_change_pctpercentMedian size of the move, in percent, among changers only.
mean_abs_change_pctpercentMean size of the move, among changers only.
nnumberProfiles priced in both months, the denominator for the three shares.

survival.csv

ColumnTypeDefinition
availablenumberAlways 0 for the current population. The measurement is withheld rather than published; see Known limitations.

niche_benchmarks.csv

ColumnTypeDefinition
categorystringTop level category label. Finer attribute taxonomy is never exposed.
median_price_real_usdusdMedian charged price within the category.
avg_price_real_usdusdMean charged price within the category.
n_pricednumberPriced profiles behind the row. Rows below the minimum cell size are omitted from the file entirely.

The same measure across the three files

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.

MeasureRepository CSVAPI CSVAPI JSON
Monthmonthmonthmonth
Mean price chargedavg_price_realavg_price_real_usdavg_real
Mean price advertisedavg_price_advertisedavg_price_advertised_usdavg_advertised
Median price chargedmedian_price_realmedian_price_real_usdmedian
Most common price chargednot carried heremost_common_price_real_usdmode
Share of paid pages on discountpct_on_discountpct_on_discountpct_on_discount
Discounts held 90 days or morepct_discount_over_90dpct_discount_over_90_daysnot carried here
Median discount depthmedian_discount_depthmedian_discount_depth_pctnot carried here
Priced profiles behind the rowprice_sample_nprice_sample_nn

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.

Downloads

Take the data with you

Free under CC BY 4.0. Attribution with a link is all we ask.

The dataset on GitHub

The newest release covers August 2026 and was frozen on Sep 01, 2026.

Citation

How to cite this

For a specific figure, use the Cite this button on its section: it points at the frozen month rather than at the live page.

Read the licence
Plain citation
LuvsOne (2026). Luvs Creator Price Index. https://luvs.one/stats https://doi.org/10.5281/zenodo.22094426
BibTeX
@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}
}
APA
LuvsOne. (2026). Luvs Creator Price Index (Version 2026-08) [Data set]. https://doi.org/10.5281/zenodo.22094426
DataCite
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.

API

Read it from code

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 page

Free 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 page

Median, 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 page

Gini 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 page

Promotion 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 page

Month 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/survival

Cohort 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 page

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

The 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,…

Need a cut that is not published?

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 data

We reply within two business days.

The data is the by-product. The creators are the point.

Every figure on this page came from evaluating real creator pages one at a time. That is the part you can actually use.