Table of Contents

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

string

BbgCompTicker

The Bloomberg composite ticker, or null.

public string? BbgCompTicker { get; init; }

Property Value

string

CloseDate

The final date by which participation must be completed, or null.

public LocalDate? CloseDate { get; init; }

Property Value

LocalDate?

DateInfo

Event-specific dates, keyed by the name the server files each under.

public required IReadOnlyDictionary<string, Instant?> DateInfo { get; init; }

Property Value

IReadOnlyDictionary<string, Instant?>

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

LocalDate?

DuebillsRedemptionDate

The due bills redemption date, or null.

public LocalDate? DuebillsRedemptionDate { get; init; }

Property Value

LocalDate?

EffectiveDate

The date the event becomes effective or is executed, or null.

public LocalDate? EffectiveDate { get; init; }

Property Value

LocalDate?

EndDate

The final date by which the event is valid, active or must be completed, or null.

public LocalDate? EndDate { get; init; }

Property Value

LocalDate?

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

LocalDate?

Event

The event type.

public required Event Event { get; init; }

Property Value

Event

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

Action

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

LocalDate

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

LocalDate?

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

string

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

string

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

IReadOnlyDictionary<string, string>

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

EventSubType

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

string

ExDate

The ex-dividend date, or null.

public LocalDate? ExDate { get; init; }

Property Value

LocalDate?

Remarks

ExDate filters on this.

Exchange

Exchange code for this listing.

public required string Exchange { get; init; }

Property Value

string

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

LocalDate?

ExpiryTime

The expiry time, or null.

public string? ExpiryTime { get; init; }

Property Value

string

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

string

Figi

The Bloomberg FIGI — the exchange-level ID — or null.

public string? Figi { get; init; }

Property Value

string

FigiTicker

The Bloomberg exchange-level ticker, or null.

public string? FigiTicker { get; init; }

Property Value

string

FinancialYearEndDate

The closing date of the company's financial year, or null.

public LocalDate? FinancialYearEndDate { get; init; }

Property Value

LocalDate?

Fraction

How fractions are handled in settlement calculations, or null.

[JsonConverter(typeof(NullableFractionJsonConverter))]
public Fraction? Fraction { get; init; }

Property Value

Fraction?

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

LocalDate?

GlobalStatus

The security's global listing activity status.

public required GlobalStatus GlobalStatus { get; init; }

Property Value

GlobalStatus

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

string

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

string

IssuerName

The issuer name.

public required string IssuerName { get; init; }

Property Value

string

ListingCountry

The listing country, or default when the row carries none.

public Country ListingCountry { get; init; }

Property Value

Country

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

LocalDate?

ListingGroupId

Groups every listing of the same security on one exchange, often in different trading currencies.

public required string ListingGroupId { get; init; }

Property Value

string

ListingId

The unique listing numerical ID — a sequence number concatenated with ListingGroupId.

public required string ListingId { get; init; }

Property Value

string

ListingSource

Whether the listing-level data in this record is main or secondary.

public required ListingSource ListingSource { get; init; }

Property Value

ListingSource

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

ListingStatus

Remarks

One of the nine closed enums. See ListingStatus.

LocalCode

The local code, or null.

public string? LocalCode { get; init; }

Property Value

string

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

MandVolu

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

ulong?

MaxOfferQty

The largest quantity a holder may offer from their holding, or null.

public ulong? MaxOfferQty { get; init; }

Property Value

ulong?

MaxQualifyQty

The largest holding that qualifies to take part in the event, or null.

public ulong? MaxQualifyQty { get; init; }

Property Value

ulong?

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

ulong?

MinOfferQty

The smallest quantity a holder may offer from their holding, or null.

public ulong? MinOfferQty { get; init; }

Property Value

ulong?

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

ulong?

MultiCurrency

true when the market currently carries more than one listing of this security.

public required bool MultiCurrency { get; init; }

Property Value

bool

NasdaqSymbol

The Nasdaq Integrated Platform suffix-convention symbol, or null.

public string? NasdaqSymbol { get; init; }

Property Value

string

NotificationDate

The date the event notification is issued or made public, or null.

public LocalDate? NotificationDate { get; init; }

Property Value

LocalDate?

OpenDate

The date the event opens for participation, or null.

public LocalDate? OpenDate { get; init; }

Property Value

LocalDate?

OperatingMic

Market Identifier Code (MIC), as an ISO 10383 string, or null.

public string? OperatingMic { get; init; }

Property Value

string

OptionElectionDate

The deadline by which participants must elect an option, or null.

public LocalDate? OptionElectionDate { get; init; }

Property Value

LocalDate?

OptionExpiryTime

The option expiry time, or null.

public string? OptionExpiryTime { get; init; }

Property Value

string

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

string

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

string

OutturnBbgCompId

The outturn Bloomberg composite ID, or null.

