Get startedDashboard

Index events

List every addition to and removal from the S&P 500, Nasdaq-100 and Dow Jones Industrial Average as dated events.

GET/v1/index/{index_name}/events
View llms.txt

GET /v1/index/{index_name}/events returns an index's membership changes as a dated log: one row per addition and one row per removal, with the member's entity_id, ticker and name, the event type and its effective date. Use it to answer "what joined or left the index, and when". For the members on a given date, use Index membership.

The response contains no money, share or percentage values. Dates are YYYY-MM-DD strings.

An addition's effective_date is the member's first day in the index; a removal's effective_date is its last day in the index. Both match the added_date and removed_date that Index membership reports for the same membership.

Each row states its own grain in member_grain, on the same terms as the roster: security rows name one share class, issuer rows name the company. Tickers and entities explains the two.

Parameters

index_namestrRequired

Path segment. sp500, djia or ndx100, or an alternative name listed on Index membership. Case-insensitive. Any other name returns 400.

startstrDefault: none; Free: one year before today

YYYY-MM-DD, a real calendar date. Earliest effective_date returned, inclusive. On Free, a start earlier than one year before today (UTC), or no start, is raised to that date and reported in meta.data_floor and the X-Data-Floor response header.

endstrDefault: none

YYYY-MM-DD, a real calendar date. Latest effective_date returned, inclusive. For djia and ndx100, an end after meta.coverage_end returns 400.

event_typestrDefault: both

added or removed, in lower case. Omit for both. Any other value returns 400.

limitintDefault: 1000

Rows per page, 1 to 1,000, on every plan.

offsetintDefault: 0

Rows to skip before the page starts. 0 or more.

Response

The body is {"data": [...], "meta": {...}}. Rows are ordered by effective_date, then additions before removals, then entity_name, then each member's own key.

Row fields

fieldtypeunitnullabledescription
entity_idint—yesShare-class id when member_grain is security; company id when it is issuer. Null for a member that is not linked to an entity.
tickerstr—yesTicker recorded for the membership, or else the ticker in force on effective_date. Null where no ticker is on record and on issuer rows.
entity_namestr—yesName recorded for the membership, or else the current name. Can be null for a member that is not linked to an entity.
indexstr—noSP500, DJIA or NDX100.
event_typestr—noadded or removed.
effective_datestrdatenoFirst day in the index for added; last day in the index for removed.
member_grainstr—nosecurity or issuer.
ticker_basisstr—nofirst_known when no ticker was in force on the date and ticker is the member's earliest ticker on record. Absent otherwise.

Meta

Response metadata explains knowledge_time, as_of and freshness.

fieldtypeunitnullabledescription
indexstr—noSP500, DJIA or NDX100.
event_coverage_startstrdatenoDate the index's record opens: 1925-12-31 for SP500, 1995-01-01 for NDX100, 1999-10-31 for DJIA.
entity_id_grainstr—nosecurity. Each row's own grain is in member_grain.
coverage_endstrdatenoLast date the index's record covers.
data_floorstrdateyesEarliest effective_date your plan can receive: one year before today on Free, null on paid plans.
countintrowsnoRows in this page.
totalintrowsnoEvents that match across all pages.
has_morebool—notrue while offset + count is less than total.
knowledge_timestrUTC timestampyesNewest knowledge time of the membership data.
as_ofstrdatenoEqual to end. Present only when end is passed.
freshnessarray—noOne index_membership entry; its through equals coverage_end.

Pagination

The endpoint pages by offset. Pass limit (up to 1,000) and offset; meta.has_more is true while rows remain and meta.total counts every matching event. The full SP500 log is more than 3,000 events, so page through it or narrow it with start, end and event_type. Pagination compares offset and cursor paging.

The last page of the 16 additions from 2026-01-01 to 2026-09-25, four per page:

Terminal
curl -s -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/sp500/events?start=2026-01-01&end=2026-09-25&event_type=added&limit=4&offset=12"
response.json
{
  "data": [
    {
      "entity_id": 10012107,
      "ticker": "RDDT",
      "entity_name": "Reddit",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-08-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10006277,
      "ticker": "BE",
      "entity_name": "Bloom Energy",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10004612,
      "ticker": "P",
      "entity_name": "Everpure",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10029052,
      "ticker": "ILMN",
      "entity_name": "Illumina, Inc.",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    }
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "coverage_end": "2026-09-29",
    "data_floor": null,
    "count": 4,
    "total": 16,
    "has_more": false,
    "as_of": "2026-09-25",
    ...
  }
}

Errors

statuserror codewhen it happenshow to fix
400bad_requestindex_name is not a served index or alternative name. The message lists the available names.Use sp500, djia, ndx100 or an alternative name.
400bad_requeststart is not a real calendar date in YYYY-MM-DD form.Pass a real date as YYYY-MM-DD.
400bad_requestend is not a real calendar date in YYYY-MM-DD form.Pass a real date as YYYY-MM-DD.
400bad_requestend is before start.Pass an end on or after start.
400bad_requestevent_type is not added or removed, including upper-case forms.Pass added or removed, or omit it.
400bad_requestdjia or ndx100 with an end after the index's coverage_end.Pass an end on or before coverage_end, or omit end.
400bad_requestlimit is not a whole number of 1 or more, or is more than 1,000.Pass a limit from 1 to 1,000.
400bad_requestoffset is negative or not a whole number.Pass 0 or a positive whole number.
401unauthorizedNo key, or a key that is not valid.Send X-API-Key: YOUR_API_KEY.
429see Rate limitsA request or row allowance is used up.Wait for the reset. A request-limit body gives the wait in retry_after_seconds; daily allowances reset at 00:00 UTC and hourly ones at the top of the UTC hour.

Unknown index (/v1/index/foo/events):

response.json
{"error": "bad_request", "code": "bad_request", "status": 400, "detail": "Unknown index: foo. Available: djia, ndx100, sp500"}

Malformed start (start=2024-1-5) and impossible end (end=2024-02-30):

response.json
{"error": "bad_request", "code": "bad_request", "status": 400, "detail": "Invalid start date format (YYYY-MM-DD)"}
response.json
{"error": "bad_request", "code": "bad_request", "status": 400, "detail": "Invalid end date: '2024-02-30' (expected a real YYYY-MM-DD date)"}

event_type=ADDED:

response.json
{"error": "bad_request", "code": "bad_request", "status": 400, "detail": "event_type must be added or removed"}

end past coverage_end (/v1/index/djia/events?end=2099-12-31). The date in detail is the index's coverage_end on the day of the request:

response.json
{"error": "bad_request", "code": "bad_request", "status": 400, "detail": "djia membership is recorded through 2026-10-07. Request a date on or before 2026-10-07."}

limit=0, limit=1001 and offset=-1:

response.json
{"error": "bad_request", "code": "bad_request", "status": 400, "detail": "limit must be a positive integer"}
response.json
{"error": "bad_request", "code": "bad_request", "status": 400, "detail": "limit max is 1000"}
response.json
{"error": "bad_request", "code": "bad_request", "status": 400, "detail": "offset must be a non-negative integer"}

No key:

response.json
{"error": "unauthorized", "code": "unauthorized", "status": 401, "detail": "No API key was sent. Pass your key in the X-API-Key header or the ?api_key= query parameter. Get one free at https://xfinlink.com/signup", "message": "No API key was sent. Pass your key in the X-API-Key header or the ?api_key= query parameter. Get one free at https://xfinlink.com/signup"}

Plan differences

A key is required on every plan. Paid plans receive every event back to the start of each index's record. Free receives the last year.

  • Free: start is raised to one year before today (UTC) when it is earlier or absent. The floor is reported in meta.data_floor and in the X-Data-Floor response header, and a start before it is named in warnings. end is not changed, so a window that ends before the floor returns no rows, with a warning that says so.
  • Pro: full history, meta.data_floor is null, no X-Data-Floor header.
  • Max: identical to Pro: full history, meta.data_floor null, no X-Data-Floor header.
  • Redistribution: identical to Pro: full history, meta.data_floor null, no X-Data-Floor header.
  • No key: 401.

