Is IPv4 Still an Investment in 2026? Yield After Fees
Short answer (checked 2026-11-06): yes, as an income asset, not as a bet on price. A /24 bought at the ip4.market 90-day median of $25.25 per IP (index updated 2026-11-02) costs about $6,464. Let at IPv4Center's average lease of $0.53 per IP a month, it earns about $1,628 a year: 25.2% gross. The registry decides the rest. Added to an LIR you already pay for, that is also the net yield; under ARIN it is 20.7% after the 2027 fee; in a new RIPE LIR opened just for this block, the EUR 1,894 fee turns it into a loss of 7.7% a year. A /22 earns enough to carry its own LIR. All figures are dated observations; for a quote see IPv4 pricing.
What changed since the 2025 crash
The speculative premium is gone. Our July 2026 market notes had a /24 at about $30 per IP and leases near $0.40 a month, a 16% gross yield. By November 2026 the purchase price had fallen further than the rent, so the same arithmetic gives 25.2%. Larger blocks still trade lowest per address: the ip4.market index shows 90-day medians of $19.00 for a /22, $15.97 for a /20 and $12.62 for a /16 (two sales only). A buyer in 2026 pays for income, not for a price that only goes up.
Fixed costs moved the other way. From 2027 the RIPE NCC charges EUR 1,894 per LIR account under RIPE-867, with no per-IP or transfer fee and EUR 1,000 to sign up (see what changed in the 2027 charging scheme). Since 29 September 2026 the RIPE NCC has also temporarily stopped existing members from opening additional LIR accounts (RIPE payment page, read 2026-11-06), so a member cannot park a block in a fresh LIR anyway. ARIN's 2027 fee schedule, adopted on 19 April 2026, charges $288.75 a year for a /24 (3X-Small) and $577.50 up to a /22 (2X-Small), plus a one-off recipient fee of $187.50 for a /24 transfer.
Measure it yourself: ipv4_asset.js
The script reads the RIPE NCC's public log of IPv4 transfers to see how liquid each block size is and how long blocks stay with one holder. Then it works out the net yield per year for a /24 and a /22 by where the block is registered, with the euro rate from the ECB. Prices are dated constants at the top: change them when you have a quote. Save it as ipv4_asset.js:
// ipv4_asset.js - is an IPv4 block still an investment? Liquidity from RIPE's own transfer log,
// then net lease yield after registry fees for a /24 and a /22.
// usage: bun ipv4_asset.js [transfers.json] (downloads RIPE's log when no file is given)
const LOG = 'https://www-static.ripe.net/dynamic/table-of-transfers/ipv4/transfers-allocations.json'
const BUY = { 24: 25.25, 22: 19.00 } // ip4.market price index, 90-day median $/IP, updated 2026-11-02
const LEASE = { 24: 0.53, 22: 0.58 } // IPv4Center lease page, avg $/IP/month, read 2026-11-06
const RIPE_LIR_EUR = 1894 // RIPE-867: annual fee per LIR account from 2027
const ARIN_RSP = { 24: 288.75, 22: 577.50 } // ARIN 2027 fee schedule, 3X-Small / 2X-Small
const file = process.argv[2]
const log = file ? await Bun.file(file).json() : await (await fetch(LOG)).json()
const ecb = await (await fetch('https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml')).text()
const usdPerEur = +ecb.match(/currency='USD' rate='([\d.]+)'/)[1]
const ecbDate = ecb.match(/time='([\d-]+)'/)[1]
const ip = s => s.split('.').reduce((a, o) => a * 256 + +o, 0)
const size = b => b.includes('/') ? 2 ** (32 - +b.split('/')[1]) : ip(b.split('-')[1].trim()) - ip(b.split('-')[0].trim()) + 1
const day = d => { const [dd, mm, yy] = d.split('/'); return Date.UTC(+yy, mm - 1, +dd) }
const bucket = n => n <= 256 ? '/24' : n <= 1024 ? '/23-/22' : n <= 4096 ? '/21-/20' : n <= 32768 ? '/19-/17' : '/16+'
const rows = log.transfers.map(t => ({ ...t, ts: day(t.date), blocks: t.transferred_blocks.split(',').map(s => s.trim()) }))
const last = new Date(Math.max(...rows.map(r => r.ts))).toISOString().slice(0, 10)
console.log(`RIPE NCC IPv4 transfer log: ${rows.length} entries, newest ${last}`)
// 1. Liquidity: market (POLICY) transfers by block size, 2025 vs 2026 to date
const year = (r, y) => new Date(r.ts).getUTCFullYear() === y
const stats = y => {
const s = {}
for (const r of rows.filter(r => r.transferType === 'POLICY' && year(r, y)))
for (const b of r.blocks) {
const k = bucket(size(b)), o = (s[k] ??= { n: 0, ips: 0, temp: 0 })
o.n++; o.ips += size(b); if (r.transferStatus === 'TEMPORARY') o.temp++
}
return s
}
const s25 = stats(2025), s26 = stats(2026)
console.log('\nblock size | 2025 blocks | 2026 blocks (to ' + last + ') | 2026 addresses | temporary')
for (const k of ['/24', '/23-/22', '/21-/20', '/19-/17', '/16+'])
console.log(`${k.padEnd(10)} | ${String(s25[k]?.n ?? 0).padStart(11)} | ${String(s26[k]?.n ?? 0).padStart(24)} | ${
(s26[k]?.ips ?? 0).toLocaleString('en-US').padStart(14)} | ${String(s26[k]?.temp ?? 0).padStart(9)}`)
// 2. Holding period: the same block sold on again as a whole (permanent market transfers)
const seen = new Map(), holds = []
for (const r of rows.filter(r => r.transferType === 'POLICY' && r.transferStatus === 'PERMANENT').sort((a, b) => a.ts - b.ts))
for (const b of r.blocks) {
if (seen.has(b)) holds.push((r.ts - seen.get(b)) / 864e5)
seen.set(b, r.ts)
}
holds.sort((a, b) => a - b)
const med = holds[Math.floor(holds.length / 2)]
console.log(`\nblocks sold on again whole: ${holds.length} of ${seen.size} (${(100 * holds.length / seen.size).toFixed(1)}%)`)
console.log(`median time between the two sales: ${(med / 365.25).toFixed(1)} years; within 24 months: ${holds.filter(d => d < 730).length}`)
// 3. Net lease yield per year on the purchase price, by registry and occupancy
const usd = v => (v < 0 ? '-$' : '$') + Math.abs(Math.round(v)).toLocaleString('en-US')
console.log(`\nEUR 1 = $${usdPerEur} (ECB, ${ecbDate}); RIPE LIR fee EUR ${RIPE_LIR_EUR} = ${usd(RIPE_LIR_EUR * usdPerEur)}`)
console.log('block | price | lease/yr | held in | fee/yr | net yield 100% | 70% let')
for (const p of [24, 22]) {
const n = 2 ** (32 - p), cost = n * BUY[p], gross = n * LEASE[p] * 12
const fees = { 'a new RIPE LIR': RIPE_LIR_EUR * usdPerEur, 'ARIN (3X/2X-Small)': ARIN_RSP[p], 'an existing LIR': 0 }
const y = (f, occ) => ((100 * (gross * occ - f) / cost).toFixed(1) + '%').padStart(occ === 1 ? 14 : 7)
for (const [k, f] of Object.entries(fees))
console.log(`/${p} | ${usd(cost).padStart(7)} | ${usd(gross).padStart(8)} | ${k.padEnd(20)} | ${usd(f).padStart(6)} | ${y(f, 1)} | ${y(f, 0.7)}`)
}
console.log('fees per year; lease = list average, before the lessor\'s abuse handling and any broker or platform cut')
bun ipv4_asset.js
Output, run on a DCXV Cloud server with Bun 1.4.4 on 2026-11-06 (RIPE log up to 2026-11-05):
RIPE NCC IPv4 transfer log: 43896 entries, newest 2026-11-05
block size | 2025 blocks | 2026 blocks (to 2026-11-05) | 2026 addresses | temporary
/24 | 1419 | 1010 | 258,560 | 43
/23-/22 | 1622 | 997 | 850,944 | 21
/21-/20 | 453 | 334 | 935,936 | 5
/19-/17 | 214 | 216 | 2,981,888 | 10
/16+ | 53 | 48 | 6,291,456 | 2
blocks sold on again whole: 5041 of 32361 (15.6%)
median time between the two sales: 3.6 years; within 24 months: 0
EUR 1 = $1.1224 (ECB, 2026-11-05); RIPE LIR fee EUR 1894 = $2,126
block | price | lease/yr | held in | fee/yr | net yield 100% | 70% let
/24 | $6,464 | $1,628 | a new RIPE LIR | $2,126 | -7.7% | -15.3%
/24 | $6,464 | $1,628 | ARIN (3X/2X-Small) | $289 | 20.7% | 13.2%
/24 | $6,464 | $1,628 | an existing LIR | $0 | 25.2% | 17.6%
/22 | $19,456 | $7,127 | a new RIPE LIR | $2,126 | 25.7% | 14.7%
/22 | $19,456 | $7,127 | ARIN (3X/2X-Small) | $578 | 33.7% | 22.7%
/22 | $19,456 | $7,127 | an existing LIR | $0 | 36.6% | 25.6%
fees per year; lease = list average, before the lessor's abuse handling and any broker or platform cut
What the numbers say
- The registry fee decides small blocks. A /24 earns $1,628 a year at list rates. A new RIPE LIR costs $2,126, so the block loses money even when fully let. The same /24 under ARIN keeps 20.7%, and added to an LIR you already run it keeps the full 25.2%. A /22 carries a RIPE LIR on its own: 25.7% net when fully let.
- Occupancy is the real risk to the yield. At 70% let, the /24 in an existing LIR falls from 25.2% to 17.6%, and the /22 in a new LIR from 25.7% to 14.7%. A month between tenants is a month of fees without rent.
- Small blocks are the liquid ones. From 1 January to 5 November 2026 the RIPE log shows 1,010 /24 blocks and 997 blocks of /23 or /22 changing hands, against 48 blocks of /16 or larger. Fewer /24s moved than in the whole of 2025 (1,419), while /19 to /17 blocks have already passed their 2025 count (216 vs 214). A transfer can carry several blocks; the script counts each one.
- Holders keep blocks for years. Of 32,361 blocks sold whole on the RIPE market, 5,041 (15.6%) were later sold again as the same block, a median 3.6 years after the first sale, and none within 24 months: the RIPE hold after a transfer shows in the data. Plan the exit at least two years out.
- The register does not show most leases. Only 81 of the 2,605 blocks moved in 2026 were RIPE temporary transfers. Most leases keep the lessor as the registered holder, so nobody can count from the register how many blocks are let.
The risks the yield does not show
| Risk | What it does to the asset | What to check |
|---|---|---|
| Price | The 2025 correction hit large blocks hardest | Buy at a dated median, not a list price |
| IPv6 | Slowly cuts lease demand; dual stack keeps IPv4 in use | Who your lessees are and why they need IPv4 |
| Registry fees | One RIPE fee per LIR, whatever it holds | Your fee per block from 2027 |
| Reputation | One bad lessee can get the block blacklisted | History before buying, abuse terms in the lease |
| Exit | 24-month hold in RIPE, a broker fee on the sale | Your exit size and the date you are free to sell |
Run the checks in our IPv4 blacklist guide before you buy: a block that is listed on day one earns nothing until it is clean. If you would rather use the addresses yourself, IPv4 lease vs buy does the same arithmetic from the tenant's side.
Entry and exit with DCXV
An asset is only as good as its exit. DCXV's broker fee is paid on the sale side: EUR 2.00 per IP for a /24 or /23, EUR 1.00 for /22 to /19 and EUR 0.50 for /18 to /14; the buyer pays the escrow charge. For the /24 above that is EUR 512, about $575 or 8.9% of its November 2026 price (ECB rate of 2026-11-05); for the /22 it is EUR 1,024, about 5.9%. We broker purchases, leases and sales in the RIPE, ARIN and APNIC regions and can let a block you hold to hosting and cloud tenants. Send the block size and registry to the IPv4 desk or to ipv4@dcxv.com.
