ParseForge Scrapers

CalPERS Private Equity Fund Returns Scraper

parseforge/public-pension-pe-returns-scraper

Lead generationAutomation

Scrape CalPERS private equity and private debt fund performance: vintage, commitments, cash flows, net IRR and multiple, with DPI and TVPI computed.

Run this scraper See the API call
Total runs
12
Bookmarked
0
Last modified
7 days ago

This scraper was last updated on .

What does the CalPERS Private Equity Fund Returns Scraper return?

ParseForge

CalPERS Private Equity Fund Returns Scraper: IRR, TVPI

Scrape all 466 CalPERS private equity funds and 64 private debt funds, fund by fund, with vintage year, capital committed, cash in, cash out, net IRR and investment multiple. Every row also carries DPI, TVPI, RVPI and unfunded commitment, which CalPERS does not publish and this Actor computes from the cash flows. No login or API key. Export to CSV, JSON, Excel, or XML.

CalPERS is the largest public pension in the United States and it publishes fund level performance as a plain HTML table that nobody can filter, sort by vintage, or export. This Actor reads that table, filters it on the raw record, computes the multiples an LP actually uses, and adds two roll-ups: one row per manager and one row per vintage year.

Who uses it What they scrape fund performance for
Limited partners Benchmarking a GP against every other fund of the same vintage
Secondaries buyers Finding funds with high residual value and a long call history
Fund of funds and consultants Building a manager track record from a public source
Investor relations at GPs Seeing exactly what a public LP discloses about their fund
Journalists and researchers Eighteen years of public pension private markets returns

What it does

This Actor collects the CalPERS private equity and private debt performance tables and returns each fund as a flat row. Every row carries:

  • ๐Ÿงพ Fund core: fund name, programme, vintage year, fund age, capital committed, cash in, cash out, cash out plus remaining value.
  • ๐Ÿ“ˆ Published returns: net IRR and investment multiple, with a flag for the funds CalPERS marks as too young to measure.
  • ๐Ÿงฎ Computed multiples: DPI, TVPI, RVPI, remaining value and net gain, from the published cash flows.
  • ๐Ÿ’ฐ Commitment math: unfunded commitment, called percentage, distributed percentage and a fully called flag.
  • ๐Ÿข Manager parse: manager, fund family and fund sequence number, so Fund VII lines up with Fund VI.
  • ๐Ÿ“Š Vintage benchmark: the median net IRR of the fund's vintage, the gap against it, and whether the fund beats it.

Results export to CSV, JSON, Excel, or XML, or stream from the API.

What you can do with public pension PE data

๐Ÿ“ Benchmark a manager against its vintage.

Turn on the vintage benchmark and every fund row carries the median net IRR of its vintage year and the distance to it. That is the comparison an investment committee asks for, in one column.

๐Ÿ”Ž Screen for secondaries.

Residual value to paid-in, remaining value in dollars and the called percentage are all on the row. A filter on vintage plus RVPI is a shortlist of positions that still have value left to run.

๐Ÿ—๏ธ Build a GP track record.

The manager summary rolls every fund of a manager into one row: fund count, first and latest vintage, committed capital, commitment weighted net IRR, DPI and TVPI.

๐Ÿ“‰ Study a bad vintage.

The vintage summary gives you fund count, committed capital, TVPI and the median, best and worst IRR of every year, which is the shape of a cycle in one table.

Why choose this scraper

What you get
The full universe 466 private equity funds and 64 private debt funds, not a sample
Multiples CalPERS omits DPI, TVPI and RVPI computed from the published cash flows
Two roll-ups One row per manager and one row per vintage year, computed across the whole table
Honest sentinels Funds CalPERS marks N/M are flagged, not silently turned into zero
Filters before billing Vintage, committed capital, IRR range, fund name and manager run on the raw record
No key, no login The source is a public page, so there is nothing to register

How it compares

There is no other Apify Actor that reads public pension fund level performance. The commercial alternatives are Preqin, PitchBook and Pregin-style databases, which license the same public disclosures back to you inside an annual contract. The trade off is coverage: they aggregate hundreds of LPs, this Actor reads one, and it reads it completely and for a few dollars a run.

This Actor Preqin and PitchBook Reading the page yourself
Fund level IRR and multiple Yes Yes Yes
DPI, TVPI, RVPI Computed Yes No
Vintage benchmark Computed Yes No
LPs covered CalPERS Hundreds One page at a time
Cost A few dollars per run Annual licence Free and unusable at scale

What a fund row looks like