Each request counts as one request against your plan's daily allowance, and limit goes up to 1,000 on every plan.

A request with no start, on Free:

Terminal
curl -s -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/sp500/events?limit=4"
headers
x-data-floor: 2025-09-27
response.json
{
  "data": [
    {
      "entity_id": 10013573,
      "ticker": "SOLS",
      "entity_name": "Solstice Advanced Materials",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2025-10-30",
      "member_grain": "security"
    },
    {
      "entity_id": 10029916,
      "ticker": "KMX",
      "entity_name": "CARMAX INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2025-10-30",
      "member_grain": "security"
    },
    ...
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "entity_id_grain": "security",
    "coverage_end": "2026-09-26",
    "data_floor": "2025-09-27",
    "count": 4,
    "total": 46,
    "has_more": true,
    ...
  }
}

The same request on Pro:

response.json
{
  "data": [
    {
      "entity_id": 10000636,
      "ticker": "BU",
      "entity_name": "KEYSPAN ENERGY CORP",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "1928-08-24",
      "member_grain": "security",
      "ticker_basis": "first_known"
    },
    {
      "entity_id": 10037376,
      "ticker": null,
      "entity_name": "BROOKLYN EDISON INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "1928-08-24",
      "member_grain": "security"
    },
    ...
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "entity_id_grain": "security",
    "coverage_end": "2026-09-26",
    "data_floor": null,
    "count": 4,
    "total": 3608,
    "has_more": true,
    ...
  }
}

The 2024 additions on Free, where the whole window ends before the floor:

Terminal
curl -s -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/sp500/events?start=2024-01-01&end=2024-12-31&event_type=added"
response.json
{
  "data": [],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "entity_id_grain": "security",
    "coverage_end": "2026-09-26",
    "data_floor": "2025-09-27",
    "count": 0,
    "total": 0,
    "has_more": false,
    "as_of": "2024-12-31",
    ...
  },
  "warnings": ["The Free plan covers the last year, from 2025-09-27. The requested window ends before that date, so it has no rows. Paid plans cover the full history: https://xfinlink.com/pricing"]
}

The same request on Pro returns 17 additions:

response.json
{
  "data": [
    {
      "entity_id": 10022537,
      "ticker": "DECK",
      "entity_name": "DECKERS OUTDOOR CORP",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2024-03-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10032096,
      "ticker": "SMCI",
      "entity_name": "SUPER MICRO COMPUTER INC",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2024-03-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10012108,
      "ticker": "SOLV",
      "entity_name": "SOLVENTUM CORP",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2024-04-01",
      "member_grain": "security"
    },
    {
      "entity_id": 10012109,
      "ticker": "GEV",
      "entity_name": "G E VERNOVA INC",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2024-04-02",
      "member_grain": "security"
    },
    {
      "entity_id": 10005291,
      "ticker": "VST",
      "entity_name": "VISTRA CORP",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2024-05-08",
      "member_grain": "security"
    },
    ...
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "coverage_end": "2026-09-26",
    "data_floor": null,
    "count": 17,
    "total": 17,
    "has_more": false,
    "as_of": "2024-12-31",
    ...
  }
}

Edge cases

Most examples in this section read dates more than 12 months back. Paid plans return these events; on Free, the same requests return only the events inside the one-year window described under Plan differences.

Additions paired with removals

An index change often removes one member and adds another. Removals carry the last day in and additions the first day in, so the two sides of one change can carry different dates. In the S&P 500 change of June 2024, Comerica, Illumina and Robert Half left with effective_date 2024-06-21 and CrowdStrike, GoDaddy and KKR joined on 2024-06-24. In September 2026, three members left with effective_date 2026-09-18 and three joined on 2026-09-21 (see Request examples).

