IPv4 Market Report October 2026: Prices, Transfers, Queue
The month in one paragraph (checked 2026-11-09). October 2026 was a busy month for deals and a quiet one for address volume. The RIPE NCC log shows 253 market transfers, level with September (237) and October 2025 (252), but they moved only 342,528 addresses, less than half of September's 779,008: no /16 changed hands. Prices firmed slightly: ip4.market's monthly median across all sizes went from $20.00 in September to $22.00 in October, and its 30-day /24 median was $25.34 per IP on 26 sales (index updated 2026-11-02). The RIPE waiting list grew by 27 LIRs to 820. These are dated observations from public sources; for a quote on a specific block see /ipv4/pricing. The previous edition is the July 2026 report.
Checked on 2026-11-09. Data: RIPE NCC transfer table and ARIN transfer log (both modified 2026-11-09), RIPE NCC waiting-list
stats.json. Prices: ip4.market IPv4 Price Index (updated 2026-11-02), IPv4Center lease page (read 2026-11-09). Policy: RIPE NCC Member Update October 2026, GM October 2026 results, ARIN 58 Day 1 recap.
October in the registry logs: a script you can rerun
Registries publish every transfer, so a month of the market can be counted rather than guessed. The script below reads the RIPE NCC transfer table, ARIN's transfer log and the RIPE waiting-list snapshots, and compares the chosen month with the month before and the same month a year earlier. A "market transfer" here is a RIPE entry of type POLICY (a sale or a lease between members, not a merger) or an ARIN RESOURCE_TRANSFER with IPv4 in it. Bun or Node 18+, no dependencies. Save it as ipv4_month.js:
// ipv4_month.js - one month of the IPv4 market from public registry logs:
// RIPE NCC transfers by block size and country, ARIN transfers and inter-RIR flows, RIPE waiting list.
// Usage: bun ipv4_month.js 2026-10 (Bun or Node 18+, no dependencies)
const M = process.argv[2] ?? '2026-10'
const shift = (m, d) => { const [y, n] = m.split('-').map(Number), t = new Date(Date.UTC(y, n - 1 + d, 1)); return t.toISOString().slice(0, 7) }
const MONTHS = [shift(M, -12), shift(M, -1), M]
const get = async u => { const r = await fetch(u); return [await r.json(), r.headers.get('last-modified')] }
const [ripe, rMod] = await get('https://www-static.ripe.net/dynamic/table-of-transfers/ipv4/transfers-allocations.json')
const [arin, aMod] = await get('https://ftp.arin.net/pub/stats/arin/transfers/transfers_latest.json')
const [wl] = await get('https://www-static.ripe.net/dynamic/ipv4-waiting-list/stats.json')
console.log(`RIPE log modified ${rMod}\nARIN log modified ${aMod}`)
// RIPE NCC: date is DD/MM/YYYY, blocks are CIDR or "a.b.c.d - e.f.g.h" ranges
const ip = s => s.trim().split('.').reduce((a, o) => a * 256 + +o, 0)
const size = b => b.includes('/') ? 2 ** (32 - +b.split('/')[1]) : ip(b.split('-')[1]) - ip(b.split('-')[0]) + 1
const ym = d => `${d.slice(6, 10)}-${d.slice(3, 5)}`
const bucket = n => n <= 256 ? '/24' : n <= 1024 ? '/23-/22' : n <= 4096 ? '/21-/20' : '/19+'
const B = ['/24', '/23-/22', '/21-/20', '/19+']
const ripeMonth = m => {
const s = { deals: 0, ips: 0, temp: 0, ma: 0, maIps: 0, cross: 0, by: {}, to: {} }
for (const t of ripe.transfers.filter(t => ym(t.date) === m)) {
if (t.transferType !== 'POLICY') { s.ma++; for (const b of t.transferred_blocks.split(',')) s.maIps += size(b); continue }
s.deals++
if (t.transferStatus === 'TEMPORARY') s.temp++
if (t.from_country_code && t.to_country_code && t.from_country_code !== t.to_country_code) s.cross++
for (const b of t.transferred_blocks.split(',')) {
const n = size(b)
s.ips += n
s.by[bucket(n)] = (s.by[bucket(n)] ?? 0) + 1
if (t.to_country_code) s.to[t.to_country_code] = (s.to[t.to_country_code] ?? 0) + n
}
}
return s
}
const R = MONTHS.map(ripeMonth)
const row = (k, f) => console.log(k.padEnd(26) + R.map(s => String(f(s)).padStart(10)).join(''))
console.log(`\nRIPE NCC market transfers ${MONTHS.map(m => m.padStart(10)).join('')}`)
row('transfers', s => s.deals)
for (const b of B) row(` blocks ${b}`, s => s.by[b] ?? 0)
row('addresses', s => s.ips.toLocaleString('en-US'))
row('temporary (leases)', s => s.temp)
row('cross-border', s => `${Math.round(100 * s.cross / s.deals)}%`)
row('mergers / acquisitions', s => s.ma)
row(' their addresses', s => s.maIps.toLocaleString('en-US'))
const top = Object.entries(R[2].to).sort((a, b) => b[1] - a[1]).slice(0, 5)
console.log(`top recipient countries ${M}: ${top.map(([c, n]) => `${c} ${n.toLocaleString('en-US')}`).join(', ')}`)
// ARIN: zero-padded octets, IPv6-only entries skipped; market transfers only (no mergers)
const aIps = t => (t.ip4nets?.transfer_set ?? []).reduce((s, n) => s + ip(n.end_address) - ip(n.start_address) + 1, 0)
console.log(`\nARIN market transfers ${MONTHS.map(m => m.padStart(10)).join('')}`)
const A = MONTHS.map(m => arin.transfers.filter(t => t.type === 'RESOURCE_TRANSFER' && t.transfer_date.startsWith(m) && aIps(t)))
const arow = (k, f) => console.log(k.padEnd(26) + A.map(l => String(f(l)).padStart(10)).join(''))
arow('inside ARIN', l => l.filter(t => t.source_rir === 'ARIN' && t.recipient_rir === 'ARIN').length)
arow('ARIN -> RIPE NCC', l => l.filter(t => t.source_rir === 'ARIN' && t.recipient_rir === 'RIPE NCC').length)
arow('ARIN -> APNIC', l => l.filter(t => t.source_rir === 'ARIN' && t.recipient_rir === 'APNIC').length)
arow('into ARIN from others', l => l.filter(t => t.source_rir !== 'ARIN' && t.recipient_rir === 'ARIN').length)
arow('addresses', l => l.reduce((s, t) => s + aIps(t), 0).toLocaleString('en-US'))
// RIPE NCC IPv4 waiting list: one snapshot per day
const day = d => wl[d] ? `${wl[d].length} LIRs, front ${wl[d].first_position_days} days` : 'no snapshot'
const first = `${M}-01`, next = `${shift(M, 1)}-01`
console.log(`\nRIPE waiting list ${first}: ${day(first)}\nRIPE waiting list ${next}: ${day(next)}`)
bun ipv4_month.js 2026-10
Output, run on a DCXV Cloud server with Bun 1.4.4 on 2026-11-09:
RIPE log modified Mon, 09 Nov 2026 05:00:03 GMT
ARIN log modified Mon, 09 Nov 2026 04:59:14 GMT
RIPE NCC market transfers 2025-10 2026-09 2026-10
transfers 252 237 253
blocks /24 89 83 78
blocks /23-/22 119 108 123
blocks /21-/20 40 29 41
blocks /19+ 14 24 12
addresses 805,120 779,008 342,528
temporary (leases) 1 0 7
cross-border 46% 56% 58%
mergers / acquisitions 92 70 367
their addresses 1,344,000 129,792 1,065,728
top recipient countries 2026-10: GB 82,176, NO 45,056, DE 34,304, RU 32,512, ES 20,992
ARIN market transfers 2025-10 2026-09 2026-10
inside ARIN 62 70 76
ARIN -> RIPE NCC 45 105 52
ARIN -> APNIC 6 18 9
into ARIN from others 17 7 4
addresses 1,594,880 1,355,776 875,264
RIPE waiting list 2026-10-01: 793 LIRs, front 485 days
RIPE waiting list 2026-11-01: 820 LIRs, front 497 days
How to read it. Deal count held, block size fell. 253 RIPE market transfers is a normal month, but the big blocks were missing: 12 blocks of /19 or larger against 24 in September, when several /16s moved (Orange's 90.98.0.0/16 to Fastly, Vodafone ONO's 62.83.0.0/16 to netcup, two /16s among seven blocks from FREENET JSC to FARLEP-INVEST). The /23 to /22 band was the busiest at 123 blocks. Mergers spiked: 367 merger or acquisition entries, and 325 of them come from three consolidations in the log, two Hungarian operators' space moving to 2Connect and JSC Avantel's to ER-Telecom Holding. They are corporate moves, not sales, so they say nothing about price. Temporary transfers showed up: 7 of them, all on 5 October from one Chinese holder to one German company; a temporary transfer has an end date, which is how a lease looks in the registry. 58% of market transfers crossed a border, up from 46% a year earlier; the UK, Norway and Germany received the most addresses. On the ARIN side, transfers to the RIPE NCC fell back to 52 after a 105-transfer September; the flow and its rules are in our ARIN to RIPE transfer guide.
The RIPE NCC's own October Member Update reported 2,173,440 addresses transferred in September. That figure counts more kinds of transfer than our POLICY-only filter (908,800 with mergers); we did not reconcile the two, so compare like with like.
Prices: the ip4.market index for October
| Block | 30-day median per IP | Sales | 90-day median per IP | Sales |
|---|---|---|---|---|
| /24 (256 IPs) | $25.34 | 26 | $25.25 | 79 |
| /23 (512 IPs) | $21.48 | 11 | $21.00 | 44 |
| /22 (1,024 IPs) | $20.00 | 13 | $19.00 | 49 |
| /21 (2,048 IPs) | $16.98 | 4 | $17.00 | 26 |
| /20 (4,096 IPs) | $15.38 | 2 | $15.97 | 18 |
Source: ip4.market IPv4 Price Index, updated 2026-11-02, read 2026-11-09 (666 reported sales since 2026-03-11). The 30-day all-size median was $21.75 on 70 sales; the monthly all-size median ran $20.00 in June, $19.00 in July and August, $20.00 in September and $22.00 in October. Read the small-sample rows with care: two /20 sales are not a price. The spread by size is the familiar one, about $25 per IP for a /24 and $15 to $16 for a /20 in the 90 days to 2026-11-02, which is why buyers of a /22 or larger should price per IP, not per block. Where the market came from this year is in the H1 2026 recovery; always check a quote on /ipv4/pricing.
Leasing. IPv4Center's lease page listed a /24 at $0.43 to $0.59 per IP a month and a /22 at $0.39 to $0.98 (read 2026-11-09, no date on the page), and ip4.market quotes EUR 0.50 per IP a month as its lease reference. At $25.34 to buy and about $0.50 a month to lease, buying a /24 pays back in roughly four years of rent before fees; the full arithmetic, registry fees included, is in IPv4 lease vs buy and IPv4 as an investment.
Policy and registry news in October
- RIPE NCC General Meeting, 28 to 30 October. 1,102 votes; both resolutions passed: any 2026 surplus goes to reserves (a deficit would be covered by members in 2027), and the Executive Board's amendments to the Articles of Association. No change to the 2027 charging scheme: EUR 1,894 per LIR account from January, sign-up EUR 1,000, no transfer fee (RIPE charging scheme 2027).
- No new LIR accounts for existing members. The restriction in force since 2026-09-29 is still described as temporary, pending policy discussion; a new member can still join (opening a RIPE LIR in 2026).
- Close by 31 December. The RIPE NCC asks members to file LIR closure requests before 31 December 2026 to avoid the 2027 invoice. A holder who sells a whole allocation and has no other use for the account should plan the transfer and the closure together.
- Address Policy. Proposal 2026-01 (first AS number without a needs assessment) is in the Review Phase, comments before 10 November; 2026-03 aligns IPv6 audit text with the IPv4 policies.
- ARIN 58, Miami, 22 to 23 October. The policy implementation report raised the 12-month rule: a recipient under NRPM 8.3 or 8.4 cannot transfer the space out again for 12 months, but the recipient sections do not say so, and some recipients did not know. Some attendees asked whether the wait should go altogether. Draft ARIN-2025-3 would lower the out-of-region threshold from a /22 to a /24. No outcome yet. The ARIN Board approved a 5% increase in registry service fees for 2027.
What to watch in November
- Whether the October price uptick holds. The 30-day all-size median of $21.75 sits between September's $20.00 and October's $22.00; a second month at $22 would confirm it.
- Large blocks. October lacked /16 sales. If they return in November, address volume will jump while deal count stays flat, as in September.
- The waiting list. 830 LIRs on 2026-11-09 and the oldest request 501 days old. The queue is shorter than a year ago (872 on 2025-10-31) but the front waits about as long; the cost of waiting against buying is in RIPE waiting list vs buying a /24.
- Year-end transfers. December 2025 had 673 RIPE market transfers, the busiest month of the last two years. The log does not say why; a year-end deadline (budgets, the next annual fee) is the likely reason. If yours is a December deal, start the transfer in November.
Buying, selling or leasing before the year-end? DCXV is a RIPE NCC member (AS204057) and brokers transfers in all regions; see /ipv4/ripe for registry notes, talk to the IPv4 desk or email ipv4@dcxv.com.