public string? OutturnBbgCompId { get; init; }

Property Value

string

OutturnBbgCompTicker

The outturn Bloomberg composite ticker, or null.

public string? OutturnBbgCompTicker { get; init; }

Property Value

string

OutturnFigi

The outturn FIGI — the Bloomberg exchange-level ID — or null.

public string? OutturnFigi { get; init; }

Property Value

string

OutturnFigiTicker

The outturn Bloomberg exchange-level ticker, or null.

public string? OutturnFigiTicker { get; init; }

Property Value

string

OutturnIsin

The outturn ISIN, or null.

public string? OutturnIsin { get; init; }

Property Value

string

Remarks

The second field allocate_isins is about; see AllocateIsins.

OutturnLocalCode

The outturn local code, or null.

public string? OutturnLocalCode { get; init; }

Property Value

string

OutturnSecurityId

The outturn security ID, or null.

public string? OutturnSecurityId { get; init; }

Property Value

string

OutturnSecurityType

The outturn security's asset type, or default when the row carries none.

public SecurityType OutturnSecurityType { get; init; }

Property Value

SecurityType

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

OutturnStyle

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

string

ParValue

The par value amount, or null.

public decimal? ParValue { get; init; }

Property Value

decimal?

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

The currency ParValue is denominated in, or default when the row carries none.

public Currency ParValueCurrency { get; init; }

Property Value

Currency

PaymentDate

The date the dividend or payment is made to eligible holders, or null.

public LocalDate? PaymentDate { get; init; }

Property Value

LocalDate?

PaymentType

The payment type, or null.

[JsonConverter(typeof(NullablePaymentTypeJsonConverter))]
public PaymentType? PaymentType { get; init; }

Property Value

PaymentType?

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

string

RateCurrency

The payment currency, or default when the row carries none.

public Currency RateCurrency { get; init; }

Property Value

Currency

RateInfo

Event-specific payment figures, keyed by the name the server files each under.

public required IReadOnlyDictionary<string, decimal?> RateInfo { get; init; }

Property Value

IReadOnlyDictionary<string, decimal?>

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

decimal?

Remarks

decimal for the reason ParValue gives.

RatioOld

The ratio denominator — the existing holding — or null.

public decimal? RatioOld { get; init; }

Property Value

decimal?

Remarks

decimal for the reason ParValue gives.

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

LocalDate?

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

string

RegisterCountry

The register country, or default when the row carries none.

public Country RegisterCountry { get; init; }

Property Value

Country

RegistrationDate

The registration date, or null.

public LocalDate? RegistrationDate { get; init; }

Property Value

LocalDate?

RelatedEvent

The related event type, or default when the row names none.

public Event RelatedEvent { get; init; }

Property Value

Event

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

string

SecurityDescription

The security description.

public required string SecurityDescription { get; init; }

Property Value

string

SecurityId

Security-level numerical ID, linking every listing of the same security together.

public required string SecurityId { get; init; }

Property Value

string

SecurityType

The security type, or default when the row carries none.

public SecurityType SecurityType { get; init; }

Property Value

SecurityType

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

string

SegmentMicName

The market segment name, or null.

public string? SegmentMicName { get; init; }

Property Value

string

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

string

StartDate

The date the event begins or becomes effective, or null.

public LocalDate? StartDate { get; init; }

Property Value

LocalDate?

StartSubscriptionDate

The date the subscription period begins, or null.

public LocalDate? StartSubscriptionDate { get; init; }

Property Value

LocalDate?

Symbol

The query input symbol this row matched, or null.

public string? Symbol { get; init; }

Property Value

string

TenderPriceStep

For a tender, the price step bids may be placed in, or null.

public decimal? TenderPriceStep { get; init; }

Property Value

decimal?

Remarks

decimal for the reason ParValue gives.

TenderStrikePrice

For a tender, the cut-off price at which all bids are accepted, or null.

public decimal? TenderStrikePrice { get; init; }

Property Value

decimal?

Remarks

decimal for the reason ParValue gives.

ToDate

The final date by which the event is valid, active or must be completed, or null.

public LocalDate? ToDate { get; init; }

Property Value

LocalDate?

TradingCurrency

The trading currency, or default when the row carries none.

public Currency TradingCurrency { get; init; }

Property Value

Currency

TsCreated

When Databento added the record, in UTC.

public required Instant TsCreated { get; init; }

Property Value

Instant

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

Instant

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

string

WithdrawalRightsExpiryTime

The withdrawal rights expiry time, or null.

public string? WithdrawalRightsExpiryTime { get; init; }

Property Value

string

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

string

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

LocalDate?

WithdrawalRightsToDate

The final date by which withdrawal rights can be exercised, or null.

public LocalDate? WithdrawalRightsToDate { get; init; }

Property Value

LocalDate?