Removals after a merger

When a member leaves because it merged, the event log records the removal, and Resolve records the corporate successor. Raytheon Company (RTN) left the S&P 500 with effective_date 2020-04-03, when Carrier and Otis joined:

Terminal
curl -s -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/sp500/events?start=2020-03-30&end=2020-04-06"
response.json
{
  "data": [
    {
      "entity_id": 10007353,
      "ticker": "CARR",
      "entity_name": "CARRIER GLOBAL CORP",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2020-04-03",
      "member_grain": "security"
    },
    {
      "entity_id": 10007354,
      "ticker": "OTIS",
      "entity_name": "OTIS WORLDWIDE CORP",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2020-04-03",
      "member_grain": "security"
    },
    {
      "entity_id": 10020888,
      "ticker": "M",
      "entity_name": "MACYS INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2020-04-03",
      "member_grain": "security"
    },
    {
      "entity_id": 10012171,
      "ticker": "RTN",
      "entity_name": "RAYTHEON CO",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2020-04-03",
      "member_grain": "security"
    }
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "coverage_end": "2026-09-26",
    "data_floor": null,
    "count": 4,
    "total": 4,
    "has_more": false,
    "as_of": "2020-04-06",
    ...
  }
}

/v1/resolve/RTN?date=2019-06-03&include=events lists R T X CORP (company entity_id 7749) as Raytheon's successor through a merger dated 2020-04-02.

Members that rejoin

A member can leave and rejoin, and each change is its own event with the same entity_id. Illumina (10029052) was removed with effective_date 2024-06-21 and added again on 2026-09-21:

Terminal
curl -s -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/sp500/events?start=2026-09-01&end=2026-12-31"
response.json
{
  "data": [
    {
      "entity_id": 10031004,
      "ticker": "BLDR",
      "entity_name": "BUILDERS FIRSTSOURCE INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10017044,
      "ticker": "TAP",
      "entity_name": "MOLSON COORS BEVERAGE CO",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10004997,
      "ticker": "TTD",
      "entity_name": "Trade Desk (The)",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10006277,
      "ticker": "BE",
      "entity_name": "Bloom Energy",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10004612,
      "ticker": "P",
      "entity_name": "Everpure",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10029052,
      "ticker": "ILMN",
      "entity_name": "Illumina, Inc.",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    }
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "coverage_end": "2026-09-26",
    "data_floor": null,
    "count": 6,
    "total": 6,
    "has_more": false,
    "as_of": "2026-12-31",
    ...
  }
}

Coverage start and the founding roster

Members already in the index when its record opens form the founding roster. Their entry is not an event, so additions start after event_coverage_start; removals are always returned. The first events of each index:

Terminal
curl -s -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/sp500/events?limit=3"
response.json
{
  "data": [
    {
      "entity_id": 10000636,
      "ticker": "BU",
      "entity_name": "KEYSPAN ENERGY CORP",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "1928-08-24",
      "member_grain": "security",
      "ticker_basis": "first_known"
    },
    {
      "entity_id": 10037376,
      "ticker": null,
      "entity_name": "BROOKLYN EDISON INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "1928-08-24",
      "member_grain": "security"
    },
    {
      "entity_id": 10037571,
      "ticker": null,
      "entity_name": "DODGE BROS INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "1928-11-23",
      "member_grain": "security"
    }
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "coverage_end": "2026-09-26",
    "data_floor": null,
    "count": 3,
    "total": 3608,
    "has_more": true,
    ...
  }
}

/v1/index/djia/events?limit=3:

response.json
{
  "data": [
    {
      "entity_id": 10003589,
      "ticker": "CHV",
      "entity_name": "CHEVRON CORP",
      "index": "DJIA",
      "event_type": "removed",
      "effective_date": "1999-10-31",
      "member_grain": "security"
    },
    {
      "entity_id": 10005058,
      "ticker": "GT",
      "entity_name": "GOODYEAR TIRE & RUBBER CO",
      "index": "DJIA",
      "event_type": "removed",
      "effective_date": "1999-10-31",
      "member_grain": "security"
    },
    {
      "entity_id": 10003399,
      "ticker": "S",
      "entity_name": "SEARS ROEBUCK & CO",
      "index": "DJIA",
      "event_type": "removed",
      "effective_date": "1999-10-31",
      "member_grain": "security"
    }
  ],
  "meta": {
    "index": "DJIA",
    "event_coverage_start": "1999-10-31",
    "coverage_end": "2026-09-26",
    "data_floor": null,
    "count": 3,
    "total": 56,
    "has_more": true,
    ...
  }
}

/v1/index/ndx100/events?limit=3:

response.json
{
  "data": [
    {
      "entity_id": 10013911,
      "ticker": "DOLR",
      "entity_name": "DOLLAR GENERAL CORP",
      "index": "NDX100",
      "event_type": "removed",
      "effective_date": "1995-01-26",
      "member_grain": "security"
    },
    ...
  ],
  "meta": {
    "index": "NDX100",
    "event_coverage_start": "1995-01-01",
    "coverage_end": "2026-09-26",
    "data_floor": null,
    "count": 3,
    "total": 844,
    "has_more": true,
    ...
  }
}
  • SP500: the record opens on 1925-12-31; the first event is dated 1928-08-24.
  • NDX100: the record opens on 1995-01-01; the first event is dated 1995-01-26.
  • DJIA: the record opens on 1999-10-31; the first events are removals dated 1999-10-31.

A start before the record opens returns events from the first one onward:

Terminal
curl -s -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/sp500/events?start=1900-01-01&end=1928-12-31"
response.json
{
  "data": [
    {
      "entity_id": 10000636,
      "ticker": "BU",
      "entity_name": "KEYSPAN ENERGY CORP",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "1928-08-24",
      "member_grain": "security",
      "ticker_basis": "first_known"
    },
    {
      "entity_id": 10037376,
      "ticker": null,
      "entity_name": "BROOKLYN EDISON INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "1928-08-24",
      "member_grain": "security"
    },
    {
      "entity_id": 10037571,
      "ticker": null,
      "entity_name": "DODGE BROS INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "1928-11-23",
      "member_grain": "security"
    },
    {
      "entity_id": 10000976,
      "ticker": "C",
      "entity_name": "CHRYSLER CORP",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "1928-11-26",
      "member_grain": "security",
      "ticker_basis": "first_known"
    }
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "coverage_end": "2026-09-26",
    "data_floor": null,
    "count": 4,
    "total": 4,
    "has_more": false,
    "as_of": "1928-12-31",
    ...
  }
}

Requests past coverage

For djia and ndx100, an end after coverage_end returns 400 (see Errors). Without end, the log runs to the newest event on record and is never refused, even when start is after coverage_end:

Terminal
curl -s -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/djia/events?start=2026-01-01"
response.json
{
  "data": [
    {
      "entity_id": 10017902,
      "ticker": "VZ",
      "entity_name": "VERIZON COMMUNICATIONS INC",
      "index": "DJIA",
      "event_type": "removed",
      "effective_date": "2026-06-28",
      "member_grain": "security"
    },
    {
      "entity_id": 10030636,
      "ticker": "GOOGL",
      "entity_name": "ALPHABET INC",
      "index": "DJIA",
      "event_type": "added",
      "effective_date": "2026-06-29",
      "member_grain": "security"
    }
  ],
  "meta": {
    "index": "DJIA",
    "event_coverage_start": "1999-10-31",
    "coverage_end": "2026-09-26",
    "data_floor": null,
    "count": 2,
    "total": 2,
    "has_more": false,
    ...
  }
}
Terminal
curl -s -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/djia/events?start=2026-10-01"
response.json
{
  "data": [],
  "meta": {
    "index": "DJIA",
    "event_coverage_start": "1999-10-31",
    "coverage_end": "2026-09-26",
    "data_floor": null,
    "count": 0,
    "total": 0,
    "has_more": false,
    ...
  }
}

For sp500, an end after coverage_end is served; the Illumina request above uses end=2026-12-31.

Labels, unlinked members and reversed windows

Each row carries the ticker and name recorded for that membership, not a modern one, so early rows can show a null ticker or ticker_basis: "first_known". A member not linked to an entity has a null entity_id, and its ticker and entity_name carry what is recorded for the membership, which can be null. A start later than end returns 400 (/v1/index/sp500/events?start=2024-12-31&end=2024-01-01):

response.json
{"error": "bad_request", "code": "bad_request", "status": 400, "detail": "end (2024-01-01) is before start (2024-12-31)"}

Request examples

The S&P 500 changes of 18 to 21 September 2026. The Python client returns a pandas.DataFrame of the rows.

request.pycurlprompt
import xfinlink as xfl

xfl.set_api_key("YOUR_API_KEY")

df = xfl.index_events("sp500", start="2026-09-17", end="2026-09-22")
print(df[["entity_id", "ticker", "entity_name", "event_type", "effective_date"]].to_string(index=False))
curl -s -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/sp500/events?start=2026-09-17&end=2026-09-22"
Which companies joined or left the S&P 500 between 17 and 22 September 2026?
stdoutresponse.jsontool result
 entity_id ticker              entity_name event_type effective_date
  10031004   BLDR BUILDERS FIRSTSOURCE INC    removed     2026-09-18
  10017044    TAP MOLSON COORS BEVERAGE CO    removed     2026-09-18
  10004997    TTD         Trade Desk (The)    removed     2026-09-18
  10006277     BE             Bloom Energy      added     2026-09-21
  10004612      P                 Everpure      added     2026-09-21
  10029052   ILMN           Illumina, Inc.      added     2026-09-21
{
  "data": [
    {
      "entity_id": 10031004,
      "ticker": "BLDR",
      "entity_name": "BUILDERS FIRSTSOURCE INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10017044,
      "ticker": "TAP",
      "entity_name": "MOLSON COORS BEVERAGE CO",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10004997,
      "ticker": "TTD",
      "entity_name": "Trade Desk (The)",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10006277,
      "ticker": "BE",
      "entity_name": "Bloom Energy",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10004612,
      "ticker": "P",
      "entity_name": "Everpure",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10029052,
      "ticker": "ILMN",
      "entity_name": "Illumina, Inc.",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    }
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "entity_id_grain": "security",
    "coverage_end": "2026-09-29",
    "data_floor": null,
    "count": 6,
    "total": 6,
    "has_more": false,
    "knowledge_time": "2026-09-29T18:57:20Z",
    "as_of": "2026-09-22",
    "freshness": [
      {
        "dataset": "index_membership",
        "through": "2026-09-29",
        "promoted_at": "2026-09-29T19:45:53Z"
      }
    ]
  }
}
{"tool": "get_index_events", "arguments": {"index_name": "sp500", "start": "2026-09-17", "end": "2026-09-22"}}
{
  "data": [
    {
      "entity_id": 10031004,
      "ticker": "BLDR",
      "entity_name": "BUILDERS FIRSTSOURCE INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10017044,
      "ticker": "TAP",
      "entity_name": "MOLSON COORS BEVERAGE CO",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10004997,
      "ticker": "TTD",
      "entity_name": "Trade Desk (The)",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10006277,
      "ticker": "BE",
      "entity_name": "Bloom Energy",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10004612,
      "ticker": "P",
      "entity_name": "Everpure",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10029052,
      "ticker": "ILMN",
      "entity_name": "Illumina, Inc.",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    }
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "entity_id_grain": "security",
    "coverage_end": "2026-09-29",
    "data_floor": null,
    "count": 6,
    "total": 6,
    "has_more": false,
    "knowledge_time": "2026-09-29T18:57:20Z",
    "as_of": "2026-09-22",
    "freshness": [
      {
        "dataset": "index_membership",
        "through": "2026-09-29",
        "promoted_at": "2026-09-29T19:45:53Z"
      }
    ]
  }
}

