- Bumped
ApifyClientVersion.ApiSpecVersionto the Apify OpenAPI specv2-2026-07-07T132551Zand the project version to0.1.1. - Corrected a wrong
LastRunOptionsdoc comment:OriginandStatusare spec-declared query parameters on the last-run endpoints (the comment had claimedOriginwas not);waitForFinishis intentionally omitted for parity with the reference client'slastRun. Behaviour unchanged.
- Initial .NET client for the Apify API (spec
v2-2026-07-02T131926Z). - Resource clients for Actors, Actor versions and environment variables, builds, runs, datasets, key-value stores, request queues, tasks, schedules, webhooks, webhook dispatches, the Apify Store, users, and logs.
- Async-first API (
Task-returning,CancellationToken-aware) with convenience helpers consistent with the JS reference client:Actor().CallAsync()/StartAsync(),ValidateInputAsync(),DefaultBuildAsync(),LastRun(), runAbortAsync/MetamorphAsync/RebootAsync/ResurrectAsync/ChargeAsync/WaitForFinishAsync, datasetListItemsAsync/DownloadItemsAsync/PushItemsAsync/ public URLs, key-value store records and public URLs, request queue batch add with retries, and log streaming. - Auto-paging lazy iteration (
IAsyncEnumerable) across all collection clients (IterateAsync) and dataset items (IterateItemsAsync), plus request-queue and Store iteration, matching the reference client's paginated iterators. - Run log redirection:
RunClient.GetStreamedLog(toLog, fromStart)returns aStreamedLogthat forwards a run's live log to a sink one message at a time, andActor/TaskCallAsyncaccept alogsink that redirects the run's log for the duration of the wait. - Last-run accessors forward their
status/originfilters to the run's nested dataset, key-value store, request queue, and log clients. - Binary-safe storage payloads:
KeyValueStoreRecord.ValueandDownloadItemsAsyncreturnbyte[](raw bytes), andSetRecordAsyncacceptsbyte[], so binary records and exports (e.g. XLSX) are not corrupted;SetRecordJsonAsyncserializes to JSON bytes. RequestQueueRequest.UserDataandActorEnvVarName/Value/IsSecretomit the field when set tonull(rather than writing a JSONnull), honoring the documented null-omit contract.BatchAddRequestsAsyncrequires a non-emptyUniqueKeyper request, splits batches by both the 25-request count limit and the ~9 MiB payload-size limit, dispatches chunks with up toBatchAddRequestsOptions.MaxParallelconcurrent calls (results merged in input order), and retries only the requests the API reports unprocessed in a successful response. Consistent with the reference client, a failed batch call reports that chunk's not-yet-processed requests as unprocessed rather than throwing.PaginationList<T>.Countis the number of items in the page (matching the indexer); the total across all pages is exposed asTotal.Datasets().GetOrCreateAsync()andKeyValueStores().GetOrCreateAsync()accept an optional schema.RequestQueue(id, RequestQueueClientOptions)acceptsClientKeyandTimeoutSecs;PaginateRequestsAsync()acceptsPaginateRequestsOptions(Limit,MaxPageLimit,ExclusiveStartId,Cursor,Filter).- Replaceable HTTP transport (
IHttpTransport) with a defaultHttpClient-based implementation; automatic retries with exponential backoff and jitter, growing per-attempt timeouts, and HMAC-SHA256 storage URL signing. - Public
ApifyClientVersion.ClientVersionandApifyClientVersion.ApiSpecVersionconstants. - Integration test suite, documentation with runnable examples, a data-model property reference
(
docs/models.md), and CI workflows for integration tests and publishing (manual NuGet.org publish via Trusted Publishing: theNuGet/loginaction exchanges a GitHub OIDC token for a short-lived key, using only theNUGET_USERrepository secret — no long-lived NuGet API key is stored).