Class CorporateAction
- Namespace
- DatabentoDotNet.Reference
- Assembly
- DatabentoDotNet.Reference.dll
One row of a corporate_actions.get_range response: what happened to a security, when
every stage of it happens, and what a holder receives.
public sealed record CorporateAction : IEquatable<CorporateAction>
- Inheritance
-
CorporateAction
- Implements
- Inherited Members
Remarks
Port of upstream's CorporateAction (corporate.rs:169-442), field for field and in
its order, including the six group comments it is written under. A hundred and four
properties, eighty-one of them optional — upstream's Option in every case, never a
judgement made here. It is the largest model in this library by a factor of two.
Three of the hundred and four are open maps, and they are the reason the other hundred and
one can be a fixed shape. DateInfo, RateInfo and
EventInfo carry the payload that varies by event type — a meeting has a meeting
number, a rights issue has a subscription ratio, and no fixed column could hold both. What may
appear in each is documented by corporate_actions.list_events: every
EventDocField names a FieldGroup, and that group is which of
these three the field lands in. See ListEventsAsync(CancellationToken).
Twenty-four dates and two timestamps, which are not the same kind of thing. The dates are
LocalDate and carry no zone because the wire does not — the fields are
yyyy-MM-dd, and attaching a zone here would invent one. The two timestamps are
Instant: TsRecord is when Databento last changed the record, and
TsCreated is when it first added it. Neither is a DateTime or a
DateOnly — CLAUDE.md, "Dates and times".
Three spellings of "absent", and which one a field uses is a fact about its type rather than
about the field. A missing string, date or number is null. A
missing open code — Event, EventSubType,
SecurityType, Country, Currency,
OutturnStyle — is that type's default, whose HasValue is
false. A missing closed enum needs a Nullable<T>,
because the nine closed enums are byte-backed so that default is an undefined
value rather than "no value" — which is why PaymentType and
Fraction are the two ?s among the coded fields here. See
ReferenceWireStrings, and SecurityMaster, which draws the same
distinction over fewer fields.
Rows arrive in the server's order and this library does not sort them. Upstream buffers
the whole response into a Vec and sorts it by whichever date
Index names (corporate.rs:59-63). A stream
has no buffer to rearrange. See GetRangeAsync(CorporateActionsGetRangeParams, CancellationToken) and
ROADMAP.md §6.
Properties
BbgCompId
The Bloomberg composite global ID, or null.
public string? BbgCompId { get; init; }
Property Value
BbgCompTicker
The Bloomberg composite ticker, or null.
public string? BbgCompTicker { get; init; }
Property Value
CloseDate
The final date by which participation must be completed, or null.
public LocalDate? CloseDate { get; init; }
Property Value
DateInfo
Event-specific dates, keyed by the name the server files each under.
public required IReadOnlyDictionary<string, Instant?> DateInfo { get; init; }
Property Value
Remarks
Required, not optional — a row without this key is a malformed row. Upstream declares
no #[serde(default)] anywhere in corporate.rs, so an absent map fails
deserialization there, and required makes it fail here. An empty
map is an ordinary answer and by far the commonest one — upstream's own fixture row sends
"date_info": {}. The two are different responses and this library keeps them apart.
Inside the map, a key carrying null is a value and not an absence.
The server saying "this event has a meeting_date, and it is not yet set" is not the
same statement as saying nothing about meeting_date at all. The value type is
therefore Instant? and a caller distinguishes the two with ContainsKey —
exactly as upstream's HashMap<String, Option<OffsetDateTime>> does. Its
own fixture exercises this on RateInfo, whose two keys both carry
null (corporate.rs:551).
Keys arrive as the server wrote them and are matched ordinally. No naming policy
transforms a dictionary key on the way in, and the comparer is the default ordinal one — so
meeting_date is not Meeting_Date. What may legally appear is documented by
corporate_actions.list_events: every EventDocField whose
Group is date_info names a key this map may carry for that
event. It is documentation, not a constraint — an undocumented key still arrives, which is
the point of an open map.
This library reads a wider set of timestamp spellings here than upstream does, and that is
a divergence worth naming. Upstream parses these values with
deserialize_opt_date_time_hash_map, which accepts ISO 8601 and nothing else, while the
two fixed timestamps on this record go through deserialize_date_time, which falls back
to a legacy space-separated form (databento-rs/src/deserialize.rs:7-53). The asymmetry
looks like an oversight rather than a rule: the two formats are mutually unambiguous, so
accepting both cannot change how any value is read, only whether a row is rejected. This map
uses the same InstantJsonConverter as
TsRecord and therefore accepts both.
DefaultOptionFlag
Whether this is the benefit a holder receives by default when several options are offered, or null.
public bool? DefaultOptionFlag { get; init; }
Property Value
- bool?
DelistingDate
The date the security was delisted, or null.
public LocalDate? DelistingDate { get; init; }
Property Value
DuebillsRedemptionDate
The due bills redemption date, or null.
public LocalDate? DuebillsRedemptionDate { get; init; }
Property Value
EffectiveDate
The date the event becomes effective or is executed, or null.
public LocalDate? EffectiveDate { get; init; }
Property Value
EndDate
The final date by which the event is valid, active or must be completed, or null.
public LocalDate? EndDate { get; init; }
Property Value
Remarks
Upstream's description is word for word ToDate's, and both are reproduced rather than reconciled. What distinguishes the two pairs is #57's to find out against real rows; SecurityMaster records the same policy for the three fields it and AdjustmentFactor disagree about.
EndSubscriptionDate
The date the subscription period ends, or null.
public LocalDate? EndSubscriptionDate { get; init; }
Property Value
Event
The event type.
public required Event Event { get; init; }
Property Value
Remarks
An open carrier, and the field that decides what the three maps below contain. A code
Databento adds to its dictionary arrives verbatim in Code with IsKnown
false rather than failing the row — upstream models 60 of the 141 codes
list_enums reports and would fail on any of the rest. See
Event, and
Events for filtering on one this library has
never seen.
EventAction
The record's action status — inserted, updated, deleted or cancelled.
public required Action EventAction { get; init; }
Property Value
Remarks
One of the nine closed enums, and required, so absence is not a state it can hold. See Action.
EventCreatedDate
The date the event was created or recorded in the system.
public required LocalDate EventCreatedDate { get; init; }
Property Value
Remarks
One of the two required dates on this record — the other twenty-two are optional. Distinct from TsCreated, which is a timestamp about the record rather than a date about the event.
EventDate
The primary date of the event — when it is scheduled to occur or take effect — or null.
public LocalDate? EventDate { get; init; }
Property Value
Remarks
EventDate, the default index, filters on this. It is nullable, which is worth knowing before reading a range-filtered result as exhaustive.
EventDateLabel
The name of the main calendar date for this event.
public required string EventDateLabel { get; init; }
Property Value
Remarks
Names one of this record's own date columns — ex_date, record_date and so on —
or an alias for it. corporate_actions.list_events is the authority for which:
CalendarDates gives each event's dates and the alias each is known by.
A string rather than an enum because upstream leaves it one, and because the
aliases are per-event.
EventId
The event identifier, unique at the event level.
public required string EventId { get; init; }
Property Value
Remarks
Where applicable this links every payment row of one event together, so that all the payment options an event offers can be seen at once.
EventInfo
Additional event-specific information, keyed by the name the server files each under.
public required IReadOnlyDictionary<string, string?> EventInfo { get; init; }
Property Value
Remarks
Required, keyed ordinally, and distinguishing a null value from an absent
key, all for the reasons DateInfo gives. The
Group that documents this one is event_info, and it is the
broadest of the three — list_events files a meeting's meeting_number here, for
instance. The values stay string because that is all the server promises about
them.
EventSubtype
The event subtype, or default when the row carries none.
public EventSubType EventSubtype { get; init; }
Property Value
Remarks
Used for the limited number of events whose data falls into distinct sub-groupings. An open
carrier: list_enums' EVENTSUBTYPE group repeats codes across parent events, so
a code's meaning depends on Event and the set is not closed. See
EventSubType.
EventUniqueId
The unique corporate actions record identifier, which deduplicates records describing the same event.
public required string EventUniqueId { get; init; }
Property Value
ExDate
The ex-dividend date, or null.
public LocalDate? ExDate { get; init; }
Property Value
Remarks
ExDate filters on this.
Exchange
Exchange code for this listing.
public required string Exchange { get; init; }
Property Value
Remarks
The values Exchanges filters on, and a
string in both places for the same reason: list_enums reports no
dictionary group for exchange codes, so there is no set to close over.
ExpCompletionDate
The date the event or its related transaction is expected to complete, or null.
public LocalDate? ExpCompletionDate { get; init; }
Property Value
ExpiryTime
The expiry time, or null.
public string? ExpiryTime { get; init; }
Property Value
Remarks
A string for the reason OptionExpiryTime gives.
ExpiryTz
The time zone ExpiryTime is expressed in, or null.
public string? ExpiryTz { get; init; }
Property Value
Figi
The Bloomberg FIGI — the exchange-level ID — or null.
public string? Figi { get; init; }
Property Value
FigiTicker
The Bloomberg exchange-level ticker, or null.
public string? FigiTicker { get; init; }
Property Value
FinancialYearEndDate
The closing date of the company's financial year, or null.
public LocalDate? FinancialYearEndDate { get; init; }
Property Value
Fraction
How fractions are handled in settlement calculations, or null.
[JsonConverter(typeof(NullableFractionJsonConverter))]
public Fraction? Fraction { get; init; }
Property Value
Remarks
The other closed enum on this record that a blank is legal for — the FRACCD group
carries a null-code entry, described as "A Blank value is possible". See
NullableFractionJsonConverter, and PaymentType for why the
converter is named on the property.
FromDate
The earliest date from which the event is valid, active or exercisable, or null.
public LocalDate? FromDate { get; init; }
Property Value
GlobalStatus
The security's global listing activity status.
public required GlobalStatus GlobalStatus { get; init; }
Property Value
Remarks
One of the nine closed enums. See GlobalStatus.
Isin
The ISIN global identifier, as an ISO 6166 string, or null.
public string? Isin { get; init; }
Property Value
Remarks
One of the two fields allocate_isins is about — see
AllocateIsins and OutturnIsin.
IssuerId
Issuer-level numerical ID, linking every security of one company together.
public required string IssuerId { get; init; }
Property Value
IssuerName
The issuer name.
public required string IssuerName { get; init; }
Property Value
ListingCountry
The listing country, or default when the row carries none.
public Country ListingCountry { get; init; }
Property Value
Remarks
The values Countries filters on. Unlike SecurityMaster, this record carries no incorporation country — every Country on it is optional.
ListingDate
The date the security was listed, or null.
public LocalDate? ListingDate { get; init; }
Property Value
ListingGroupId
Groups every listing of the same security on one exchange, often in different trading currencies.
public required string ListingGroupId { get; init; }
Property Value
ListingId
The unique listing numerical ID — a sequence number concatenated with ListingGroupId.
public required string ListingId { get; init; }
Property Value
ListingSource
Whether the listing-level data in this record is main or secondary.
public required ListingSource ListingSource { get; init; }
Property Value
Remarks
One of the nine closed enums, and the smallest of them — two codes. See ListingSource.
ListingStatus
The listing's activity status at market level.
public required ListingStatus ListingStatus { get; init; }
Property Value
Remarks
One of the nine closed enums. See ListingStatus.
LocalCode
The local code, or null.
public string? LocalCode { get; init; }
Property Value
Remarks
Usually unique at market level, with exceptions. Either an alphabetic string or a number, so it stays a string either way.
LotSize
The lot size — the fewest shares acquirable in one transaction — or null.
public uint? LotSize { get; init; }
Property Value
- uint?
MandVoluFlag
Whether participation in the event is mandatory, voluntary, or a mix.
public required MandVolu MandVoluFlag { get; init; }
Property Value
Remarks
One of the nine closed enums. See MandVolu.
MaxAcceptQty
The largest total the company will accept from all tendering holders for the event to bind the offeror, or null.
public ulong? MaxAcceptQty { get; init; }
Property Value
MaxOfferQty
The largest quantity a holder may offer from their holding, or null.
public ulong? MaxOfferQty { get; init; }
Property Value
MaxQualifyQty
The largest holding that qualifies to take part in the event, or null.
public ulong? MaxQualifyQty { get; init; }
Property Value
MinAcceptQty
The smallest total the company will accept from all tendering holders for the event to bind the offeror, or null.
public ulong? MinAcceptQty { get; init; }
Property Value
MinOfferQty
The smallest quantity a holder may offer from their holding, or null.
public ulong? MinOfferQty { get; init; }
Property Value
Remarks
A ulong, upstream's u64, for all six quantity fields. A share
count is not a rate, so the decimal argument that governs
ParValue does not reach it: the value is an exact integer on the wire and an
exact integer here.
MinQualifyQty
The smallest holding that qualifies to take part in the event, or null.
public ulong? MinQualifyQty { get; init; }
Property Value
MultiCurrency
true when the market currently carries more than one listing of this security.
public required bool MultiCurrency { get; init; }
Property Value
NasdaqSymbol
The Nasdaq Integrated Platform suffix-convention symbol, or null.
public string? NasdaqSymbol { get; init; }
Property Value
NotificationDate
The date the event notification is issued or made public, or null.
public LocalDate? NotificationDate { get; init; }
Property Value
OpenDate
The date the event opens for participation, or null.
public LocalDate? OpenDate { get; init; }
Property Value
OperatingMic
Market Identifier Code (MIC), as an ISO 10383 string, or null.
public string? OperatingMic { get; init; }
Property Value
OptionElectionDate
The deadline by which participants must elect an option, or null.
public LocalDate? OptionElectionDate { get; init; }
Property Value
OptionExpiryTime
The option expiry time, or null.
public string? OptionExpiryTime { get; init; }
Property Value
Remarks
A string rather than a LocalTime, and deliberately.
Upstream leaves all four *_time fields as Option<String> and documents no
format for them, unlike the twenty-four dates and two timestamps, whose formats it parses.
Picking a pattern here would be inventing a contract; the value is handed over as the server
wrote it, together with its zone in OptionExpiryTz. #57 is where a real row can
say what these hold.
OptionExpiryTz
The time zone OptionExpiryTime is expressed in, or null.
public string? OptionExpiryTz { get; init; }
Property Value
Remarks
A string and not a DateTimeZone: it is not known to be an IANA zone ID,
so resolving it against a time-zone database would be a guess. See
OptionExpiryTime.
OptionId
The option number of the event, or null. Options are ORs — a holder picks one.
public string? OptionId { get; init; }
Property Value
OutturnBbgCompId
The outturn Bloomberg composite ID, or null.
public string? OutturnBbgCompId { get; init; }
Property Value
OutturnBbgCompTicker
The outturn Bloomberg composite ticker, or null.
public string? OutturnBbgCompTicker { get; init; }
Property Value
OutturnFigi
The outturn FIGI — the Bloomberg exchange-level ID — or null.
public string? OutturnFigi { get; init; }
Property Value
OutturnFigiTicker
The outturn Bloomberg exchange-level ticker, or null.
public string? OutturnFigiTicker { get; init; }
Property Value
OutturnIsin
The outturn ISIN, or null.
public string? OutturnIsin { get; init; }
Property Value
Remarks
The second field allocate_isins is about; see
AllocateIsins.
OutturnLocalCode
The outturn local code, or null.
public string? OutturnLocalCode { get; init; }
Property Value
OutturnSecurityId
The outturn security ID, or null.
public string? OutturnSecurityId { get; init; }
Property Value
OutturnSecurityType
The outturn security's asset type, or default when the row carries none.
public SecurityType OutturnSecurityType { get; init; }
Property Value
Remarks
The second SecurityType on this record.
OutturnStyle
The style of the outturn security, or default when the row carries none.
public OutturnStyle OutturnStyle { get; init; }
Property Value
Remarks
An open carrier rather than a closed enum, so a style outside the modelled set arrives in
Code rather than failing the row. See
OutturnStyle.
OutturnUsCode
The outturn CUSIP, or null.
public string? OutturnUsCode { get; init; }
Property Value
ParValue
The par value amount, or null.
public decimal? ParValue { get; init; }
Property Value
Remarks
decimal where upstream has f64. #53 settled that for every
rate field across the three reference models and this issue does not re-open it;
Factor carries the measurement, including what
decimal costs at magnitudes no par value reaches.
ParValueCurrency
public Currency ParValueCurrency { get; init; }
Property Value
PaymentDate
The date the dividend or payment is made to eligible holders, or null.
public LocalDate? PaymentDate { get; init; }
Property Value
PaymentType
The payment type, or null.
[JsonConverter(typeof(NullablePaymentTypeJsonConverter))]
public PaymentType? PaymentType { get; init; }
Property Value
Remarks
One of the two closed enums on this record that a blank is legal for. The
PAYTYPE group of corporate_actions.list_enums carries an entry with a null
code, so a blank means "no value" rather than a malformed response — and a
Nullable<T> is the only way a byte-backed enum can hold that. The converter is
named on the property because [JsonConverter] on the type can only name one, and that
one is the non-nullable PaymentTypeJsonConverter. See
NullablePaymentTypeJsonConverter.
PrimaryExchange
Exchange code for the primary security, or null.
public string? PrimaryExchange { get; init; }
Property Value
RateCurrency
The payment currency, or default when the row carries none.
public Currency RateCurrency { get; init; }
Property Value
RateInfo
Event-specific payment figures, keyed by the name the server files each under.
public required IReadOnlyDictionary<string, decimal?> RateInfo { get; init; }
Property Value
Remarks
Required, keyed ordinally, and distinguishing a null value from an absent
key, all for the reasons DateInfo gives. The
Group that documents this one is rate_info.
decimal where upstream has f64, matching the fixed rate columns
rather than diverging from them. #53 settled that for every rate field across the three
reference models; a map of rates is still rates. See ParValue and
Factor.
The three maps are three types and not one, because their values are. Collapsing them
into a single Dictionary<string, string> would hand every caller the parsing
this library exists to do, and collapsing them into a single object-valued map would
hand them a cast. Upstream keeps three for the same reason.
RatioNew
The ratio numerator — the new holding — or null.
public decimal? RatioNew { get; init; }
Property Value
Remarks
RatioOld
The ratio denominator — the existing holding — or null.
public decimal? RatioOld { get; init; }
Property Value
Remarks
RdPriority
The record-date priority sequence number, or null.
public uint? RdPriority { get; init; }
Property Value
- uint?
Remarks
Where populated, this is the order the rows have to be applied in to calculate the resulting cash and stock outcomes correctly. It is not a sort key for the response — see GetRangeAsync(CorporateActionsGetRangeParams, CancellationToken) for what the library does and does not order.
RecordDate
The date the company reviews its records to determine who is entitled, or null.
public LocalDate? RecordDate { get; init; }
Property Value
Remarks
One business day after ExDate.
RecordDateId
The record date ID, linking every event for the same security that shares a record date, or null.
public string? RecordDateId { get; init; }
Property Value
RegisterCountry
The register country, or default when the row carries none.
public Country RegisterCountry { get; init; }
Property Value
RegistrationDate
The registration date, or null.
public LocalDate? RegistrationDate { get; init; }
Property Value
RelatedEvent
The related event type, or default when the row names none.
public Event RelatedEvent { get; init; }
Property Value
Remarks
The second Event on this record, and the one
upstream's own test pins the open behaviour with: a related_event of CORR
deserializes to an unknown code rather than failing the row (corporate.rs:687-716).
RelatedEventId
A direct link to another event, or null.
public string? RelatedEventId { get; init; }
Property Value
SecurityDescription
The security description.
public required string SecurityDescription { get; init; }
Property Value
SecurityId
Security-level numerical ID, linking every listing of the same security together.
public required string SecurityId { get; init; }
Property Value
SecurityType
The security type, or default when the row carries none.
public SecurityType SecurityType { get; init; }
Property Value
Remarks
An open carrier: upstream models 30 of the 64 codes the live dictionary reports, so one of the 34 it does not know fails the whole row there. See SecurityType.
SegmentMic
The segment Market Identifier Code (MIC), as an ISO 10383 string, or null.
public string? SegmentMic { get; init; }
Property Value
SegmentMicName
The market segment name, or null.
public string? SegmentMicName { get; init; }
Property Value
SerialId
The serial number of the event, or null. Serials are ANDs — a holder receives all of them.
public string? SerialId { get; init; }
Property Value
StartDate
The date the event begins or becomes effective, or null.
public LocalDate? StartDate { get; init; }
Property Value
StartSubscriptionDate
The date the subscription period begins, or null.
public LocalDate? StartSubscriptionDate { get; init; }
Property Value
Symbol
The query input symbol this row matched, or null.
public string? Symbol { get; init; }
Property Value
TenderPriceStep
For a tender, the price step bids may be placed in, or null.
public decimal? TenderPriceStep { get; init; }
Property Value
Remarks
TenderStrikePrice
For a tender, the cut-off price at which all bids are accepted, or null.
public decimal? TenderStrikePrice { get; init; }
Property Value
Remarks
ToDate
The final date by which the event is valid, active or must be completed, or null.
public LocalDate? ToDate { get; init; }
Property Value
TradingCurrency
The trading currency, or default when the row carries none.
public Currency TradingCurrency { get; init; }
Property Value
TsCreated
When Databento added the record, in UTC.
public required Instant TsCreated { get; init; }
Property Value
Remarks
Distinct from TsRecord, which moves every time the record changes, and from EventCreatedDate, which is a date about the event rather than a timestamp about the record. CorporateActionIndex cannot filter on this one.
TsRecord
When the record last changed, in UTC.
public required Instant TsRecord { get; init; }
Property Value
Remarks
One of the three fields CorporateActionIndex can filter on, and the only one of the three that is required — the other two are dates that may be absent.
UsCode
The US domestic CUSIP, or null.
public string? UsCode { get; init; }
Property Value
WithdrawalRightsExpiryTime
The withdrawal rights expiry time, or null.
public string? WithdrawalRightsExpiryTime { get; init; }
Property Value
Remarks
A string for the reason OptionExpiryTime gives.
WithdrawalRightsExpiryTz
The time zone WithdrawalRightsExpiryTime is expressed in, or null.
public string? WithdrawalRightsExpiryTz { get; init; }
Property Value
WithdrawalRightsFlag
The withdrawal rights flag, or null.
public bool? WithdrawalRightsFlag { get; init; }
Property Value
- bool?
WithdrawalRightsFromDate
The date withdrawal rights become effective, letting participants retract their election, or null.
public LocalDate? WithdrawalRightsFromDate { get; init; }
Property Value
WithdrawalRightsToDate
The final date by which withdrawal rights can be exercised, or null.
public LocalDate? WithdrawalRightsToDate { get; init; }