Was this page helpful?

request.pycurlprompt
import xfinlink as xfl

xfl.set_api_key("YOUR_API_KEY")

df = xfl.index_events("sp500", start="2026-09-17", end="2026-09-22")
print(df[["entity_id", "ticker", "entity_name", "event_type", "effective_date"]].to_string(index=False))
curl -s -H "X-API-Key: YOUR_API_KEY" \
  "https://api.xfinlink.com/v1/index/sp500/events?start=2026-09-17&end=2026-09-22"
Which companies joined or left the S&P 500 between 17 and 22 September 2026?
stdoutresponse.jsontool result
 entity_id ticker              entity_name event_type effective_date
  10031004   BLDR BUILDERS FIRSTSOURCE INC    removed     2026-09-18
  10017044    TAP MOLSON COORS BEVERAGE CO    removed     2026-09-18
  10004997    TTD         Trade Desk (The)    removed     2026-09-18
  10006277     BE             Bloom Energy      added     2026-09-21
  10004612      P                 Everpure      added     2026-09-21
  10029052   ILMN           Illumina, Inc.      added     2026-09-21
{
  "data": [
    {
      "entity_id": 10031004,
      "ticker": "BLDR",
      "entity_name": "BUILDERS FIRSTSOURCE INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10017044,
      "ticker": "TAP",
      "entity_name": "MOLSON COORS BEVERAGE CO",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10004997,
      "ticker": "TTD",
      "entity_name": "Trade Desk (The)",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10006277,
      "ticker": "BE",
      "entity_name": "Bloom Energy",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10004612,
      "ticker": "P",
      "entity_name": "Everpure",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10029052,
      "ticker": "ILMN",
      "entity_name": "Illumina, Inc.",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    }
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "entity_id_grain": "security",
    "coverage_end": "2026-09-29",
    "data_floor": null,
    "count": 6,
    "total": 6,
    "has_more": false,
    "knowledge_time": "2026-09-29T18:57:20Z",
    "as_of": "2026-09-22",
    "freshness": [
      {
        "dataset": "index_membership",
        "through": "2026-09-29",
        "promoted_at": "2026-09-29T19:45:53Z"
      }
    ]
  }
}
{"tool": "get_index_events", "arguments": {"index_name": "sp500", "start": "2026-09-17", "end": "2026-09-22"}}
{
  "data": [
    {
      "entity_id": 10031004,
      "ticker": "BLDR",
      "entity_name": "BUILDERS FIRSTSOURCE INC",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10017044,
      "ticker": "TAP",
      "entity_name": "MOLSON COORS BEVERAGE CO",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10004997,
      "ticker": "TTD",
      "entity_name": "Trade Desk (The)",
      "index": "SP500",
      "event_type": "removed",
      "effective_date": "2026-09-18",
      "member_grain": "security"
    },
    {
      "entity_id": 10006277,
      "ticker": "BE",
      "entity_name": "Bloom Energy",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10004612,
      "ticker": "P",
      "entity_name": "Everpure",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    },
    {
      "entity_id": 10029052,
      "ticker": "ILMN",
      "entity_name": "Illumina, Inc.",
      "index": "SP500",
      "event_type": "added",
      "effective_date": "2026-09-21",
      "member_grain": "security"
    }
  ],
  "meta": {
    "index": "SP500",
    "event_coverage_start": "1925-12-31",
    "entity_id_grain": "security",
    "coverage_end": "2026-09-29",
    "data_floor": null,
    "count": 6,
    "total": 6,
    "has_more": false,
    "knowledge_time": "2026-09-29T18:57:20Z",
    "as_of": "2026-09-22",
    "freshness": [
      {
        "dataset": "index_membership",
        "through": "2026-09-29",
        "promoted_at": "2026-09-29T19:45:53Z"
      }
    ]
  }
}