Skip to main content

Syndicate Portfolio

Read the syndicate's portfolio as point-in-time JSON: a summary of totals, and a paginated list of positions — one per deal, summed across everyone holding its securities. Requires the read:syndicates scope.

Beta

These endpoints are in beta. Field additions are possible; breaking changes will follow the deprecation policy.

Access​

Works with either token type:

  • Syndicate-owned tokens — the token must belong to the syndicate in the URL.
  • User-owned tokens — the user needs management authority (creator or manager) or an approved membership. Pending, rejected, or exiled roles get 403, even where other syndicate endpoints allow them to view.

Responses contain aggregate figures only — no member names, emails, or per-member amounts. For member-level data use the members endpoints.

Deal-scoped, not member-scoped

Positions cover everyone holding securities from the syndicate's deals, not just current members. If securities changed hands after close, totals and investor_count include buyers who never joined the syndicate, and a member who sold their entire stake still appears in the aggregates.

Conventions​

Monetary values

On the portfolio endpoints, monetary values are integer cents (4000000 = $40,000.00) in the currency next to them (lower-case ISO 4217: usd, or eur for an ECSP round). Per-share prices and return multiples are decimal strings ("0.9936", "1.38").

Summary totals are in one currency only — usd when any deal is in USD, otherwise the syndicate's only currency. Deals in any other currency are named in other_currencies and left out of the four total_*_cents figures (they still count in deal_counts); read them, each with its own currency, from the positions endpoint.

Portfolio values are recalculated periodically rather than on each request, so recent investments and valuation changes can take a few minutes to appear. as_of is the timestamp of the oldest calculation included in the response.

Get portfolio summary​

GET /syndicates/:id/portfolio
curl "https://api.wefunder.com/syndicates/syn_aB3xQ9k2vF8mNp1zT5wY7Qc4/portfolio" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
{
"data": {
"type": "syndicate_portfolio_summary",
"attributes": {
"currency": "usd",
"other_currencies": [],
"total_cost_basis_cents": 4000000,
"total_current_value_cents": 5520000,
"total_unrealized_gain_cents": 1520000,
"total_realized_gain_cents": 0,
"return_multiple": "1.38",
"deal_counts": { "active": 1, "exited": 0, "sold": 0, "failed": 0 },
"investor_count": 3,
"as_of": "2026-07-27T14:02:11Z"
}
}
}

The summary accepts the same status and company query parameters as the positions endpoint, to total a slice of the portfolio — for example, ?status=exited for exited deals only.

List portfolio positions​

GET /syndicates/:id/portfolio/positions

One position per deal (fundraise), newest first, cursor-paginated.

curl "https://api.wefunder.com/syndicates/syn_aB3xQ9k2vF8mNp1zT5wY7Qc4/portfolio/positions?per_page=25" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
{
"data": [
{
"id": "ofr_kUlkWcWVugo7cSLD4RdD6gdK",
"type": "syndicate_portfolio_position",
"attributes": {
"offering_id": "ofr_kUlkWcWVugo7cSLD4RdD6gdK",
"company": { "id": "co_siInncsiLN5KkUAXVRTpqMBi", "name": "S24 Orange Fund", "slug": "s24-orange-fund", "url": "https://wefunder.com/s24-orange-fund" },
"asset_type": "fund",
"security": { "type": "fund", "label": "Fund" },
"status": "active",
"exit_reason": null,
"exited_on": null,
"invested_at": "2025-03-14T18:22:00Z",
"currency": "usd",
"cost_basis_cents": 4000000,
"current_value_cents": 5520000,
"unrealized_gain_cents": 1520000,
"realized_gain_cents": 0,
"return_multiple": "1.38",
"shares_held": "55555.55",
"current_share_price": "0.9936",
"investor_count": 3,
"securities": [
{
"security": { "type": "fund", "label": "Fund" },
"early_bird": false,
"terms": {
"currency": "usd",
"share_price": "0.72",
"note_cap_cents": null,
"uncapped": null,
"note_discount": null,
"premoney_valuation_cents": null
},
"cost_basis_cents": 4000000,
"current_value_cents": 5520000,
"unrealized_gain_cents": 1520000,
"realized_gain_cents": 0,
"shares_held": "55555.55",
"current_share_price": "0.9936",
"invested_at": "2025-03-14T18:22:00Z",
"investor_count": 3
}
],
"holdings": [
{ "company": { "id": "co_8kQzXw2mNv6TfR9pLbYc4dHe", "name": "Anthrogen", "slug": "anthrogen", "url": "https://wefunder.com/anthrogen" }, "status": "active" },
{ "company": { "id": "co_P3mVs7jWqK1xTn5RgZa8uFyB", "name": "Cartage AI, Inc.", "slug": null, "url": null }, "status": "active" }
],
"as_of": "2026-07-27T14:02:11Z"
}
}
],
"meta": { "has_more": false, "page_count": 1 }
}

Query parameters​

ParameterTypeDescription
cursorintegernext_cursor from the previous page's meta. Omit for the first page.
per_pageintegerPage size, 1–100. Defaults to 25.
statusstringFilter by active, exited, sold, or failed.
companystringFilter to one company by its id (co_...). Unknown ids return 404.

Reading securities​

Each entry is one security offering within the deal — an early bird tier or the regular terms — with its own issue terms, amounts, and investor_count. Most deals have a single entry; a deal that sold multiple tiers has one per tier, and occasionally a round has more than one offering record with identical terms. Entries aggregate across all holders.

Reading holdings​

For fund and SPV deals (asset_type: "fund"), holdings lists the companies the vehicle invested in — one entry per company, with the status of the fund's most recent investment in it.

Empty holdings on some vehicles

Some vehicles, especially older single-asset SPVs, have no recorded holdings and return an empty array. These are typically named after their target company (a SpaceX SPV appears as "SpaceX"), so the position itself identifies the investment.

A note on exit_reason​

exit_reason says why a position ended (ipo, acquisition, buyback, failed, winding_down). It is set only for exited and failed deals — a sold deal ended with the transfer itself — and some older positions have no recorded ending. ipo means the company went public — it does not mean proceeds have been distributed. realized_gain_cents reflects actual distributions. exited_on carries the date the deal ended, and is null for older exits recorded before Wefunder kept exit dates.

company.url (on the deal and on each holding) is the company's page on wefunder.com, the link target the attribution rule asks for. current_value_cents equals cost_basis_cents until a later priced round, a recorded valuation mark, or an exit marks the deal.

Was this page helpful?