{
  "rowType": "fund",
  "pension": "CalPERS",
  "program": "Private Equity Program",
  "fundName": "57 Stars Global Opportunities Fund 2 (CalPERS), LLC",
  "vintageYear": 2009,
  "fundAgeYears": 17,
  "capitalCommittedUsd": 500000000,
  "cashInUsd": 530736052,
  "cashOutUsd": 539723168,
  "cashOutAndRemainingValueUsd": 735901763,
  "netIrrPct": 5.3,
  "investmentMultiple": 1.4,
  "returnsMeasurable": "Yes",
  "reportAsOf": "December 31, 2025",
  "dpi": 1.017,
  "tvpi": 1.387,
  "rvpi": 0.37,
  "remainingValueUsd": 196178595,
  "netGainUsd": 205165711,
  "unfundedCommitmentUsd": 0,
  "calledPct": 106.15,
  "distributedPctOfCommitment": 107.94,
  "fullyCalled": "Yes",
  "managerName": "57 Stars Global Opportunities",
  "fundFamily": "57 Stars Global Opportunities Fund 2 (CalPERS)",
  "vintageMedianNetIrrPct": 5.3,
  "netIrrVsVintageMedianPct": 0,
  "beatsVintageMedian": "Yes",
  "sourceUrl": "https://www.calpers.ca.gov/investments/about-investment-office/investment-organization/pep-fund-performance",
  "scrapedAt": "2026-08-28T20:11:42.774Z"
}

Configure the run

Pick what you want in Data to scrape, then filter. Filters run on the full fund record before the row is built, so you can screen by net IRR without buying the benchmark block. When you select several datasets the row cap is split between them.

Every fund, with the computed multiples:

{
  "datasets": ["privateEquity", "privateDebt"],
  "includeMultiples": true,
  "includeCommitmentMath": true,
  "maxItems": 600
}

Post 2015 vintages that beat 15% net IRR:

{
  "datasets": ["privateEquity"],
  "minVintageYear": 2015,
  "minNetIrr": 15,
  "onlyMeasurableReturns": true,
  "includeVintageBenchmark": true,
  "maxItems": 200
}

A manager track record and the vintage context around it:

{
  "datasets": ["managerSummary", "vintageSummary"],
  "managerContains": "Blackstone",
  "maxItems": 100
}

Free users

Free Apify accounts get a 10 row preview per run, which is enough to check the schema and the field names. Upgrade to a paid plan to lift the cap to a million rows per run.

Run it

  1. Create a free Apify account. New accounts get $5 in free credit.
  2. Open the Actor, leave the default input, and press Start to see ten funds.
  3. Add your filters, tick the blocks you want, then raise Max Items to 600 for the full universe.
  4. Export the dataset to CSV, JSON, Excel or XML, or read it from the API.

Use with AI agents (MCP)

claude mcp add apify --transport sse https://mcp.apify.com/sse --header "Authorization: Bearer YOUR_APIFY_TOKEN"

Then ask in plain language:

  • "Which CalPERS private equity funds from 2018 or later beat a 20% net IRR?"
  • "Give me the manager summary for every GP with more than three CalPERS funds."
  • "What was the median net IRR of the 2019 vintage, and which funds beat it?"

Troubleshooting

Net IRR says Not Disclosed. CalPERS prints N/M for funds too young for a meaningful return, and for the entire private debt programme. The returnsMeasurable flag tells you which rows those are, and the multiples block still computes DPI and TVPI from the cash flows.

Fewer rows than I asked for. The whole universe is 530 funds. Above that, the only extra rows are the manager and vintage summaries.

A manager name looks wrong. The manager is parsed from the fund name, which is the only place it appears. Fund families with unusual naming can parse imperfectly; the raw fundName is always on the row.

The as-of date is missing on private debt rows. The private debt page does not carry an as-of line. The private equity page does, and it is on every private equity row.

No rows came back. A net IRR filter drops every fund CalPERS marks N/M, which is most recent vintages. Turn the IRR filter off to see them.

FAQ

Question Answer
Which pension is covered? CalPERS, the California Public Employees Retirement System, private equity and private debt programmes.
Will other pensions be added? They are on the roadmap. Most other large systems publish fund performance only as an annual PDF, which is a different build.
How current is the data? CalPERS refreshes the table quarterly. The row carries the as-of date it publishes, currently December 31, 2025.
What is DPI, TVPI and RVPI? Distributed, total value and residual value over paid-in capital. This Actor computes all three from cash in, cash out and remaining value.
Why is IRR missing on private debt? CalPERS publishes the column but prints N/M for every private debt fund. Measured: zero percentage values in the whole table.
Can I filter by IRR without buying a block? Yes. Filters run on the raw record before projection.
Does it need a proxy? No. The source answers plain HTTP requests.
How fast is it? Measured at 921 rows in 11 seconds with a 158 MB peak.

Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

Disclaimer: this is an unofficial tool, not affiliated with CalPERS. It reads only the performance tables CalPERS publishes without a login. The data is about funds and firms, not individuals, so it carries no personal data under GDPR, CCPA or PIPL.

What input does the CalPERS Private Equity Fund Returns Scraper accept?

FieldTypeWhat it doesDefault
datasets array Fund level rows from the CalPERS private equity and private debt programs, plus two roll-ups computed from them: one row per manager and one row per vintage year. ["privateEquity"]
maxItems integer Free users: limited to 10 items (preview). Paid users: up to 1,000,000. 10
minVintageYear integer Keep only funds whose vintage year is this or later, for example 2015. not set
maxVintageYear integer Keep only funds whose vintage year is this or earlier. not set
minCapitalCommitted number Keep only funds with at least this much committed, in dollars. Decimals are honoured. not set
minNetIrr number Keep only funds at or above this net IRR, in percent. Funds too young to have a meaningful return are dropped by this filter. not set
maxNetIrr number Keep only funds at or below this net IRR, in percent. Use a negative number to find the losers. not set
fundNameContains string Case-insensitive substring on the fund name, for example 'Blackstone' or 'Growth'. not set
managerContains string Case-insensitive substring on the manager name parsed from the fund name, for example 'Carlyle'. not set
onlyMeasurableReturns boolean Drop funds where CalPERS prints N/M because the fund is too young for a meaningful IRR. false
includeMultiples boolean Adds distributed to paid-in, total value to paid-in, residual value to paid-in, remaining value and net gain. CalPERS does not publish these; they are computed from the cash flows. false
includeCommitmentMath boolean Adds unfunded commitment, called percentage, distributed percentage of commitment and a fully called flag. false
includeManagerParse boolean Splits the fund name into manager, fund family and fund sequence number, so successive funds of the same family line up. false
includeVintageBenchmark boolean Adds the median net IRR of the fund's vintage year across the whole programme, the difference against it, and whether the fund beats it. false

How much does the CalPERS Private Equity Fund Returns Scraper cost?

from $8.90 per 1,000 results

Charged forWhat it isPrice each
Actor Start Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). $0.02
Performance table scanned Charged once per CalPERS performance page downloaded and parsed. One page holds the whole programme, so a full run scans at most two. $0.01
Private equity fund row Charged once per private equity fund written to your dataset: vintage year, capital committed, cash in, cash out, cash out plus remaining value, net IRR and investment multiple. $0.0089 to $0.01
Private debt fund row Charged once per private debt fund. CalPERS does not publish IRR or multiple for this programme, so those two columns carry a sentinel and the multiples block computes DPI and TVPI from the cash flows instead. $0.0089 to $0.01
Manager summary row Charged once per manager roll-up: fund count, first and latest vintage, committed capital, cash flows, commitment weighted net IRR, DPI and TVPI across all of that manager funds. $0.00712 to $0.008
Vintage summary row Charged once per vintage year roll-up: fund count, committed capital, TVPI and the median, best and worst net IRR of the year. $0.00712 to $0.008
DPI, TVPI and RVPI block Optional. Charged only on rows that received distributed to paid-in, total value to paid-in, residual value to paid-in, remaining value and net gain, all computed from the published cash flows. $0.00267 to $0.003
Commitment math block Optional. Charged only on rows that received unfunded commitment, called percentage, distributed percentage of commitment and the fully called flag. $0.00267 to $0.003
Manager parse block Optional. Charged only on rows that received the manager, fund family and fund sequence number parsed out of the fund name. $0.00178 to $0.002
Vintage benchmark block Optional. Charged only on rows that received the median net IRR of their vintage year, the difference against it and whether the fund beats it. $0.00267 to $0.003

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

How do I call the CalPERS Private Equity Fund Returns Scraper API?

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST ยท run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~public-pension-pe-returns-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "datasets": [
      "privateEquity"
    ],
    "maxItems": 10,
    "onlyMeasurableReturns": false,
    "includeMultiples": false,
    "includeCommitmentMath": false
  }'

What example inputs can I use?

Use these inputs to see how a run is configured.

input.json
{
  "datasets": [
    "privateEquity"
  ],
  "maxItems": 10,
  "onlyMeasurableReturns": false,
  "includeMultiples": false,
  "includeCommitmentMath": false
}

What do users say about the CalPERS Private Equity Fund Returns Scraper?

No reviews yet. Be the first.

How do I report an issue with the CalPERS Private Equity Fund Returns Scraper?

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

What related scrapers can I use?

Run CalPERS Private Equity Fund Returns Scraper on Apify All scrapers