Releases: MarketDataApp/sdk-csharp
Release list
Version 1.0.0
First stable release of the C#/.NET SDK. The public API is covered by semantic
versioning from this version on: no breaking change ships without a major version bump.
Compliance work performed on the C#/.NET SDK after its donation by Omid Rad
(Exceptal) to Market Data. Changes are grouped by type and reference the
MarketData.app SDK requirements sections they satisfy.
Added
- Real XML documentation across the entire endpoint surface (59 public methods on the
five API classes): summaries, per-parameter docs, returns, the exceptions each method
can actually throw, a usage example per endpoint, and the canonical docs-site URL as
<seealso href>. Enforced in CI by a reflection test over the generated
MarketDataApp.xml(guarding content, where CS1591 only guarantees presence) plus a
live check that every canonical URL responds. (#21) AddMarketDataClientservice-collection extensions
(Microsoft.Extensions.DependencyInjection) registeringMarketDataClientas a
singleton over anIHttpClientFactory-managed HttpClient.MarketDataClient.CreateAsync(httpClient, options?, cancellationToken)async
factory: when a token is present andValidateTokenOnStartupis enabled
(default), it awaitsGET /user/to fail fast on a bad token
(AuthenticationException) and to seed the rate-limit snapshot. Demo mode and
opt-out skip the call. (§§5, 8.1)SupportInfoproperty that renders the mandated
--- MARKET DATA SUPPORT INFO ---block: snake_case labels in spec order
(request_id,request_url,status_code,timestamp,message,
exception_type), column-aligned, with a(none)fallback. (§6.3)AddMarketDataCanonicalConsole()logging-builder extension +
MarketDataConsoleFormatterproducing the canonical
{timestamp} - {logger_name} - {level} - {message}log line (opt-in). (§7)IsJson/IsCsv/IsHtmlformat-detection flags on every response via the
IMarketDataResponsecontract (typed JSON,CsvResponse,HtmlResponse).
(§11.6)- Concise
ToString()summaries on response wrappers (type, item count, HTTP
status, no-data marker) and primary data records — no raw payload dumps.
(§11.6) - Extension-aware
SaveToFile/SaveToFileAsyncthat select content by file
extension (.json/.csv/.html, falling back to the raw body) and
return the written path. (§11.6) - Configuration cascade: client-level defaults (
DefaultDateFormat,Mode,
Columns,AddHeaders,Human,MinimumLogLevel,OutputFormat) merge into
per-method parameters (method wins), plus newMARKETDATA_*formatting and
diagnostics environment variables:MARKETDATA_DATE_FORMAT,MARKETDATA_MODE,
MARKETDATA_COLUMNS,MARKETDATA_ADD_HEADERS,MARKETDATA_USE_HUMAN_READABLE,
MARKETDATA_LOGGING_LEVEL, andMARKETDATA_OUTPUT_FORMAT. (§4) - Cached
/status/retry gate: before retrying a server error the SDK consults a
per-service status snapshot (270s refresh / 300s validity); anOFFLINE
service fails immediately instead of retrying. (§9.5) IDisposableonMarketDataClientandApiClient(disposes the concurrency
semaphore; never the caller-ownedHttpClient). (§1)- Packaging: git-tag-driven versioning via MinVer, deterministic builds,
symbol package (.snupkg), Source Link (CI), package validation, and NuGet
metadata (README, license, repository/project URLs). (§15) - Continuous integration: cross-OS unit-test matrix (ubuntu, windows, macOS), a
line + branch coverage gate, a coverage-report artifact, and live integration
tests wired to run on pull requests and releases. (§13) - CI/CD supply-chain and cost hardening, mirroring the sibling MarketData SDKs:
Dependabot (github-actions+nuget, weekly) with an auto-merge workflow for
semver-minor/patch bumps; least-privilegepermissions: contents: readand a
PR-only cancel concurrency group on CI; a Codecov coverage upload (opencover)
plus CI/coverage README badges; OIDC Trusted Publishing to NuGet.org
(NuGet/login, no long-lived API key) with SLSA build-provenance attestation
of the.nupkg/.snupkgbefore push; a release-triggered changelog-update
automation; and a PR-vs-post-merge matrix split (PRs build ubuntu-only, main /
releases run the full OS matrix) that keeps the 100% coverage gate and PR
integration tests on every run. - This
CHANGELOG.md.
Changed
- Logs and telemetry now include the full request URL, query string included (via the
url.fullactivity tag and the request/response log lines), matching the URL already
reported on exceptions. The API token is never placed in the URL — it is sent only as
anAuthorization: Bearerheader and is redacted (last-4) wherever logged — so no
credential is exposed. AddMarketDataClientnow auto-wires the container'sILogger<MarketDataClient>
into the SDK when the application has logging configured, so SDK logs flow
automatically in DI apps without extra wiring. An explicitly supplied
MarketDataClientOptions.Loggeris respected and never overridden, and the
client still constructs silently when no logging is registered. Pairs with
AddMarketDataCanonicalConsole(). (§7)- Request timeout is fixed at 99 seconds and is no longer configurable. (§10)
MaxConcurrentRequestsis validated and capped to the range 1–50. (§12)- Automatic retries now apply only to HTTP 501–599 server errors and transient
network failures; other responses are not retried. request_idis read from thecf-rayresponse header first, then falls back
tox-request-id. (§6.2)- Support-info and diagnostic timestamps are rendered in US/Eastern time.
SupportInfois now a property, replacing the previousGetSupportInfo()
method. (§6.3)- Package version is no longer a hardcoded
<Version>literal; it is derived
from git tags at build time (with a0.0.0-alpha.0.Npre-release fallback for
untagged local/dev builds). (§15)
Removed
- Configurable
Timeoutoption and theMARKETDATA_TIMEOUTenvironment variable
(timeout is now fixed at 99s). (§10) - Undocumented
nonstandardparameter onoptions/expirations(retained on the
options chain, where it is documented). (§3) - Undocumented
countbackparameter onoptions/quotes. (§3) - Removed the deprecated
stocks/bulkquotesmethods
(GetBulkQuotesAsync/GetBulkQuotesCsvAsync) andStockBulkQuotesRequest; use
GetQuotesAsyncwith multiple symbols (thestocks/quotesendpoint now serves
bulk retrieval). (§3) - Removed the deprecated
options/strikessurface
(GetStrikesAsync/GetStrikesCsvAsync,OptionsStrikesRequest,OptionStrikes,
OptionsStrikesResponse); the/v1/options/strikes/endpoint is deprecated and
no longer documented. Use the options chain to discover available strikes.
Fixed
- Constructors no longer perform synchronous-over-async network I/O; startup
token validation moved toCreateAsync. (§§5, 8.1) - The news JSON endpoint now honors the
columnsprojection. (§3) - Local
dotnet buildno longer emits the Source Link
"Source control information is not available - the generated source link is
empty" warning: Source Link andContinuousIntegrationBuildare gated to CI,
where the repository resolves normally.
Version 1.0.0-rc.2
First published release of the C#/.NET SDK, offered as a release candidate. The public
API is feature-complete and no breaking changes are planned before 1.0.0.
Compliance work performed on the C#/.NET SDK after its donation by Omid Rad
(Exceptal) to Market Data. Changes are grouped by type and reference the
MarketData.app SDK requirements sections they satisfy.
Added
- Real XML documentation across the entire endpoint surface (59 public methods on the
five API classes): summaries, per-parameter docs, returns, the exceptions each method
can actually throw, a usage example per endpoint, and the canonical docs-site URL as
<seealso href>. Enforced in CI by a reflection test over the generated
MarketDataApp.xml(guarding content, where CS1591 only guarantees presence) plus a
live check that every canonical URL responds. (#21) AddMarketDataClientservice-collection extensions
(Microsoft.Extensions.DependencyInjection) registeringMarketDataClientas a
singleton over anIHttpClientFactory-managed HttpClient.MarketDataClient.CreateAsync(httpClient, options?, cancellationToken)async
factory: when a token is present andValidateTokenOnStartupis enabled
(default), it awaitsGET /user/to fail fast on a bad token
(AuthenticationException) and to seed the rate-limit snapshot. Demo mode and
opt-out skip the call. (§§5, 8.1)SupportInfoproperty that renders the mandated
--- MARKET DATA SUPPORT INFO ---block: snake_case labels in spec order
(request_id,request_url,status_code,timestamp,message,
exception_type), column-aligned, with a(none)fallback. (§6.3)AddMarketDataCanonicalConsole()logging-builder extension +
MarketDataConsoleFormatterproducing the canonical
{timestamp} - {logger_name} - {level} - {message}log line (opt-in). (§7)IsJson/IsCsv/IsHtmlformat-detection flags on every response via the
IMarketDataResponsecontract (typed JSON,CsvResponse,HtmlResponse).
(§11.6)- Concise
ToString()summaries on response wrappers (type, item count, HTTP
status, no-data marker) and primary data records — no raw payload dumps.
(§11.6) - Extension-aware
SaveToFile/SaveToFileAsyncthat select content by file
extension (.json/.csv/.html, falling back to the raw body) and
return the written path. (§11.6) - Configuration cascade: client-level defaults (
DefaultDateFormat,Mode,
Columns,AddHeaders,Human,MinimumLogLevel,OutputFormat) merge into
per-method parameters (method wins), plus newMARKETDATA_*formatting and
diagnostics environment variables:MARKETDATA_DATE_FORMAT,MARKETDATA_MODE,
MARKETDATA_COLUMNS,MARKETDATA_ADD_HEADERS,MARKETDATA_USE_HUMAN_READABLE,
MARKETDATA_LOGGING_LEVEL, andMARKETDATA_OUTPUT_FORMAT. (§4) - Cached
/status/retry gate: before retrying a server error the SDK consults a
per-service status snapshot (270s refresh / 300s validity); anOFFLINE
service fails immediately instead of retrying. (§9.5) IDisposableonMarketDataClientandApiClient(disposes the concurrency
semaphore; never the caller-ownedHttpClient). (§1)- Packaging: git-tag-driven versioning via MinVer, deterministic builds,
symbol package (.snupkg), Source Link (CI), package validation, and NuGet
metadata (README, license, repository/project URLs). (§15) - Continuous integration: cross-OS unit-test matrix (ubuntu, windows, macOS), a
line + branch coverage gate, a coverage-report artifact, and live integration
tests wired to run on pull requests and releases. (§13) - CI/CD supply-chain and cost hardening, mirroring the sibling MarketData SDKs:
Dependabot (github-actions+nuget, weekly) with an auto-merge workflow for
semver-minor/patch bumps; least-privilegepermissions: contents: readand a
PR-only cancel concurrency group on CI; a Codecov coverage upload (opencover)
plus CI/coverage README badges; OIDC Trusted Publishing to NuGet.org
(NuGet/login, no long-lived API key) with SLSA build-provenance attestation
of the.nupkg/.snupkgbefore push; a release-triggered changelog-update
automation; and a PR-vs-post-merge matrix split (PRs build ubuntu-only, main /
releases run the full OS matrix) that keeps the 100% coverage gate and PR
integration tests on every run. - This
CHANGELOG.md.
Changed
- Logs and telemetry now include the full request URL, query string included (via the
url.fullactivity tag and the request/response log lines), matching the URL already
reported on exceptions. The API token is never placed in the URL — it is sent only as
anAuthorization: Bearerheader and is redacted (last-4) wherever logged — so no
credential is exposed. AddMarketDataClientnow auto-wires the container'sILogger<MarketDataClient>
into the SDK when the application has logging configured, so SDK logs flow
automatically in DI apps without extra wiring. An explicitly supplied
MarketDataClientOptions.Loggeris respected and never overridden, and the
client still constructs silently when no logging is registered. Pairs with
AddMarketDataCanonicalConsole(). (§7)- Request timeout is fixed at 99 seconds and is no longer configurable. (§10)
MaxConcurrentRequestsis validated and capped to the range 1–50. (§12)- Automatic retries now apply only to HTTP 501–599 server errors and transient
network failures; other responses are not retried. request_idis read from thecf-rayresponse header first, then falls back
tox-request-id. (§6.2)- Support-info and diagnostic timestamps are rendered in US/Eastern time.
SupportInfois now a property, replacing the previousGetSupportInfo()
method. (§6.3)- Package version is no longer a hardcoded
<Version>literal; it is derived
from git tags at build time (with a0.0.0-alpha.0.Npre-release fallback for
untagged local/dev builds). (§15)
Removed
- Configurable
Timeoutoption and theMARKETDATA_TIMEOUTenvironment variable
(timeout is now fixed at 99s). (§10) - Undocumented
nonstandardparameter onoptions/expirations(retained on the
options chain, where it is documented). (§3) - Undocumented
countbackparameter onoptions/quotes. (§3) - Removed the deprecated
stocks/bulkquotesmethods
(GetBulkQuotesAsync/GetBulkQuotesCsvAsync) andStockBulkQuotesRequest; use
GetQuotesAsyncwith multiple symbols (thestocks/quotesendpoint now serves
bulk retrieval). (§3) - Removed the deprecated
options/strikessurface
(GetStrikesAsync/GetStrikesCsvAsync,OptionsStrikesRequest,OptionStrikes,
OptionsStrikesResponse); the/v1/options/strikes/endpoint is deprecated and
no longer documented. Use the options chain to discover available strikes.
Fixed
- Constructors no longer perform synchronous-over-async network I/O; startup
token validation moved toCreateAsync. (§§5, 8.1) - The news JSON endpoint now honors the
columnsprojection. (§3) - Local
dotnet buildno longer emits the Source Link
"Source control information is not available - the generated source link is
empty" warning: Source Link andContinuousIntegrationBuildare gated to CI,
where the repository resolves normally.
Version 1.0.0-rc.1
First published release of the C#/.NET SDK, offered as a release candidate. The public
API is feature-complete and no breaking changes are planned before 1.0.0.
Compliance work performed on the C#/.NET SDK after its donation by Omid Rad
(Exceptal) to Market Data. Changes are grouped by type and reference the
MarketData.app SDK requirements sections they satisfy.
Added
- Real XML documentation across the entire endpoint surface (59 public methods on the
five API classes): summaries, per-parameter docs, returns, the exceptions each method
can actually throw, a usage example per endpoint, and the canonical docs-site URL as
<seealso href>. Enforced in CI by a reflection test over the generated
MarketDataApp.xml(guarding content, where CS1591 only guarantees presence) plus a
live check that every canonical URL responds. (#21) AddMarketDataClientservice-collection extensions
(Microsoft.Extensions.DependencyInjection) registeringMarketDataClientas a
singleton over anIHttpClientFactory-managed HttpClient.MarketDataClient.CreateAsync(httpClient, options?, cancellationToken)async
factory: when a token is present andValidateTokenOnStartupis enabled
(default), it awaitsGET /user/to fail fast on a bad token
(AuthenticationException) and to seed the rate-limit snapshot. Demo mode and
opt-out skip the call. (§§5, 8.1)SupportInfoproperty that renders the mandated
--- MARKET DATA SUPPORT INFO ---block: snake_case labels in spec order
(request_id,request_url,status_code,timestamp,message,
exception_type), column-aligned, with a(none)fallback. (§6.3)AddMarketDataCanonicalConsole()logging-builder extension +
MarketDataConsoleFormatterproducing the canonical
{timestamp} - {logger_name} - {level} - {message}log line (opt-in). (§7)IsJson/IsCsv/IsHtmlformat-detection flags on every response via the
IMarketDataResponsecontract (typed JSON,CsvResponse,HtmlResponse).
(§11.6)- Concise
ToString()summaries on response wrappers (type, item count, HTTP
status, no-data marker) and primary data records — no raw payload dumps.
(§11.6) - Extension-aware
SaveToFile/SaveToFileAsyncthat select content by file
extension (.json/.csv/.html, falling back to the raw body) and
return the written path. (§11.6) - Configuration cascade: client-level defaults (
DefaultDateFormat,Mode,
Columns,AddHeaders,Human,MinimumLogLevel,OutputFormat) merge into
per-method parameters (method wins), plus newMARKETDATA_*formatting and
diagnostics environment variables:MARKETDATA_DATE_FORMAT,MARKETDATA_MODE,
MARKETDATA_COLUMNS,MARKETDATA_ADD_HEADERS,MARKETDATA_USE_HUMAN_READABLE,
MARKETDATA_LOGGING_LEVEL, andMARKETDATA_OUTPUT_FORMAT. (§4) - Cached
/status/retry gate: before retrying a server error the SDK consults a
per-service status snapshot (270s refresh / 300s validity); anOFFLINE
service fails immediately instead of retrying. (§9.5) IDisposableonMarketDataClientandApiClient(disposes the concurrency
semaphore; never the caller-ownedHttpClient). (§1)- Packaging: git-tag-driven versioning via MinVer, deterministic builds,
symbol package (.snupkg), Source Link (CI), package validation, and NuGet
metadata (README, license, repository/project URLs). (§15) - Continuous integration: cross-OS unit-test matrix (ubuntu, windows, macOS), a
line + branch coverage gate, a coverage-report artifact, and live integration
tests wired to run on pull requests and releases. (§13) - CI/CD supply-chain and cost hardening, mirroring the sibling MarketData SDKs:
Dependabot (github-actions+nuget, weekly) with an auto-merge workflow for
semver-minor/patch bumps; least-privilegepermissions: contents: readand a
PR-only cancel concurrency group on CI; a Codecov coverage upload (opencover)
plus CI/coverage README badges; OIDC Trusted Publishing to NuGet.org
(NuGet/login, no long-lived API key) with SLSA build-provenance attestation
of the.nupkg/.snupkgbefore push; a release-triggered changelog-update
automation; and a PR-vs-post-merge matrix split (PRs build ubuntu-only, main /
releases run the full OS matrix) that keeps the 100% coverage gate and PR
integration tests on every run. - This
CHANGELOG.md.
Changed
- Logs and telemetry now include the full request URL, query string included (via the
url.fullactivity tag and the request/response log lines), matching the URL already
reported on exceptions. The API token is never placed in the URL — it is sent only as
anAuthorization: Bearerheader and is redacted (last-4) wherever logged — so no
credential is exposed. AddMarketDataClientnow auto-wires the container'sILogger<MarketDataClient>
into the SDK when the application has logging configured, so SDK logs flow
automatically in DI apps without extra wiring. An explicitly supplied
MarketDataClientOptions.Loggeris respected and never overridden, and the
client still constructs silently when no logging is registered. Pairs with
AddMarketDataCanonicalConsole(). (§7)- Request timeout is fixed at 99 seconds and is no longer configurable. (§10)
MaxConcurrentRequestsis validated and capped to the range 1–50. (§12)- Automatic retries now apply only to HTTP 501–599 server errors and transient
network failures; other responses are not retried. request_idis read from thecf-rayresponse header first, then falls back
tox-request-id. (§6.2)- Support-info and diagnostic timestamps are rendered in US/Eastern time.
SupportInfois now a property, replacing the previousGetSupportInfo()
method. (§6.3)- Package version is no longer a hardcoded
<Version>literal; it is derived
from git tags at build time (with a0.0.0-alpha.0.Npre-release fallback for
untagged local/dev builds). (§15)
Removed
- Configurable
Timeoutoption and theMARKETDATA_TIMEOUTenvironment variable
(timeout is now fixed at 99s). (§10) - Undocumented
nonstandardparameter onoptions/expirations(retained on the
options chain, where it is documented). (§3) - Undocumented
countbackparameter onoptions/quotes. (§3) - Removed the deprecated
stocks/bulkquotesmethods
(GetBulkQuotesAsync/GetBulkQuotesCsvAsync) andStockBulkQuotesRequest; use
GetQuotesAsyncwith multiple symbols (thestocks/quotesendpoint now serves
bulk retrieval). (§3) - Removed the deprecated
options/strikessurface
(GetStrikesAsync/GetStrikesCsvAsync,OptionsStrikesRequest,OptionStrikes,
OptionsStrikesResponse); the/v1/options/strikes/endpoint is deprecated and
no longer documented. Use the options chain to discover available strikes.
Fixed
- Constructors no longer perform synchronous-over-async network I/O; startup
token validation moved toCreateAsync. (§§5, 8.1) - The news JSON endpoint now honors the
columnsprojection. (§3) - Local
dotnet buildno longer emits the Source Link
"Source control information is not available - the generated source link is
empty" warning: Source Link andContinuousIntegrationBuildare gated to CI,
where the repository resolves normally.