Skip to content

feat!: add Server Actor support and sync with Apify OpenAPI spec v2-2026-11-04T151257Z - #35

Merged
Pijukatel merged 6 commits into
masterfrom
claude/affectionate-lamport-3x9r01
Nov 9, 2026
Merged

Pijukatel merged 6 commits into
masterfrom
claude/affectionate-lamport-3x9r01

Conversation

@Pijukatel

@Pijukatel Pijukatel commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Syncs the Rust client with OpenAPI spec v2-2026-11-04T151257Z (apify/apify-docs#3083, #3084, #3152) and apify-client-js #1179, #1187, #1188, #1190 and #1197. Also applies requirement updates from apify/apify-client-orchestration#64 and #65. The crate version goes to 0.16.0 (breaking).

Spec sync

  • API_SPEC_VERSION is v2-2026-11-04T151257Z.
  • ActorVersion::actor_path added.
  • Actor Standby fields on Actor, with a new ActorStandby type. tenancy is documented and stays a String.

Server Actors (JS #1179)

  • ActorClient::server() returns an ActorServerClient with request, request_stream, get_url and get_open_api_spec. The deprecated standby() alias is kept.
  • The token goes in X-Apify-Authorization, and redirects are not followed.
  • Only 429 and 503 are retried. Error statuses come back as responses, not errors.
  • HttpRequest gained follow_redirects. ReqwestBackend keeps a second client that does not follow redirects (with_no_redirect_client).
  • HttpMethod gained Patch, Options and Trace.

Dataset page count (JS #1187, #1190)

  • PaginationList::count is now the larger of the scanned rows and the items returned. Iterators step by it, capped at the page size.
  • The docs now say that iterating dataset items without a page size loads the whole dataset in one response.

Signed URL validity (JS #1188)

  • A non-positive expires_in_secs fails with InvalidArgument before any request is sent.
  • New public constant common::MAX_EXPIRES_IN_SECS.
  • The expiry is counted from when the URL is signed, after the storage lookup.

Bug fixes

  • ListIterator::next no longer stops before matching rows that come after a page emptied by a filter.
  • Streaming calls (log stream, download_items_stream, request_stream) now retry through the same loop as buffered calls until the response starts.

Tests and docs

  • New offline tests are in tests/unit_server.rs, with additions to unit_http.rs and unit_resources.rs.
  • New live tests cover the Server Actor (against a temporary echo Actor), actorPath on versions, and dataset count.
  • README, docs and the CHANGELOG are updated.

Breaking changes

These are all listed in the CHANGELOG:

  • HttpRequest::follow_redirects and the new HttpMethod variants affect custom HTTP backends.
  • Actor and ActorVersion gained fields.
  • The meaning of count on dataset pages changed.

…026-11-04T151257Z

Ports the apify-client-js Server Actor client (`ActorClient::server`), the `count` of
dataset item pages, and the iteration page size documentation. Adds `actorPath` to Actor
versions and the Actor Standby fields to `Actor`.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017ocuAGnQ7tWM7EdPahZPAA
…review items

Retries the streaming calls until the response starts, rejects a non-positive
`expires_in_secs`, drops `HttpMethod::Connect`, bounds only the response start of server
streams, and documents the redirect contract of custom backends.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017ocuAGnQ7tWM7EdPahZPAA
…s review items

Does not read the body of an error response that a retry follows, saturates the signed
URL expiry instead of overflowing, corrects stale comments and the changelog wording, and
adds the missing offline tests of the streaming retries.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017ocuAGnQ7tWM7EdPahZPAA
Computes the expiry of a signed public URL in one validated helper that rejects a
non-positive validity and an overflowing one, instead of overflowing in the signer.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017ocuAGnQ7tWM7EdPahZPAA
Validates the validity up front (positive, at most a named maximum) and adds it to the
current time when the URL is signed, so a slow storage lookup does not come off the
validity. Clarifies two docs.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017ocuAGnQ7tWM7EdPahZPAA
… URL timing

Exposes `common::MAX_EXPIRES_IN_SECS`, documents it where `expires_in_secs` is described,
and covers the dataset items URL with the validity-from-signing test.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017ocuAGnQ7tWM7EdPahZPAA
@Pijukatel Pijukatel added adhoc Ad-hoc unplanned task added during the sprint. t-tooling Issues with this label are in the ownership of the tooling team. labels Nov 6, 2026 — with Claude
@apify-service-account apify-service-account added the tested Temporary label used only programatically for some analytics. label Nov 6, 2026
@Pijukatel
Pijukatel merged commit e5da77a into master Nov 9, 2026
4 of 8 checks passed
@Pijukatel
Pijukatel deleted the claude/affectionate-lamport-3x9r01 branch November 9, 2026 11:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

adhoc Ad-hoc unplanned task added during the sprint. t-tooling Issues with this label are in the ownership of the tooling team. tested Temporary label used only programatically for some analytics.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants