diff --git a/.github/workflows/dotnet-integration-tests.yml b/.github/workflows/dotnet-integration-tests.yml index 487f2f2..46fa3df 100644 --- a/.github/workflows/dotnet-integration-tests.yml +++ b/.github/workflows/dotnet-integration-tests.yml @@ -52,7 +52,11 @@ jobs: # Offline unit tests (mock transport): prove the retry/error/signature logic without the API. Every test step # sets TreatNoTestsAsError, so a filter that matches no tests fails the workflow instead of passing. + # The tests run in a non-UTC time zone, so that a date converted with the machine's local time zone shows + # up as a failure instead of passing by accident on the UTC runner. - name: Unit tests + env: + TZ: Asia/Tokyo run: dotnet test --configuration Release --no-build --filter Category=Unit -- RunConfiguration.TreatNoTestsAsError=true # Fail fast if the integration-test secret is missing or empty. Without this guard the diff --git a/.github/workflows/dotnet-publish.yml b/.github/workflows/dotnet-publish.yml index ceadc19..86c13b6 100644 --- a/.github/workflows/dotnet-publish.yml +++ b/.github/workflows/dotnet-publish.yml @@ -59,8 +59,12 @@ jobs: - name: Build (warnings as errors) run: dotnet build --configuration Release --no-restore + # The same settings as the unit-test step of the CI workflow: a non-UTC time zone, and a filter that matches + # no tests fails the release gate instead of passing it. - name: Unit tests - run: dotnet test --configuration Release --no-build --filter Category=Unit + env: + TZ: Asia/Tokyo + run: dotnet test --configuration Release --no-build --filter Category=Unit -- RunConfiguration.TreatNoTestsAsError=true - name: Resolve version from csproj id: version diff --git a/CHANGELOG.md b/CHANGELOG.md index 73e9893..35f8cf9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ # Changelog +## 0.9.0 + +- Added `ActorClient.Server()`, which returns an `ActorServerClient` for Server Actors (formerly Actor + Standby): `RequestAsync` sends a request to the Actor's server (token in `X-Apify-Authorization`, any + response returned, only 429 and 503 retried, no redirects followed), `GetUrlAsync` returns the server URL + and `GetOpenApiSpecAsync` its OpenAPI specification. New `ActorServerRequestOptions`, + `ActorServerResponse` and `ActorServerException`. `Content-*` headers of a request reach the server with the + request body. +- Requests that must not follow redirects set `ApifyRequestOptions.FollowRedirects` to `false`; a custom + `IHttpTransport` has to honor it. `HttpClientTransport` takes an optional second `HttpClient` with + automatic redirects disabled for them (it creates one when it creates its own `HttpClient`). +- **Breaking:** `PaginationList.Count` is now the number of entries the API went through for the page, as + `count` in the reference client, instead of the number of items. On a page from + `DatasetClient.ListItemsAsync` it is the larger of the rows the API scanned for it + (`X-Apify-Pagination-Count`) and the items returned, so filters such as `SkipEmpty` or `Clean` can leave it + above `Items.Count`. On any other list it is the `count` the API reports, which + exceeds `Items.Count` only where the API drops entries after counting them, as the Store listing does. Use + `Items.Count` for the number of items: the list's own count (`IReadOnlyCollection.Count`, LINQ's + `Count()`), enumeration and indexer still cover the items. Offset iteration steps by `Count`, capped at + the requested limit. +- `CreateItemsPublicUrlAsync` and `CreateKeysPublicUrlAsync` throw `ArgumentOutOfRangeException` before any + request for a zero or negative `expiresInSecs`, which used to produce a signed URL that had already expired. + Leave it out for a URL that never expires. +- Documented the page size used when iterating dataset items without `ChunkSize` (the whole dataset in one + response). +- Added `Actor.StandbyUrl`/`ActorStandby`/`TaggedBuilds`, `Build.ActorDefinition` and + `ActorVersion.ActorPath` (the Actor's directory inside an uploaded `SOURCE_FILES` or `TARBALL` source). +- Bumped `ApifyClientVersion.ApiSpecVersion` to the Apify OpenAPI spec `v2-2026-11-04T151257Z` and the + project version to `0.9.0`; regenerated the embedded response schemas (`actorPath` on versions and + builds). + ## 0.8.0 - `PushItemsAsync` no longer retries a request that timed out, because the API may already have stored the diff --git a/README.md b/README.md index c5216b8..1a9a788 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,8 @@ var run = await client.Actor("apify/hello-world").CallAsync(); // Read items from the run's default dataset. var items = await client.Dataset(run.DefaultDatasetId!).ListItemsAsync(); -// Count is the number of items in THIS page; Total is the dataset's full count across all pages. -Console.WriteLine($"Items on this page: {items.Count} (of {items.Total} total)"); +// Items.Count is the number of items in THIS page; Total is the dataset's full count across all pages. +Console.WriteLine($"Items on this page: {items.Items.Count} (of {items.Total} total)"); ``` `new ApifyClient("my-api-token")` takes the token as an explicit argument — it does **not** read diff --git a/docs/README.md b/docs/README.md index 0fc2fad..dadb17a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,7 +13,7 @@ signatures on the pages below for brevity). Method names mirror the reference cl ## Contents -- [Actors](actors.md) — create, run, build, validate input, versions and environment variables. +- [Actors](actors.md) — create, run, build, validate input, Server Actors, versions and environment variables. - [Builds](builds.md) — fetch, wait, abort, logs, OpenAPI definition. - [Runs](runs.md) — get/wait, abort, metamorph, reboot, resurrect, charge, storages, logs. - [Storages](storages.md) — datasets, key-value stores, request queues. @@ -51,8 +51,8 @@ var run = await client.Actor("apify/hello-world").CallAsync(); // Read items from the run's default dataset. var items = await client.Dataset(run.DefaultDatasetId!).ListItemsAsync(); -// Count is the number of items in THIS page; Total is the dataset's full count across all pages. -Console.WriteLine($"Items on this page: {items.Count} (of {items.Total} total)"); +// Items.Count is the number of items in THIS page; Total is the dataset's full count across all pages. +Console.WriteLine($"Items on this page: {items.Items.Count} (of {items.Total} total)"); ``` `new ApifyClient("my-api-token")` takes the token as an explicit argument — it does **not** read @@ -74,7 +74,7 @@ the `using` directives for whichever ones a file references: | `Apify.Client.Resources` | Every resource client the entry point returns — `ActorClient`, `RunClient`, `BuildClient`, `DatasetClient`, `KeyValueStoreClient`, `RequestQueueClient`, `TaskClient`, `ScheduleClient`, `LogClient`, `UserClient`, `ActorVersionClient`, `ActorEnvVarClient`, the `…CollectionClient` types (including `ActorVersionCollectionClient`, `ActorEnvVarCollectionClient`, `NestedWebhookCollectionClient`, and `WebhookDispatchCollectionClient`), etc. | | `Apify.Client.Models` | Data models returned by the clients — `Actor`, `ActorRun`, `Build`, `Dataset`, `RequestQueueRequest`, `ActorEnvVar`, `PaginationList`, and so on. | | `Apify.Client.Options` | The option/request objects passed into methods — `ActorStartOptions`, `ActorBuildOptions`, `ActorListOptions`, `RunListOptions`, `RunResurrectOptions`, `RunChargeOptions`, `MetamorphOptions`, `LastRunOptions`, `DatasetListItemsOptions`, `DatasetDownloadOptions`, `DownloadItemsFormat`, `GetRecordOptions`, `SetRecordOptions`, `ListKeysOptions`, `IterateKeysOptions`, `ListRequestsOptions`, `PaginateRequestsOptions`, `BatchAddRequestsOptions`, `RequestQueueClientOptions`, `TaskStartOptions`, `ValidateInputOptions`, `LogOptions`, `ListOptions`, `StorageListOptions`, `StoreListOptions`. | -| `Apify.Client.Exceptions` | `ApifyClientException` (common base), `ApifyApiException` (and its per-status subclasses), `ApifyTransportException`, `InvalidResponseBodyException` and `ResponseValidationException`. | +| `Apify.Client.Exceptions` | `ApifyClientException` (common base), `ApifyApiException` (and its per-status subclasses), `ApifyTransportException`, `InvalidResponseBodyException`, `ResponseValidationException` and `ActorServerException`. | | `Apify.Client.Http` | The replaceable transport: `IHttpTransport` and the default `HttpClientTransport`. | | `System.Text.Json.Nodes` (BCL) | Not an Apify namespace, but required whenever you name the JSON escape-hatch types the client returns/accepts — `JsonObject`/`JsonNode` (e.g. dataset items, `GetInputAsync`/`UpdateInputAsync`, `GetStatisticsAsync`, `GetOpenApiDefinitionAsync`, `MonthlyUsageAsync`/`LimitsAsync`, `RequestQueueRequest.UserData`). Add `using System.Text.Json.Nodes;`. | @@ -203,6 +203,15 @@ var client = new ApifyClient(new ApifyClientOptions }); ``` +Requests to an Actor's server (`client.Actor(id).Server()`, see [Actors](actors.md)) must not follow +redirects, because they carry the API token in a header. They set +`Apify.Client.Http.ApifyRequestOptions.FollowRedirects` to `false` in `HttpRequestMessage.Options`, and a +custom `IHttpTransport` has to return a redirect response as it is for such a request. `HttpClientTransport` +does this with a second `HttpClient` that has automatic redirects disabled: it creates one itself, but a +transport wrapping your own `HttpClient` needs one too, passed as the second constructor argument +(`new HttpClientTransport(httpClient, noRedirectHttpClient)`), otherwise such a request throws +`InvalidOperationException`. + ## Error handling Methods that fetch a single resource return `null` when the resource does not exist (rather than @@ -248,8 +257,9 @@ not break the client. The response arrived in full, so neither is retried. Both expose `StatusCode`, `HttpMethod`, `Path` and the raw `Body`. An error status with an unparsable body throws the `ApifyApiException` for its status code, with the raw body in its message. -`ApifyApiException`, `ApifyTransportException`, `InvalidResponseBodyException` and -`ResponseValidationException` extend the common +`ApifyApiException`, `ApifyTransportException`, `InvalidResponseBodyException`, +`ResponseValidationException` and `ActorServerException` (an Actor that is not a Server Actor, see +[Actors](actors.md)) extend the common `ApifyClientException`, so `catch (ApifyClientException)` catches every error this client raises for a failed call without naming the concrete types: diff --git a/docs/actors.md b/docs/actors.md index 725a2e6..7997d75 100644 --- a/docs/actors.md +++ b/docs/actors.md @@ -59,6 +59,7 @@ without re-encoding it as JSON. - `Builds()` → `BuildCollectionClient`; `Runs()` → `RunCollectionClient`. - `Version(string versionNumber)` → `ActorVersionClient`; `Versions()` → `ActorVersionCollectionClient` — a single Actor version and the version collection. - `Webhooks()` → read-only `NestedWebhookCollectionClient`. +- `Server()` → `ActorServerClient` — the Actor's server interface, see [Server Actors](#server-actors--clientactoridserver). `ActorStartOptions` fields: @@ -95,6 +96,80 @@ against) and `ContentType` (`string?`, content type of the input; defaults to `a `LastRunOptions` fields: `Status` (`string?`, only consider the last run with this status, e.g. `SUCCEEDED`) and `Origin` (`string?`, only consider the last run started from this origin, e.g. `API`). +## Server Actors — `client.Actor(id).Server()` + +A Server Actor (formerly Actor Standby) runs a web server that is called over HTTP without starting a run +for each call. `Server()` returns an `ActorServerClient`; every call returns the same client, so the server +URL it fetches is reused. + +- `RequestAsync(string path = "/", ActorServerRequestOptions? options = null)` → `ActorServerResponse` — + sends a request to the Actor's server and returns its response, whatever its status. +- `GetUrlAsync()` → `string` — the server URL (the Actor's `standbyUrl`), to call the server with another + HTTP client. Fetched from the API on the first call of `GetUrlAsync`, `GetOpenApiSpecAsync` or + `RequestAsync`, then reused. +- `GetOpenApiSpecAsync()` → `JsonObject?` — the web server schema (OpenAPI specification) of the build that + serves the server: `actorStandby.build` (a tag or a build number) or `latest`; `null` if the definition has + none. +- `WithTimeout(TimeSpan timeout)` — the timeout of the API calls made by `GetUrlAsync` and + `GetOpenApiSpecAsync`. + +They throw `ActorServerException` when the Actor is not a Server Actor (or the serving build does not exist), +and the usual `ApifyApiException` when it does not exist. `RequestAsync` also throws +`InvalidOperationException` when the client's `HttpClientTransport` wraps your own `HttpClient` without a +second one that does not follow redirects (see +[Replaceable HTTP transport](README.md#replaceable-http-transport)). + +`RequestAsync` details: + +- The request goes to the server URL, and `path` is always resolved against it (a fragment is dropped), so + neither the request nor the token can reach another host. +- The token travels in the `X-Apify-Authorization` header, which the platform removes before the request + reaches the Actor's code. Headers you pass, `Authorization` included, reach the Actor as they are. +- Any response is returned, error statuses included. Only 429 and 503 are retried (with the client's retry + settings, returning the last response when they run out), because other statuses can come from the Actor's + code. Network errors and timeouts are not retried, since the Actor may have already handled the request, and + a redirect is returned as it is instead of followed. +- Bodies are sent uncompressed unless `Compressor` is set. The timeout defaults to the `Long` tier, which + covers the cold start of an idle Actor. + +`ActorServerRequestOptions` fields: + +| Field | Type | Description | +|---|---|---| +| `Method` | `HttpMethod?` | HTTP method. Defaults to `GET`. | +| `Query` | `IReadOnlyDictionary?` | Query parameters; `null` values are left out, booleans become `1`/`0`, dates ISO 8601 in UTC (a `DateTime` of unspecified kind is taken as UTC) and lists their comma-joined values. | +| `Headers` | `IReadOnlyDictionary?` | Additional request headers. A `Content-Type` header equals `ContentType`; a `Content-Encoding` header marks a body that is already encoded and is then not compressed; other `Content-*` headers (e.g. `Content-Disposition`) are sent only with a `Body`. | +| `Body` | `object?` | Request body: `byte[]` and `string` are sent as they are, anything else is serialized to JSON. | +| `ContentType` | `string?` | Content type of the body; defaults to `application/json`, `text/plain; charset=utf-8` for a string and `application/octet-stream` for bytes. | +| `Compressor` | `HttpCompressor?` | Compressor of the body (e.g. `new GzipHttpCompressor()`). Set it only if the Actor's server decodes the resulting `Content-Encoding`. | +| `StreamResponse` | `bool` | Return the response body unread, to read it with `ReadAsStreamAsync`. The response holds its connection until disposed. | +| `Timeout` | `TimeSpan?` | Timeout of the request; defaults to the `Long` tier. | + +`ActorServerResponse` is `IDisposable` (dispose it when done) and has `StatusCode`, `IsSuccess`, `Headers` +(case-insensitive), `ContentType`, `ReadAsBytesAsync()`, `ReadAsStringAsync()`, `ReadAsStreamAsync()` and +`ReadAsJsonAsync()` (`JsonNode?`; throws `InvalidResponseBodyException` for a body that is not JSON). + +```csharp +using System; +using System.Collections.Generic; +using Apify.Client; +using Apify.Client.Options; + +var client = new ApifyClient("my-api-token"); +var server = client.Actor("username/actor-name").Server(); + +using var response = await server.RequestAsync( + "/search", + new ActorServerRequestOptions { Query = new Dictionary { ["q"] = "apify" } }); +if (response.IsSuccess) +{ + Console.WriteLine(await response.ReadAsJsonAsync()); +} + +Console.WriteLine(await server.GetUrlAsync()); +Console.WriteLine(await server.GetOpenApiSpecAsync()); +``` + ## Versions and environment variables Manage an Actor's versions with `client.Actor(id).Versions()` (the whole collection) and diff --git a/docs/examples.md b/docs/examples.md index 1001d2d..3b0be00 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -29,8 +29,8 @@ var client = new ApifyClient( // The third argument bounds the wait in seconds (120 here); pass null to wait indefinitely. var run = await client.Actor("apify/hello-world").CallAsync(null, null, 120); var items = await client.Dataset(run.DefaultDatasetId!).ListItemsAsync(new DatasetListItemsOptions()); -// Count is the number of items in THIS page; Total is the dataset's full count across all pages. -Console.WriteLine($"Items on this page: {items.Count} (of {items.Total} total)"); +// Items.Count is the number of items in THIS page; Total is the dataset's full count across all pages. +Console.WriteLine($"Items on this page: {items.Items.Count} (of {items.Total} total)"); ``` ## Each storage: create, push, read @@ -40,7 +40,7 @@ Console.WriteLine($"Items on this page: {items.Count} (of {items.Total} total)") var dataset = await client.Datasets().GetOrCreateAsync("example-ds"); await client.Dataset(dataset.Id!).PushItemsAsync(new[] { new { hello = "world" } }); var items = await client.Dataset(dataset.Id!).ListItemsAsync(new DatasetListItemsOptions()); -Console.WriteLine("Dataset items: " + items.Count); +Console.WriteLine("Dataset items: " + items.Items.Count); // Key-value store var store = await client.KeyValueStores().GetOrCreateAsync("example-kvs"); diff --git a/docs/models.md b/docs/models.md index cf88551..6cec4ac 100644 --- a/docs/models.md +++ b/docs/models.md @@ -41,6 +41,9 @@ Base class for every JSON-backed model below. | `IsPublic` | `bool?` | Whether the Actor is published publicly in the Apify Store. | | `CreatedAt` | `string?` | ISO 8601 creation timestamp. | | `ModifiedAt` | `string?` | ISO 8601 last-modification timestamp. | +| `StandbyUrl` | `string?` | URL of the Actor's server when it is a Server Actor (see [`ActorServerClient`](actors.md#server-actors--clientactoridserver)); `null` otherwise. | +| `ActorStandby` | `JsonObject?` | The Server Actor settings: `isEnabled`, `build`, `memoryMbytes`, `idleTimeoutSecs`, `tenancy` (`SINGLE_TENANT` or `MULTI_TENANT`) and others. | +| `TaggedBuilds` | `JsonObject?` | The builds the Actor's tags point to, keyed by tag (e.g. `latest`); each value has `buildId` and `buildNumber`. | ## `ActorRun` @@ -78,6 +81,7 @@ Base class for every JSON-backed model below. | `ExitCode` | `long?` | Exit code of the build process (`0` on success); absent while building. | | `GitBranchName` | `string?` | Git branch the build's source was taken from, for Git-based sources. | | `GitCommitId` | `string?` | Git commit the build's source was taken from, for Git-based sources. | +| `ActorDefinition` | `JsonObject?` | The Actor definition the build was made from, including its `webServerSchema`. | | `IsTerminal` | `bool` | `true` if `Status` is a terminal state. | ## `ActorVersion` @@ -86,6 +90,7 @@ Base class for every JSON-backed model below. |---|---|---| | `VersionNumber` | `string?` | The version's number (e.g. `0.1`). | | `SourceType` | `string?` | How the source is provided (e.g. `SOURCE_FILES`, `GIT_REPO`, `TARBALL`, `GITHUB_GIST`). | +| `ActorPath` | `string?` | The Actor's directory inside the uploaded source of a `SOURCE_FILES` or `TARBALL` version (relative to the upload root, `/` separators, e.g. `actors/typescript-actor`); `null` when the upload root is the Actor's directory. A `TARBALL` source is a zip archive. | ## `ActorEnvVar` @@ -351,7 +356,7 @@ One page of a paginated listing, returned by every `ListAsync` method. | Property | Type | Description | |---|---|---| | `Items` | `IReadOnlyList` | The items on this page. | -| `Count` | `long` | Number of items on this page (equals `Items.Count`). | +| `Count` | `long` | Number of entries the API went through for this page. On a page of dataset items, the larger of the dataset rows it scanned and the items returned, so filters such as `SkipEmpty` or `Clean` can leave it above `Items.Count`; the next page starts at `Offset + Math.Min(Count, Limit)`. On any other page, the `count` the API reports, which is the number of items except where the API drops entries after counting them (the Store listing). Use `Items.Count` for the number of items: the list's own count (`IReadOnlyCollection.Count`, LINQ's `Count()`), enumeration and indexer cover the items only. | | `Total` | `long` | Total number of items across all pages. | | `Offset` | `long` | The offset this page started at. | | `Limit` | `long` | The page-size limit that was applied. | diff --git a/docs/storages.md b/docs/storages.md index 9394b2e..f81802f 100644 --- a/docs/storages.md +++ b/docs/storages.md @@ -27,7 +27,9 @@ reached from a run (`client.Run(id).Dataset()`, `.KeyValueStore()`, `.RequestQue - `GetAsync()` → `Dataset?`; `UpdateAsync(object newFields)` → `Dataset`; `DeleteAsync()`. - `ListItemsAsync(DatasetListItemsOptions? options = null)` → `PaginationList` (one page; pagination via - response headers). + response headers). The page's `Count` is the larger of the dataset rows the API scanned and the items returned, + so `Clean`/`SkipEmpty` can leave it above `Items.Count`; to page by hand, request the next page at + `Offset + Math.Min(Count, Limit)`, and use `Items.Count` for the number of items. - `IterateItemsAsync(DatasetListItemsOptions? options = null)` → `IAsyncEnumerable` — lazily iterate every item across pages, fetching each page on demand. - `DownloadItemsAsync(DownloadItemsFormat format, DatasetDownloadOptions? options = null)` → serialized items as @@ -40,11 +42,12 @@ reached from a run (`client.Run(id).Dataset()`, `.KeyValueStore()`, `.RequestQue serialization). Anything else, such as a bare number or an array of non-objects, throws `ArgumentException` before a request is sent, because the API accepts only objects. - `GetStatisticsAsync()` → `JsonObject` (throws if the dataset does not exist). -- `CreateItemsPublicUrlAsync(DatasetListItemsOptions? options = null, int? expiresInSecs = null, DownloadItemsFormat? format = null)` → `string` (a signed public URL; `format` defaults to `Json`). +- `CreateItemsPublicUrlAsync(DatasetListItemsOptions? options = null, int? expiresInSecs = null, DownloadItemsFormat? format = null)` → `string` (a signed public URL; `format` defaults to `Json`; `expiresInSecs` must be positive, leave it out for a URL that never expires, otherwise `ArgumentOutOfRangeException` is thrown before any request). `DatasetListItemsOptions` selects and reshapes items: `Offset`/`Limit` (pagination: `Limit` is the number of dataset rows read, in total across pages when iterating; `0` or unset means no cap), `ChunkSize` (the page -size `IterateItemsAsync` requests, never sent to the API), `Desc` (reverse +size `IterateItemsAsync` requests, never sent to the API; without it and `Limit`, iteration loads the whole +dataset in one response), `Desc` (reverse order), `Fields`/`OutputFields`/`Omit` (choose columns), `Unwind`/`Flatten` (restructure nested fields), `Clean`/`SkipEmpty`/`SkipHidden`/`SkipFailedPages` (drop unwanted rows), `Simplified`, `View`, and `Signature` (for signed public URLs). @@ -87,7 +90,7 @@ var client = new ApifyClient("my-api-token"); var dataset = await client.Datasets().GetOrCreateAsync("my-dataset"); await client.Dataset(dataset.Id!).PushItemsAsync(new[] { new { url = "https://a.com", n = 1 } }); var page = await client.Dataset(dataset.Id!).ListItemsAsync(new DatasetListItemsOptions { Limit = 100 }); -Console.WriteLine(page.Count); // items in this page; page.Total is the count across all pages +Console.WriteLine(page.Items.Count); // items in this page; page.Total is the count across all pages var csvBytes = await client.Dataset(dataset.Id!).DownloadItemsAsync(DownloadItemsFormat.Csv); Console.WriteLine(Encoding.UTF8.GetString(csvBytes)); // CSV is text; decode the raw bytes @@ -114,7 +117,7 @@ await csvStream.CopyToAsync(file); `SetRecordJsonAsync(string key, object? value)` (serializes `value` to JSON bytes). - `DeleteRecordAsync(string key)`. - `GetRecordPublicUrlAsync(string key)` → `string` and - `CreateKeysPublicUrlAsync(ListKeysOptions? options = null, int? expiresInSecs = null)` → `string` (both signed public URLs). + `CreateKeysPublicUrlAsync(ListKeysOptions? options = null, int? expiresInSecs = null)` → `string` (both signed public URLs; `expiresInSecs` must be positive, leave it out for a URL that never expires, otherwise `ArgumentOutOfRangeException` is thrown before any request). `ListKeysOptions` fields: `Limit` (page size), `ExclusiveStartKey` (start after this key), `Prefix` (only keys with this prefix), `Collection` (a named record collection), and `Signature` diff --git a/src/Apify.Client/Apify.Client.csproj b/src/Apify.Client/Apify.Client.csproj index 8788d59..9d450ce 100644 --- a/src/Apify.Client/Apify.Client.csproj +++ b/src/Apify.Client/Apify.Client.csproj @@ -6,7 +6,7 @@ Apify.Client - 0.8.0 + 0.9.0 Apify Apify Apify API client for .NET diff --git a/src/Apify.Client/ApifyClientVersion.cs b/src/Apify.Client/ApifyClientVersion.cs index d949c58..a56fe8b 100644 --- a/src/Apify.Client/ApifyClientVersion.cs +++ b/src/Apify.Client/ApifyClientVersion.cs @@ -14,11 +14,11 @@ public static class ApifyClientVersion /// The semantic version of this client library (see https://semver.org/). Changes to the public /// interface other than additive ones are considered breaking changes. /// - public const string ClientVersion = "0.8.0"; + public const string ClientVersion = "0.9.0"; /// /// The version of the Apify OpenAPI specification this client was generated and verified against. /// Corresponds to the info.version field of the Apify OpenAPI document. /// - public const string ApiSpecVersion = "v2-2026-10-29T100357Z"; + public const string ApiSpecVersion = "v2-2026-11-04T151257Z"; } diff --git a/src/Apify.Client/Exceptions/ActorServerException.cs b/src/Apify.Client/Exceptions/ActorServerException.cs new file mode 100644 index 0000000..4894cb4 --- /dev/null +++ b/src/Apify.Client/Exceptions/ActorServerException.cs @@ -0,0 +1,17 @@ +namespace Apify.Client.Exceptions; + +/// +/// Thrown by when the Actor cannot be used as a Server Actor: it does +/// not serve a web server, or the build that should serve its server interface does not exist. A missing Actor +/// is reported as the usual instead. Matches the reference client's +/// ApifyClientError for these cases. +/// +public sealed class ActorServerException : ApifyClientException +{ + /// Creates a Server Actor exception with the given message. + /// A description of the failure. + public ActorServerException(string message) + : base(message) + { + } +} diff --git a/src/Apify.Client/Http/ApifyRequestOptions.cs b/src/Apify.Client/Http/ApifyRequestOptions.cs new file mode 100644 index 0000000..833c1dd --- /dev/null +++ b/src/Apify.Client/Http/ApifyRequestOptions.cs @@ -0,0 +1,23 @@ +using System.Net.Http; + +namespace Apify.Client.Http; + +/// +/// Keys of the per-request settings the client passes to an in +/// . +/// +/// +/// A custom transport has to honour them, or it can send the API token somewhere it must not go. The built-in +/// does. +/// +public static class ApifyRequestOptions +{ + /// + /// Set to false on a request that must not follow redirects: the transport returns a redirect + /// response as it is. The client sets it on requests to an Actor's server (see + /// ), because they carry the API token in a header that an + /// automatic redirect would send to a host the Actor's code picked. A request without the option follows + /// redirects as usual. + /// + public static readonly HttpRequestOptionsKey FollowRedirects = new("Apify.FollowRedirects"); +} diff --git a/src/Apify.Client/Http/HttpClientTransport.cs b/src/Apify.Client/Http/HttpClientTransport.cs index 6641945..bb7fb6f 100644 --- a/src/Apify.Client/Http/HttpClientTransport.cs +++ b/src/Apify.Client/Http/HttpClientTransport.cs @@ -22,37 +22,65 @@ public sealed class HttpClientTransport : IHttpTransport, IDisposable private static readonly TimeSpan ConnectTimeout = TimeSpan.FromSeconds(30); private readonly HttpClient _httpClient; + private readonly HttpClient? _noRedirectClient; private readonly bool _ownsClient; + private readonly bool _ownsNoRedirectClient; /// - /// Creates a transport, optionally wrapping a caller-supplied (e.g. one - /// configured with a proxy or custom TLS). When none is given, an internal client is created and - /// disposed with this instance. + /// Creates a transport, optionally wrapping caller-supplied s (e.g. ones + /// configured with a proxy or custom TLS). For any client that is not supplied, an internal one is created + /// and disposed with this instance. /// + /// + /// A request that must not follow redirects (see , used for + /// requests to an Actor's server) is sent through the no-redirect client. A client supplied as + /// cannot be switched to that mode, so supply a second one with automatic + /// redirects disabled as , configured like the first one otherwise; + /// without it, such a request throws rather than risk following a + /// redirect with the API token. + /// /// An optional pre-configured HTTP client to use. - public HttpClientTransport(HttpClient? httpClient = null) + /// + /// An optional pre-configured HTTP client whose handler does not follow redirects, used for requests that + /// must not follow them. Required for those requests when is supplied. + /// + public HttpClientTransport(HttpClient? httpClient = null, HttpClient? noRedirectHttpClient = null) { - if (httpClient is not null) + _httpClient = httpClient ?? CreateOwnedClient(allowAutoRedirect: true); + _ownsClient = httpClient is null; + + // A transport that owns its main client can create the matching no-redirect one; one wrapping a + // caller's client has to be given it. + _noRedirectClient = noRedirectHttpClient ?? (httpClient is null ? CreateOwnedClient(allowAutoRedirect: false) : null); + _ownsNoRedirectClient = noRedirectHttpClient is null && httpClient is null; + } + + private static HttpClient CreateOwnedClient(bool allowAutoRedirect) + { + var handler = new SocketsHttpHandler { - _httpClient = httpClient; - _ownsClient = false; - } - else + ConnectTimeout = ConnectTimeout, + AllowAutoRedirect = allowAutoRedirect, + // The API advertises brotli/gzip/deflate response compression on the dataset-items and + // key-value-store record endpoints. Enabling automatic decompression makes the handler send + // the matching `Accept-Encoding` request header and transparently inflate the response, so + // compressed payloads are handled the same way as in the reference JS client. + AutomaticDecompression = DecompressionMethods.Brotli | DecompressionMethods.GZip | DecompressionMethods.Deflate, + }; + // The client-side retry orchestrator owns the per-request timeout, so disable HttpClient's own. + return new HttpClient(handler) { Timeout = Timeout.InfiniteTimeSpan }; + } + + private HttpClient ClientFor(HttpRequestMessage request) + { + if (!request.Options.TryGetValue(ApifyRequestOptions.FollowRedirects, out var followRedirects) || followRedirects) { - var handler = new SocketsHttpHandler - { - ConnectTimeout = ConnectTimeout, - AllowAutoRedirect = true, - // The API advertises brotli/gzip/deflate response compression on the dataset-items and - // key-value-store record endpoints. Enabling automatic decompression makes the handler send - // the matching `Accept-Encoding` request header and transparently inflate the response, so - // compressed payloads are handled the same way as in the reference JS client. - AutomaticDecompression = DecompressionMethods.Brotli | DecompressionMethods.GZip | DecompressionMethods.Deflate, - }; - // The client-side retry orchestrator owns the per-request timeout, so disable HttpClient's own. - _httpClient = new HttpClient(handler) { Timeout = Timeout.InfiniteTimeSpan }; - _ownsClient = true; + return _httpClient; } + + return _noRedirectClient ?? throw new InvalidOperationException( + "The request must not follow redirects, but this HttpClientTransport wraps an HttpClient it cannot switch to that mode. " + + "Pass a second HttpClient with automatic redirects disabled as the noRedirectHttpClient argument."); } /// @@ -74,7 +102,7 @@ public async Task SendAsync( try { - return await _httpClient.SendAsync(request, completion, timeoutCts.Token).ConfigureAwait(false); + return await ClientFor(request).SendAsync(request, completion, timeoutCts.Token).ConfigureAwait(false); } catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) { @@ -92,12 +120,17 @@ public async Task SendAsync( } } - /// Disposes the internally-created (a supplied one is left alone). + /// Disposes the internally-created s (supplied ones are left alone). public void Dispose() { if (_ownsClient) { _httpClient.Dispose(); } + + if (_ownsNoRedirectClient) + { + _noRedirectClient?.Dispose(); + } } } diff --git a/src/Apify.Client/Http/IHttpTransport.cs b/src/Apify.Client/Http/IHttpTransport.cs index fac5d16..c6d7477 100644 --- a/src/Apify.Client/Http/IHttpTransport.cs +++ b/src/Apify.Client/Http/IHttpTransport.cs @@ -21,6 +21,12 @@ namespace Apify.Client.Http; /// . /// /// +/// A request that sets to false in +/// carries the API token in a header that must not follow a redirect to +/// another host, so the implementation has to return a redirect response as it is. The client sets it on +/// requests to an Actor's server. +/// +/// /// Swap the default implementation () via /// to share a connection pool, customize /// TLS/proxy settings, or inject a mock in tests. diff --git a/src/Apify.Client/Internal/HttpClientCore.cs b/src/Apify.Client/Internal/HttpClientCore.cs index 43ce7f6..e669417 100644 --- a/src/Apify.Client/Internal/HttpClientCore.cs +++ b/src/Apify.Client/Internal/HttpClientCore.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Linq; using System.IO; using System.Net.Http; using System.Net.Http.Headers; @@ -19,7 +20,7 @@ namespace Apify.Client.Internal; internal sealed class HttpClientCore { /// Status returned when the per-resource rate limit is hit. - private const int RateLimitExceeded = 429; + public const int RateLimitExceeded = 429; /// Statuses at or above this value are treated as retryable internal server errors. private const int MinServerError = 500; @@ -32,6 +33,18 @@ internal sealed class HttpClientCore private const int NotFound = 404; + /// Prefix of the headers that describe a request body; they belong to the body, not to the request. + private const string ContentHeaderPrefix = "Content-"; + + /// The header that carries the media type of a request body. + public const string ContentTypeHeader = "Content-Type"; + + /// The header that carries the encoding (compression) of a request body. + public const string ContentEncodingHeader = "Content-Encoding"; + + /// Content headers the client derives from the body itself, so a caller-supplied value is ignored. + private static readonly string[] BodyDerivedContentHeaders = { ContentTypeHeader, ContentEncodingHeader, "Content-Length" }; + /// /// Request bodies whose size in bytes is at or above this threshold are compressed before sending, /// matching the reference client's minimum-compression size. @@ -144,7 +157,9 @@ public HttpClientCore( /// /// Sends a request with auth, User-Agent and the retry policy applied, returning the successful - /// response (the caller owns and disposes it). + /// response (the caller owns and disposes it). A other than + /// changes how the call authenticates, which responses it retries and + /// whether an error response is returned instead of thrown. /// public async Task CallAsync( HttpMethod method, @@ -157,8 +172,10 @@ public async Task CallAsync( IReadOnlyDictionary? extraHeaders = null, RequestTier tier = RequestTier.Long, string? explicitContentEncoding = null, + RequestPolicy? policy = null, CancellationToken cancellationToken = default) { + policy ??= RequestPolicy.Default; _stats.AddCall(); var delayMillis = _retry.MinDelayMillis; var maxAttempts = _retry.MaxRetries + 1; @@ -176,7 +193,7 @@ public async Task CallAsync( // skips this: the bytes are already in their final, encoded form and must reach the API unchanged. var prepared = explicitContentEncoding is not null ? new PreparedBody(bodyBytes ?? (body is not null ? Encoding.UTF8.GetBytes(body) : null), contentType, explicitContentEncoding) - : await PrepareBodyAsync(body, bodyBytes, contentType, cancellationToken).ConfigureAwait(false); + : await PrepareBodyAsync(body, bodyBytes, contentType, policy, cancellationToken).ConfigureAwait(false); Exception? lastError = null; for (var attempt = 1; attempt <= maxAttempts; attempt++) @@ -186,7 +203,7 @@ public async Task CallAsync( { _stats.AddRequest(); var response = await SendOnceAsync( - method, url, prepared, extraHeaders, + method, url, prepared, extraHeaders, policy, AttemptTimeout(baseTimeout, overallCap, attempt), cancellationToken).ConfigureAwait(false); var status = (int)response.StatusCode; @@ -198,21 +215,30 @@ public async Task CallAsync( return response; } - if (status == RateLimitExceeded) + // The statistics track the API's rate limits; only API calls throw on an error status, so a call + // that returns error responses is not an API call and its 429s stay out of them. + if (status == RateLimitExceeded && policy.ThrowOnErrorStatus) { _stats.AddRateLimitError(attempt); } + retryable = IsStatusRetryable(status, policy); + if (!policy.ThrowOnErrorStatus && (!retryable || attempt == maxAttempts)) + { + response.RequestMessage = new HttpRequestMessage(method, url); + return response; + } + var errorBody = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); response.Dispose(); lastError = BuildApiError(status, errorBody, attempt, method.Method, path); - retryable = IsStatusRetryable(status); } catch (ApifyTransportException ex) { lastError = ex; - // Network/timeout failures are retryable, unless the caller opted out of retrying timeouts. - retryable = !(doNotRetryTimeouts && ex.IsTimeout); + // Network/timeout failures are retryable, unless the caller opted out of retrying timeouts or of + // retrying transport errors at all. + retryable = policy.RetryTransportErrors && !(doNotRetryTimeouts && ex.IsTimeout); } if (!retryable || attempt == maxAttempts) @@ -234,7 +260,7 @@ public Task StreamAsync(string url, CancellationToken cance { _stats.AddCall(); _stats.AddRequest(); - var request = BuildRequest(HttpMethod.Get, url, default, null); + var request = BuildRequest(HttpMethod.Get, url, default, null, RequestPolicy.Default); return _transport.SendAsync(request, TimeSpan.FromSeconds(Math.Min(_retry.LongTimeoutSecs, _retry.TimeoutSecs)), streaming: true, cancellationToken); } @@ -243,11 +269,12 @@ private async Task SendOnceAsync( string url, PreparedBody prepared, IReadOnlyDictionary? extraHeaders, + RequestPolicy policy, TimeSpan timeout, CancellationToken cancellationToken) { - using var request = BuildRequest(method, url, prepared, extraHeaders); - return await _transport.SendAsync(request, timeout, streaming: false, cancellationToken).ConfigureAwait(false); + using var request = BuildRequest(method, url, prepared, extraHeaders, policy); + return await _transport.SendAsync(request, timeout, policy.StreamResponse, cancellationToken).ConfigureAwait(false); } /// @@ -279,6 +306,24 @@ private static void ValidateDefaultHeaders(IReadOnlyDictionary? } } + /// + /// Moves the request's Authorization header (the token, or a default header of that name) to the header + /// named ; nothing changes for null. A header of that name set for the + /// single call is applied afterwards and still wins. + /// + private static void MoveAuthorization(HttpRequestMessage request, string? headerName) + { + if (headerName is null || !request.Headers.TryGetValues("Authorization", out var values)) + { + return; + } + + var authorization = string.Join(", ", values); + request.Headers.Remove("Authorization"); + request.Headers.Remove(headerName); + request.Headers.TryAddWithoutValidation(headerName, authorization); + } + /// Sets each header on the request, replacing any value already set under the same name. private static void SetHeaders(HttpRequestMessage request, IReadOnlyDictionary? headers) { @@ -289,17 +334,26 @@ private static void SetHeaders(HttpRequestMessage request, IReadOnlyDictionary name.StartsWith(ContentHeaderPrefix, StringComparison.OrdinalIgnoreCase); + /// Builds a fully-prepared request with auth, User-Agent, content type and extra headers. private HttpRequestMessage BuildRequest( HttpMethod method, string url, PreparedBody prepared, - IReadOnlyDictionary? extraHeaders) + IReadOnlyDictionary? extraHeaders, + RequestPolicy policy) { var request = new HttpRequestMessage(method, url); request.Headers.TryAddWithoutValidation("User-Agent", UserAgent); @@ -311,7 +365,12 @@ private HttpRequestMessage BuildRequest( // The client-wide default headers win over the built-in ones above, and a header set for this single call // wins over both. SetHeaders(request, _defaultHeaders); + MoveAuthorization(request, policy.AuthorizationHeader); SetHeaders(request, extraHeaders); + if (!policy.FollowRedirects) + { + request.Options.Set(ApifyRequestOptions.FollowRedirects, false); + } if (prepared.Bytes is not null) { @@ -325,12 +384,37 @@ private HttpRequestMessage BuildRequest( content.Headers.ContentEncoding.Add(prepared.ContentEncoding); } + AddContentHeaders(content, extraHeaders); request.Content = content; } return request; } + /// + /// Sets the caller's content headers on the body, except the ones the client derives from the body itself. A + /// request without a body has nothing to attach them to (for example Content-Disposition), so they are + /// not sent. + /// + private static void AddContentHeaders(HttpContent content, IReadOnlyDictionary? headers) + { + if (headers is null) + { + return; + } + + foreach (var header in headers) + { + if (!IsContentHeader(header.Key) || BodyDerivedContentHeaders.Contains(header.Key, StringComparer.OrdinalIgnoreCase)) + { + continue; + } + + content.Headers.Remove(header.Key); + content.Headers.TryAddWithoutValidation(header.Key, header.Value); + } + } + /// /// Normalizes a request body to bytes and, when it is large enough, compresses it. Raw bytes take /// precedence so binary records (e.g. images) are used as-is rather than re-encoded through a UTF-8 @@ -342,7 +426,7 @@ private HttpRequestMessage BuildRequest( /// the configured : brotli (Content-Encoding: br) by default, matching /// the reference client's preference. /// - private async Task PrepareBodyAsync(string? body, byte[]? bodyBytes, string contentType, CancellationToken cancellationToken) + private async Task PrepareBodyAsync(string? body, byte[]? bodyBytes, string contentType, RequestPolicy policy, CancellationToken cancellationToken) { var raw = bodyBytes ?? (body is not null ? Encoding.UTF8.GetBytes(body) : null); if (raw is null) @@ -350,13 +434,14 @@ private async Task PrepareBodyAsync(string? body, byte[]? bodyByte return default; } - if (raw.Length < MinCompressBytes || !IsCompressibleContentType(contentType)) + if (!policy.CompressBody || raw.Length < MinCompressBytes || !IsCompressibleContentType(contentType)) { return new PreparedBody(raw, contentType, null); } - var compressed = await _compressor.CompressAsync(raw, cancellationToken).ConfigureAwait(false); - return new PreparedBody(compressed, contentType, _compressor.ContentEncoding); + var compressor = policy.Compressor ?? _compressor; + var compressed = await compressor.CompressAsync(raw, cancellationToken).ConfigureAwait(false); + return new PreparedBody(compressed, contentType, compressor.ContentEncoding); } /// @@ -443,7 +528,10 @@ private static TimeSpan AttemptTimeout(TimeSpan baseTimeout, TimeSpan overall, i return scaled < overall ? scaled : overall; } - private static bool IsStatusRetryable(int status) => status == RateLimitExceeded || status >= MinServerError; + private static bool IsStatusRetryable(int status, RequestPolicy policy) + => policy.RetryStatusCodes is { } codes + ? codes.Contains(status) + : status == RateLimitExceeded || status >= MinServerError; /// Returns a delay chosen randomly from [delay, 2*delay) (exponential backoff + jitter). private static double RandomizedDelayMillis(double delayMillis) diff --git a/src/Apify.Client/Internal/RequestPolicy.cs b/src/Apify.Client/Internal/RequestPolicy.cs new file mode 100644 index 0000000..aa159f0 --- /dev/null +++ b/src/Apify.Client/Internal/RequestPolicy.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; +using Apify.Client.Http; + +namespace Apify.Client.Internal; + +/// +/// Per-request overrides of the shared HTTP behaviour, for calls that are not plain API calls. The default +/// instance is the behaviour of every API call; overrides it to +/// talk to an Actor's own server (the reference client's per-request ApifyRequestConfig options). +/// +internal sealed class RequestPolicy +{ + /// The behaviour of an ordinary API call. + public static readonly RequestPolicy Default = new(); + + /// + /// The header that carries the API token, or null for the standard Authorization header. Actor + /// servers accept X-Apify-Authorization, which the platform removes before the request reaches the + /// Actor's code, so Authorization stays free for the Actor's own authentication. + /// + public string? AuthorizationHeader { get; init; } + + /// + /// Whether an error status throws . When false, the error + /// response is returned once no retry follows, and a rate limit (429) is not counted in the client's + /// statistics, which track the API's rate limits. + /// + public bool ThrowOnErrorStatus { get; init; } = true; + + /// The statuses to retry, or null for the default of rate limits (429) and server errors (5xx). + public IReadOnlyCollection? RetryStatusCodes { get; init; } + + /// + /// Whether transport errors, timeouts included, are retried. When false, the first one fails the call, + /// since the request may have reached the server before it failed. + /// + public bool RetryTransportErrors { get; init; } = true; + + /// + /// Whether the transport follows redirects. When false, a redirect response is returned like an error + /// status (see ), so a header that carries the token never + /// goes to a host the server picked. + /// + public bool FollowRedirects { get; init; } = true; + + /// Whether a large request body may be compressed at all. + public bool CompressBody { get; init; } = true; + + /// The compressor for this request's body, or null for the client's own one. + public HttpCompressor? Compressor { get; init; } + + /// Whether the response body is returned unread, to be consumed as a stream. + public bool StreamResponse { get; init; } +} diff --git a/src/Apify.Client/Internal/ResourceContext.cs b/src/Apify.Client/Internal/ResourceContext.cs index 6280764..c3ae434 100644 --- a/src/Apify.Client/Internal/ResourceContext.cs +++ b/src/Apify.Client/Internal/ResourceContext.cs @@ -214,20 +214,9 @@ public async Task DeleteResourceAsync(string subPath, RequestTier tier, Cancella /// GET a paginated listing and build a with each item hydrated. public async Task> ListResourceAsync(string subPath, QueryParams p, Func hydrate, RequestTier tier, CancellationToken ct) - { - var (page, _) = await ListPageAsync(subPath, p, hydrate, tier, ct).ConfigureAwait(false); - return page; - } - - /// - /// Fetches one page of a listing together with the API's count of the rows it scanned to produce - /// the page. That can exceed the number of items returned: the Store listing drops Actors the caller - /// cannot run after applying offset and limit, so advancing by the returned items would re-read rows. - /// - private async Task<(PaginationList Page, long RowsScanned)> ListPageAsync(string subPath, QueryParams p, Func hydrate, RequestTier tier, CancellationToken ct) { var data = await GetResourceRequiredAsync(subPath, p, tier, ct).ConfigureAwait(false); - return (PaginationList.FromData(data, hydrate), JsonValues.IntOr(data, "count", 0)); + return PaginationList.FromData(data, hydrate); } /// @@ -254,8 +243,8 @@ public IAsyncEnumerable IterateListAsync( limitCountsRows: false, async (offset, pageLimit, token) => { - var (page, rowsScanned) = await ListPageAsync(subPath, baseQuery.PageQuery(offset, pageLimit), hydrate, tier, token).ConfigureAwait(false); - return new FetchedPage(page.Items, rowsScanned); + var page = await ListResourceAsync(subPath, baseQuery.PageQuery(offset, pageLimit), hydrate, tier, token).ConfigureAwait(false); + return new FetchedPage(page.Items, page.Count); }, ct); } diff --git a/src/Apify.Client/Internal/ResponseSchemas.json b/src/Apify.Client/Internal/ResponseSchemas.json index 427b8f8..ab88daf 100644 --- a/src/Apify.Client/Internal/ResponseSchemas.json +++ b/src/Apify.Client/Internal/ResponseSchemas.json @@ -1 +1 @@ -{"operations":{"DELETE /v2/actor-runs/{runId}/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchDeleteResponse"},"DELETE /v2/actor-tasks/{actorTaskId}":{"type":"object"},"DELETE /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchDeleteResponse"},"DELETE /v2/actors/{actorId}":{"type":"object"},"DELETE /v2/actors/{actorId}/runs/last/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchDeleteResponse"},"DELETE /v2/actors/{actorId}/versions/{versionNumber}":{"type":"object"},"DELETE /v2/actors/{actorId}/versions/{versionNumber}/env-vars/{envVarName}":{"type":"object"},"DELETE /v2/browser-info":{"$ref":"#/components/schemas/BrowserInfoResponse"},"DELETE /v2/request-queues/{queueId}/requests/batch":{"$ref":"#/components/schemas/BatchDeleteResponse"},"DELETE /v2/schedules/{scheduleId}":{"type":"object"},"DELETE /v2/webhooks/{webhookId}":{"type":"object"},"GET /v2/actor-builds":{"$ref":"#/components/schemas/ListOfBuildsResponse"},"GET /v2/actor-builds/{buildId}":{"allOf":[{"$ref":"#/components/schemas/BuildResponse"}]},"GET /v2/actor-builds/{buildId}/openapi.json":{"type":"object"},"GET /v2/actor-oauth-accounts/{accountId}":{"$ref":"#/components/schemas/ActorOAuthAccountResponse"},"GET /v2/actor-oauth-accounts/{connectionId}/accounts":{"$ref":"#/components/schemas/ListOfActorOAuthAccountsResponse"},"GET /v2/actor-runs":{"allOf":[{"$ref":"#/components/schemas/ListOfRunsResponse"}]},"GET /v2/actor-runs/{runId}":{"allOf":[{"$ref":"#/components/schemas/RunResponse"}]},"GET /v2/actor-runs/{runId}/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"GET /v2/actor-runs/{runId}/dataset/items":{"items":{"type":"object"},"type":"array"},"GET /v2/actor-runs/{runId}/dataset/statistics":{"$ref":"#/components/schemas/DatasetStatisticsResponse"},"GET /v2/actor-runs/{runId}/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"GET /v2/actor-runs/{runId}/key-value-store/keys":{"$ref":"#/components/schemas/ListOfKeysResponse"},"GET /v2/actor-runs/{runId}/key-value-store/records/{recordKey}":{"$ref":"#/components/schemas/RecordResponse"},"GET /v2/actor-runs/{runId}/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"GET /v2/actor-runs/{runId}/request-queue/head":{"$ref":"#/components/schemas/RequestQueueHeadResponse"},"GET /v2/actor-runs/{runId}/request-queue/requests":{"$ref":"#/components/schemas/ListOfRequestsResponse"},"GET /v2/actor-runs/{runId}/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/RequestResponse"},"GET /v2/actor-tasks":{"$ref":"#/components/schemas/ListOfTasksResponse"},"GET /v2/actor-tasks/{actorTaskId}":{"properties":{"data":{"$ref":"#/components/schemas/Task"}},"required":["data"],"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/input":{"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/run-sync":{"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/run-sync-get-dataset-items":{"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/runs":{"properties":{"data":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/RunListItem"},"type":"array"}},"required":["items"],"type":"object"}]}},"required":["data"],"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/runs/last":{"properties":{"data":{"$ref":"#/components/schemas/Run"}},"required":["data"],"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/dataset/items":{"items":{"type":"object"},"type":"array"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/dataset/statistics":{"$ref":"#/components/schemas/DatasetStatisticsResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store/keys":{"$ref":"#/components/schemas/ListOfKeysResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store/records/{recordKey}":{"$ref":"#/components/schemas/RecordResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/head":{"$ref":"#/components/schemas/RequestQueueHeadResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests":{"$ref":"#/components/schemas/ListOfRequestsResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/RequestResponse"},"GET /v2/actor-tasks/{actorTaskId}/webhooks":{"properties":{"data":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/WebhookResource"},"type":"array"}},"required":["items"],"type":"object"}]}},"required":["data"],"type":"object"},"GET /v2/actors":{"$ref":"#/components/schemas/ListOfActorsResponse"},"GET /v2/actors/{actorId}":{"$ref":"#/components/schemas/ActorResponse"},"GET /v2/actors/{actorId}/builds":{"$ref":"#/components/schemas/ListOfBuildsResponse"},"GET /v2/actors/{actorId}/builds/default":{"$ref":"#/components/schemas/BuildResponse"},"GET /v2/actors/{actorId}/builds/{buildId}":{"$ref":"#/components/schemas/BuildResponse"},"GET /v2/actors/{actorId}/builds/{buildId}/openapi.json":{"type":"object"},"GET /v2/actors/{actorId}/oauth-connections":{"$ref":"#/components/schemas/ListOfActorOAuthConnectionsResponse"},"GET /v2/actors/{actorId}/run-sync":{"type":"object"},"GET /v2/actors/{actorId}/run-sync-get-dataset-items":{"items":{"type":"object"},"type":"array"},"GET /v2/actors/{actorId}/runs":{"$ref":"#/components/schemas/ListOfRunsResponse"},"GET /v2/actors/{actorId}/runs/last":{"$ref":"#/components/schemas/RunResponse"},"GET /v2/actors/{actorId}/runs/last/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"GET /v2/actors/{actorId}/runs/last/dataset/items":{"items":{"type":"object"},"type":"array"},"GET /v2/actors/{actorId}/runs/last/dataset/statistics":{"$ref":"#/components/schemas/DatasetStatisticsResponse"},"GET /v2/actors/{actorId}/runs/last/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"GET /v2/actors/{actorId}/runs/last/key-value-store/keys":{"$ref":"#/components/schemas/ListOfKeysResponse"},"GET /v2/actors/{actorId}/runs/last/key-value-store/records/{recordKey}":{"$ref":"#/components/schemas/RecordResponse"},"GET /v2/actors/{actorId}/runs/last/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"GET /v2/actors/{actorId}/runs/last/request-queue/head":{"$ref":"#/components/schemas/RequestQueueHeadResponse"},"GET /v2/actors/{actorId}/runs/last/request-queue/requests":{"$ref":"#/components/schemas/ListOfRequestsResponse"},"GET /v2/actors/{actorId}/runs/last/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/RequestResponse"},"GET /v2/actors/{actorId}/runs/{runId}":{"$ref":"#/components/schemas/RunResponse"},"GET /v2/actors/{actorId}/versions":{"$ref":"#/components/schemas/ListOfVersionsResponse"},"GET /v2/actors/{actorId}/versions/{versionNumber}":{"$ref":"#/components/schemas/VersionResponse"},"GET /v2/actors/{actorId}/versions/{versionNumber}/env-vars":{"$ref":"#/components/schemas/ListOfEnvVarsResponse"},"GET /v2/actors/{actorId}/versions/{versionNumber}/env-vars/{envVarName}":{"$ref":"#/components/schemas/EnvVarResponse"},"GET /v2/actors/{actorId}/webhooks":{"$ref":"#/components/schemas/ListOfWebhookResourcesResponse"},"GET /v2/browser-info":{"$ref":"#/components/schemas/BrowserInfoResponse"},"GET /v2/datasets":{"$ref":"#/components/schemas/ListOfDatasetsResponse"},"GET /v2/datasets/{datasetId}":{"$ref":"#/components/schemas/DatasetResponse"},"GET /v2/datasets/{datasetId}/items":{"items":{"type":"object"},"type":"array"},"GET /v2/datasets/{datasetId}/statistics":{"$ref":"#/components/schemas/DatasetStatisticsResponse"},"GET /v2/integrations/git":{"$ref":"#/components/schemas/ListOfGitProviderIntegrationsResponse"},"GET /v2/key-value-stores":{"$ref":"#/components/schemas/ListOfKeyValueStoresResponse"},"GET /v2/key-value-stores/{storeId}":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"GET /v2/key-value-stores/{storeId}/keys":{"$ref":"#/components/schemas/ListOfKeysResponse"},"GET /v2/key-value-stores/{storeId}/records/{recordKey}":{"$ref":"#/components/schemas/RecordResponse"},"GET /v2/request-queues":{"$ref":"#/components/schemas/ListOfRequestQueuesResponse"},"GET /v2/request-queues/{queueId}":{"$ref":"#/components/schemas/RequestQueueResponse"},"GET /v2/request-queues/{queueId}/head":{"$ref":"#/components/schemas/RequestQueueHeadResponse"},"GET /v2/request-queues/{queueId}/requests":{"$ref":"#/components/schemas/ListOfRequestsResponse"},"GET /v2/request-queues/{queueId}/requests/{requestId}":{"$ref":"#/components/schemas/RequestResponse"},"GET /v2/schedules":{"$ref":"#/components/schemas/ListOfSchedulesResponse"},"GET /v2/schedules/{scheduleId}":{"$ref":"#/components/schemas/ScheduleResponse"},"GET /v2/schedules/{scheduleId}/log":{"$ref":"#/components/schemas/ScheduleLogResponse"},"GET /v2/store":{"$ref":"#/components/schemas/ListOfStoreActorsResponse"},"GET /v2/users/me":{"$ref":"#/components/schemas/UserPrivateInfoResponse"},"GET /v2/users/me/limits":{"$ref":"#/components/schemas/AccountLimitsResponse"},"GET /v2/users/me/usage/monthly":{"$ref":"#/components/schemas/MonthlyUsageResponse"},"GET /v2/users/{userId}":{"anyOf":[{"$ref":"#/components/schemas/UserPublicInfoResponse"},{"$ref":"#/components/schemas/UserPrivateInfoResponse"}]},"GET /v2/users/{userId}/limits":{"$ref":"#/components/schemas/AccountLimitsResponse"},"GET /v2/users/{userId}/usage/monthly":{"$ref":"#/components/schemas/MonthlyUsageResponse"},"GET /v2/webhook-dispatches":{"$ref":"#/components/schemas/ListOfWebhookDispatchesResponse"},"GET /v2/webhook-dispatches/{dispatchId}":{"$ref":"#/components/schemas/WebhookDispatchResponse"},"GET /v2/webhooks":{"$ref":"#/components/schemas/ListOfWebhooksResponse"},"GET /v2/webhooks/{webhookId}":{"$ref":"#/components/schemas/WebhookResponse"},"GET /v2/webhooks/{webhookId}/dispatches":{"$ref":"#/components/schemas/ListOfWebhookDispatchesResponse"},"POST /v2/actor-builds/{buildId}/abort":{"allOf":[{"$ref":"#/components/schemas/BuildResponse"}]},"POST /v2/actor-runs/{runId}/abort":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-runs/{runId}/charge":{"type":"object"},"POST /v2/actor-runs/{runId}/dataset/items":{"type":"object"},"POST /v2/actor-runs/{runId}/key-value-store/records/{recordKey}":{"type":"object"},"POST /v2/actor-runs/{runId}/metamorph":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-runs/{runId}/reboot":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-runs/{runId}/request-queue/head/lock":{"$ref":"#/components/schemas/LockedRequestQueueHeadResponse"},"POST /v2/actor-runs/{runId}/request-queue/requests":{"$ref":"#/components/schemas/AddRequestResponse"},"POST /v2/actor-runs/{runId}/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchAddResponse"},"POST /v2/actor-runs/{runId}/request-queue/requests/unlock":{"$ref":"#/components/schemas/UnlockRequestsResponse"},"POST /v2/actor-runs/{runId}/resurrect":{"allOf":[{"$ref":"#/components/schemas/RunResponse"}]},"POST /v2/actor-tasks":{"$ref":"#/components/schemas/TaskResponse"},"POST /v2/actor-tasks/{actorTaskId}/run-sync":{"type":"object"},"POST /v2/actor-tasks/{actorTaskId}/run-sync-get-dataset-items":{"type":"object"},"POST /v2/actor-tasks/{actorTaskId}/runs":{"properties":{"data":{"$ref":"#/components/schemas/Run"}},"required":["data"],"type":"object"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/abort":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/dataset/items":{"type":"object"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store/records/{recordKey}":{"type":"object"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/metamorph":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/reboot":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/head/lock":{"$ref":"#/components/schemas/LockedRequestQueueHeadResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests":{"$ref":"#/components/schemas/AddRequestResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchAddResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/unlock":{"$ref":"#/components/schemas/UnlockRequestsResponse"},"POST /v2/actors":{"$ref":"#/components/schemas/ActorResponse"},"POST /v2/actors/{actorId}/builds":{"$ref":"#/components/schemas/BuildResponse"},"POST /v2/actors/{actorId}/builds/{buildId}/abort":{"$ref":"#/components/schemas/BuildResponse"},"POST /v2/actors/{actorId}/run-sync":{"type":"object"},"POST /v2/actors/{actorId}/run-sync-get-dataset-items":{"items":{"type":"object"},"type":"array"},"POST /v2/actors/{actorId}/runs":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/last/abort":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/last/dataset/items":{"type":"object"},"POST /v2/actors/{actorId}/runs/last/key-value-store/records/{recordKey}":{"type":"object"},"POST /v2/actors/{actorId}/runs/last/metamorph":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/last/reboot":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/last/request-queue/head/lock":{"$ref":"#/components/schemas/LockedRequestQueueHeadResponse"},"POST /v2/actors/{actorId}/runs/last/request-queue/requests":{"$ref":"#/components/schemas/AddRequestResponse"},"POST /v2/actors/{actorId}/runs/last/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchAddResponse"},"POST /v2/actors/{actorId}/runs/last/request-queue/requests/unlock":{"$ref":"#/components/schemas/UnlockRequestsResponse"},"POST /v2/actors/{actorId}/runs/{runId}/abort":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/{runId}/metamorph":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/{runId}/resurrect":{"allOf":[{"$ref":"#/components/schemas/RunResponse"}]},"POST /v2/actors/{actorId}/validate-input":{"properties":{"valid":{"type":"boolean"}},"required":["valid"],"type":"object"},"POST /v2/actors/{actorId}/versions":{"$ref":"#/components/schemas/VersionResponse"},"POST /v2/actors/{actorId}/versions/{versionNumber}":{"$ref":"#/components/schemas/VersionResponse"},"POST /v2/actors/{actorId}/versions/{versionNumber}/env-vars":{"$ref":"#/components/schemas/EnvVarResponse"},"POST /v2/actors/{actorId}/versions/{versionNumber}/env-vars/{envVarName}":{"$ref":"#/components/schemas/EnvVarResponse"},"POST /v2/browser-info":{"$ref":"#/components/schemas/BrowserInfoResponse"},"POST /v2/datasets":{"$ref":"#/components/schemas/DatasetResponse"},"POST /v2/datasets/{datasetId}/items":{"type":"object"},"POST /v2/integrations/git/{providerId}/create-repo":{"$ref":"#/components/schemas/GitRepoResponse"},"POST /v2/integrations/git/{providerId}/register-deployment-key":{"$ref":"#/components/schemas/RegisterDeploymentKeyResponse"},"POST /v2/key-value-stores":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"POST /v2/key-value-stores/{storeId}/records/{recordKey}":{"type":"object"},"POST /v2/request-queues":{"$ref":"#/components/schemas/RequestQueueResponse"},"POST /v2/request-queues/{queueId}/head/lock":{"$ref":"#/components/schemas/LockedRequestQueueHeadResponse"},"POST /v2/request-queues/{queueId}/requests":{"$ref":"#/components/schemas/AddRequestResponse"},"POST /v2/request-queues/{queueId}/requests/batch":{"$ref":"#/components/schemas/BatchAddResponse"},"POST /v2/request-queues/{queueId}/requests/unlock":{"$ref":"#/components/schemas/UnlockRequestsResponse"},"POST /v2/schedules":{"$ref":"#/components/schemas/ScheduleResponse"},"POST /v2/schedules/{scheduleId}/invoke":{"type":"object"},"POST /v2/tools/decode-and-verify":{"$ref":"#/components/schemas/DecodeAndVerifyResponse"},"POST /v2/tools/encode-and-sign":{"$ref":"#/components/schemas/EncodeAndSignResponse"},"POST /v2/webhooks":{"$ref":"#/components/schemas/WebhookResponse"},"POST /v2/webhooks/{webhookId}/test":{"$ref":"#/components/schemas/WebhookDispatchResponse"},"PUT /v2/actor-runs/{runId}":{"$ref":"#/components/schemas/RunResponse"},"PUT /v2/actor-runs/{runId}/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"PUT /v2/actor-runs/{runId}/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"PUT /v2/actor-runs/{runId}/key-value-store/records/{recordKey}":{"type":"object"},"PUT /v2/actor-runs/{runId}/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"PUT /v2/actor-runs/{runId}/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/UpdateRequestResponse"},"PUT /v2/actor-runs/{runId}/request-queue/requests/{requestId}/lock":{"$ref":"#/components/schemas/ProlongRequestLockResponse"},"PUT /v2/actor-tasks/{actorTaskId}":{"properties":{"data":{"$ref":"#/components/schemas/Task"}},"required":["data"],"type":"object"},"PUT /v2/actor-tasks/{actorTaskId}/input":{"type":"object"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store/records/{recordKey}":{"type":"object"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/UpdateRequestResponse"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/{requestId}/lock":{"$ref":"#/components/schemas/ProlongRequestLockResponse"},"PUT /v2/actors/{actorId}":{"$ref":"#/components/schemas/ActorResponse"},"PUT /v2/actors/{actorId}/runs/last/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"PUT /v2/actors/{actorId}/runs/last/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"PUT /v2/actors/{actorId}/runs/last/key-value-store/records/{recordKey}":{"type":"object"},"PUT /v2/actors/{actorId}/runs/last/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"PUT /v2/actors/{actorId}/runs/last/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/UpdateRequestResponse"},"PUT /v2/actors/{actorId}/runs/last/request-queue/requests/{requestId}/lock":{"$ref":"#/components/schemas/ProlongRequestLockResponse"},"PUT /v2/actors/{actorId}/versions/{versionNumber}":{"$ref":"#/components/schemas/VersionResponse"},"PUT /v2/actors/{actorId}/versions/{versionNumber}/env-vars/{envVarName}":{"$ref":"#/components/schemas/EnvVarResponse"},"PUT /v2/browser-info":{"$ref":"#/components/schemas/BrowserInfoResponse"},"PUT /v2/datasets/{datasetId}":{"$ref":"#/components/schemas/DatasetResponse"},"PUT /v2/key-value-stores/{storeId}":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"PUT /v2/key-value-stores/{storeId}/records/{recordKey}":{"type":"object"},"PUT /v2/request-queues/{queueId}":{"$ref":"#/components/schemas/RequestQueueResponse"},"PUT /v2/request-queues/{queueId}/requests/{requestId}":{"$ref":"#/components/schemas/UpdateRequestResponse"},"PUT /v2/request-queues/{queueId}/requests/{requestId}/lock":{"$ref":"#/components/schemas/ProlongRequestLockResponse"},"PUT /v2/schedules/{scheduleId}":{"$ref":"#/components/schemas/ScheduleResponse"},"PUT /v2/users/me/limits":{"type":"object"},"PUT /v2/users/{userId}/limits":{"type":"object"},"PUT /v2/webhooks/{webhookId}":{"$ref":"#/components/schemas/WebhookResponse"}},"schemas":{"AccountLimits":{"properties":{"current":{"$ref":"#/components/schemas/CurrentUsage"},"limits":{"$ref":"#/components/schemas/Limits"},"monthlyUsageCycle":{"$ref":"#/components/schemas/UsageCycle"}},"required":["monthlyUsageCycle","limits","current"],"type":"object"},"AccountLimitsResponse":{"properties":{"data":{"$ref":"#/components/schemas/AccountLimits"}},"required":["data"],"type":"object"},"ActorDefinition":{"properties":{"actorSpecification":{"type":"integer"},"buildTag":{"type":"string"},"changelog":{"type":["string","null"]},"defaultMemoryMbytes":{"oneOf":[{"type":"string"},{"type":"integer"}]},"description":{"type":"string"},"dockerContextDir":{"type":"string"},"dockerfile":{"type":"string"},"environmentVariables":{"type":"object"},"input":{"type":["object","null"]},"maxMemoryMbytes":{"minimum":128,"type":"integer"},"meta":{"$ref":"#/components/schemas/ActorDefinitionMeta"},"minMemoryMbytes":{"minimum":128,"type":"integer"},"name":{"type":"string"},"output":{"type":["object","null"]},"readme":{"type":["string","null"]},"storages":{"properties":{"dataset":{"type":"object"},"datasets":{"type":"object"},"keyValueStore":{"type":"object"}},"type":"object"},"title":{"type":"string"},"usesStandbyMode":{"type":"boolean"},"version":{"pattern":"^[0-9]+(\\.[0-9]+)+$","type":"string"},"webServerMcpPath":{"type":"string"},"webServerSchema":{"type":"object"}},"type":"object"},"ActorDefinitionMeta":{"properties":{"generatedBy":{"type":"string"},"templateId":{"type":"string"}},"type":"object"},"ActorJobStatus":{"type":"string"},"ActorListItem":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"stats":{"anyOf":[{"$ref":"#/components/schemas/ActorStats"},{"type":"null"}]},"title":{"type":"string"},"username":{"type":"string"}},"required":["id","createdAt","modifiedAt","name","username"],"type":"object"},"ActorNotice":{"type":["string","null"]},"ActorOAuthAccount":{"properties":{"_id":{"type":"string"},"authorizedAt":{"format":"date-time","type":["string","null"]},"connectionId":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"data":{"type":"object"},"description":{"type":["string","null"]},"modifiedAt":{"format":"date-time","type":"string"},"userId":{"type":"string"}},"required":["_id","userId","connectionId","createdAt","modifiedAt","data"],"type":"object"},"ActorOAuthAccountResponse":{"properties":{"data":{"$ref":"#/components/schemas/ActorOAuthAccount"}},"required":["data"],"type":"object"},"ActorOAuthConnection":{"properties":{"_id":{"type":"string"},"actorId":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"credentials":{"properties":{"clientId":{"type":"string"},"imageUrl":{"type":"string"},"label":{"type":"string"},"scope":{"type":"string"}},"type":"object"},"modifiedAt":{"format":"date-time","type":"string"},"oAuthProviderType":{"type":"string"}},"required":["_id","actorId","oAuthProviderType","createdAt","modifiedAt"],"type":"object"},"ActorPermissionLevel":{"type":"string"},"ActorResource":{"properties":{"actorPermissionLevel":{"$ref":"#/components/schemas/ActorPermissionLevel"},"actorStandby":{"anyOf":[{"$ref":"#/components/schemas/ActorStandby"},{"type":"null"}]},"categories":{"items":{"type":"string"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"defaultRunOptions":{"$ref":"#/components/schemas/DefaultRunOptions"},"deploymentKey":{"type":"string"},"description":{"type":["string","null"]},"exampleRunInput":{"anyOf":[{"$ref":"#/components/schemas/ExampleRunInput"},{"type":"null"}]},"hasNoDataset":{"type":"boolean"},"id":{"type":"string"},"isCritical":{"type":"boolean"},"isDeprecated":{"type":["boolean","null"]},"isGeneric":{"type":"boolean"},"isPublic":{"type":"boolean"},"isSourceCodeHidden":{"type":"boolean"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"notice":{"$ref":"#/components/schemas/ActorNotice"},"pictureUrl":{"type":["string","null"]},"pricingInfos":{"items":{"$ref":"#/components/schemas/ActorRunPricingInfo"},"type":"array"},"readmeSummary":{"type":"string"},"restartOnError":{"type":["boolean","null"]},"seoDescription":{"type":["string","null"]},"seoTitle":{"type":["string","null"]},"standbyUrl":{"type":["string","null"]},"stats":{"$ref":"#/components/schemas/ActorStats"},"taggedBuilds":{"anyOf":[{"$ref":"#/components/schemas/TaggedBuilds"},{"type":"null"}]},"title":{"type":["string","null"]},"userId":{"type":"string"},"username":{"type":"string"},"versions":{"items":{"$ref":"#/components/schemas/Version"},"type":"array"}},"required":["id","userId","name","username","isPublic","createdAt","modifiedAt","stats","versions","defaultRunOptions"],"type":"object"},"ActorResponse":{"properties":{"data":{"$ref":"#/components/schemas/ActorResource"}},"required":["data"],"type":"object"},"ActorRunPricingInfo":{"oneOf":[{"$ref":"#/components/schemas/PayPerEventActorPricingInfo"},{"$ref":"#/components/schemas/PricePerDatasetItemActorPricingInfo"},{"$ref":"#/components/schemas/FlatPricePerMonthActorPricingInfo"},{"$ref":"#/components/schemas/FreeActorPricingInfo"}]},"ActorStandby":{"properties":{"build":{"type":["string","null"]},"desiredRequestsPerActorRun":{"type":["integer","null"]},"disableStandbyFieldsOverride":{"type":["boolean","null"]},"idleTimeoutSecs":{"type":["integer","null"]},"isConsoleAuthEnabled":{"type":["boolean","null"]},"isEnabled":{"type":["boolean","null"]},"isTokenlessEnabled":{"type":["boolean","null"]},"maxRequestsPerActorRun":{"type":["integer","null"]},"memoryMbytes":{"type":["integer","null"]},"shouldPassActorInput":{"type":["boolean","null"]},"tenancy":{"type":["string","null"]}},"type":"object"},"ActorStats":{"properties":{"actorReviewCount":{"type":"integer"},"actorReviewRating":{"type":"number"},"bookmarkCount":{"type":"integer"},"lastRunStartedAt":{"format":"date-time","type":"string"},"publicActorRunStats30Days":{"properties":{"ABORTED":{"type":"integer"},"FAILED":{"type":"integer"},"SUCCEEDED":{"type":"integer"},"TIMED-OUT":{"type":"integer"},"TOTAL":{"type":"integer"}},"type":"object"},"totalBuilds":{"type":"integer"},"totalMetamorphs":{"type":"integer"},"totalRuns":{"type":"integer"},"totalUsers":{"type":"integer"},"totalUsers30Days":{"type":"integer"},"totalUsers7Days":{"type":"integer"},"totalUsers90Days":{"type":"integer"}},"type":"object"},"AddRequestResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestRegistration"}},"required":["data"],"type":"object"},"AddedRequest":{"properties":{"requestId":{"$ref":"#/components/schemas/RequestId"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"},"wasAlreadyHandled":{"$ref":"#/components/schemas/WasAlreadyHandled"},"wasAlreadyPresent":{"$ref":"#/components/schemas/WasAlreadyPresent"}},"required":["requestId","uniqueKey","wasAlreadyHandled","wasAlreadyPresent"],"type":"object"},"AvailableProxyGroups":{"type":"object"},"BatchAddResponse":{"properties":{"data":{"$ref":"#/components/schemas/BatchAddResult"}},"required":["data"],"type":"object"},"BatchAddResult":{"properties":{"processedRequests":{"items":{"$ref":"#/components/schemas/AddedRequest"},"type":"array"},"unprocessedRequests":{"items":{"$ref":"#/components/schemas/UnprocessedRequest"},"type":"array"}},"required":["processedRequests","unprocessedRequests"],"type":"object"},"BatchDeleteResponse":{"properties":{"data":{"$ref":"#/components/schemas/BatchDeleteResult"}},"required":["data"],"type":"object"},"BatchDeleteResult":{"properties":{"processedRequests":{"items":{"$ref":"#/components/schemas/DeletedRequest"},"type":"array"},"unprocessedRequests":{"items":{"$ref":"#/components/schemas/UnprocessedRequest"},"type":"array"}},"required":["processedRequests","unprocessedRequests"],"type":"object"},"BrowserInfoResponse":{"properties":{"bodyLength":{"type":"integer"},"clientIp":{"type":["string","null"]},"countryCode":{"type":["string","null"]},"headers":{"type":"object"},"method":{"type":"string"},"rawHeaders":{"items":{"type":"string"},"type":"array"}},"required":["method","clientIp","countryCode","bodyLength"],"type":"object"},"Build":{"properties":{"actId":{"type":"string"},"actVersion":{"properties":{"buildTag":{"type":["string","null"]},"gitHubGistUrl":{"type":"string"},"gitRepoUrl":{"type":"string"},"sourceFiles":{"items":{"$ref":"#/components/schemas/SourceCodeFile"},"type":"array"},"sourceType":{"$ref":"#/components/schemas/VersionSourceType"},"tarballUrl":{"type":"string"},"versionNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])$","type":"string"}},"type":"object"},"actorDefinition":{"anyOf":[{"$ref":"#/components/schemas/ActorDefinition"},{"type":"null"}]},"buildNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])(\\.[1-9][0-9]{0,4})$","type":"string"},"changelog":{"type":["string","null"]},"createdByOrganizationMemberUserId":{"type":"string"},"exitCode":{"type":["integer","null"]},"finishedAt":{"format":"date-time","type":["string","null"]},"gitBranchName":{"type":"string"},"gitCommitId":{"type":"string"},"id":{"type":"string"},"imageDigest":{"type":["string","null"]},"inputSchema":{"type":["string","null"]},"meta":{"$ref":"#/components/schemas/BuildMeta"},"options":{"anyOf":[{"$ref":"#/components/schemas/BuildOptions"},{"type":"null"}]},"readme":{"type":["string","null"]},"startedAt":{"format":"date-time","type":"string"},"stats":{"anyOf":[{"$ref":"#/components/schemas/BuildStats"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/ActorJobStatus"},"usage":{"anyOf":[{"$ref":"#/components/schemas/BuildUsage"},{"type":"null"}]},"usageTotalUsd":{"type":["number","null"]},"usageUsd":{"anyOf":[{"$ref":"#/components/schemas/BuildUsage"},{"type":"null"}]},"userId":{"type":"string"}},"required":["id","actId","userId","startedAt","status","meta","buildNumber"],"type":"object"},"BuildListItem":{"properties":{"actId":{"type":"string"},"buildNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])(\\.[1-9][0-9]{0,4})$","type":"string"},"buildNumberInt":{"type":"integer"},"finishedAt":{"format":"date-time","type":["string","null"]},"id":{"type":"string"},"meta":{"$ref":"#/components/schemas/BuildMeta"},"startedAt":{"format":"date-time","type":"string"},"status":{"$ref":"#/components/schemas/ActorJobStatus"},"usageTotalUsd":{"type":"number"},"userId":{"type":"string"}},"required":["id","status","startedAt","buildNumber"],"type":"object"},"BuildMeta":{"properties":{"actorRunId":{"type":"string"},"clientIp":{"type":["string"]},"githubActionsRunUrl":{"type":"string"},"origin":{"$ref":"#/components/schemas/RunOrigin"},"userAgent":{"type":["string"]},"webhookDispatchId":{"type":"string"}},"required":["origin"],"type":"object"},"BuildOptions":{"properties":{"betaPackages":{"type":["boolean","null"]},"debug":{"type":["boolean","null"]},"diskMbytes":{"type":["integer","null"]},"memoryMbytes":{"type":["integer","null"]},"tag":{"type":["string","null"]},"useCache":{"type":["boolean","null"]}},"type":"object"},"BuildResponse":{"properties":{"data":{"$ref":"#/components/schemas/Build"}},"required":["data"],"type":"object"},"BuildStats":{"properties":{"computeUnits":{"type":"number"},"durationMillis":{"type":"integer"},"imageSizeBytes":{"type":["integer","null"]},"runTimeSecs":{"type":"number"}},"type":"object"},"BuildUsage":{"properties":{"ACTOR_COMPUTE_UNITS":{"type":["number","null"]}},"type":"object"},"CommonActorPricingInfo":{"properties":{"apifyMarginPercentage":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"forceContainsSignificantPriceChange":{"type":"boolean"},"isPriceChangeNotificationSuppressed":{"type":"boolean"},"notifiedAboutChangeAt":{"format":"date-time","type":["string","null"]},"notifiedAboutFutureChangeAt":{"format":"date-time","type":["string","null"]},"notifiedAboutRentalToPpePriceChangeAt":{"format":"date-time","type":["string","null"]},"reasonForChange":{"type":["string","null"]},"startedAt":{"format":"date-time","type":"string"}},"required":["apifyMarginPercentage","createdAt","startedAt"],"type":"object"},"CurrentPricingInfo":{"properties":{"apifyMarginPercentage":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"forceContainsSignificantPriceChange":{"type":"boolean"},"isPPEPlatformUsagePaidByUser":{"type":"boolean"},"isPriceChangeNotificationSuppressed":{"type":"boolean"},"minimalMaxTotalChargeUsd":{"type":["number","null"]},"notifiedAboutChangeAt":{"format":"date-time","type":["string","null"]},"notifiedAboutFutureChangeAt":{"format":"date-time","type":["string","null"]},"notifiedAboutRentalToPpePriceChangeAt":{"format":"date-time","type":["string","null"]},"pricePerUnitUsd":{"type":"number"},"pricingModel":{"type":"string"},"pricingPerEvent":{"type":["object","null"]},"reasonForChange":{"type":["string","null"]},"startedAt":{"format":"date-time","type":"string"},"tieredPricing":{"type":"object"},"trialMinutes":{"type":"integer"},"unitName":{"type":"string"}},"required":["pricingModel"],"type":"object"},"CurrentUsage":{"properties":{"activeActorJobCount":{"type":"integer"},"actorCount":{"type":"integer"},"actorMemoryGbytes":{"type":"number"},"actorTaskCount":{"type":"integer"},"monthlyActorComputeUnits":{"type":"number"},"monthlyExternalDataTransferGbytes":{"type":"number"},"monthlyProxySerps":{"type":"integer"},"monthlyResidentialProxyGbytes":{"type":"number"},"monthlyUnblockerUnits":{"type":"number"},"monthlyUsageUsd":{"type":"number"},"scheduleCount":{"type":"integer"},"teamAccountSeatCount":{"type":"integer"}},"required":["monthlyUsageUsd","monthlyActorComputeUnits","monthlyExternalDataTransferGbytes","monthlyProxySerps","monthlyResidentialProxyGbytes","actorMemoryGbytes","actorCount","actorTaskCount","activeActorJobCount","teamAccountSeatCount"],"type":"object"},"DailyServiceUsage":{"properties":{"date":{"format":"date-time","type":"string"},"serviceUsage":{"$ref":"#/components/schemas/ServiceUsage"},"totalUsageCreditsUsd":{"type":"number"}},"required":["date","serviceUsage","totalUsageCreditsUsd"],"type":"object"},"DatasetListItem":{"properties":{"accessedAt":{"format":"date-time","type":"string"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"cleanItemCount":{"type":"integer"},"createdAt":{"format":"date-time","type":"string"},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"id":{"type":"string"},"itemCount":{"type":"integer"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":["string","null"]},"stats":{"$ref":"#/components/schemas/DatasetStats"},"title":{"type":["string","null"]},"userId":{"type":"string"},"username":{"type":"string"}},"required":["id","userId","createdAt","modifiedAt","accessedAt","itemCount","cleanItemCount"],"type":"object"},"DatasetResource":{"properties":{"accessedAt":{"format":"date-time","type":"string"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"cleanItemCount":{"minimum":0,"type":"integer"},"consoleUrl":{"format":"uri","type":"string"},"createdAt":{"format":"date-time","type":"string"},"fields":{"items":{"type":"string"},"type":["array","null"]},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"id":{"type":"string"},"itemCount":{"minimum":0,"type":"integer"},"itemsPublicUrl":{"format":"uri","type":"string"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":["string","null"]},"schema":{"type":["object","null"]},"stats":{"$ref":"#/components/schemas/DatasetStats"},"title":{"type":["string","null"]},"urlSigningSecretKey":{"type":["string","null"]},"userId":{"type":"string"}},"required":["id","userId","createdAt","modifiedAt","accessedAt","itemCount","cleanItemCount","consoleUrl"],"type":"object"},"DatasetResponse":{"properties":{"data":{"$ref":"#/components/schemas/DatasetResource"}},"required":["data"],"type":"object"},"DatasetStatistics":{"properties":{"fieldStatistics":{"type":["object","null"]}},"type":"object"},"DatasetStatisticsResponse":{"properties":{"data":{"$ref":"#/components/schemas/DatasetStatistics"}},"required":["data"],"type":"object"},"DatasetStats":{"properties":{"inflatedBytes":{"type":"integer"},"readCount":{"type":"integer"},"storageBytes":{"type":"integer"},"writeCount":{"type":"integer"}},"type":"object"},"DecodeAndVerifyResponse":{"properties":{"data":{"$ref":"#/components/schemas/DecodeAndVerifyResult"}},"required":["data"],"type":"object"},"DecodeAndVerifyResult":{"properties":{"decoded":{},"encodedByUserId":{"type":["string","null"]},"isVerifiedUser":{"type":"boolean"}},"required":["decoded","encodedByUserId","isVerifiedUser"],"type":"object"},"DefaultRunOptions":{"properties":{"build":{"type":"string"},"forcePermissionLevel":{"anyOf":[{"$ref":"#/components/schemas/ActorPermissionLevel"},{"type":"null"}]},"isMaxTotalChargeUsdSetByUser":{"type":["boolean","null"]},"maxItems":{"type":["integer","null"]},"maxTotalChargeUsd":{"type":["number","null"]},"memoryMbytes":{"type":"integer"},"restartOnError":{"type":["boolean","null"]},"timeoutSecs":{"type":"integer"}},"type":"object"},"DeletedRequest":{"anyOf":[{"$ref":"#/components/schemas/DeletedRequestById"},{"$ref":"#/components/schemas/DeletedRequestByUniqueKey"}]},"DeletedRequestById":{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"}},"required":["id"],"type":"object"},"DeletedRequestByUniqueKey":{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"}},"required":["uniqueKey"],"type":"object"},"EffectivePlatformFeature":{"properties":{"disabledReason":{"type":["string","null"]},"disabledReasonType":{"type":["string","null"]},"isEnabled":{"type":"boolean"},"isTrial":{"type":"boolean"},"trialExpirationAt":{"format":"date-time","type":["string","null"]}},"required":["isEnabled","disabledReason","disabledReasonType","isTrial","trialExpirationAt"],"type":"object"},"EffectivePlatformFeatures":{"properties":{"ACTORS":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"ACTORS_PUBLIC_ALL":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"ACTORS_PUBLIC_DEVELOPER":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"PROXY":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"PROXY_EXTERNAL_ACCESS":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"PROXY_RESIDENTIAL":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"PROXY_SERPS":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"SCHEDULER":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"STORAGE":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"WEBHOOKS":{"$ref":"#/components/schemas/EffectivePlatformFeature"}},"required":["ACTORS","STORAGE","SCHEDULER","PROXY","PROXY_EXTERNAL_ACCESS","PROXY_RESIDENTIAL","PROXY_SERPS","WEBHOOKS","ACTORS_PUBLIC_ALL","ACTORS_PUBLIC_DEVELOPER"],"type":"object"},"EncodeAndSignResponse":{"properties":{"data":{"$ref":"#/components/schemas/EncodeAndSignResult"}},"required":["data"],"type":"object"},"EncodeAndSignResult":{"properties":{"encoded":{"type":"string"}},"required":["encoded"],"type":"object"},"EnvVar":{"properties":{"isSecret":{"type":["boolean","null"]},"name":{"type":"string"},"value":{"type":"string"},"valueHash":{"type":"string"}},"required":["name"],"type":"object"},"EnvVarResponse":{"properties":{"data":{"$ref":"#/components/schemas/EnvVar"}},"required":["data"],"type":"object"},"ExampleRunInput":{"properties":{"body":{"type":"string"},"contentType":{"type":"string"}},"type":"object"},"FlatPricePerMonthActorPricingInfo":{"allOf":[{"$ref":"#/components/schemas/CommonActorPricingInfo"},{"properties":{"pricePerUnitUsd":{"type":"number"},"pricingModel":{"type":"string"},"trialMinutes":{"type":"integer"}},"required":["pricingModel","pricePerUnitUsd","trialMinutes"],"type":"object"}]},"FreeActorPricingInfo":{"allOf":[{"$ref":"#/components/schemas/CommonActorPricingInfo"},{"properties":{"pricingModel":{"type":"string"}},"required":["pricingModel"],"type":"object"}]},"GeneralAccess":{"type":"string"},"GitProviderIntegration":{"properties":{"addWorkspaceUrl":{"type":"string"},"id":{"type":"string"},"provider":{"type":"string"},"workspaces":{"items":{"$ref":"#/components/schemas/GitProviderWorkspace"},"type":"array"}},"required":["id","provider","workspaces"],"type":"object"},"GitProviderWorkspace":{"properties":{"id":{"type":"string"},"label":{"type":"string"}},"required":["id","label"],"type":"object"},"GitRepo":{"properties":{"htmlUrl":{"type":"string"},"httpsUrl":{"type":"string"},"sshUrl":{"type":"string"}},"required":["sshUrl","httpsUrl","htmlUrl"],"type":"object"},"GitRepoResponse":{"properties":{"data":{"$ref":"#/components/schemas/GitRepo"}},"required":["data"],"type":"object"},"HadMultipleClients":{"type":"boolean"},"HandledRequestCount":{"minimum":0,"type":"integer"},"HeadLimit":{"type":"integer"},"HttpMethod":{"type":"string"},"IntegrationTracking":{"properties":{"appId":{"type":"string"},"isAiTool":{"type":"boolean"},"platform":{"type":"string"}},"type":"object"},"KeyValueStoreKey":{"properties":{"key":{"type":"string"},"recordPublicUrl":{"format":"uri","type":"string"},"size":{"type":"integer"}},"required":["key","size","recordPublicUrl"],"type":"object"},"KeyValueStoreListItem":{"properties":{"accessedAt":{"format":"date-time","type":"string"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"createdAt":{"format":"date-time","type":"string"},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"id":{"type":"string"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":["string","null"]},"schema":{"type":["object","string","null"]},"stats":{"$ref":"#/components/schemas/KeyValueStoreListStats"},"title":{"type":["string","null"]},"userId":{"type":["string","null"]},"username":{"type":["string","null"]}},"required":["id","createdAt","modifiedAt","accessedAt"],"type":"object"},"KeyValueStoreListStats":{"properties":{"deleteCount":{"type":"integer"},"listCount":{"type":"integer"},"readCount":{"type":"integer"},"s3StorageBytes":{"type":"integer"},"writeCount":{"type":"integer"}},"type":"object"},"KeyValueStoreResource":{"properties":{"accessedAt":{"format":"date-time","type":"string"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"consoleUrl":{"format":"uri","type":"string"},"createdAt":{"format":"date-time","type":"string"},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"id":{"type":"string"},"keysPublicUrl":{"format":"uri","type":"string"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":["string","null"]},"recordsPublicUrl":{"format":"uri","type":"string"},"schema":{"type":["object","null"]},"stats":{"$ref":"#/components/schemas/KeyValueStoreStats"},"title":{"type":["string","null"]},"urlSigningSecretKey":{"type":["string","null"]},"userId":{"type":["string","null"]},"username":{"type":["string","null"]}},"required":["id","createdAt","modifiedAt","accessedAt"],"type":"object"},"KeyValueStoreResponse":{"properties":{"data":{"$ref":"#/components/schemas/KeyValueStoreResource"}},"required":["data"],"type":"object"},"KeyValueStoreStats":{"properties":{"deleteCount":{"type":"integer"},"listCount":{"type":"integer"},"readCount":{"type":"integer"},"s3StorageBytes":{"type":"integer"},"storageBytes":{"type":"integer"},"writeCount":{"type":"integer"}},"type":"object"},"Limits":{"properties":{"dataRetentionDays":{"type":"integer"},"maxActorCount":{"type":"integer"},"maxActorMemoryGbytes":{"type":"number"},"maxActorTaskCount":{"type":"integer"},"maxConcurrentActorJobs":{"type":"integer"},"maxMonthlyActorComputeUnits":{"type":"number"},"maxMonthlyExternalDataTransferGbytes":{"type":"number"},"maxMonthlyProxySerps":{"type":"integer"},"maxMonthlyResidentialProxyGbytes":{"type":"number"},"maxMonthlyUnblockerUnits":{"type":"number"},"maxMonthlyUsageUsd":{"type":"number"},"maxScheduleCount":{"type":"integer"},"maxTeamAccountSeatCount":{"type":"integer"}},"required":["maxMonthlyUsageUsd","maxMonthlyActorComputeUnits","maxMonthlyExternalDataTransferGbytes","maxMonthlyProxySerps","maxMonthlyResidentialProxyGbytes","maxActorMemoryGbytes","maxActorCount","maxActorTaskCount","maxConcurrentActorJobs","maxTeamAccountSeatCount","dataRetentionDays"],"type":"object"},"ListOfActorOAuthAccounts":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ActorOAuthAccount"},"type":"array"},"total":{"type":"integer"}},"required":["total","items"],"type":"object"},"ListOfActorOAuthAccountsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfActorOAuthAccounts"}},"required":["data"],"type":"object"},"ListOfActorOAuthConnections":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ActorOAuthConnection"},"type":"array"},"total":{"type":"integer"}},"required":["total","items"],"type":"object"},"ListOfActorOAuthConnectionsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfActorOAuthConnections"}},"required":["data"],"type":"object"},"ListOfActors":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/ActorListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfActorsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfActors"}},"required":["data"],"type":"object"},"ListOfBuilds":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/BuildListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfBuildsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfBuilds"}},"required":["data"],"type":"object"},"ListOfDatasets":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/DatasetListItem"},"type":"array"},"unnamed":{"type":"boolean"}},"required":["items"],"type":"object"}]},"ListOfDatasetsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfDatasets"}},"required":["data"],"type":"object"},"ListOfEnvVars":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EnvVar"},"type":"array"},"total":{"type":"integer"}},"required":["total","items"],"type":"object"},"ListOfEnvVarsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfEnvVars"}},"required":["data"],"type":"object"},"ListOfGitProviderIntegrationsResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/GitProviderIntegration"},"type":"array"}},"required":["data"],"type":"object"},"ListOfKeyValueStores":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/KeyValueStoreListItem"},"type":"array"},"unnamed":{"type":"boolean"}},"required":["items"],"type":"object"}]},"ListOfKeyValueStoresResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfKeyValueStores"}},"required":["data"],"type":"object"},"ListOfKeys":{"properties":{"count":{"type":"integer"},"exclusiveStartKey":{"type":["string","null"]},"isTruncated":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/KeyValueStoreKey"},"type":"array"},"limit":{"type":"integer"},"nextExclusiveStartKey":{"type":["string","null"]}},"required":["items","count","limit","isTruncated"],"type":"object"},"ListOfKeysResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfKeys"}},"required":["data"],"type":"object"},"ListOfRequestQueues":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/RequestQueueListItem"},"type":"array"},"unnamed":{"type":"boolean"}},"required":["items"],"type":"object"}]},"ListOfRequestQueuesResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfRequestQueues"}},"required":["data"],"type":"object"},"ListOfRequests":{"properties":{"cursor":{"type":"string"},"exclusiveStartId":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/RequestResource"},"type":"array"},"limit":{"type":"integer"},"nextCursor":{"type":"string"}},"required":["items","limit"],"type":"object"},"ListOfRequestsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfRequests"}},"required":["data"],"type":"object"},"ListOfRuns":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/RunListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfRunsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfRuns"}},"required":["data"],"type":"object"},"ListOfSchedules":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/ScheduleListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfSchedulesResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfSchedules"}},"required":["data"],"type":"object"},"ListOfStoreActors":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/StoreActor"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfStoreActorsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfStoreActors"}},"required":["data"],"type":"object"},"ListOfTasks":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/TaskListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfTasksResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfTasks"}},"required":["data"],"type":"object"},"ListOfVersions":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Version"},"type":"array"},"total":{"type":"integer"}},"required":["total","items"],"type":"object"},"ListOfVersionsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfVersions"}},"required":["data"],"type":"object"},"ListOfWebhookDispatches":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/WebhookDispatch"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfWebhookDispatchesResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfWebhookDispatches"}},"required":["data"],"type":"object"},"ListOfWebhookResources":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/WebhookResource"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfWebhookResourcesResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfWebhookResources"}},"required":["data"],"type":"object"},"ListOfWebhooks":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/WebhookListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfWebhooksResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfWebhooks"}},"required":["data"],"type":"object"},"LockExpiresAt":{"format":"date-time","type":"string"},"LockedRequestQueueHead":{"properties":{"clientKey":{"type":"string"},"hadMultipleClients":{"$ref":"#/components/schemas/HadMultipleClients"},"items":{"items":{"$ref":"#/components/schemas/LockedRequestQueueHeadItem"},"type":"array"},"limit":{"$ref":"#/components/schemas/HeadLimit"},"lockSecs":{"type":"integer"},"queueHasLockedRequests":{"type":"boolean"},"queueModifiedAt":{"$ref":"#/components/schemas/QueueModifiedAt"}},"required":["limit","queueModifiedAt","hadMultipleClients","lockSecs","items"],"type":"object"},"LockedRequestQueueHeadItem":{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"lockExpiresAt":{"$ref":"#/components/schemas/LockExpiresAt"},"method":{"$ref":"#/components/schemas/RequestMethod"},"retryCount":{"$ref":"#/components/schemas/RetryCount"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"},"url":{"$ref":"#/components/schemas/RequestUrl"}},"required":["id","uniqueKey","url","lockExpiresAt"],"type":"object"},"LockedRequestQueueHeadResponse":{"properties":{"data":{"$ref":"#/components/schemas/LockedRequestQueueHead"}},"required":["data"],"type":"object"},"MonthlyServiceUsage":{"type":"object"},"MonthlyUsage":{"properties":{"dailyServiceUsages":{"items":{"$ref":"#/components/schemas/DailyServiceUsage"},"type":"array"},"monthlyServiceUsage":{"$ref":"#/components/schemas/MonthlyServiceUsage"},"totalUsageCreditsUsdAfterVolumeDiscount":{"type":"number"},"totalUsageCreditsUsdBeforeVolumeDiscount":{"type":"number"},"usageCycle":{"$ref":"#/components/schemas/UsageCycle"}},"required":["usageCycle","monthlyServiceUsage","dailyServiceUsages","totalUsageCreditsUsdBeforeVolumeDiscount","totalUsageCreditsUsdAfterVolumeDiscount"],"type":"object"},"MonthlyUsageResponse":{"properties":{"data":{"$ref":"#/components/schemas/MonthlyUsage"}},"required":["data"],"type":"object"},"PaginationResponse":{"properties":{"count":{"minimum":0,"type":"integer"},"desc":{"type":"boolean"},"limit":{"minimum":1,"type":"integer"},"offset":{"minimum":0,"type":"integer"},"total":{"minimum":0,"type":"integer"}},"required":["total","offset","limit","desc","count"],"type":"object"},"PayPerEventActorPricingInfo":{"allOf":[{"$ref":"#/components/schemas/CommonActorPricingInfo"},{"properties":{"isPPEPlatformUsagePaidByUser":{"type":["boolean","null"]},"minimalMaxTotalChargeUsd":{"type":["number","null"]},"pricingModel":{"type":"string"},"pricingPerEvent":{"properties":{"actorChargeEvents":{"type":"object"}},"type":"object"}},"required":["pricingModel","pricingPerEvent"],"type":"object"}]},"PendingRequestCount":{"type":"integer"},"PricePerDatasetItemActorPricingInfo":{"allOf":[{"$ref":"#/components/schemas/CommonActorPricingInfo"},{"properties":{"pricePerUnitUsd":{"type":"number"},"pricingModel":{"type":"string"},"tieredPricing":{"$ref":"#/components/schemas/TieredPricingPerDatasetItem"},"unitName":{"type":"string"}},"required":["pricingModel","unitName"],"type":"object"}]},"ProlongRequestLockResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestLockInfo"}},"required":["data"],"type":"object"},"ProxyGroup":{"properties":{"availableCount":{"type":"integer"},"description":{"type":["string","null"]},"id":{"type":"string"},"name":{"type":"string"}},"required":["name","description"],"type":"object"},"ProxyResource":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/ProxyGroup"},"type":"array"},"password":{"type":["string","null"]}},"required":["groups"],"type":"object"},"QueueAccessedAt":{"format":"date-time","type":"string"},"QueueCreatedAt":{"format":"date-time","type":"string"},"QueueId":{"type":"string"},"QueueModifiedAt":{"format":"date-time","type":"string"},"QueueUserId":{"type":"string"},"RecordResponse":{"type":"object"},"RegisterDeploymentKeyResponse":{"properties":{"data":{"properties":{"repoName":{"type":"string"}},"required":["repoName"],"type":"object"}},"required":["data"],"type":"object"},"RequestBase":{"properties":{"errorMessages":{"items":{"type":"string"},"type":["array","null"]},"handledAt":{"format":"date-time","type":["string","null"]},"headers":{"type":["object","null"]},"loadedUrl":{"type":["string","null"]},"method":{"$ref":"#/components/schemas/RequestMethod"},"noRetry":{"type":["boolean","null"]},"payload":{"type":["string","object","null"]},"retryCount":{"$ref":"#/components/schemas/RetryCount"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"},"url":{"$ref":"#/components/schemas/RequestUrl"},"userData":{"$ref":"#/components/schemas/RequestUserData"}},"required":["uniqueKey","url"],"type":"object"},"RequestId":{"type":"string"},"RequestLockInfo":{"properties":{"lockExpiresAt":{"$ref":"#/components/schemas/LockExpiresAt"}},"required":["lockExpiresAt"],"type":"object"},"RequestMethod":{"$ref":"#/components/schemas/HttpMethod"},"RequestQueueHead":{"properties":{"hadMultipleClients":{"$ref":"#/components/schemas/HadMultipleClients"},"items":{"items":{"$ref":"#/components/schemas/RequestQueueHeadItem"},"type":"array"},"limit":{"$ref":"#/components/schemas/HeadLimit"},"queueModifiedAt":{"$ref":"#/components/schemas/QueueModifiedAt"}},"required":["limit","queueModifiedAt","hadMultipleClients","items"],"type":"object"},"RequestQueueHeadItem":{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"method":{"$ref":"#/components/schemas/RequestMethod"},"retryCount":{"$ref":"#/components/schemas/RetryCount"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"},"url":{"$ref":"#/components/schemas/RequestUrl"}},"required":["id","uniqueKey","url"],"type":"object"},"RequestQueueHeadResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestQueueHead"}},"required":["data"],"type":"object"},"RequestQueueListItem":{"properties":{"accessedAt":{"$ref":"#/components/schemas/QueueAccessedAt"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"createdAt":{"$ref":"#/components/schemas/QueueCreatedAt"},"expireAt":{"format":"date-time","type":"string"},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"hadMultipleClients":{"$ref":"#/components/schemas/HadMultipleClients"},"handledRequestCount":{"$ref":"#/components/schemas/HandledRequestCount"},"id":{"$ref":"#/components/schemas/QueueId"},"modifiedAt":{"$ref":"#/components/schemas/QueueModifiedAt"},"name":{"type":["string","null"]},"pendingRequestCount":{"$ref":"#/components/schemas/PendingRequestCount"},"stats":{"$ref":"#/components/schemas/RequestQueueListStats"},"title":{"type":["string","null"]},"totalRequestCount":{"$ref":"#/components/schemas/TotalRequestCount"},"userId":{"$ref":"#/components/schemas/QueueUserId"},"username":{"type":"string"}},"required":["id","userId","createdAt","modifiedAt","accessedAt","totalRequestCount","handledRequestCount","pendingRequestCount","hadMultipleClients"],"type":"object"},"RequestQueueListStats":{"properties":{"deleteCount":{"type":"integer"},"dynamodbStorageBytes":{"type":"integer"},"headItemReadCount":{"type":"integer"},"readCount":{"type":"integer"},"s3StorageBytes":{"type":"integer"},"writeCount":{"type":"integer"}},"type":"object"},"RequestQueueResource":{"properties":{"accessedAt":{"$ref":"#/components/schemas/QueueAccessedAt"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"consoleUrl":{"format":"uri","type":"string"},"createdAt":{"$ref":"#/components/schemas/QueueCreatedAt"},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"hadMultipleClients":{"$ref":"#/components/schemas/HadMultipleClients"},"handledRequestCount":{"$ref":"#/components/schemas/HandledRequestCount"},"id":{"$ref":"#/components/schemas/QueueId"},"modifiedAt":{"$ref":"#/components/schemas/QueueModifiedAt"},"name":{"type":["string","null"]},"pendingRequestCount":{"$ref":"#/components/schemas/PendingRequestCount"},"stats":{"$ref":"#/components/schemas/RequestQueueStats"},"title":{"type":["string","null"]},"totalRequestCount":{"$ref":"#/components/schemas/TotalRequestCount"},"userId":{"$ref":"#/components/schemas/QueueUserId"}},"required":["id","userId","createdAt","modifiedAt","accessedAt","totalRequestCount","handledRequestCount","pendingRequestCount","hadMultipleClients","consoleUrl"],"type":"object"},"RequestQueueResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestQueueResource"}},"required":["data"],"type":"object"},"RequestQueueStats":{"properties":{"deleteCount":{"type":"integer"},"headItemReadCount":{"type":"integer"},"readCount":{"type":"integer"},"storageBytes":{"type":"integer"},"writeCount":{"type":"integer"}},"type":"object"},"RequestRegistration":{"properties":{"requestId":{"$ref":"#/components/schemas/RequestId"},"wasAlreadyHandled":{"$ref":"#/components/schemas/WasAlreadyHandled"},"wasAlreadyPresent":{"$ref":"#/components/schemas/WasAlreadyPresent"}},"required":["requestId","wasAlreadyPresent","wasAlreadyHandled"],"type":"object"},"RequestResource":{"allOf":[{"$ref":"#/components/schemas/RequestBase","required":["id"]},{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"lockByClient":{"type":"string"},"lockExpiresAt":{"$ref":"#/components/schemas/LockExpiresAt"}}}]},"RequestResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestResource"}},"required":["data"],"type":"object"},"RequestUrl":{"type":"string"},"RequestUserData":{"type":"object"},"RetryCount":{"type":"integer"},"Run":{"properties":{"accountedChargedEventCounts":{"type":["object","null"]},"actId":{"type":"string"},"actorTaskId":{"type":["string","null"]},"buildId":{"type":"string"},"buildNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])(\\.[1-9][0-9]{0,4})$","type":["string","null"]},"chargedEventCounts":{"type":"object"},"consoleUrl":{"format":"uri","type":"string"},"containerUrl":{"format":"uri","type":"string"},"createdByOrganizationMemberUserId":{"type":"string"},"defaultDatasetId":{"type":"string"},"defaultKeyValueStoreId":{"type":"string"},"defaultRequestQueueId":{"type":"string"},"eventUsage":{"type":"object"},"exitCode":{"type":["integer","null"]},"externalChargedTotalUsd":{"type":"number"},"finishedAt":{"format":"date-time","type":["string","null"]},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"gitBranchName":{"type":["string","null"]},"id":{"type":"string"},"integrationTracking":{"$ref":"#/components/schemas/IntegrationTracking"},"isContainerServerReady":{"type":["boolean","null"]},"isStatusMessageTerminal":{"type":["boolean","null"]},"meta":{"$ref":"#/components/schemas/RunMeta"},"metamorphs":{"anyOf":[{"items":{"$ref":"#/components/schemas/RunMetamorphEvent"},"type":"array"},{"type":"null"}]},"options":{"$ref":"#/components/schemas/RunOptions"},"output":{"type":"object"},"platformUsageBillingModel":{"type":"string"},"pricingInfo":{"$ref":"#/components/schemas/ActorRunPricingInfo"},"standby":{"anyOf":[{"$ref":"#/components/schemas/RunStandby"},{"type":"null"}]},"startedAt":{"format":"date-time","type":"string"},"stats":{"$ref":"#/components/schemas/RunStats"},"status":{"$ref":"#/components/schemas/ActorJobStatus"},"statusMessage":{"type":["string","null"]},"storageIds":{"properties":{"datasets":{"properties":{"default":{"type":"string"}},"type":"object"},"keyValueStores":{"properties":{"default":{"type":"string"}},"type":"object"},"requestQueues":{"properties":{"default":{"type":"string"}},"type":"object"}},"type":"object"},"usage":{"anyOf":[{"$ref":"#/components/schemas/RunUsage"},{"type":"null"}]},"usageTotalUsd":{"type":["number","null"]},"usageUsd":{"anyOf":[{"$ref":"#/components/schemas/RunUsageUsd"},{"type":"null"}]},"userId":{"type":"string"}},"required":["id","actId","userId","startedAt","status","meta","stats","options","buildId","defaultKeyValueStoreId","defaultDatasetId","defaultRequestQueueId"],"type":"object"},"RunListItem":{"properties":{"actId":{"type":"string"},"actorTaskId":{"type":["string","null"]},"buildId":{"type":"string"},"buildNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])(\\.[1-9][0-9]{0,4})$","type":"string"},"buildNumberInt":{"type":"integer"},"defaultDatasetId":{"type":"string"},"defaultKeyValueStoreId":{"type":"string"},"defaultRequestQueueId":{"type":"string"},"finishedAt":{"format":"date-time","type":["string","null"]},"id":{"type":"string"},"meta":{"$ref":"#/components/schemas/RunMeta"},"standby":{"anyOf":[{"$ref":"#/components/schemas/RunStandby"},{"type":"null"}]},"startedAt":{"format":"date-time","type":"string"},"status":{"$ref":"#/components/schemas/ActorJobStatus"},"usageTotalUsd":{"type":"number"},"userId":{"type":"string"}},"required":["id","actId","status","startedAt","buildId","meta","usageTotalUsd","defaultKeyValueStoreId","defaultDatasetId","defaultRequestQueueId"],"type":"object"},"RunMeta":{"properties":{"actorRunId":{"type":"string"},"clientIp":{"type":["string","null"]},"origin":{"$ref":"#/components/schemas/RunOrigin"},"scheduleId":{"type":["string","null"]},"scheduledAct2Id":{"type":"string"},"scheduledActorTaskId":{"type":"string"},"scheduledAt":{"format":"date-time","type":["string","null"]},"userAgent":{"type":["string","null"]},"webhookDispatchId":{"type":"string"}},"required":["origin"],"type":"object"},"RunMetamorphEvent":{"properties":{"actorId":{"type":"string"},"buildId":{"type":"string"},"buildTags":{"items":{"type":"string"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"inputKey":{"type":["string","null"]}},"required":["createdAt","actorId","buildId"],"type":"object"},"RunOptions":{"properties":{"build":{"type":"string"},"diskMbytes":{"minimum":0,"type":"integer"},"isMaxTotalChargeUsdSetByUser":{"type":"boolean"},"maxItems":{"minimum":0,"type":["integer","null"]},"maxTotalChargeUsd":{"minimum":0,"type":["number","null"]},"memoryMbytes":{"maximum":32768,"minimum":128,"type":"integer"},"restartOnError":{"type":["boolean","null"]},"timeoutSecs":{"minimum":0,"type":"integer"}},"required":["build","timeoutSecs","memoryMbytes","diskMbytes"],"type":"object"},"RunOrigin":{"type":"string"},"RunResponse":{"properties":{"data":{"$ref":"#/components/schemas/Run"}},"required":["data"],"type":"object"},"RunStandby":{"properties":{"deployment":{"type":"string"}},"required":["deployment"],"type":"object"},"RunStats":{"properties":{"computeUnits":{"minimum":0,"type":"number"},"cpuAvgUsage":{"type":"number"},"cpuCurrentUsage":{"type":"number"},"cpuMaxUsage":{"type":"number"},"durationMillis":{"minimum":0,"type":"integer"},"inputBodyLen":{"minimum":0,"type":["integer","null"]},"memAvgBytes":{"type":"number"},"memCurrentBytes":{"minimum":0,"type":"integer"},"memMaxBytes":{"minimum":0,"type":"integer"},"metamorph":{"minimum":0,"type":"integer"},"migrationCount":{"minimum":0,"type":"integer"},"netRxBytes":{"minimum":0,"type":"integer"},"netTxBytes":{"minimum":0,"type":"integer"},"rebootCount":{"minimum":0,"type":"integer"},"restartCount":{"minimum":0,"type":"integer"},"resurrectCount":{"minimum":0,"type":"integer"},"runTimeSecs":{"minimum":0,"type":"number"}},"type":"object"},"RunUsage":{"properties":{"ACTOR_COMPUTE_UNITS":{"type":["number","null"]},"DATASET_READS":{"type":["integer","null"]},"DATASET_WRITES":{"type":["integer","null"]},"DATA_TRANSFER_EXTERNAL_GBYTES":{"type":["number","null"]},"DATA_TRANSFER_INTERNAL_GBYTES":{"type":["number","null"]},"KEY_VALUE_STORE_LISTS":{"type":["integer","null"]},"KEY_VALUE_STORE_READS":{"type":["integer","null"]},"KEY_VALUE_STORE_WRITES":{"type":["integer","null"]},"PROXY_RESIDENTIAL_TRANSFER_GBYTES":{"type":["number","null"]},"PROXY_SERPS":{"type":["integer","null"]},"PROXY_UNBLOCKER_UNITS":{"type":["number","null"]},"REQUEST_QUEUE_READS":{"type":["integer","null"]},"REQUEST_QUEUE_WRITES":{"type":["integer","null"]}},"type":"object"},"RunUsageUsd":{"properties":{"ACTOR_COMPUTE_UNITS":{"type":["number","null"]},"DATASET_READS":{"type":["number","null"]},"DATASET_WRITES":{"type":["number","null"]},"DATA_TRANSFER_EXTERNAL_GBYTES":{"type":["number","null"]},"DATA_TRANSFER_INTERNAL_GBYTES":{"type":["number","null"]},"KEY_VALUE_STORE_LISTS":{"type":["number","null"]},"KEY_VALUE_STORE_READS":{"type":["number","null"]},"KEY_VALUE_STORE_WRITES":{"type":["number","null"]},"PROXY_RESIDENTIAL_TRANSFER_GBYTES":{"type":["number","null"]},"PROXY_SERPS":{"type":["number","null"]},"PROXY_UNBLOCKER_UNITS":{"type":["number","null"]},"REQUEST_QUEUE_READS":{"type":["number","null"]},"REQUEST_QUEUE_WRITES":{"type":["number","null"]}},"type":"object"},"Schedule":{"allOf":[{"$ref":"#/components/schemas/ScheduleBase"},{"properties":{"actions":{"items":{"$ref":"#/components/schemas/ScheduleAction"},"type":"array"},"description":{"type":["string","null"]},"integrationTracking":{"$ref":"#/components/schemas/IntegrationTracking"},"notifications":{"$ref":"#/components/schemas/ScheduleNotifications"},"title":{"type":["string","null"]},"uiState":{"anyOf":[{"$ref":"#/components/schemas/ScheduleUiState"},{"type":"null"}]}},"required":["actions"],"type":"object"}]},"ScheduleAction":{"oneOf":[{"$ref":"#/components/schemas/ScheduleActionRunActor"},{"$ref":"#/components/schemas/ScheduleActionRunActorTask"}]},"ScheduleActionRunActor":{"properties":{"actorId":{"type":"string"},"id":{"type":"string"},"runInput":{"anyOf":[{"$ref":"#/components/schemas/ScheduleActionRunInput"},{"type":"null"}]},"runOptions":{"anyOf":[{"$ref":"#/components/schemas/TaskOptions"},{"type":"null"}]},"type":{}},"required":["id","type","actorId"],"type":"object"},"ScheduleActionRunActorTask":{"properties":{"actorTaskId":{"type":"string"},"id":{"type":"string"},"input":{"anyOf":[{"type":"object"},{"type":"null"}]},"type":{}},"required":["id","type","actorTaskId"],"type":"object"},"ScheduleActionRunInput":{"properties":{"body":{"type":["string","null"]},"contentType":{"type":["string","null"]}},"type":"object"},"ScheduleBase":{"properties":{"createdAt":{"format":"date-time","type":"string"},"cronExpression":{"type":"string"},"id":{"type":"string"},"isEnabled":{"type":"boolean"},"isExclusive":{"type":"boolean"},"lastRunAt":{"format":"date-time","type":["string","null"]},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"nextRunAt":{"format":"date-time","type":["string","null"]},"timezone":{"type":"string"},"userId":{"type":"string"}},"required":["id","userId","name","cronExpression","timezone","isEnabled","isExclusive","createdAt","modifiedAt"],"type":"object"},"ScheduleListItem":{"allOf":[{"$ref":"#/components/schemas/ScheduleBase"},{"properties":{"actions":{"items":{"$ref":"#/components/schemas/ScheduleListItemAction"},"type":"array"},"integrationTracking":{"$ref":"#/components/schemas/IntegrationTracking"},"notifications":{"$ref":"#/components/schemas/ScheduleNotifications"},"title":{"type":["string","null"]}},"required":["actions"],"type":"object"}]},"ScheduleListItemAction":{"oneOf":[{"$ref":"#/components/schemas/ScheduleListItemActionRunActor"},{"$ref":"#/components/schemas/ScheduleListItemActionRunActorTask"}]},"ScheduleListItemActionRunActor":{"properties":{"actorId":{"type":"string"},"id":{"type":"string"},"type":{}},"required":["id","type","actorId"],"type":"object"},"ScheduleListItemActionRunActorTask":{"properties":{"actorTaskId":{"type":"string"},"id":{"type":"string"},"type":{}},"required":["id","type","actorTaskId"],"type":"object"},"ScheduleLogEntry":{"properties":{"createdAt":{"format":"date-time","type":"string"},"level":{"type":"string"},"message":{"type":"string"}},"required":["message","level","createdAt"],"type":"object"},"ScheduleLogResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ScheduleLogEntry"},"type":"array"}},"required":["data"],"type":"object"},"ScheduleNotifications":{"properties":{"email":{"type":"boolean"}},"type":"object"},"ScheduleResponse":{"properties":{"data":{"$ref":"#/components/schemas/Schedule"}},"required":["data"],"type":"object"},"ScheduleUiState":{"properties":{"data":{"properties":{"cronExpression":{"type":"string"},"timezone":{"type":"string"}},"type":"object"},"version":{"type":"integer"}},"type":"object"},"ServiceUsage":{"type":"object"},"SourceCodeFile":{"properties":{"content":{"type":"string"},"format":{"$ref":"#/components/schemas/SourceCodeFileFormat"},"name":{"type":"string"}},"required":["name"],"type":"object"},"SourceCodeFileFormat":{"type":"string"},"SourceCodeFolder":{"properties":{"folder":{"type":"boolean"},"name":{"type":"string"}},"required":["name","folder"],"type":"object"},"StoreActor":{"properties":{"actorReviewCount":{"type":"integer"},"actorReviewRating":{"type":"number"},"badge":{"type":["string","null"]},"bookmarkCount":{"type":"integer"},"categories":{"items":{"type":"string"},"type":"array"},"currentPricingInfo":{"$ref":"#/components/schemas/CurrentPricingInfo"},"description":{"type":["string","null"]},"id":{"type":"string"},"inputSchema":{"properties":{"properties":{"type":"object"},"required":{"items":{"type":"string"},"type":"array"},"type":{"type":"string"}},"required":["type","properties"],"type":"object"},"isWhiteListedForAgenticPayments":{"type":["boolean","null"]},"name":{"type":"string"},"notice":{"$ref":"#/components/schemas/ActorNotice"},"pictureUrl":{"type":["string","null"]},"readmeSummary":{"type":"string"},"stats":{"$ref":"#/components/schemas/ActorStats"},"title":{"type":"string"},"url":{"format":"uri","type":["string","null"]},"userFullName":{"type":["string","null"]},"userPictureUrl":{"format":"uri","type":["string","null"]},"username":{"type":"string"}},"required":["id","title","name","username","stats"],"type":"object"},"TaggedBuilds":{"type":"object"},"Task":{"properties":{"actId":{"type":"string"},"actorStandby":{"anyOf":[{"$ref":"#/components/schemas/ActorStandby"},{"type":"null"}]},"createdAt":{"format":"date-time","type":"string"},"description":{"type":["string","null"]},"id":{"type":"string"},"input":{"anyOf":[{"$ref":"#/components/schemas/TaskInput"},{"items":{"$ref":"#/components/schemas/TaskInput"},"type":"array"},{"type":"null"}]},"isPublic":{"type":"boolean"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"nameLowerCase":{"type":"string"},"options":{"anyOf":[{"$ref":"#/components/schemas/TaskOptions"},{"type":"null"}]},"publicConfig":{"anyOf":[{"$ref":"#/components/schemas/TaskPublicConfig"},{"type":"null"}]},"removedAt":{"format":"date-time","type":["string","null"]},"standbyUrl":{"format":"uri","type":["string","null"]},"stats":{"anyOf":[{"$ref":"#/components/schemas/TaskStats"},{"type":"null"}]},"title":{"type":["string","null"]},"userId":{"type":"string"},"username":{"type":["string","null"]}},"required":["id","userId","actId","name","createdAt","modifiedAt"],"type":"object"},"TaskInput":{"type":"object"},"TaskListItem":{"properties":{"actId":{"type":"string"},"actName":{"type":["string","null"]},"actUsername":{"type":["string","null"]},"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"isPublic":{"type":"boolean"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"stats":{"anyOf":[{"$ref":"#/components/schemas/TaskStats"},{"type":"null"}]},"title":{"type":["string","null"]},"userId":{"type":"string"},"username":{"type":["string","null"]}},"required":["id","userId","actId","name","createdAt","modifiedAt"],"type":"object"},"TaskOptions":{"properties":{"build":{"type":["string","null"]},"forcePermissionLevel":{"anyOf":[{"$ref":"#/components/schemas/ActorPermissionLevel"},{"type":"null"}]},"isMaxTotalChargeUsdSetByUser":{"type":["boolean","null"]},"maxItems":{"type":["integer","null"]},"maxTotalChargeUsd":{"type":["number","null"]},"memoryMbytes":{"type":["integer","null"]},"restartOnError":{"type":["boolean","null"]},"timeoutSecs":{"type":["integer","null"]}},"type":"object"},"TaskPublicConfig":{"properties":{"categorization":{"type":["string","null"]},"datasetName":{"type":["string","null"]},"datasetView":{"type":["string","null"]},"faq":{"items":{"properties":{"answer":{"type":"string"},"question":{"type":"string"}},"required":["question","answer"],"type":"object"},"type":["array","null"]},"highlightedFields":{"items":{"type":"string"},"type":["array","null"]},"inputSchemaFields":{"items":{"type":"string"},"type":["array","null"]},"publishedAt":{"format":"date-time","type":["string","null"]},"seoDescription":{"maxLength":160,"type":["string","null"]},"seoTitle":{"maxLength":60,"type":["string","null"]}},"type":"object"},"TaskResponse":{"properties":{"data":{"$ref":"#/components/schemas/Task"}},"required":["data"],"type":"object"},"TaskStats":{"properties":{"lastRunStartedAt":{"format":"date-time","type":["string","null"]},"totalRuns":{"type":"integer"}},"type":"object"},"TieredPricingPerDatasetItem":{"type":"object"},"TotalRequestCount":{"minimum":0,"type":"integer"},"UniqueKey":{"type":"string"},"UnlockRequestsResponse":{"properties":{"data":{"$ref":"#/components/schemas/UnlockRequestsResult"}},"required":["data"],"type":"object"},"UnlockRequestsResult":{"properties":{"unlockedCount":{"type":"integer"}},"required":["unlockedCount"],"type":"object"},"UnprocessedRequest":{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"method":{"$ref":"#/components/schemas/RequestMethod"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"},"url":{"$ref":"#/components/schemas/RequestUrl"}},"required":["uniqueKey","url"],"type":"object"},"UpdateRequestResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestRegistration"}},"required":["data"],"type":"object"},"UsageCycle":{"properties":{"endAt":{"format":"date-time","type":"string"},"startAt":{"format":"date-time","type":"string"}},"required":["startAt","endAt"],"type":"object"},"UserPlan":{"properties":{"apiRateLimitBoosts":{"type":"integer"},"availableAddOns":{"items":{"type":"string"},"type":"array"},"availableProxyGroups":{"$ref":"#/components/schemas/AvailableProxyGroups"},"dataRetentionDays":{"type":"integer"},"description":{"type":"string"},"enabledPlatformFeatures":{"items":{"type":"string"},"type":"array"},"forceBillingInterval":{"type":"string"},"id":{"type":"string"},"isEnabled":{"type":"boolean"},"isPayingCustomer":{"type":"boolean"},"legacyPlanId":{"type":"string"},"maxActorCount":{"type":"integer"},"maxActorMemoryGbytes":{"type":"number"},"maxActorTaskCount":{"type":"integer"},"maxConcurrentActorRuns":{"type":"integer"},"maxMonthlyActorComputeUnits":{"type":"number"},"maxMonthlyExternalDataTransferGbytes":{"type":"number"},"maxMonthlyProxySerps":{"type":"integer"},"maxMonthlyResidentialProxyGbytes":{"type":"number"},"maxMonthlyUnblockerUnits":{"type":"integer"},"maxMonthlyUsageUsd":{"type":"number"},"maxPublicActorTaskCount":{"type":"integer"},"maxPublicActorTaskCountPerActor":{"type":"integer"},"maxScheduleCount":{"type":"integer"},"monitoringLevel":{"type":["string","null"]},"monthlyBasePriceUsd":{"type":"number"},"monthlyUsageCreditsUsd":{"type":"number"},"overageThresholdUsd":{"type":"number"},"personalizedSupport":{"type":["string","null"]},"planPricing":{"type":"object"},"planTags":{"items":{"type":"string"},"type":"array"},"planVersion":{"type":"number"},"supportLevel":{"type":"string"},"teamAccountSeatCount":{"type":"integer"},"tier":{"type":"string"},"usageDiscountPercent":{"type":"number"}},"required":["availableProxyGroups"],"type":"object"},"UserPrivateInfo":{"properties":{"createdAt":{"format":"date-time","type":"string"},"effectivePlatformFeatures":{"$ref":"#/components/schemas/EffectivePlatformFeatures"},"email":{"format":"email","type":["string","null"]},"id":{"type":"string"},"isPaying":{"type":"boolean"},"organizationOwnerUserId":{"type":["string","null"]},"plan":{"$ref":"#/components/schemas/UserPlan"},"profile":{"$ref":"#/components/schemas/UserProfile"},"proxy":{"$ref":"#/components/schemas/ProxyResource"},"username":{"type":"string"}},"required":["username"],"type":"object"},"UserPrivateInfoResponse":{"properties":{"data":{"$ref":"#/components/schemas/UserPrivateInfo"}},"required":["data"],"type":"object"},"UserProfile":{"properties":{"bio":{"type":["string","null"]},"githubUsername":{"type":["string","null"]},"name":{"type":"string"},"pictureUrl":{"format":"uri","type":["string","null"]},"readme":{"type":["string","null"]},"twitterUsername":{"type":["string","null"]},"websiteUrl":{"format":"uri","type":["string","null"]}},"type":"object"},"UserPublicInfo":{"properties":{"profile":{"$ref":"#/components/schemas/UserProfile"},"username":{"type":"string"}},"required":["username"],"type":"object"},"UserPublicInfoResponse":{"properties":{"data":{"$ref":"#/components/schemas/UserPublicInfo"}},"required":["data"],"type":"object"},"Version":{"properties":{"applyEnvVarsToBuild":{"type":["boolean","null"]},"bitbucketWebhookId":{"type":["string","null"]},"buildTag":{"type":["string","null"]},"envVars":{"anyOf":[{"items":{"$ref":"#/components/schemas/EnvVar"},"type":"array"},{"type":"null"}]},"gitHubGistUrl":{"type":["string","null"]},"gitRepoUrl":{"type":["string","null"]},"githubWebhookId":{"type":["integer","null"]},"gitlabWebhookId":{"type":["integer","null"]},"sourceFiles":{"$ref":"#/components/schemas/VersionSourceFiles"},"sourceType":{"anyOf":[{"$ref":"#/components/schemas/VersionSourceType"},{"type":"null"}]},"tarballUrl":{"type":["string","null"]},"versionNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])$","type":"string"}},"required":["versionNumber","sourceType"],"type":"object"},"VersionResponse":{"properties":{"data":{"$ref":"#/components/schemas/Version"}},"required":["data"],"type":"object"},"VersionSourceFiles":{"items":{"anyOf":[{"$ref":"#/components/schemas/SourceCodeFile"},{"$ref":"#/components/schemas/SourceCodeFolder"}]},"type":"array"},"VersionSourceType":{"type":"string"},"WasAlreadyHandled":{"type":"boolean"},"WasAlreadyPresent":{"type":"boolean"},"WebhookCondition":{"properties":{"actorId":{"type":["string","null"]},"actorRunId":{"type":["string","null"]},"actorTaskId":{"type":["string","null"]}},"type":"object"},"WebhookDatasetTransformation":{"properties":{"fields":{"items":{"type":"string"},"type":"array"},"omit":{"items":{"type":"string"},"type":"array"}},"type":"object"},"WebhookDispatch":{"properties":{"calls":{"items":{"properties":{"debugPostMessage":{"type":"object"},"errorMessage":{"type":["string","null"]},"finishedAt":{"format":"date-time","type":["string","null"]},"responseBody":{"type":["string","null"]},"responseStatus":{"type":["integer","null"]},"startedAt":{"format":"date-time","type":["string","null"]}},"type":"object"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"eventData":{"properties":{"actorBuildId":{"type":"string"},"actorId":{"type":"string"},"actorRunId":{"type":"string"},"actorTaskId":{"type":["string","null"]}},"required":["actorId"],"type":["object","null"]},"eventType":{"$ref":"#/components/schemas/WebhookEventType"},"id":{"type":"string"},"status":{"$ref":"#/components/schemas/WebhookDispatchStatus"},"userId":{"type":"string"},"webhook":{"anyOf":[{"$ref":"#/components/schemas/WebhookDispatchWebhookSummary"},{"type":"null"}]},"webhookId":{"type":"string"}},"required":["id","userId","webhookId","createdAt","status","eventType"],"type":"object"},"WebhookDispatchResponse":{"properties":{"data":{"$ref":"#/components/schemas/WebhookDispatch"}},"required":["data"],"type":"object"},"WebhookDispatchStatus":{"type":"string"},"WebhookDispatchWebhookSummary":{"properties":{"_id":{"type":"string"},"actionType":{"type":"string"},"condition":{"$ref":"#/components/schemas/WebhookCondition"},"githubIssue":{"$ref":"#/components/schemas/WebhookGithubIssue"},"googleDrive":{"$ref":"#/components/schemas/WebhookGoogleDrive"},"googleMail":{"$ref":"#/components/schemas/WebhookGoogleMail"},"isAdHoc":{"type":"boolean"},"isApifyIntegration":{"type":["boolean","null"]},"requestUrl":{"format":"uri","type":["string","null"]},"slackMessage":{"$ref":"#/components/schemas/WebhookSlackMessage"}},"type":"object"},"WebhookEventType":{"type":"string"},"WebhookGithubIssue":{"properties":{"body":{"type":"string"},"repository":{"type":"string"},"title":{"type":"string"},"userIntegrationId":{"type":"string"}},"type":"object"},"WebhookGoogleDrive":{"properties":{"filename":{"type":"string"},"format":{"type":["string","null"]},"transformation":{"$ref":"#/components/schemas/WebhookDatasetTransformation"},"userIntegrationId":{"type":"string"}},"type":"object"},"WebhookGoogleMail":{"properties":{"attachmentFormat":{"type":"string"},"attachmentTransformation":{"$ref":"#/components/schemas/WebhookDatasetTransformation"},"body":{"type":"string"},"emailTo":{"items":{"type":"string"},"type":"array"},"subject":{"type":"string"},"userIntegrationId":{"type":"string"}},"type":"object"},"WebhookLastDispatch":{"properties":{"finishedAt":{"format":"date-time","type":["string","null"]},"removedAt":{"format":"date-time","type":["string","null"]},"status":{"$ref":"#/components/schemas/WebhookDispatchStatus"}},"required":["status"],"type":"object"},"WebhookListItem":{"properties":{"actionType":{"type":"string"},"condition":{"$ref":"#/components/schemas/WebhookCondition"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":["string","null"]},"doNotRetry":{"type":"boolean"},"eventTypes":{"items":{"$ref":"#/components/schemas/WebhookEventType"},"type":"array"},"githubIssue":{"$ref":"#/components/schemas/WebhookGithubIssue"},"googleDrive":{"$ref":"#/components/schemas/WebhookGoogleDrive"},"googleMail":{"$ref":"#/components/schemas/WebhookGoogleMail"},"headersTemplate":{"type":["string","null"]},"id":{"type":"string"},"ignoreSslErrors":{"type":"boolean"},"isAdHoc":{"type":["boolean","null"]},"isApifyIntegration":{"type":"boolean"},"isEnabled":{"type":"boolean"},"lastDispatch":{"anyOf":[{"$ref":"#/components/schemas/WebhookLastDispatch"},{"type":"null"}]},"modifiedAt":{"format":"date-time","type":"string"},"requestUrl":{"format":"uri","type":["string","null"]},"shouldInterpolateStrings":{"type":["boolean","null"]},"slackMessage":{"$ref":"#/components/schemas/WebhookSlackMessage"},"stats":{"anyOf":[{"$ref":"#/components/schemas/WebhookStats"},{"type":"null"}]},"title":{"type":["string","null"]},"userId":{"type":"string"}},"required":["id","createdAt","modifiedAt","userId","eventTypes","condition","ignoreSslErrors","doNotRetry"],"type":"object"},"WebhookResource":{"properties":{"actionType":{"type":"string"},"condition":{"$ref":"#/components/schemas/WebhookCondition"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":["string","null"]},"doNotRetry":{"type":["boolean","null"]},"eventTypes":{"items":{"$ref":"#/components/schemas/WebhookEventType"},"type":"array"},"githubIssue":{"$ref":"#/components/schemas/WebhookGithubIssue"},"googleDrive":{"$ref":"#/components/schemas/WebhookGoogleDrive"},"googleMail":{"$ref":"#/components/schemas/WebhookGoogleMail"},"headersTemplate":{"type":["string","null"]},"id":{"type":"string"},"ignoreSslErrors":{"type":"boolean"},"isAdHoc":{"type":["boolean","null"]},"isApifyIntegration":{"type":["boolean","null"]},"isEnabled":{"type":"boolean"},"lastDispatch":{"anyOf":[{"$ref":"#/components/schemas/WebhookLastDispatch"},{"type":"null"}]},"modifiedAt":{"format":"date-time","type":"string"},"payloadTemplate":{"type":["string","null"]},"requestUrl":{"format":"uri","type":["string","null"]},"shouldInterpolateStrings":{"type":["boolean","null"]},"slackMessage":{"$ref":"#/components/schemas/WebhookSlackMessage"},"stats":{"anyOf":[{"$ref":"#/components/schemas/WebhookStats"},{"type":"null"}]},"title":{"type":["string","null"]},"userId":{"type":"string"}},"required":["id","createdAt","modifiedAt","userId","eventTypes","condition","ignoreSslErrors"],"type":"object"},"WebhookResponse":{"properties":{"data":{"$ref":"#/components/schemas/WebhookResource"}},"required":["data"],"type":"object"},"WebhookSlackMessage":{"properties":{"channelId":{"type":"string"},"messageTemplate":{"type":"string"},"userIntegrationId":{"type":"string"}},"type":"object"},"WebhookStats":{"properties":{"totalDispatches":{"type":"integer"}},"type":"object"}},"specVersion":"v2-2026-10-29T100357Z"} +{"operations":{"DELETE /v2/actor-runs/{runId}/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchDeleteResponse"},"DELETE /v2/actor-tasks/{actorTaskId}":{"type":"object"},"DELETE /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchDeleteResponse"},"DELETE /v2/actors/{actorId}":{"type":"object"},"DELETE /v2/actors/{actorId}/runs/last/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchDeleteResponse"},"DELETE /v2/actors/{actorId}/versions/{versionNumber}":{"type":"object"},"DELETE /v2/actors/{actorId}/versions/{versionNumber}/env-vars/{envVarName}":{"type":"object"},"DELETE /v2/browser-info":{"$ref":"#/components/schemas/BrowserInfoResponse"},"DELETE /v2/request-queues/{queueId}/requests/batch":{"$ref":"#/components/schemas/BatchDeleteResponse"},"DELETE /v2/schedules/{scheduleId}":{"type":"object"},"DELETE /v2/webhooks/{webhookId}":{"type":"object"},"GET /v2/actor-builds":{"$ref":"#/components/schemas/ListOfBuildsResponse"},"GET /v2/actor-builds/{buildId}":{"allOf":[{"$ref":"#/components/schemas/BuildResponse"}]},"GET /v2/actor-builds/{buildId}/openapi.json":{"type":"object"},"GET /v2/actor-oauth-accounts/{accountId}":{"$ref":"#/components/schemas/ActorOAuthAccountResponse"},"GET /v2/actor-oauth-accounts/{connectionId}/accounts":{"$ref":"#/components/schemas/ListOfActorOAuthAccountsResponse"},"GET /v2/actor-runs":{"allOf":[{"$ref":"#/components/schemas/ListOfRunsResponse"}]},"GET /v2/actor-runs/{runId}":{"allOf":[{"$ref":"#/components/schemas/RunResponse"}]},"GET /v2/actor-runs/{runId}/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"GET /v2/actor-runs/{runId}/dataset/items":{"items":{"type":"object"},"type":"array"},"GET /v2/actor-runs/{runId}/dataset/statistics":{"$ref":"#/components/schemas/DatasetStatisticsResponse"},"GET /v2/actor-runs/{runId}/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"GET /v2/actor-runs/{runId}/key-value-store/keys":{"$ref":"#/components/schemas/ListOfKeysResponse"},"GET /v2/actor-runs/{runId}/key-value-store/records/{recordKey}":{"$ref":"#/components/schemas/RecordResponse"},"GET /v2/actor-runs/{runId}/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"GET /v2/actor-runs/{runId}/request-queue/head":{"$ref":"#/components/schemas/RequestQueueHeadResponse"},"GET /v2/actor-runs/{runId}/request-queue/requests":{"$ref":"#/components/schemas/ListOfRequestsResponse"},"GET /v2/actor-runs/{runId}/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/RequestResponse"},"GET /v2/actor-tasks":{"$ref":"#/components/schemas/ListOfTasksResponse"},"GET /v2/actor-tasks/{actorTaskId}":{"properties":{"data":{"$ref":"#/components/schemas/Task"}},"required":["data"],"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/input":{"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/run-sync":{"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/run-sync-get-dataset-items":{"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/runs":{"properties":{"data":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/RunListItem"},"type":"array"}},"required":["items"],"type":"object"}]}},"required":["data"],"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/runs/last":{"properties":{"data":{"$ref":"#/components/schemas/Run"}},"required":["data"],"type":"object"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/dataset/items":{"items":{"type":"object"},"type":"array"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/dataset/statistics":{"$ref":"#/components/schemas/DatasetStatisticsResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store/keys":{"$ref":"#/components/schemas/ListOfKeysResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store/records/{recordKey}":{"$ref":"#/components/schemas/RecordResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/head":{"$ref":"#/components/schemas/RequestQueueHeadResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests":{"$ref":"#/components/schemas/ListOfRequestsResponse"},"GET /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/RequestResponse"},"GET /v2/actor-tasks/{actorTaskId}/webhooks":{"properties":{"data":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/WebhookResource"},"type":"array"}},"required":["items"],"type":"object"}]}},"required":["data"],"type":"object"},"GET /v2/actors":{"$ref":"#/components/schemas/ListOfActorsResponse"},"GET /v2/actors/{actorId}":{"$ref":"#/components/schemas/ActorResponse"},"GET /v2/actors/{actorId}/builds":{"$ref":"#/components/schemas/ListOfBuildsResponse"},"GET /v2/actors/{actorId}/builds/default":{"$ref":"#/components/schemas/BuildResponse"},"GET /v2/actors/{actorId}/builds/{buildId}":{"$ref":"#/components/schemas/BuildResponse"},"GET /v2/actors/{actorId}/builds/{buildId}/openapi.json":{"type":"object"},"GET /v2/actors/{actorId}/oauth-connections":{"$ref":"#/components/schemas/ListOfActorOAuthConnectionsResponse"},"GET /v2/actors/{actorId}/run-sync":{"type":"object"},"GET /v2/actors/{actorId}/run-sync-get-dataset-items":{"items":{"type":"object"},"type":"array"},"GET /v2/actors/{actorId}/runs":{"$ref":"#/components/schemas/ListOfRunsResponse"},"GET /v2/actors/{actorId}/runs/last":{"$ref":"#/components/schemas/RunResponse"},"GET /v2/actors/{actorId}/runs/last/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"GET /v2/actors/{actorId}/runs/last/dataset/items":{"items":{"type":"object"},"type":"array"},"GET /v2/actors/{actorId}/runs/last/dataset/statistics":{"$ref":"#/components/schemas/DatasetStatisticsResponse"},"GET /v2/actors/{actorId}/runs/last/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"GET /v2/actors/{actorId}/runs/last/key-value-store/keys":{"$ref":"#/components/schemas/ListOfKeysResponse"},"GET /v2/actors/{actorId}/runs/last/key-value-store/records/{recordKey}":{"$ref":"#/components/schemas/RecordResponse"},"GET /v2/actors/{actorId}/runs/last/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"GET /v2/actors/{actorId}/runs/last/request-queue/head":{"$ref":"#/components/schemas/RequestQueueHeadResponse"},"GET /v2/actors/{actorId}/runs/last/request-queue/requests":{"$ref":"#/components/schemas/ListOfRequestsResponse"},"GET /v2/actors/{actorId}/runs/last/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/RequestResponse"},"GET /v2/actors/{actorId}/runs/{runId}":{"$ref":"#/components/schemas/RunResponse"},"GET /v2/actors/{actorId}/versions":{"$ref":"#/components/schemas/ListOfVersionsResponse"},"GET /v2/actors/{actorId}/versions/{versionNumber}":{"$ref":"#/components/schemas/VersionResponse"},"GET /v2/actors/{actorId}/versions/{versionNumber}/env-vars":{"$ref":"#/components/schemas/ListOfEnvVarsResponse"},"GET /v2/actors/{actorId}/versions/{versionNumber}/env-vars/{envVarName}":{"$ref":"#/components/schemas/EnvVarResponse"},"GET /v2/actors/{actorId}/webhooks":{"$ref":"#/components/schemas/ListOfWebhookResourcesResponse"},"GET /v2/browser-info":{"$ref":"#/components/schemas/BrowserInfoResponse"},"GET /v2/datasets":{"$ref":"#/components/schemas/ListOfDatasetsResponse"},"GET /v2/datasets/{datasetId}":{"$ref":"#/components/schemas/DatasetResponse"},"GET /v2/datasets/{datasetId}/items":{"items":{"type":"object"},"type":"array"},"GET /v2/datasets/{datasetId}/statistics":{"$ref":"#/components/schemas/DatasetStatisticsResponse"},"GET /v2/integrations/git":{"$ref":"#/components/schemas/ListOfGitProviderIntegrationsResponse"},"GET /v2/key-value-stores":{"$ref":"#/components/schemas/ListOfKeyValueStoresResponse"},"GET /v2/key-value-stores/{storeId}":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"GET /v2/key-value-stores/{storeId}/keys":{"$ref":"#/components/schemas/ListOfKeysResponse"},"GET /v2/key-value-stores/{storeId}/records/{recordKey}":{"$ref":"#/components/schemas/RecordResponse"},"GET /v2/request-queues":{"$ref":"#/components/schemas/ListOfRequestQueuesResponse"},"GET /v2/request-queues/{queueId}":{"$ref":"#/components/schemas/RequestQueueResponse"},"GET /v2/request-queues/{queueId}/head":{"$ref":"#/components/schemas/RequestQueueHeadResponse"},"GET /v2/request-queues/{queueId}/requests":{"$ref":"#/components/schemas/ListOfRequestsResponse"},"GET /v2/request-queues/{queueId}/requests/{requestId}":{"$ref":"#/components/schemas/RequestResponse"},"GET /v2/schedules":{"$ref":"#/components/schemas/ListOfSchedulesResponse"},"GET /v2/schedules/{scheduleId}":{"$ref":"#/components/schemas/ScheduleResponse"},"GET /v2/schedules/{scheduleId}/log":{"$ref":"#/components/schemas/ScheduleLogResponse"},"GET /v2/store":{"$ref":"#/components/schemas/ListOfStoreActorsResponse"},"GET /v2/users/me":{"$ref":"#/components/schemas/UserPrivateInfoResponse"},"GET /v2/users/me/limits":{"$ref":"#/components/schemas/AccountLimitsResponse"},"GET /v2/users/me/usage/monthly":{"$ref":"#/components/schemas/MonthlyUsageResponse"},"GET /v2/users/{userId}":{"anyOf":[{"$ref":"#/components/schemas/UserPublicInfoResponse"},{"$ref":"#/components/schemas/UserPrivateInfoResponse"}]},"GET /v2/users/{userId}/limits":{"$ref":"#/components/schemas/AccountLimitsResponse"},"GET /v2/users/{userId}/usage/monthly":{"$ref":"#/components/schemas/MonthlyUsageResponse"},"GET /v2/webhook-dispatches":{"$ref":"#/components/schemas/ListOfWebhookDispatchesResponse"},"GET /v2/webhook-dispatches/{dispatchId}":{"$ref":"#/components/schemas/WebhookDispatchResponse"},"GET /v2/webhooks":{"$ref":"#/components/schemas/ListOfWebhooksResponse"},"GET /v2/webhooks/{webhookId}":{"$ref":"#/components/schemas/WebhookResponse"},"GET /v2/webhooks/{webhookId}/dispatches":{"$ref":"#/components/schemas/ListOfWebhookDispatchesResponse"},"POST /v2/actor-builds/{buildId}/abort":{"allOf":[{"$ref":"#/components/schemas/BuildResponse"}]},"POST /v2/actor-runs/{runId}/abort":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-runs/{runId}/charge":{"type":"object"},"POST /v2/actor-runs/{runId}/dataset/items":{"type":"object"},"POST /v2/actor-runs/{runId}/key-value-store/records/{recordKey}":{"type":"object"},"POST /v2/actor-runs/{runId}/metamorph":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-runs/{runId}/reboot":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-runs/{runId}/request-queue/head/lock":{"$ref":"#/components/schemas/LockedRequestQueueHeadResponse"},"POST /v2/actor-runs/{runId}/request-queue/requests":{"$ref":"#/components/schemas/AddRequestResponse"},"POST /v2/actor-runs/{runId}/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchAddResponse"},"POST /v2/actor-runs/{runId}/request-queue/requests/unlock":{"$ref":"#/components/schemas/UnlockRequestsResponse"},"POST /v2/actor-runs/{runId}/resurrect":{"allOf":[{"$ref":"#/components/schemas/RunResponse"}]},"POST /v2/actor-tasks":{"$ref":"#/components/schemas/TaskResponse"},"POST /v2/actor-tasks/{actorTaskId}/run-sync":{"type":"object"},"POST /v2/actor-tasks/{actorTaskId}/run-sync-get-dataset-items":{"type":"object"},"POST /v2/actor-tasks/{actorTaskId}/runs":{"properties":{"data":{"$ref":"#/components/schemas/Run"}},"required":["data"],"type":"object"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/abort":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/dataset/items":{"type":"object"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store/records/{recordKey}":{"type":"object"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/metamorph":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/reboot":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/head/lock":{"$ref":"#/components/schemas/LockedRequestQueueHeadResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests":{"$ref":"#/components/schemas/AddRequestResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchAddResponse"},"POST /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/unlock":{"$ref":"#/components/schemas/UnlockRequestsResponse"},"POST /v2/actors":{"$ref":"#/components/schemas/ActorResponse"},"POST /v2/actors/{actorId}/builds":{"$ref":"#/components/schemas/BuildResponse"},"POST /v2/actors/{actorId}/builds/{buildId}/abort":{"$ref":"#/components/schemas/BuildResponse"},"POST /v2/actors/{actorId}/run-sync":{"type":"object"},"POST /v2/actors/{actorId}/run-sync-get-dataset-items":{"items":{"type":"object"},"type":"array"},"POST /v2/actors/{actorId}/runs":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/last/abort":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/last/dataset/items":{"type":"object"},"POST /v2/actors/{actorId}/runs/last/key-value-store/records/{recordKey}":{"type":"object"},"POST /v2/actors/{actorId}/runs/last/metamorph":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/last/reboot":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/last/request-queue/head/lock":{"$ref":"#/components/schemas/LockedRequestQueueHeadResponse"},"POST /v2/actors/{actorId}/runs/last/request-queue/requests":{"$ref":"#/components/schemas/AddRequestResponse"},"POST /v2/actors/{actorId}/runs/last/request-queue/requests/batch":{"$ref":"#/components/schemas/BatchAddResponse"},"POST /v2/actors/{actorId}/runs/last/request-queue/requests/unlock":{"$ref":"#/components/schemas/UnlockRequestsResponse"},"POST /v2/actors/{actorId}/runs/{runId}/abort":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/{runId}/metamorph":{"$ref":"#/components/schemas/RunResponse"},"POST /v2/actors/{actorId}/runs/{runId}/resurrect":{"allOf":[{"$ref":"#/components/schemas/RunResponse"}]},"POST /v2/actors/{actorId}/validate-input":{"properties":{"valid":{"type":"boolean"}},"required":["valid"],"type":"object"},"POST /v2/actors/{actorId}/versions":{"$ref":"#/components/schemas/VersionResponse"},"POST /v2/actors/{actorId}/versions/{versionNumber}":{"$ref":"#/components/schemas/VersionResponse"},"POST /v2/actors/{actorId}/versions/{versionNumber}/env-vars":{"$ref":"#/components/schemas/EnvVarResponse"},"POST /v2/actors/{actorId}/versions/{versionNumber}/env-vars/{envVarName}":{"$ref":"#/components/schemas/EnvVarResponse"},"POST /v2/browser-info":{"$ref":"#/components/schemas/BrowserInfoResponse"},"POST /v2/datasets":{"$ref":"#/components/schemas/DatasetResponse"},"POST /v2/datasets/{datasetId}/items":{"type":"object"},"POST /v2/integrations/git/{providerId}/create-repo":{"$ref":"#/components/schemas/GitRepoResponse"},"POST /v2/integrations/git/{providerId}/register-deployment-key":{"$ref":"#/components/schemas/RegisterDeploymentKeyResponse"},"POST /v2/key-value-stores":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"POST /v2/key-value-stores/{storeId}/records/{recordKey}":{"type":"object"},"POST /v2/request-queues":{"$ref":"#/components/schemas/RequestQueueResponse"},"POST /v2/request-queues/{queueId}/head/lock":{"$ref":"#/components/schemas/LockedRequestQueueHeadResponse"},"POST /v2/request-queues/{queueId}/requests":{"$ref":"#/components/schemas/AddRequestResponse"},"POST /v2/request-queues/{queueId}/requests/batch":{"$ref":"#/components/schemas/BatchAddResponse"},"POST /v2/request-queues/{queueId}/requests/unlock":{"$ref":"#/components/schemas/UnlockRequestsResponse"},"POST /v2/schedules":{"$ref":"#/components/schemas/ScheduleResponse"},"POST /v2/schedules/{scheduleId}/invoke":{"type":"object"},"POST /v2/tools/decode-and-verify":{"$ref":"#/components/schemas/DecodeAndVerifyResponse"},"POST /v2/tools/encode-and-sign":{"$ref":"#/components/schemas/EncodeAndSignResponse"},"POST /v2/webhooks":{"$ref":"#/components/schemas/WebhookResponse"},"POST /v2/webhooks/{webhookId}/test":{"$ref":"#/components/schemas/WebhookDispatchResponse"},"PUT /v2/actor-runs/{runId}":{"$ref":"#/components/schemas/RunResponse"},"PUT /v2/actor-runs/{runId}/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"PUT /v2/actor-runs/{runId}/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"PUT /v2/actor-runs/{runId}/key-value-store/records/{recordKey}":{"type":"object"},"PUT /v2/actor-runs/{runId}/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"PUT /v2/actor-runs/{runId}/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/UpdateRequestResponse"},"PUT /v2/actor-runs/{runId}/request-queue/requests/{requestId}/lock":{"$ref":"#/components/schemas/ProlongRequestLockResponse"},"PUT /v2/actor-tasks/{actorTaskId}":{"properties":{"data":{"$ref":"#/components/schemas/Task"}},"required":["data"],"type":"object"},"PUT /v2/actor-tasks/{actorTaskId}/input":{"type":"object"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/key-value-store/records/{recordKey}":{"type":"object"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/UpdateRequestResponse"},"PUT /v2/actor-tasks/{actorTaskId}/runs/last/request-queue/requests/{requestId}/lock":{"$ref":"#/components/schemas/ProlongRequestLockResponse"},"PUT /v2/actors/{actorId}":{"$ref":"#/components/schemas/ActorResponse"},"PUT /v2/actors/{actorId}/runs/last/dataset":{"$ref":"#/components/schemas/DatasetResponse"},"PUT /v2/actors/{actorId}/runs/last/key-value-store":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"PUT /v2/actors/{actorId}/runs/last/key-value-store/records/{recordKey}":{"type":"object"},"PUT /v2/actors/{actorId}/runs/last/request-queue":{"$ref":"#/components/schemas/RequestQueueResponse"},"PUT /v2/actors/{actorId}/runs/last/request-queue/requests/{requestId}":{"$ref":"#/components/schemas/UpdateRequestResponse"},"PUT /v2/actors/{actorId}/runs/last/request-queue/requests/{requestId}/lock":{"$ref":"#/components/schemas/ProlongRequestLockResponse"},"PUT /v2/actors/{actorId}/versions/{versionNumber}":{"$ref":"#/components/schemas/VersionResponse"},"PUT /v2/actors/{actorId}/versions/{versionNumber}/env-vars/{envVarName}":{"$ref":"#/components/schemas/EnvVarResponse"},"PUT /v2/browser-info":{"$ref":"#/components/schemas/BrowserInfoResponse"},"PUT /v2/datasets/{datasetId}":{"$ref":"#/components/schemas/DatasetResponse"},"PUT /v2/key-value-stores/{storeId}":{"$ref":"#/components/schemas/KeyValueStoreResponse"},"PUT /v2/key-value-stores/{storeId}/records/{recordKey}":{"type":"object"},"PUT /v2/request-queues/{queueId}":{"$ref":"#/components/schemas/RequestQueueResponse"},"PUT /v2/request-queues/{queueId}/requests/{requestId}":{"$ref":"#/components/schemas/UpdateRequestResponse"},"PUT /v2/request-queues/{queueId}/requests/{requestId}/lock":{"$ref":"#/components/schemas/ProlongRequestLockResponse"},"PUT /v2/schedules/{scheduleId}":{"$ref":"#/components/schemas/ScheduleResponse"},"PUT /v2/users/me/limits":{"type":"object"},"PUT /v2/users/{userId}/limits":{"type":"object"},"PUT /v2/webhooks/{webhookId}":{"$ref":"#/components/schemas/WebhookResponse"}},"schemas":{"AccountLimits":{"properties":{"current":{"$ref":"#/components/schemas/CurrentUsage"},"limits":{"$ref":"#/components/schemas/Limits"},"monthlyUsageCycle":{"$ref":"#/components/schemas/UsageCycle"}},"required":["monthlyUsageCycle","limits","current"],"type":"object"},"AccountLimitsResponse":{"properties":{"data":{"$ref":"#/components/schemas/AccountLimits"}},"required":["data"],"type":"object"},"ActorDefinition":{"properties":{"actorSpecification":{"type":"integer"},"buildTag":{"type":"string"},"changelog":{"type":["string","null"]},"defaultMemoryMbytes":{"oneOf":[{"type":"string"},{"type":"integer"}]},"description":{"type":"string"},"dockerContextDir":{"type":"string"},"dockerfile":{"type":"string"},"environmentVariables":{"type":"object"},"input":{"type":["object","null"]},"maxMemoryMbytes":{"minimum":128,"type":"integer"},"meta":{"$ref":"#/components/schemas/ActorDefinitionMeta"},"minMemoryMbytes":{"minimum":128,"type":"integer"},"name":{"type":"string"},"output":{"type":["object","null"]},"readme":{"type":["string","null"]},"storages":{"properties":{"dataset":{"type":"object"},"datasets":{"type":"object"},"keyValueStore":{"type":"object"}},"type":"object"},"title":{"type":"string"},"usesStandbyMode":{"type":"boolean"},"version":{"pattern":"^[0-9]+(\\.[0-9]+)+$","type":"string"},"webServerMcpPath":{"type":"string"},"webServerSchema":{"type":"object"}},"type":"object"},"ActorDefinitionMeta":{"properties":{"generatedBy":{"type":"string"},"templateId":{"type":"string"}},"type":"object"},"ActorJobStatus":{"type":"string"},"ActorListItem":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"stats":{"anyOf":[{"$ref":"#/components/schemas/ActorStats"},{"type":"null"}]},"title":{"type":"string"},"username":{"type":"string"}},"required":["id","createdAt","modifiedAt","name","username"],"type":"object"},"ActorNotice":{"type":["string","null"]},"ActorOAuthAccount":{"properties":{"_id":{"type":"string"},"authorizedAt":{"format":"date-time","type":["string","null"]},"connectionId":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"data":{"type":"object"},"description":{"type":["string","null"]},"modifiedAt":{"format":"date-time","type":"string"},"userId":{"type":"string"}},"required":["_id","userId","connectionId","createdAt","modifiedAt","data"],"type":"object"},"ActorOAuthAccountResponse":{"properties":{"data":{"$ref":"#/components/schemas/ActorOAuthAccount"}},"required":["data"],"type":"object"},"ActorOAuthConnection":{"properties":{"_id":{"type":"string"},"actorId":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"credentials":{"properties":{"clientId":{"type":"string"},"imageUrl":{"type":"string"},"label":{"type":"string"},"scope":{"type":"string"}},"type":"object"},"modifiedAt":{"format":"date-time","type":"string"},"oAuthProviderType":{"type":"string"}},"required":["_id","actorId","oAuthProviderType","createdAt","modifiedAt"],"type":"object"},"ActorPermissionLevel":{"type":"string"},"ActorResource":{"properties":{"actorPermissionLevel":{"$ref":"#/components/schemas/ActorPermissionLevel"},"actorStandby":{"anyOf":[{"$ref":"#/components/schemas/ActorStandby"},{"type":"null"}]},"categories":{"items":{"type":"string"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"defaultRunOptions":{"$ref":"#/components/schemas/DefaultRunOptions"},"deploymentKey":{"type":"string"},"description":{"type":["string","null"]},"exampleRunInput":{"anyOf":[{"$ref":"#/components/schemas/ExampleRunInput"},{"type":"null"}]},"hasNoDataset":{"type":"boolean"},"id":{"type":"string"},"isCritical":{"type":"boolean"},"isDeprecated":{"type":["boolean","null"]},"isGeneric":{"type":"boolean"},"isPublic":{"type":"boolean"},"isSourceCodeHidden":{"type":"boolean"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"notice":{"$ref":"#/components/schemas/ActorNotice"},"pictureUrl":{"type":["string","null"]},"pricingInfos":{"items":{"$ref":"#/components/schemas/ActorRunPricingInfo"},"type":"array"},"readmeSummary":{"type":"string"},"restartOnError":{"type":["boolean","null"]},"seoDescription":{"type":["string","null"]},"seoTitle":{"type":["string","null"]},"standbyUrl":{"type":["string","null"]},"stats":{"$ref":"#/components/schemas/ActorStats"},"taggedBuilds":{"anyOf":[{"$ref":"#/components/schemas/TaggedBuilds"},{"type":"null"}]},"title":{"type":["string","null"]},"userId":{"type":"string"},"username":{"type":"string"},"versions":{"items":{"$ref":"#/components/schemas/Version"},"type":"array"}},"required":["id","userId","name","username","isPublic","createdAt","modifiedAt","stats","versions","defaultRunOptions"],"type":"object"},"ActorResponse":{"properties":{"data":{"$ref":"#/components/schemas/ActorResource"}},"required":["data"],"type":"object"},"ActorRunPricingInfo":{"oneOf":[{"$ref":"#/components/schemas/PayPerEventActorPricingInfo"},{"$ref":"#/components/schemas/PricePerDatasetItemActorPricingInfo"},{"$ref":"#/components/schemas/FlatPricePerMonthActorPricingInfo"},{"$ref":"#/components/schemas/FreeActorPricingInfo"}]},"ActorStandby":{"properties":{"build":{"type":["string","null"]},"desiredRequestsPerActorRun":{"type":["integer","null"]},"disableStandbyFieldsOverride":{"type":["boolean","null"]},"idleTimeoutSecs":{"type":["integer","null"]},"isConsoleAuthEnabled":{"type":["boolean","null"]},"isEnabled":{"type":["boolean","null"]},"isTokenlessEnabled":{"type":["boolean","null"]},"maxRequestsPerActorRun":{"type":["integer","null"]},"memoryMbytes":{"type":["integer","null"]},"shouldPassActorInput":{"type":["boolean","null"]},"tenancy":{"type":["string","null"]}},"type":"object"},"ActorStats":{"properties":{"actorReviewCount":{"type":"integer"},"actorReviewRating":{"type":"number"},"bookmarkCount":{"type":"integer"},"lastRunStartedAt":{"format":"date-time","type":"string"},"publicActorRunStats30Days":{"properties":{"ABORTED":{"type":"integer"},"FAILED":{"type":"integer"},"SUCCEEDED":{"type":"integer"},"TIMED-OUT":{"type":"integer"},"TOTAL":{"type":"integer"}},"type":"object"},"totalBuilds":{"type":"integer"},"totalMetamorphs":{"type":"integer"},"totalRuns":{"type":"integer"},"totalUsers":{"type":"integer"},"totalUsers30Days":{"type":"integer"},"totalUsers7Days":{"type":"integer"},"totalUsers90Days":{"type":"integer"}},"type":"object"},"AddRequestResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestRegistration"}},"required":["data"],"type":"object"},"AddedRequest":{"properties":{"requestId":{"$ref":"#/components/schemas/RequestId"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"},"wasAlreadyHandled":{"$ref":"#/components/schemas/WasAlreadyHandled"},"wasAlreadyPresent":{"$ref":"#/components/schemas/WasAlreadyPresent"}},"required":["requestId","uniqueKey","wasAlreadyHandled","wasAlreadyPresent"],"type":"object"},"AvailableProxyGroups":{"type":"object"},"BatchAddResponse":{"properties":{"data":{"$ref":"#/components/schemas/BatchAddResult"}},"required":["data"],"type":"object"},"BatchAddResult":{"properties":{"processedRequests":{"items":{"$ref":"#/components/schemas/AddedRequest"},"type":"array"},"unprocessedRequests":{"items":{"$ref":"#/components/schemas/UnprocessedRequest"},"type":"array"}},"required":["processedRequests","unprocessedRequests"],"type":"object"},"BatchDeleteResponse":{"properties":{"data":{"$ref":"#/components/schemas/BatchDeleteResult"}},"required":["data"],"type":"object"},"BatchDeleteResult":{"properties":{"processedRequests":{"items":{"$ref":"#/components/schemas/DeletedRequest"},"type":"array"},"unprocessedRequests":{"items":{"$ref":"#/components/schemas/UnprocessedRequest"},"type":"array"}},"required":["processedRequests","unprocessedRequests"],"type":"object"},"BrowserInfoResponse":{"properties":{"bodyLength":{"type":"integer"},"clientIp":{"type":["string","null"]},"countryCode":{"type":["string","null"]},"headers":{"type":"object"},"method":{"type":"string"},"rawHeaders":{"items":{"type":"string"},"type":"array"}},"required":["method","clientIp","countryCode","bodyLength"],"type":"object"},"Build":{"properties":{"actId":{"type":"string"},"actVersion":{"properties":{"actorPath":{"type":["string","null"]},"buildTag":{"type":["string","null"]},"gitHubGistUrl":{"type":"string"},"gitRepoUrl":{"type":"string"},"sourceFiles":{"items":{"$ref":"#/components/schemas/SourceCodeFile"},"type":"array"},"sourceType":{"$ref":"#/components/schemas/VersionSourceType"},"tarballUrl":{"type":"string"},"versionNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])$","type":"string"}},"type":"object"},"actorDefinition":{"anyOf":[{"$ref":"#/components/schemas/ActorDefinition"},{"type":"null"}]},"buildNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])(\\.[1-9][0-9]{0,4})$","type":"string"},"changelog":{"type":["string","null"]},"createdByOrganizationMemberUserId":{"type":"string"},"exitCode":{"type":["integer","null"]},"finishedAt":{"format":"date-time","type":["string","null"]},"gitBranchName":{"type":"string"},"gitCommitId":{"type":"string"},"id":{"type":"string"},"imageDigest":{"type":["string","null"]},"inputSchema":{"type":["string","null"]},"meta":{"$ref":"#/components/schemas/BuildMeta"},"options":{"anyOf":[{"$ref":"#/components/schemas/BuildOptions"},{"type":"null"}]},"readme":{"type":["string","null"]},"startedAt":{"format":"date-time","type":"string"},"stats":{"anyOf":[{"$ref":"#/components/schemas/BuildStats"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/ActorJobStatus"},"usage":{"anyOf":[{"$ref":"#/components/schemas/BuildUsage"},{"type":"null"}]},"usageTotalUsd":{"type":["number","null"]},"usageUsd":{"anyOf":[{"$ref":"#/components/schemas/BuildUsage"},{"type":"null"}]},"userId":{"type":"string"}},"required":["id","actId","userId","startedAt","status","meta","buildNumber"],"type":"object"},"BuildListItem":{"properties":{"actId":{"type":"string"},"buildNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])(\\.[1-9][0-9]{0,4})$","type":"string"},"buildNumberInt":{"type":"integer"},"finishedAt":{"format":"date-time","type":["string","null"]},"id":{"type":"string"},"meta":{"$ref":"#/components/schemas/BuildMeta"},"startedAt":{"format":"date-time","type":"string"},"status":{"$ref":"#/components/schemas/ActorJobStatus"},"usageTotalUsd":{"type":"number"},"userId":{"type":"string"}},"required":["id","status","startedAt","buildNumber"],"type":"object"},"BuildMeta":{"properties":{"actorRunId":{"type":"string"},"clientIp":{"type":["string"]},"githubActionsRunUrl":{"type":"string"},"origin":{"$ref":"#/components/schemas/RunOrigin"},"userAgent":{"type":["string"]},"webhookDispatchId":{"type":"string"}},"required":["origin"],"type":"object"},"BuildOptions":{"properties":{"betaPackages":{"type":["boolean","null"]},"debug":{"type":["boolean","null"]},"diskMbytes":{"type":["integer","null"]},"memoryMbytes":{"type":["integer","null"]},"tag":{"type":["string","null"]},"useCache":{"type":["boolean","null"]}},"type":"object"},"BuildResponse":{"properties":{"data":{"$ref":"#/components/schemas/Build"}},"required":["data"],"type":"object"},"BuildStats":{"properties":{"computeUnits":{"type":"number"},"durationMillis":{"type":"integer"},"imageSizeBytes":{"type":["integer","null"]},"runTimeSecs":{"type":"number"}},"type":"object"},"BuildUsage":{"properties":{"ACTOR_COMPUTE_UNITS":{"type":["number","null"]}},"type":"object"},"CommonActorPricingInfo":{"properties":{"apifyMarginPercentage":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"forceContainsSignificantPriceChange":{"type":"boolean"},"isPriceChangeNotificationSuppressed":{"type":"boolean"},"notifiedAboutChangeAt":{"format":"date-time","type":["string","null"]},"notifiedAboutFutureChangeAt":{"format":"date-time","type":["string","null"]},"notifiedAboutRentalToPpePriceChangeAt":{"format":"date-time","type":["string","null"]},"reasonForChange":{"type":["string","null"]},"startedAt":{"format":"date-time","type":"string"}},"required":["apifyMarginPercentage","createdAt","startedAt"],"type":"object"},"CurrentPricingInfo":{"properties":{"apifyMarginPercentage":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"forceContainsSignificantPriceChange":{"type":"boolean"},"isPPEPlatformUsagePaidByUser":{"type":"boolean"},"isPriceChangeNotificationSuppressed":{"type":"boolean"},"minimalMaxTotalChargeUsd":{"type":["number","null"]},"notifiedAboutChangeAt":{"format":"date-time","type":["string","null"]},"notifiedAboutFutureChangeAt":{"format":"date-time","type":["string","null"]},"notifiedAboutRentalToPpePriceChangeAt":{"format":"date-time","type":["string","null"]},"pricePerUnitUsd":{"type":"number"},"pricingModel":{"type":"string"},"pricingPerEvent":{"type":["object","null"]},"reasonForChange":{"type":["string","null"]},"startedAt":{"format":"date-time","type":"string"},"tieredPricing":{"type":"object"},"trialMinutes":{"type":"integer"},"unitName":{"type":"string"}},"required":["pricingModel"],"type":"object"},"CurrentUsage":{"properties":{"activeActorJobCount":{"type":"integer"},"actorCount":{"type":"integer"},"actorMemoryGbytes":{"type":"number"},"actorTaskCount":{"type":"integer"},"monthlyActorComputeUnits":{"type":"number"},"monthlyExternalDataTransferGbytes":{"type":"number"},"monthlyProxySerps":{"type":"integer"},"monthlyResidentialProxyGbytes":{"type":"number"},"monthlyUnblockerUnits":{"type":"number"},"monthlyUsageUsd":{"type":"number"},"scheduleCount":{"type":"integer"},"teamAccountSeatCount":{"type":"integer"}},"required":["monthlyUsageUsd","monthlyActorComputeUnits","monthlyExternalDataTransferGbytes","monthlyProxySerps","monthlyResidentialProxyGbytes","actorMemoryGbytes","actorCount","actorTaskCount","activeActorJobCount","teamAccountSeatCount"],"type":"object"},"DailyServiceUsage":{"properties":{"date":{"format":"date-time","type":"string"},"serviceUsage":{"$ref":"#/components/schemas/ServiceUsage"},"totalUsageCreditsUsd":{"type":"number"}},"required":["date","serviceUsage","totalUsageCreditsUsd"],"type":"object"},"DatasetListItem":{"properties":{"accessedAt":{"format":"date-time","type":"string"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"cleanItemCount":{"type":"integer"},"createdAt":{"format":"date-time","type":"string"},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"id":{"type":"string"},"itemCount":{"type":"integer"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":["string","null"]},"stats":{"$ref":"#/components/schemas/DatasetStats"},"title":{"type":["string","null"]},"userId":{"type":"string"},"username":{"type":"string"}},"required":["id","userId","createdAt","modifiedAt","accessedAt","itemCount","cleanItemCount"],"type":"object"},"DatasetResource":{"properties":{"accessedAt":{"format":"date-time","type":"string"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"cleanItemCount":{"minimum":0,"type":"integer"},"consoleUrl":{"format":"uri","type":"string"},"createdAt":{"format":"date-time","type":"string"},"fields":{"items":{"type":"string"},"type":["array","null"]},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"id":{"type":"string"},"itemCount":{"minimum":0,"type":"integer"},"itemsPublicUrl":{"format":"uri","type":"string"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":["string","null"]},"schema":{"type":["object","null"]},"stats":{"$ref":"#/components/schemas/DatasetStats"},"title":{"type":["string","null"]},"urlSigningSecretKey":{"type":["string","null"]},"userId":{"type":"string"}},"required":["id","userId","createdAt","modifiedAt","accessedAt","itemCount","cleanItemCount","consoleUrl"],"type":"object"},"DatasetResponse":{"properties":{"data":{"$ref":"#/components/schemas/DatasetResource"}},"required":["data"],"type":"object"},"DatasetStatistics":{"properties":{"fieldStatistics":{"type":["object","null"]}},"type":"object"},"DatasetStatisticsResponse":{"properties":{"data":{"$ref":"#/components/schemas/DatasetStatistics"}},"required":["data"],"type":"object"},"DatasetStats":{"properties":{"inflatedBytes":{"type":"integer"},"readCount":{"type":"integer"},"storageBytes":{"type":"integer"},"writeCount":{"type":"integer"}},"type":"object"},"DecodeAndVerifyResponse":{"properties":{"data":{"$ref":"#/components/schemas/DecodeAndVerifyResult"}},"required":["data"],"type":"object"},"DecodeAndVerifyResult":{"properties":{"decoded":{},"encodedByUserId":{"type":["string","null"]},"isVerifiedUser":{"type":"boolean"}},"required":["decoded","encodedByUserId","isVerifiedUser"],"type":"object"},"DefaultRunOptions":{"properties":{"build":{"type":"string"},"forcePermissionLevel":{"anyOf":[{"$ref":"#/components/schemas/ActorPermissionLevel"},{"type":"null"}]},"isMaxTotalChargeUsdSetByUser":{"type":["boolean","null"]},"maxItems":{"type":["integer","null"]},"maxTotalChargeUsd":{"type":["number","null"]},"memoryMbytes":{"type":"integer"},"restartOnError":{"type":["boolean","null"]},"timeoutSecs":{"type":"integer"}},"type":"object"},"DeletedRequest":{"anyOf":[{"$ref":"#/components/schemas/DeletedRequestById"},{"$ref":"#/components/schemas/DeletedRequestByUniqueKey"}]},"DeletedRequestById":{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"}},"required":["id"],"type":"object"},"DeletedRequestByUniqueKey":{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"}},"required":["uniqueKey"],"type":"object"},"EffectivePlatformFeature":{"properties":{"disabledReason":{"type":["string","null"]},"disabledReasonType":{"type":["string","null"]},"isEnabled":{"type":"boolean"},"isTrial":{"type":"boolean"},"trialExpirationAt":{"format":"date-time","type":["string","null"]}},"required":["isEnabled","disabledReason","disabledReasonType","isTrial","trialExpirationAt"],"type":"object"},"EffectivePlatformFeatures":{"properties":{"ACTORS":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"ACTORS_PUBLIC_ALL":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"ACTORS_PUBLIC_DEVELOPER":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"PROXY":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"PROXY_EXTERNAL_ACCESS":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"PROXY_RESIDENTIAL":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"PROXY_SERPS":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"SCHEDULER":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"STORAGE":{"$ref":"#/components/schemas/EffectivePlatformFeature"},"WEBHOOKS":{"$ref":"#/components/schemas/EffectivePlatformFeature"}},"required":["ACTORS","STORAGE","SCHEDULER","PROXY","PROXY_EXTERNAL_ACCESS","PROXY_RESIDENTIAL","PROXY_SERPS","WEBHOOKS","ACTORS_PUBLIC_ALL","ACTORS_PUBLIC_DEVELOPER"],"type":"object"},"EncodeAndSignResponse":{"properties":{"data":{"$ref":"#/components/schemas/EncodeAndSignResult"}},"required":["data"],"type":"object"},"EncodeAndSignResult":{"properties":{"encoded":{"type":"string"}},"required":["encoded"],"type":"object"},"EnvVar":{"properties":{"isSecret":{"type":["boolean","null"]},"name":{"type":"string"},"value":{"type":"string"},"valueHash":{"type":"string"}},"required":["name"],"type":"object"},"EnvVarResponse":{"properties":{"data":{"$ref":"#/components/schemas/EnvVar"}},"required":["data"],"type":"object"},"ExampleRunInput":{"properties":{"body":{"type":"string"},"contentType":{"type":"string"}},"type":"object"},"FlatPricePerMonthActorPricingInfo":{"allOf":[{"$ref":"#/components/schemas/CommonActorPricingInfo"},{"properties":{"pricePerUnitUsd":{"type":"number"},"pricingModel":{"type":"string"},"trialMinutes":{"type":"integer"}},"required":["pricingModel","pricePerUnitUsd","trialMinutes"],"type":"object"}]},"FreeActorPricingInfo":{"allOf":[{"$ref":"#/components/schemas/CommonActorPricingInfo"},{"properties":{"pricingModel":{"type":"string"}},"required":["pricingModel"],"type":"object"}]},"GeneralAccess":{"type":"string"},"GitProviderIntegration":{"properties":{"addWorkspaceUrl":{"type":"string"},"id":{"type":"string"},"provider":{"type":"string"},"workspaces":{"items":{"$ref":"#/components/schemas/GitProviderWorkspace"},"type":"array"}},"required":["id","provider","workspaces"],"type":"object"},"GitProviderWorkspace":{"properties":{"id":{"type":"string"},"label":{"type":"string"}},"required":["id","label"],"type":"object"},"GitRepo":{"properties":{"htmlUrl":{"type":"string"},"httpsUrl":{"type":"string"},"sshUrl":{"type":"string"}},"required":["sshUrl","httpsUrl","htmlUrl"],"type":"object"},"GitRepoResponse":{"properties":{"data":{"$ref":"#/components/schemas/GitRepo"}},"required":["data"],"type":"object"},"HadMultipleClients":{"type":"boolean"},"HandledRequestCount":{"minimum":0,"type":"integer"},"HeadLimit":{"type":"integer"},"HttpMethod":{"type":"string"},"IntegrationTracking":{"properties":{"appId":{"type":"string"},"isAiTool":{"type":"boolean"},"platform":{"type":"string"}},"type":"object"},"KeyValueStoreKey":{"properties":{"key":{"type":"string"},"recordPublicUrl":{"format":"uri","type":"string"},"size":{"type":"integer"}},"required":["key","size","recordPublicUrl"],"type":"object"},"KeyValueStoreListItem":{"properties":{"accessedAt":{"format":"date-time","type":"string"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"createdAt":{"format":"date-time","type":"string"},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"id":{"type":"string"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":["string","null"]},"schema":{"type":["object","string","null"]},"stats":{"$ref":"#/components/schemas/KeyValueStoreListStats"},"title":{"type":["string","null"]},"userId":{"type":["string","null"]},"username":{"type":["string","null"]}},"required":["id","createdAt","modifiedAt","accessedAt"],"type":"object"},"KeyValueStoreListStats":{"properties":{"deleteCount":{"type":"integer"},"listCount":{"type":"integer"},"readCount":{"type":"integer"},"s3StorageBytes":{"type":"integer"},"writeCount":{"type":"integer"}},"type":"object"},"KeyValueStoreResource":{"properties":{"accessedAt":{"format":"date-time","type":"string"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"consoleUrl":{"format":"uri","type":"string"},"createdAt":{"format":"date-time","type":"string"},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"id":{"type":"string"},"keysPublicUrl":{"format":"uri","type":"string"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":["string","null"]},"recordsPublicUrl":{"format":"uri","type":"string"},"schema":{"type":["object","null"]},"stats":{"$ref":"#/components/schemas/KeyValueStoreStats"},"title":{"type":["string","null"]},"urlSigningSecretKey":{"type":["string","null"]},"userId":{"type":["string","null"]},"username":{"type":["string","null"]}},"required":["id","createdAt","modifiedAt","accessedAt"],"type":"object"},"KeyValueStoreResponse":{"properties":{"data":{"$ref":"#/components/schemas/KeyValueStoreResource"}},"required":["data"],"type":"object"},"KeyValueStoreStats":{"properties":{"deleteCount":{"type":"integer"},"listCount":{"type":"integer"},"readCount":{"type":"integer"},"s3StorageBytes":{"type":"integer"},"storageBytes":{"type":"integer"},"writeCount":{"type":"integer"}},"type":"object"},"Limits":{"properties":{"dataRetentionDays":{"type":"integer"},"maxActorCount":{"type":"integer"},"maxActorMemoryGbytes":{"type":"number"},"maxActorTaskCount":{"type":"integer"},"maxConcurrentActorJobs":{"type":"integer"},"maxMonthlyActorComputeUnits":{"type":"number"},"maxMonthlyExternalDataTransferGbytes":{"type":"number"},"maxMonthlyProxySerps":{"type":"integer"},"maxMonthlyResidentialProxyGbytes":{"type":"number"},"maxMonthlyUnblockerUnits":{"type":"number"},"maxMonthlyUsageUsd":{"type":"number"},"maxScheduleCount":{"type":"integer"},"maxTeamAccountSeatCount":{"type":"integer"}},"required":["maxMonthlyUsageUsd","maxMonthlyActorComputeUnits","maxMonthlyExternalDataTransferGbytes","maxMonthlyProxySerps","maxMonthlyResidentialProxyGbytes","maxActorMemoryGbytes","maxActorCount","maxActorTaskCount","maxConcurrentActorJobs","maxTeamAccountSeatCount","dataRetentionDays"],"type":"object"},"ListOfActorOAuthAccounts":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ActorOAuthAccount"},"type":"array"},"total":{"type":"integer"}},"required":["total","items"],"type":"object"},"ListOfActorOAuthAccountsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfActorOAuthAccounts"}},"required":["data"],"type":"object"},"ListOfActorOAuthConnections":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ActorOAuthConnection"},"type":"array"},"total":{"type":"integer"}},"required":["total","items"],"type":"object"},"ListOfActorOAuthConnectionsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfActorOAuthConnections"}},"required":["data"],"type":"object"},"ListOfActors":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/ActorListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfActorsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfActors"}},"required":["data"],"type":"object"},"ListOfBuilds":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/BuildListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfBuildsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfBuilds"}},"required":["data"],"type":"object"},"ListOfDatasets":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/DatasetListItem"},"type":"array"},"unnamed":{"type":"boolean"}},"required":["items"],"type":"object"}]},"ListOfDatasetsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfDatasets"}},"required":["data"],"type":"object"},"ListOfEnvVars":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EnvVar"},"type":"array"},"total":{"type":"integer"}},"required":["total","items"],"type":"object"},"ListOfEnvVarsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfEnvVars"}},"required":["data"],"type":"object"},"ListOfGitProviderIntegrationsResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/GitProviderIntegration"},"type":"array"}},"required":["data"],"type":"object"},"ListOfKeyValueStores":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/KeyValueStoreListItem"},"type":"array"},"unnamed":{"type":"boolean"}},"required":["items"],"type":"object"}]},"ListOfKeyValueStoresResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfKeyValueStores"}},"required":["data"],"type":"object"},"ListOfKeys":{"properties":{"count":{"type":"integer"},"exclusiveStartKey":{"type":["string","null"]},"isTruncated":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/KeyValueStoreKey"},"type":"array"},"limit":{"type":"integer"},"nextExclusiveStartKey":{"type":["string","null"]}},"required":["items","count","limit","isTruncated"],"type":"object"},"ListOfKeysResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfKeys"}},"required":["data"],"type":"object"},"ListOfRequestQueues":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/RequestQueueListItem"},"type":"array"},"unnamed":{"type":"boolean"}},"required":["items"],"type":"object"}]},"ListOfRequestQueuesResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfRequestQueues"}},"required":["data"],"type":"object"},"ListOfRequests":{"properties":{"cursor":{"type":"string"},"exclusiveStartId":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/RequestResource"},"type":"array"},"limit":{"type":"integer"},"nextCursor":{"type":"string"}},"required":["items","limit"],"type":"object"},"ListOfRequestsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfRequests"}},"required":["data"],"type":"object"},"ListOfRuns":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/RunListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfRunsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfRuns"}},"required":["data"],"type":"object"},"ListOfSchedules":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/ScheduleListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfSchedulesResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfSchedules"}},"required":["data"],"type":"object"},"ListOfStoreActors":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/StoreActor"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfStoreActorsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfStoreActors"}},"required":["data"],"type":"object"},"ListOfTasks":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/TaskListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfTasksResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfTasks"}},"required":["data"],"type":"object"},"ListOfVersions":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Version"},"type":"array"},"total":{"type":"integer"}},"required":["total","items"],"type":"object"},"ListOfVersionsResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfVersions"}},"required":["data"],"type":"object"},"ListOfWebhookDispatches":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/WebhookDispatch"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfWebhookDispatchesResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfWebhookDispatches"}},"required":["data"],"type":"object"},"ListOfWebhookResources":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/WebhookResource"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfWebhookResourcesResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfWebhookResources"}},"required":["data"],"type":"object"},"ListOfWebhooks":{"allOf":[{"$ref":"#/components/schemas/PaginationResponse"},{"properties":{"items":{"items":{"$ref":"#/components/schemas/WebhookListItem"},"type":"array"}},"required":["items"],"type":"object"}]},"ListOfWebhooksResponse":{"properties":{"data":{"$ref":"#/components/schemas/ListOfWebhooks"}},"required":["data"],"type":"object"},"LockExpiresAt":{"format":"date-time","type":"string"},"LockedRequestQueueHead":{"properties":{"clientKey":{"type":"string"},"hadMultipleClients":{"$ref":"#/components/schemas/HadMultipleClients"},"items":{"items":{"$ref":"#/components/schemas/LockedRequestQueueHeadItem"},"type":"array"},"limit":{"$ref":"#/components/schemas/HeadLimit"},"lockSecs":{"type":"integer"},"queueHasLockedRequests":{"type":"boolean"},"queueModifiedAt":{"$ref":"#/components/schemas/QueueModifiedAt"}},"required":["limit","queueModifiedAt","hadMultipleClients","lockSecs","items"],"type":"object"},"LockedRequestQueueHeadItem":{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"lockExpiresAt":{"$ref":"#/components/schemas/LockExpiresAt"},"method":{"$ref":"#/components/schemas/RequestMethod"},"retryCount":{"$ref":"#/components/schemas/RetryCount"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"},"url":{"$ref":"#/components/schemas/RequestUrl"}},"required":["id","uniqueKey","url","lockExpiresAt"],"type":"object"},"LockedRequestQueueHeadResponse":{"properties":{"data":{"$ref":"#/components/schemas/LockedRequestQueueHead"}},"required":["data"],"type":"object"},"MonthlyServiceUsage":{"type":"object"},"MonthlyUsage":{"properties":{"dailyServiceUsages":{"items":{"$ref":"#/components/schemas/DailyServiceUsage"},"type":"array"},"monthlyServiceUsage":{"$ref":"#/components/schemas/MonthlyServiceUsage"},"totalUsageCreditsUsdAfterVolumeDiscount":{"type":"number"},"totalUsageCreditsUsdBeforeVolumeDiscount":{"type":"number"},"usageCycle":{"$ref":"#/components/schemas/UsageCycle"}},"required":["usageCycle","monthlyServiceUsage","dailyServiceUsages","totalUsageCreditsUsdBeforeVolumeDiscount","totalUsageCreditsUsdAfterVolumeDiscount"],"type":"object"},"MonthlyUsageResponse":{"properties":{"data":{"$ref":"#/components/schemas/MonthlyUsage"}},"required":["data"],"type":"object"},"PaginationResponse":{"properties":{"count":{"minimum":0,"type":"integer"},"desc":{"type":"boolean"},"limit":{"minimum":1,"type":"integer"},"offset":{"minimum":0,"type":"integer"},"total":{"minimum":0,"type":"integer"}},"required":["total","offset","limit","desc","count"],"type":"object"},"PayPerEventActorPricingInfo":{"allOf":[{"$ref":"#/components/schemas/CommonActorPricingInfo"},{"properties":{"isPPEPlatformUsagePaidByUser":{"type":["boolean","null"]},"minimalMaxTotalChargeUsd":{"type":["number","null"]},"pricingModel":{"type":"string"},"pricingPerEvent":{"properties":{"actorChargeEvents":{"type":"object"}},"type":"object"}},"required":["pricingModel","pricingPerEvent"],"type":"object"}]},"PendingRequestCount":{"type":"integer"},"PricePerDatasetItemActorPricingInfo":{"allOf":[{"$ref":"#/components/schemas/CommonActorPricingInfo"},{"properties":{"pricePerUnitUsd":{"type":"number"},"pricingModel":{"type":"string"},"tieredPricing":{"$ref":"#/components/schemas/TieredPricingPerDatasetItem"},"unitName":{"type":"string"}},"required":["pricingModel","unitName"],"type":"object"}]},"ProlongRequestLockResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestLockInfo"}},"required":["data"],"type":"object"},"ProxyGroup":{"properties":{"availableCount":{"type":"integer"},"description":{"type":["string","null"]},"id":{"type":"string"},"name":{"type":"string"}},"required":["name","description"],"type":"object"},"ProxyResource":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/ProxyGroup"},"type":"array"},"password":{"type":["string","null"]}},"required":["groups"],"type":"object"},"QueueAccessedAt":{"format":"date-time","type":"string"},"QueueCreatedAt":{"format":"date-time","type":"string"},"QueueId":{"type":"string"},"QueueModifiedAt":{"format":"date-time","type":"string"},"QueueUserId":{"type":"string"},"RecordResponse":{"type":"object"},"RegisterDeploymentKeyResponse":{"properties":{"data":{"properties":{"repoName":{"type":"string"}},"required":["repoName"],"type":"object"}},"required":["data"],"type":"object"},"RequestBase":{"properties":{"errorMessages":{"items":{"type":"string"},"type":["array","null"]},"handledAt":{"format":"date-time","type":["string","null"]},"headers":{"type":["object","null"]},"loadedUrl":{"type":["string","null"]},"method":{"$ref":"#/components/schemas/RequestMethod"},"noRetry":{"type":["boolean","null"]},"payload":{"type":["string","object","null"]},"retryCount":{"$ref":"#/components/schemas/RetryCount"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"},"url":{"$ref":"#/components/schemas/RequestUrl"},"userData":{"$ref":"#/components/schemas/RequestUserData"}},"required":["uniqueKey","url"],"type":"object"},"RequestId":{"type":"string"},"RequestLockInfo":{"properties":{"lockExpiresAt":{"$ref":"#/components/schemas/LockExpiresAt"}},"required":["lockExpiresAt"],"type":"object"},"RequestMethod":{"$ref":"#/components/schemas/HttpMethod"},"RequestQueueHead":{"properties":{"hadMultipleClients":{"$ref":"#/components/schemas/HadMultipleClients"},"items":{"items":{"$ref":"#/components/schemas/RequestQueueHeadItem"},"type":"array"},"limit":{"$ref":"#/components/schemas/HeadLimit"},"queueModifiedAt":{"$ref":"#/components/schemas/QueueModifiedAt"}},"required":["limit","queueModifiedAt","hadMultipleClients","items"],"type":"object"},"RequestQueueHeadItem":{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"method":{"$ref":"#/components/schemas/RequestMethod"},"retryCount":{"$ref":"#/components/schemas/RetryCount"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"},"url":{"$ref":"#/components/schemas/RequestUrl"}},"required":["id","uniqueKey","url"],"type":"object"},"RequestQueueHeadResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestQueueHead"}},"required":["data"],"type":"object"},"RequestQueueListItem":{"properties":{"accessedAt":{"$ref":"#/components/schemas/QueueAccessedAt"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"createdAt":{"$ref":"#/components/schemas/QueueCreatedAt"},"expireAt":{"format":"date-time","type":"string"},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"hadMultipleClients":{"$ref":"#/components/schemas/HadMultipleClients"},"handledRequestCount":{"$ref":"#/components/schemas/HandledRequestCount"},"id":{"$ref":"#/components/schemas/QueueId"},"modifiedAt":{"$ref":"#/components/schemas/QueueModifiedAt"},"name":{"type":["string","null"]},"pendingRequestCount":{"$ref":"#/components/schemas/PendingRequestCount"},"stats":{"$ref":"#/components/schemas/RequestQueueListStats"},"title":{"type":["string","null"]},"totalRequestCount":{"$ref":"#/components/schemas/TotalRequestCount"},"userId":{"$ref":"#/components/schemas/QueueUserId"},"username":{"type":"string"}},"required":["id","userId","createdAt","modifiedAt","accessedAt","totalRequestCount","handledRequestCount","pendingRequestCount","hadMultipleClients"],"type":"object"},"RequestQueueListStats":{"properties":{"deleteCount":{"type":"integer"},"dynamodbStorageBytes":{"type":"integer"},"headItemReadCount":{"type":"integer"},"readCount":{"type":"integer"},"s3StorageBytes":{"type":"integer"},"writeCount":{"type":"integer"}},"type":"object"},"RequestQueueResource":{"properties":{"accessedAt":{"$ref":"#/components/schemas/QueueAccessedAt"},"actId":{"type":["string","null"]},"actRunId":{"type":["string","null"]},"consoleUrl":{"format":"uri","type":"string"},"createdAt":{"$ref":"#/components/schemas/QueueCreatedAt"},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"hadMultipleClients":{"$ref":"#/components/schemas/HadMultipleClients"},"handledRequestCount":{"$ref":"#/components/schemas/HandledRequestCount"},"id":{"$ref":"#/components/schemas/QueueId"},"modifiedAt":{"$ref":"#/components/schemas/QueueModifiedAt"},"name":{"type":["string","null"]},"pendingRequestCount":{"$ref":"#/components/schemas/PendingRequestCount"},"stats":{"$ref":"#/components/schemas/RequestQueueStats"},"title":{"type":["string","null"]},"totalRequestCount":{"$ref":"#/components/schemas/TotalRequestCount"},"userId":{"$ref":"#/components/schemas/QueueUserId"}},"required":["id","userId","createdAt","modifiedAt","accessedAt","totalRequestCount","handledRequestCount","pendingRequestCount","hadMultipleClients","consoleUrl"],"type":"object"},"RequestQueueResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestQueueResource"}},"required":["data"],"type":"object"},"RequestQueueStats":{"properties":{"deleteCount":{"type":"integer"},"headItemReadCount":{"type":"integer"},"readCount":{"type":"integer"},"storageBytes":{"type":"integer"},"writeCount":{"type":"integer"}},"type":"object"},"RequestRegistration":{"properties":{"requestId":{"$ref":"#/components/schemas/RequestId"},"wasAlreadyHandled":{"$ref":"#/components/schemas/WasAlreadyHandled"},"wasAlreadyPresent":{"$ref":"#/components/schemas/WasAlreadyPresent"}},"required":["requestId","wasAlreadyPresent","wasAlreadyHandled"],"type":"object"},"RequestResource":{"allOf":[{"$ref":"#/components/schemas/RequestBase","required":["id"]},{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"lockByClient":{"type":"string"},"lockExpiresAt":{"$ref":"#/components/schemas/LockExpiresAt"}}}]},"RequestResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestResource"}},"required":["data"],"type":"object"},"RequestUrl":{"type":"string"},"RequestUserData":{"type":"object"},"RetryCount":{"type":"integer"},"Run":{"properties":{"accountedChargedEventCounts":{"type":["object","null"]},"actId":{"type":"string"},"actorTaskId":{"type":["string","null"]},"buildId":{"type":"string"},"buildNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])(\\.[1-9][0-9]{0,4})$","type":["string","null"]},"chargedEventCounts":{"type":"object"},"consoleUrl":{"format":"uri","type":"string"},"containerUrl":{"format":"uri","type":"string"},"createdByOrganizationMemberUserId":{"type":"string"},"defaultDatasetId":{"type":"string"},"defaultKeyValueStoreId":{"type":"string"},"defaultRequestQueueId":{"type":"string"},"eventUsage":{"type":"object"},"exitCode":{"type":["integer","null"]},"externalChargedTotalUsd":{"type":"number"},"finishedAt":{"format":"date-time","type":["string","null"]},"generalAccess":{"anyOf":[{"$ref":"#/components/schemas/GeneralAccess"},{"type":"null"}]},"gitBranchName":{"type":["string","null"]},"id":{"type":"string"},"integrationTracking":{"$ref":"#/components/schemas/IntegrationTracking"},"isContainerServerReady":{"type":["boolean","null"]},"isStatusMessageTerminal":{"type":["boolean","null"]},"meta":{"$ref":"#/components/schemas/RunMeta"},"metamorphs":{"anyOf":[{"items":{"$ref":"#/components/schemas/RunMetamorphEvent"},"type":"array"},{"type":"null"}]},"options":{"$ref":"#/components/schemas/RunOptions"},"output":{"type":"object"},"platformUsageBillingModel":{"type":"string"},"pricingInfo":{"$ref":"#/components/schemas/ActorRunPricingInfo"},"standby":{"anyOf":[{"$ref":"#/components/schemas/RunStandby"},{"type":"null"}]},"startedAt":{"format":"date-time","type":"string"},"stats":{"$ref":"#/components/schemas/RunStats"},"status":{"$ref":"#/components/schemas/ActorJobStatus"},"statusMessage":{"type":["string","null"]},"storageIds":{"properties":{"datasets":{"properties":{"default":{"type":"string"}},"type":"object"},"keyValueStores":{"properties":{"default":{"type":"string"}},"type":"object"},"requestQueues":{"properties":{"default":{"type":"string"}},"type":"object"}},"type":"object"},"usage":{"anyOf":[{"$ref":"#/components/schemas/RunUsage"},{"type":"null"}]},"usageTotalUsd":{"type":["number","null"]},"usageUsd":{"anyOf":[{"$ref":"#/components/schemas/RunUsageUsd"},{"type":"null"}]},"userId":{"type":"string"}},"required":["id","actId","userId","startedAt","status","meta","stats","options","buildId","defaultKeyValueStoreId","defaultDatasetId","defaultRequestQueueId"],"type":"object"},"RunListItem":{"properties":{"actId":{"type":"string"},"actorTaskId":{"type":["string","null"]},"buildId":{"type":"string"},"buildNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])(\\.[1-9][0-9]{0,4})$","type":"string"},"buildNumberInt":{"type":"integer"},"defaultDatasetId":{"type":"string"},"defaultKeyValueStoreId":{"type":"string"},"defaultRequestQueueId":{"type":"string"},"finishedAt":{"format":"date-time","type":["string","null"]},"id":{"type":"string"},"meta":{"$ref":"#/components/schemas/RunMeta"},"standby":{"anyOf":[{"$ref":"#/components/schemas/RunStandby"},{"type":"null"}]},"startedAt":{"format":"date-time","type":"string"},"status":{"$ref":"#/components/schemas/ActorJobStatus"},"usageTotalUsd":{"type":"number"},"userId":{"type":"string"}},"required":["id","actId","status","startedAt","buildId","meta","usageTotalUsd","defaultKeyValueStoreId","defaultDatasetId","defaultRequestQueueId"],"type":"object"},"RunMeta":{"properties":{"actorRunId":{"type":"string"},"clientIp":{"type":["string","null"]},"origin":{"$ref":"#/components/schemas/RunOrigin"},"scheduleId":{"type":["string","null"]},"scheduledAct2Id":{"type":"string"},"scheduledActorTaskId":{"type":"string"},"scheduledAt":{"format":"date-time","type":["string","null"]},"userAgent":{"type":["string","null"]},"webhookDispatchId":{"type":"string"}},"required":["origin"],"type":"object"},"RunMetamorphEvent":{"properties":{"actorId":{"type":"string"},"buildId":{"type":"string"},"buildTags":{"items":{"type":"string"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"inputKey":{"type":["string","null"]}},"required":["createdAt","actorId","buildId"],"type":"object"},"RunOptions":{"properties":{"build":{"type":"string"},"diskMbytes":{"minimum":0,"type":"integer"},"isMaxTotalChargeUsdSetByUser":{"type":"boolean"},"maxItems":{"minimum":0,"type":["integer","null"]},"maxTotalChargeUsd":{"minimum":0,"type":["number","null"]},"memoryMbytes":{"maximum":32768,"minimum":128,"type":"integer"},"restartOnError":{"type":["boolean","null"]},"timeoutSecs":{"minimum":0,"type":"integer"}},"required":["build","timeoutSecs","memoryMbytes","diskMbytes"],"type":"object"},"RunOrigin":{"type":"string"},"RunResponse":{"properties":{"data":{"$ref":"#/components/schemas/Run"}},"required":["data"],"type":"object"},"RunStandby":{"properties":{"deployment":{"type":"string"}},"required":["deployment"],"type":"object"},"RunStats":{"properties":{"computeUnits":{"minimum":0,"type":"number"},"cpuAvgUsage":{"type":"number"},"cpuCurrentUsage":{"type":"number"},"cpuMaxUsage":{"type":"number"},"durationMillis":{"minimum":0,"type":"integer"},"inputBodyLen":{"minimum":0,"type":["integer","null"]},"memAvgBytes":{"type":"number"},"memCurrentBytes":{"minimum":0,"type":"integer"},"memMaxBytes":{"minimum":0,"type":"integer"},"metamorph":{"minimum":0,"type":"integer"},"migrationCount":{"minimum":0,"type":"integer"},"netRxBytes":{"minimum":0,"type":"integer"},"netTxBytes":{"minimum":0,"type":"integer"},"rebootCount":{"minimum":0,"type":"integer"},"restartCount":{"minimum":0,"type":"integer"},"resurrectCount":{"minimum":0,"type":"integer"},"runTimeSecs":{"minimum":0,"type":"number"}},"type":"object"},"RunUsage":{"properties":{"ACTOR_COMPUTE_UNITS":{"type":["number","null"]},"DATASET_READS":{"type":["integer","null"]},"DATASET_WRITES":{"type":["integer","null"]},"DATA_TRANSFER_EXTERNAL_GBYTES":{"type":["number","null"]},"DATA_TRANSFER_INTERNAL_GBYTES":{"type":["number","null"]},"KEY_VALUE_STORE_LISTS":{"type":["integer","null"]},"KEY_VALUE_STORE_READS":{"type":["integer","null"]},"KEY_VALUE_STORE_WRITES":{"type":["integer","null"]},"PROXY_RESIDENTIAL_TRANSFER_GBYTES":{"type":["number","null"]},"PROXY_SERPS":{"type":["integer","null"]},"PROXY_UNBLOCKER_UNITS":{"type":["number","null"]},"REQUEST_QUEUE_READS":{"type":["integer","null"]},"REQUEST_QUEUE_WRITES":{"type":["integer","null"]}},"type":"object"},"RunUsageUsd":{"properties":{"ACTOR_COMPUTE_UNITS":{"type":["number","null"]},"DATASET_READS":{"type":["number","null"]},"DATASET_WRITES":{"type":["number","null"]},"DATA_TRANSFER_EXTERNAL_GBYTES":{"type":["number","null"]},"DATA_TRANSFER_INTERNAL_GBYTES":{"type":["number","null"]},"KEY_VALUE_STORE_LISTS":{"type":["number","null"]},"KEY_VALUE_STORE_READS":{"type":["number","null"]},"KEY_VALUE_STORE_WRITES":{"type":["number","null"]},"PROXY_RESIDENTIAL_TRANSFER_GBYTES":{"type":["number","null"]},"PROXY_SERPS":{"type":["number","null"]},"PROXY_UNBLOCKER_UNITS":{"type":["number","null"]},"REQUEST_QUEUE_READS":{"type":["number","null"]},"REQUEST_QUEUE_WRITES":{"type":["number","null"]}},"type":"object"},"Schedule":{"allOf":[{"$ref":"#/components/schemas/ScheduleBase"},{"properties":{"actions":{"items":{"$ref":"#/components/schemas/ScheduleAction"},"type":"array"},"description":{"type":["string","null"]},"integrationTracking":{"$ref":"#/components/schemas/IntegrationTracking"},"notifications":{"$ref":"#/components/schemas/ScheduleNotifications"},"title":{"type":["string","null"]},"uiState":{"anyOf":[{"$ref":"#/components/schemas/ScheduleUiState"},{"type":"null"}]}},"required":["actions"],"type":"object"}]},"ScheduleAction":{"oneOf":[{"$ref":"#/components/schemas/ScheduleActionRunActor"},{"$ref":"#/components/schemas/ScheduleActionRunActorTask"}]},"ScheduleActionRunActor":{"properties":{"actorId":{"type":"string"},"id":{"type":"string"},"runInput":{"anyOf":[{"$ref":"#/components/schemas/ScheduleActionRunInput"},{"type":"null"}]},"runOptions":{"anyOf":[{"$ref":"#/components/schemas/TaskOptions"},{"type":"null"}]},"type":{}},"required":["id","type","actorId"],"type":"object"},"ScheduleActionRunActorTask":{"properties":{"actorTaskId":{"type":"string"},"id":{"type":"string"},"input":{"anyOf":[{"type":"object"},{"type":"null"}]},"type":{}},"required":["id","type","actorTaskId"],"type":"object"},"ScheduleActionRunInput":{"properties":{"body":{"type":["string","null"]},"contentType":{"type":["string","null"]}},"type":"object"},"ScheduleBase":{"properties":{"createdAt":{"format":"date-time","type":"string"},"cronExpression":{"type":"string"},"id":{"type":"string"},"isEnabled":{"type":"boolean"},"isExclusive":{"type":"boolean"},"lastRunAt":{"format":"date-time","type":["string","null"]},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"nextRunAt":{"format":"date-time","type":["string","null"]},"timezone":{"type":"string"},"userId":{"type":"string"}},"required":["id","userId","name","cronExpression","timezone","isEnabled","isExclusive","createdAt","modifiedAt"],"type":"object"},"ScheduleListItem":{"allOf":[{"$ref":"#/components/schemas/ScheduleBase"},{"properties":{"actions":{"items":{"$ref":"#/components/schemas/ScheduleListItemAction"},"type":"array"},"integrationTracking":{"$ref":"#/components/schemas/IntegrationTracking"},"notifications":{"$ref":"#/components/schemas/ScheduleNotifications"},"title":{"type":["string","null"]}},"required":["actions"],"type":"object"}]},"ScheduleListItemAction":{"oneOf":[{"$ref":"#/components/schemas/ScheduleListItemActionRunActor"},{"$ref":"#/components/schemas/ScheduleListItemActionRunActorTask"}]},"ScheduleListItemActionRunActor":{"properties":{"actorId":{"type":"string"},"id":{"type":"string"},"type":{}},"required":["id","type","actorId"],"type":"object"},"ScheduleListItemActionRunActorTask":{"properties":{"actorTaskId":{"type":"string"},"id":{"type":"string"},"type":{}},"required":["id","type","actorTaskId"],"type":"object"},"ScheduleLogEntry":{"properties":{"createdAt":{"format":"date-time","type":"string"},"level":{"type":"string"},"message":{"type":"string"}},"required":["message","level","createdAt"],"type":"object"},"ScheduleLogResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ScheduleLogEntry"},"type":"array"}},"required":["data"],"type":"object"},"ScheduleNotifications":{"properties":{"email":{"type":"boolean"}},"type":"object"},"ScheduleResponse":{"properties":{"data":{"$ref":"#/components/schemas/Schedule"}},"required":["data"],"type":"object"},"ScheduleUiState":{"properties":{"data":{"properties":{"cronExpression":{"type":"string"},"timezone":{"type":"string"}},"type":"object"},"version":{"type":"integer"}},"type":"object"},"ServiceUsage":{"type":"object"},"SourceCodeFile":{"properties":{"content":{"type":"string"},"format":{"$ref":"#/components/schemas/SourceCodeFileFormat"},"name":{"type":"string"}},"required":["name"],"type":"object"},"SourceCodeFileFormat":{"type":"string"},"SourceCodeFolder":{"properties":{"folder":{"type":"boolean"},"name":{"type":"string"}},"required":["name","folder"],"type":"object"},"StoreActor":{"properties":{"actorReviewCount":{"type":"integer"},"actorReviewRating":{"type":"number"},"badge":{"type":["string","null"]},"bookmarkCount":{"type":"integer"},"categories":{"items":{"type":"string"},"type":"array"},"currentPricingInfo":{"$ref":"#/components/schemas/CurrentPricingInfo"},"description":{"type":["string","null"]},"id":{"type":"string"},"inputSchema":{"properties":{"properties":{"type":"object"},"required":{"items":{"type":"string"},"type":"array"},"type":{"type":"string"}},"required":["type","properties"],"type":"object"},"isWhiteListedForAgenticPayments":{"type":["boolean","null"]},"name":{"type":"string"},"notice":{"$ref":"#/components/schemas/ActorNotice"},"pictureUrl":{"type":["string","null"]},"readmeSummary":{"type":"string"},"stats":{"$ref":"#/components/schemas/ActorStats"},"title":{"type":"string"},"url":{"format":"uri","type":["string","null"]},"userFullName":{"type":["string","null"]},"userPictureUrl":{"format":"uri","type":["string","null"]},"username":{"type":"string"}},"required":["id","title","name","username","stats"],"type":"object"},"TaggedBuilds":{"type":"object"},"Task":{"properties":{"actId":{"type":"string"},"actorStandby":{"anyOf":[{"$ref":"#/components/schemas/ActorStandby"},{"type":"null"}]},"createdAt":{"format":"date-time","type":"string"},"description":{"type":["string","null"]},"id":{"type":"string"},"input":{"anyOf":[{"$ref":"#/components/schemas/TaskInput"},{"items":{"$ref":"#/components/schemas/TaskInput"},"type":"array"},{"type":"null"}]},"isPublic":{"type":"boolean"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"nameLowerCase":{"type":"string"},"options":{"anyOf":[{"$ref":"#/components/schemas/TaskOptions"},{"type":"null"}]},"publicConfig":{"anyOf":[{"$ref":"#/components/schemas/TaskPublicConfig"},{"type":"null"}]},"removedAt":{"format":"date-time","type":["string","null"]},"standbyUrl":{"format":"uri","type":["string","null"]},"stats":{"anyOf":[{"$ref":"#/components/schemas/TaskStats"},{"type":"null"}]},"title":{"type":["string","null"]},"userId":{"type":"string"},"username":{"type":["string","null"]}},"required":["id","userId","actId","name","createdAt","modifiedAt"],"type":"object"},"TaskInput":{"type":"object"},"TaskListItem":{"properties":{"actId":{"type":"string"},"actName":{"type":["string","null"]},"actUsername":{"type":["string","null"]},"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"isPublic":{"type":"boolean"},"modifiedAt":{"format":"date-time","type":"string"},"name":{"type":"string"},"stats":{"anyOf":[{"$ref":"#/components/schemas/TaskStats"},{"type":"null"}]},"title":{"type":["string","null"]},"userId":{"type":"string"},"username":{"type":["string","null"]}},"required":["id","userId","actId","name","createdAt","modifiedAt"],"type":"object"},"TaskOptions":{"properties":{"build":{"type":["string","null"]},"forcePermissionLevel":{"anyOf":[{"$ref":"#/components/schemas/ActorPermissionLevel"},{"type":"null"}]},"isMaxTotalChargeUsdSetByUser":{"type":["boolean","null"]},"maxItems":{"type":["integer","null"]},"maxTotalChargeUsd":{"type":["number","null"]},"memoryMbytes":{"type":["integer","null"]},"restartOnError":{"type":["boolean","null"]},"timeoutSecs":{"type":["integer","null"]}},"type":"object"},"TaskPublicConfig":{"properties":{"categorization":{"type":["string","null"]},"datasetName":{"type":["string","null"]},"datasetView":{"type":["string","null"]},"faq":{"items":{"properties":{"answer":{"type":"string"},"question":{"type":"string"}},"required":["question","answer"],"type":"object"},"type":["array","null"]},"highlightedFields":{"items":{"type":"string"},"type":["array","null"]},"inputSchemaFields":{"items":{"type":"string"},"type":["array","null"]},"publishedAt":{"format":"date-time","type":["string","null"]},"seoDescription":{"maxLength":160,"type":["string","null"]},"seoTitle":{"maxLength":60,"type":["string","null"]}},"type":"object"},"TaskResponse":{"properties":{"data":{"$ref":"#/components/schemas/Task"}},"required":["data"],"type":"object"},"TaskStats":{"properties":{"lastRunStartedAt":{"format":"date-time","type":["string","null"]},"totalRuns":{"type":"integer"}},"type":"object"},"TieredPricingPerDatasetItem":{"type":"object"},"TotalRequestCount":{"minimum":0,"type":"integer"},"UniqueKey":{"type":"string"},"UnlockRequestsResponse":{"properties":{"data":{"$ref":"#/components/schemas/UnlockRequestsResult"}},"required":["data"],"type":"object"},"UnlockRequestsResult":{"properties":{"unlockedCount":{"type":"integer"}},"required":["unlockedCount"],"type":"object"},"UnprocessedRequest":{"properties":{"id":{"$ref":"#/components/schemas/RequestId"},"method":{"$ref":"#/components/schemas/RequestMethod"},"uniqueKey":{"$ref":"#/components/schemas/UniqueKey"},"url":{"$ref":"#/components/schemas/RequestUrl"}},"required":["uniqueKey","url"],"type":"object"},"UpdateRequestResponse":{"properties":{"data":{"$ref":"#/components/schemas/RequestRegistration"}},"required":["data"],"type":"object"},"UsageCycle":{"properties":{"endAt":{"format":"date-time","type":"string"},"startAt":{"format":"date-time","type":"string"}},"required":["startAt","endAt"],"type":"object"},"UserPlan":{"properties":{"apiRateLimitBoosts":{"type":"integer"},"availableAddOns":{"items":{"type":"string"},"type":"array"},"availableProxyGroups":{"$ref":"#/components/schemas/AvailableProxyGroups"},"dataRetentionDays":{"type":"integer"},"description":{"type":"string"},"enabledPlatformFeatures":{"items":{"type":"string"},"type":"array"},"forceBillingInterval":{"type":"string"},"id":{"type":"string"},"isEnabled":{"type":"boolean"},"isPayingCustomer":{"type":"boolean"},"legacyPlanId":{"type":"string"},"maxActorCount":{"type":"integer"},"maxActorMemoryGbytes":{"type":"number"},"maxActorTaskCount":{"type":"integer"},"maxConcurrentActorRuns":{"type":"integer"},"maxMonthlyActorComputeUnits":{"type":"number"},"maxMonthlyExternalDataTransferGbytes":{"type":"number"},"maxMonthlyProxySerps":{"type":"integer"},"maxMonthlyResidentialProxyGbytes":{"type":"number"},"maxMonthlyUnblockerUnits":{"type":"integer"},"maxMonthlyUsageUsd":{"type":"number"},"maxPublicActorTaskCount":{"type":"integer"},"maxPublicActorTaskCountPerActor":{"type":"integer"},"maxScheduleCount":{"type":"integer"},"monitoringLevel":{"type":["string","null"]},"monthlyBasePriceUsd":{"type":"number"},"monthlyUsageCreditsUsd":{"type":"number"},"overageThresholdUsd":{"type":"number"},"personalizedSupport":{"type":["string","null"]},"planPricing":{"type":"object"},"planTags":{"items":{"type":"string"},"type":"array"},"planVersion":{"type":"number"},"supportLevel":{"type":"string"},"teamAccountSeatCount":{"type":"integer"},"tier":{"type":"string"},"usageDiscountPercent":{"type":"number"}},"required":["availableProxyGroups"],"type":"object"},"UserPrivateInfo":{"properties":{"createdAt":{"format":"date-time","type":"string"},"effectivePlatformFeatures":{"$ref":"#/components/schemas/EffectivePlatformFeatures"},"email":{"format":"email","type":["string","null"]},"id":{"type":"string"},"isPaying":{"type":"boolean"},"organizationOwnerUserId":{"type":["string","null"]},"plan":{"$ref":"#/components/schemas/UserPlan"},"profile":{"$ref":"#/components/schemas/UserProfile"},"proxy":{"$ref":"#/components/schemas/ProxyResource"},"username":{"type":"string"}},"required":["username"],"type":"object"},"UserPrivateInfoResponse":{"properties":{"data":{"$ref":"#/components/schemas/UserPrivateInfo"}},"required":["data"],"type":"object"},"UserProfile":{"properties":{"bio":{"type":["string","null"]},"githubUsername":{"type":["string","null"]},"name":{"type":"string"},"pictureUrl":{"format":"uri","type":["string","null"]},"readme":{"type":["string","null"]},"twitterUsername":{"type":["string","null"]},"websiteUrl":{"format":"uri","type":["string","null"]}},"type":"object"},"UserPublicInfo":{"properties":{"profile":{"$ref":"#/components/schemas/UserProfile"},"username":{"type":"string"}},"required":["username"],"type":"object"},"UserPublicInfoResponse":{"properties":{"data":{"$ref":"#/components/schemas/UserPublicInfo"}},"required":["data"],"type":"object"},"Version":{"properties":{"actorPath":{"maxLength":255,"minLength":1,"type":["string","null"]},"applyEnvVarsToBuild":{"type":["boolean","null"]},"bitbucketWebhookId":{"type":["string","null"]},"buildTag":{"type":["string","null"]},"envVars":{"anyOf":[{"items":{"$ref":"#/components/schemas/EnvVar"},"type":"array"},{"type":"null"}]},"gitHubGistUrl":{"type":["string","null"]},"gitRepoUrl":{"type":["string","null"]},"githubWebhookId":{"type":["integer","null"]},"gitlabWebhookId":{"type":["integer","null"]},"sourceFiles":{"$ref":"#/components/schemas/VersionSourceFiles"},"sourceType":{"anyOf":[{"$ref":"#/components/schemas/VersionSourceType"},{"type":"null"}]},"tarballUrl":{"type":["string","null"]},"versionNumber":{"pattern":"^([0-9]|[1-9][0-9])\\.([0-9]|[1-9][0-9])$","type":"string"}},"required":["versionNumber","sourceType"],"type":"object"},"VersionResponse":{"properties":{"data":{"$ref":"#/components/schemas/Version"}},"required":["data"],"type":"object"},"VersionSourceFiles":{"items":{"anyOf":[{"$ref":"#/components/schemas/SourceCodeFile"},{"$ref":"#/components/schemas/SourceCodeFolder"}]},"type":"array"},"VersionSourceType":{"type":"string"},"WasAlreadyHandled":{"type":"boolean"},"WasAlreadyPresent":{"type":"boolean"},"WebhookCondition":{"properties":{"actorId":{"type":["string","null"]},"actorRunId":{"type":["string","null"]},"actorTaskId":{"type":["string","null"]}},"type":"object"},"WebhookDatasetTransformation":{"properties":{"fields":{"items":{"type":"string"},"type":"array"},"omit":{"items":{"type":"string"},"type":"array"}},"type":"object"},"WebhookDispatch":{"properties":{"calls":{"items":{"properties":{"debugPostMessage":{"type":"object"},"errorMessage":{"type":["string","null"]},"finishedAt":{"format":"date-time","type":["string","null"]},"responseBody":{"type":["string","null"]},"responseStatus":{"type":["integer","null"]},"startedAt":{"format":"date-time","type":["string","null"]}},"type":"object"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"eventData":{"properties":{"actorBuildId":{"type":"string"},"actorId":{"type":"string"},"actorRunId":{"type":"string"},"actorTaskId":{"type":["string","null"]}},"required":["actorId"],"type":["object","null"]},"eventType":{"$ref":"#/components/schemas/WebhookEventType"},"id":{"type":"string"},"status":{"$ref":"#/components/schemas/WebhookDispatchStatus"},"userId":{"type":"string"},"webhook":{"anyOf":[{"$ref":"#/components/schemas/WebhookDispatchWebhookSummary"},{"type":"null"}]},"webhookId":{"type":"string"}},"required":["id","userId","webhookId","createdAt","status","eventType"],"type":"object"},"WebhookDispatchResponse":{"properties":{"data":{"$ref":"#/components/schemas/WebhookDispatch"}},"required":["data"],"type":"object"},"WebhookDispatchStatus":{"type":"string"},"WebhookDispatchWebhookSummary":{"properties":{"_id":{"type":"string"},"actionType":{"type":"string"},"condition":{"$ref":"#/components/schemas/WebhookCondition"},"githubIssue":{"$ref":"#/components/schemas/WebhookGithubIssue"},"googleDrive":{"$ref":"#/components/schemas/WebhookGoogleDrive"},"googleMail":{"$ref":"#/components/schemas/WebhookGoogleMail"},"isAdHoc":{"type":"boolean"},"isApifyIntegration":{"type":["boolean","null"]},"requestUrl":{"format":"uri","type":["string","null"]},"slackMessage":{"$ref":"#/components/schemas/WebhookSlackMessage"}},"type":"object"},"WebhookEventType":{"type":"string"},"WebhookGithubIssue":{"properties":{"body":{"type":"string"},"repository":{"type":"string"},"title":{"type":"string"},"userIntegrationId":{"type":"string"}},"type":"object"},"WebhookGoogleDrive":{"properties":{"filename":{"type":"string"},"format":{"type":["string","null"]},"transformation":{"$ref":"#/components/schemas/WebhookDatasetTransformation"},"userIntegrationId":{"type":"string"}},"type":"object"},"WebhookGoogleMail":{"properties":{"attachmentFormat":{"type":"string"},"attachmentTransformation":{"$ref":"#/components/schemas/WebhookDatasetTransformation"},"body":{"type":"string"},"emailTo":{"items":{"type":"string"},"type":"array"},"subject":{"type":"string"},"userIntegrationId":{"type":"string"}},"type":"object"},"WebhookLastDispatch":{"properties":{"finishedAt":{"format":"date-time","type":["string","null"]},"removedAt":{"format":"date-time","type":["string","null"]},"status":{"$ref":"#/components/schemas/WebhookDispatchStatus"}},"required":["status"],"type":"object"},"WebhookListItem":{"properties":{"actionType":{"type":"string"},"condition":{"$ref":"#/components/schemas/WebhookCondition"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":["string","null"]},"doNotRetry":{"type":"boolean"},"eventTypes":{"items":{"$ref":"#/components/schemas/WebhookEventType"},"type":"array"},"githubIssue":{"$ref":"#/components/schemas/WebhookGithubIssue"},"googleDrive":{"$ref":"#/components/schemas/WebhookGoogleDrive"},"googleMail":{"$ref":"#/components/schemas/WebhookGoogleMail"},"headersTemplate":{"type":["string","null"]},"id":{"type":"string"},"ignoreSslErrors":{"type":"boolean"},"isAdHoc":{"type":["boolean","null"]},"isApifyIntegration":{"type":"boolean"},"isEnabled":{"type":"boolean"},"lastDispatch":{"anyOf":[{"$ref":"#/components/schemas/WebhookLastDispatch"},{"type":"null"}]},"modifiedAt":{"format":"date-time","type":"string"},"requestUrl":{"format":"uri","type":["string","null"]},"shouldInterpolateStrings":{"type":["boolean","null"]},"slackMessage":{"$ref":"#/components/schemas/WebhookSlackMessage"},"stats":{"anyOf":[{"$ref":"#/components/schemas/WebhookStats"},{"type":"null"}]},"title":{"type":["string","null"]},"userId":{"type":"string"}},"required":["id","createdAt","modifiedAt","userId","eventTypes","condition","ignoreSslErrors","doNotRetry"],"type":"object"},"WebhookResource":{"properties":{"actionType":{"type":"string"},"condition":{"$ref":"#/components/schemas/WebhookCondition"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":["string","null"]},"doNotRetry":{"type":["boolean","null"]},"eventTypes":{"items":{"$ref":"#/components/schemas/WebhookEventType"},"type":"array"},"githubIssue":{"$ref":"#/components/schemas/WebhookGithubIssue"},"googleDrive":{"$ref":"#/components/schemas/WebhookGoogleDrive"},"googleMail":{"$ref":"#/components/schemas/WebhookGoogleMail"},"headersTemplate":{"type":["string","null"]},"id":{"type":"string"},"ignoreSslErrors":{"type":"boolean"},"isAdHoc":{"type":["boolean","null"]},"isApifyIntegration":{"type":["boolean","null"]},"isEnabled":{"type":"boolean"},"lastDispatch":{"anyOf":[{"$ref":"#/components/schemas/WebhookLastDispatch"},{"type":"null"}]},"modifiedAt":{"format":"date-time","type":"string"},"payloadTemplate":{"type":["string","null"]},"requestUrl":{"format":"uri","type":["string","null"]},"shouldInterpolateStrings":{"type":["boolean","null"]},"slackMessage":{"$ref":"#/components/schemas/WebhookSlackMessage"},"stats":{"anyOf":[{"$ref":"#/components/schemas/WebhookStats"},{"type":"null"}]},"title":{"type":["string","null"]},"userId":{"type":"string"}},"required":["id","createdAt","modifiedAt","userId","eventTypes","condition","ignoreSslErrors"],"type":"object"},"WebhookResponse":{"properties":{"data":{"$ref":"#/components/schemas/WebhookResource"}},"required":["data"],"type":"object"},"WebhookSlackMessage":{"properties":{"channelId":{"type":"string"},"messageTemplate":{"type":"string"},"userIntegrationId":{"type":"string"}},"type":"object"},"WebhookStats":{"properties":{"totalDispatches":{"type":"integer"}},"type":"object"}},"specVersion":"v2-2026-11-04T151257Z"} diff --git a/src/Apify.Client/Internal/Signatures.cs b/src/Apify.Client/Internal/Signatures.cs index 38d8fb5..0dc99f4 100644 --- a/src/Apify.Client/Internal/Signatures.cs +++ b/src/Apify.Client/Internal/Signatures.cs @@ -37,6 +37,21 @@ public static string CreateHmacSignature(string secretKey, string message) return HexToBase62(truncated); } + /// + /// Rejects a zero or negative expiry, which would yield a URL that has already expired (the expiry is added to + /// the current time); a caller that wants a permanent URL leaves the expiry out. Matches the reference + /// client, which requires a positive expiresInSecs. + /// + /// The expiry from the caller's arguments, or null when unset. + /// The caller's parameter name, used in the error message. + public static void ValidateExpiry(int? expiresInSecs, string paramName) + { + if (expiresInSecs is <= 0) + { + throw new ArgumentOutOfRangeException(paramName, expiresInSecs, paramName + " must be positive; omit it for a URL that never expires."); + } + } + /// /// Builds a storage-content signature for a resource's public URL, byte-for-byte compatible with /// upstream createStorageContentSignature. @@ -51,6 +66,7 @@ public static string CreateHmacSignature(string secretKey, string message) /// Optional expiry in seconds (null for a non-expiring URL). public static string SignStorageContent(string secretKey, string resourceId, int? expiresInSecs) { + ValidateExpiry(expiresInSecs, nameof(expiresInSecs)); var expiresAtMillis = expiresInSecs is not null ? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + (expiresInSecs.Value * 1000L) : 0L; diff --git a/src/Apify.Client/Models/Actor.cs b/src/Apify.Client/Models/Actor.cs index 1172088..d8c02b3 100644 --- a/src/Apify.Client/Models/Actor.cs +++ b/src/Apify.Client/Models/Actor.cs @@ -38,4 +38,23 @@ public Actor(JsonObject data) /// When the Actor was last modified (ISO-8601 string). public string? ModifiedAt => GetString("modifiedAt"); + + /// + /// The URL of the Actor's server when it is a Server Actor (formerly Actor Standby), otherwise null + /// or absent. + /// + public string? StandbyUrl => GetString("standbyUrl"); + + /// + /// The Server Actor settings (actorStandby): isEnabled, build, memoryMbytes, + /// idleTimeoutSecs, tenancy (SINGLE_TENANT or MULTI_TENANT) and others, or + /// null when absent. + /// + public JsonObject? ActorStandby => Get("actorStandby") as JsonObject; + + /// + /// The builds the Actor's tags point to, keyed by tag (e.g. latest); each value holds the + /// buildId and buildNumber, or null when absent. + /// + public JsonObject? TaggedBuilds => Get("taggedBuilds") as JsonObject; } diff --git a/src/Apify.Client/Models/ActorVersion.cs b/src/Apify.Client/Models/ActorVersion.cs index b9c9732..a268067 100644 --- a/src/Apify.Client/Models/ActorVersion.cs +++ b/src/Apify.Client/Models/ActorVersion.cs @@ -17,4 +17,12 @@ public ActorVersion(JsonObject data) /// How the version's source is provided (e.g. SOURCE_FILES). public string? SourceType => GetString("sourceType"); + + /// + /// The Actor's directory inside the uploaded source of a SOURCE_FILES or TARBALL version, as a + /// path relative to the upload root with / separators (for example actors/typescript-actor). + /// null when the upload root is the Actor's directory, and absent for a TARBALL version when the + /// caller has no write access to the Actor. + /// + public string? ActorPath => GetString("actorPath"); } diff --git a/src/Apify.Client/Models/Build.cs b/src/Apify.Client/Models/Build.cs index fddaced..8db96da 100644 --- a/src/Apify.Client/Models/Build.cs +++ b/src/Apify.Client/Models/Build.cs @@ -55,4 +55,10 @@ public Build(JsonObject data) /// The ID of the Git commit the build's source was taken from, if it came from a Git repository. public string? GitCommitId => GetString("gitCommitId"); + + /// + /// The Actor definition the build was made from (the actorDefinition object, including its + /// webServerSchema), or null when absent. + /// + public JsonObject? ActorDefinition => Get("actorDefinition") as JsonObject; } diff --git a/src/Apify.Client/Models/PaginationList.cs b/src/Apify.Client/Models/PaginationList.cs index 7c79a1c..2e31d97 100644 --- a/src/Apify.Client/Models/PaginationList.cs +++ b/src/Apify.Client/Models/PaginationList.cs @@ -11,21 +11,23 @@ namespace Apify.Client.Models; /// /// /// The pagination metadata (, , , -/// , ) accompanies the . is -/// always the number of items in this page (so this[i] is valid for -/// 0 <= i < Count); the API's total across all pages is exposed separately as -/// . Note: reflects the API's reported total, which can briefly lag -/// immediately after a write (the count is computed asynchronously) — re-read after a short delay if you -/// need an exact post-write total. +/// , ) accompanies the . is the +/// number of entries the API went through for this page, which can differ from the number of items +/// returned: use Items.Count for the items. The list's own Count (through +/// , so also LINQ's Count()), enumeration and indexer cover the +/// items only. The API's total across all pages is exposed separately as . Note: +/// reflects the API's reported total, which can briefly lag immediately after a write (the +/// count is computed asynchronously) — re-read after a short delay if you need an exact post-write total. /// /// The hydrated item type. public sealed class PaginationList : IReadOnlyList { private readonly IReadOnlyList _items; - private PaginationList(IReadOnlyList items, long total, long offset, long limit, bool desc) + private PaginationList(IReadOnlyList items, long count, long total, long offset, long limit, bool desc) { _items = items; + Count = count; Total = total; Offset = offset; Limit = limit; @@ -33,7 +35,7 @@ private PaginationList(IReadOnlyList items, long total, long offset, long lim } /// Builds a page from a decoded paginated object, hydrating each item. - /// The decoded paginated object. + /// The decoded paginated object; its count becomes . /// Maps each raw item to a model. internal static PaginationList FromData(JsonNode? data, Func hydrate) { @@ -47,6 +49,7 @@ internal static PaginationList FromData(JsonNode? data, Func h return new PaginationList( items, + JsonValues.IntOr(obj, "count", items.Count), JsonValues.IntOr(obj, "total", items.Count), JsonValues.IntOr(obj, "offset", 0), JsonValues.IntOr(obj, "limit", items.Count), @@ -58,12 +61,13 @@ internal static PaginationList FromData(JsonNode? data, Func h /// a bare array with pagination in response headers). /// /// The page items. + /// The rows the API scanned for the page, or the item count when that is larger. /// Total number of items available across all pages. /// Number of items skipped at the start. /// Maximum number of items the API would return. /// Whether the items are in descending order. - internal static PaginationList FromItems(IReadOnlyList items, long total, long offset, long limit, bool desc) - => new(items, total, offset, limit, desc); + internal static PaginationList FromItems(IReadOnlyList items, long count, long total, long offset, long limit, bool desc) + => new(items, count, total, offset, limit, desc); /// The items of this page (never null). public IReadOnlyList Items => _items; @@ -78,10 +82,17 @@ internal static PaginationList FromItems(IReadOnlyList items, long total, public long Limit { get; } /// - /// Number of items in this page (always equal to Items.Count). Use for the - /// count across all pages. + /// Number of entries on this page. On a page from , the + /// number of dataset rows the API scanned for it, or the number of items returned when that is larger, so + /// filters such as or + /// can leave it above Items.Count. The next page + /// starts at Offset + Math.Min(Count, Limit); the cap matters only with + /// , which can return more items than the rows scanned. + /// On any other page it is the count the API reports, which is the number of items returned except + /// where the API drops entries after counting them, as the Store listing does. Use + /// for the count across all pages. /// - public long Count => _items.Count; + public long Count { get; } /// Whether the items are in descending order. public bool Desc { get; } diff --git a/src/Apify.Client/Options/ActorServerRequestOptions.cs b/src/Apify.Client/Options/ActorServerRequestOptions.cs new file mode 100644 index 0000000..e7b4302 --- /dev/null +++ b/src/Apify.Client/Options/ActorServerRequestOptions.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using Apify.Client.Http; + +namespace Apify.Client.Options; + +/// Configures a request to an Actor's server. All fields are optional. +public sealed class ActorServerRequestOptions +{ + /// The HTTP method of the request. Defaults to GET. + public HttpMethod? Method { get; init; } + + /// + /// The query parameters of the request, converted as for API calls: null values are left out, booleans + /// become 1/0, dates become ISO 8601 in UTC (a of unspecified kind is + /// taken as UTC), lists become their comma-joined values and other values use their invariant text form. A + /// query in the path is kept and these are appended to it. + /// + public IReadOnlyDictionary? Query { get; init; } + + /// + /// Additional request headers. They reach the Actor's server as they are, Authorization included, and + /// a header of the token's name (X-Apify-Authorization) replaces the token. A Content-Type header + /// is the same as . A Content-Encoding header marks a body that is already + /// encoded, which is then sent without compressing it (identity opts out of compression). Other + /// Content-* headers, such as Content-Disposition, describe the body and are sent only with a + /// ; a Content-Length header is ignored, since the client sets the length itself. + /// + public IReadOnlyDictionary? Headers { get; init; } + + /// + /// The request body, serialized as for API calls: raw bytes (byte[]) and a string are sent as + /// they are, and any other value is serialized to JSON. null sends no body. + /// + public object? Body { get; init; } + + /// + /// The content type of the body. Defaults to application/json for a serialized value, + /// text/plain; charset=utf-8 for a string and application/octet-stream for bytes. + /// + public string? ContentType { get; init; } + + /// + /// The compressor for the request body, for example . The body is sent + /// uncompressed when it is not set, since the Actor's server may not decode a compressed body. The body is + /// compressed under the same conditions as for API calls. Set it only if the Actor's server decodes the + /// resulting Content-Encoding. Matches the reference client's compression option. + /// + public HttpCompressor? Compressor { get; init; } + + /// + /// Whether to return the response body unread, to read it as a stream with + /// . The response then holds its connection open + /// until it is disposed. Defaults to false, which reads the whole body before returning. + /// + public bool StreamResponse { get; init; } + + /// + /// The timeout of the HTTP request. Defaults to the client's Long timeout tier, which covers the cold + /// start of an idle Actor. With , it bounds the wait for the server to start + /// responding. A value above is capped at it. + /// + public TimeSpan? Timeout { get; init; } +} diff --git a/src/Apify.Client/Options/DatasetListItemsOptions.cs b/src/Apify.Client/Options/DatasetListItemsOptions.cs index ca1adf8..77903eb 100644 --- a/src/Apify.Client/Options/DatasetListItemsOptions.cs +++ b/src/Apify.Client/Options/DatasetListItemsOptions.cs @@ -22,7 +22,9 @@ public sealed class DatasetListItemsOptions /// /// Maximum number of items requested per API call when iterating across pages (must be positive). Only /// iteration uses it, as the page size; it is never sent to the API. The effective page size is the - /// smaller of this and the remaining Limit. Defaults to the API's own page size. + /// smaller of this and the remaining Limit. Dataset items have no default limit, so without + /// ChunkSize and Limit iteration loads the whole dataset in one response; set it to iterate a + /// large dataset. /// public int? ChunkSize { get; init; } diff --git a/src/Apify.Client/Resources/ActorClient.cs b/src/Apify.Client/Resources/ActorClient.cs index 016d721..90023b9 100644 --- a/src/Apify.Client/Resources/ActorClient.cs +++ b/src/Apify.Client/Resources/ActorClient.cs @@ -21,6 +21,7 @@ public sealed class ActorClient private readonly HttpClientCore _http; private readonly string _baseUrl; private readonly ResourceContext _ctx; + private ActorServerClient? _serverClient; internal ActorClient(ApifyClient root, HttpClientCore http, string baseUrl, string id) { @@ -184,12 +185,20 @@ public ActorVersionClient Version(string versionNumber) /// A client for this Actor's version collection. public ActorVersionCollectionClient Versions() => new(_http, _ctx.SubUrl("")); + /// + /// A client for the server interface of this Actor. A Server Actor (formerly Actor Standby) runs a web server + /// that is called over HTTP without starting a run for each call. Every call returns the same client, so the + /// server URL it fetches is reused. + /// + public ActorServerClient Server() + => LazyInitializer.EnsureInitialized(ref _serverClient, () => new ActorServerClient(_http, _baseUrl, Id)); + /// A read-only client for this Actor's webhook collection (GET /v2/actors/{id}/webhooks). public NestedWebhookCollectionClient Webhooks() => new(_http, _ctx.SubUrl("")); /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/ActorCollectionClient.cs b/src/Apify.Client/Resources/ActorCollectionClient.cs index cb3b01a..1663c7a 100644 --- a/src/Apify.Client/Resources/ActorCollectionClient.cs +++ b/src/Apify.Client/Resources/ActorCollectionClient.cs @@ -52,7 +52,7 @@ public async Task CreateAsync(object actor, CancellationToken cancellatio /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/ActorEnvVarClient.cs b/src/Apify.Client/Resources/ActorEnvVarClient.cs index 43d121b..b18e4a6 100644 --- a/src/Apify.Client/Resources/ActorEnvVarClient.cs +++ b/src/Apify.Client/Resources/ActorEnvVarClient.cs @@ -43,7 +43,7 @@ public async Task UpdateAsync(ActorEnvVar envVar, CancellationToken /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/ActorEnvVarCollectionClient.cs b/src/Apify.Client/Resources/ActorEnvVarCollectionClient.cs index 3b76d4e..53378ca 100644 --- a/src/Apify.Client/Resources/ActorEnvVarCollectionClient.cs +++ b/src/Apify.Client/Resources/ActorEnvVarCollectionClient.cs @@ -55,7 +55,7 @@ public async IAsyncEnumerable IterateAsync([EnumeratorCancellation] /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/ActorServerClient.cs b/src/Apify.Client/Resources/ActorServerClient.cs new file mode 100644 index 0000000..2c0dd1c --- /dev/null +++ b/src/Apify.Client/Resources/ActorServerClient.cs @@ -0,0 +1,370 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net.Http; +using System.Text.Json.Nodes; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using Apify.Client.Exceptions; +using Apify.Client.Internal; +using Apify.Client.Models; +using Apify.Client.Options; + +namespace Apify.Client.Resources; + +/// +/// A client for the server interface of a specific Actor, obtained with . +/// +/// +/// A Server Actor (formerly Actor Standby) runs a web server that is called over HTTP without starting a run for +/// each call. This client sends requests to that server, and returns its URL and its OpenAPI specification. See +/// . +/// +public sealed class ActorServerClient +{ + /// The header that carries the API token to an Actor's server. The platform removes it before the request reaches the Actor. + private const string ServerAuthorizationHeader = "X-Apify-Authorization"; + + /// The build tag whose build serves the server interface when actorStandby.build is not set. + private const string DefaultBuildTag = "latest"; + + private const string DefaultRequestPath = "/"; + + private const string TextContentType = "text/plain; charset=utf-8"; + private const string BinaryContentType = "application/octet-stream"; + + /// The format of a date in a query parameter: ISO 8601 in UTC with milliseconds, as the reference client sends it. + private const string QueryTimestampFormat = "yyyy-MM-dd'T'HH:mm:ss.fff'Z'"; + + /// The separator of the values of a list in a query parameter. + private const string QueryListSeparator = ","; + + /// The Service Unavailable status the platform answers with when it cannot pass a request to a server run. + private const int ServiceUnavailableStatus = 503; + + /// + /// Bounds the build number matching so that a pathological input cannot stall the call; the pattern is simple, + /// so a second is generous. + /// + private static readonly TimeSpan BuildNumberMatchTimeout = TimeSpan.FromSeconds(1); + + /// + /// Statuses a server request is retried on. The platform answers with them when it cannot pass a request to a + /// server run, so a retry usually does not run the Actor's code again. An Actor that returns one itself gets + /// the request again. + /// + private static readonly int[] ServerRetryStatusCodes = { HttpClientCore.RateLimitExceeded, ServiceUnavailableStatus }; + + /// Matches a build number such as 0.1.23: version, minor version and sequence number. + private static readonly Regex BuildNumberPattern = new("^([0-9]+)\\.([0-9]+)\\.([0-9]+)$", RegexOptions.CultureInvariant, BuildNumberMatchTimeout); + + private readonly HttpClientCore _http; + private readonly string _baseUrl; + private readonly ResourceContext _ctx; + private string? _serverUrl; + + internal ActorServerClient(HttpClientCore http, string baseUrl, string id) + { + _http = http; + _baseUrl = baseUrl; + Id = id; + _ctx = ResourceContext.Single(http, baseUrl, "actors", id); + } + + /// The Actor's ID (or username~name) as provided. + public string Id { get; } + + /// + /// Returns the URL of the Actor's server, to call it with another HTTP client, for example one generated from + /// the server's OpenAPI specification (see ). + /// + /// + /// The URL is the Actor's standbyUrl. The first call of this method, or + /// fetches it from the API and this client reuses it afterwards; concurrent first + /// calls may each fetch it. + /// + /// A token to cancel the request. + /// The Actor is not a Server Actor. + /// The Actor does not exist. + public async Task GetUrlAsync(CancellationToken cancellationToken = default) + => _serverUrl ?? (await GetServerActorAsync(cancellationToken).ConfigureAwait(false)).StandbyUrl!; + + /// + /// Returns the OpenAPI specification of the Actor's server, to generate an HTTP client for it and point that + /// client at the URL returned by ; null if the Actor's definition does not + /// include one. + /// + /// + /// The specification is the web server schema of the Actor's definition, taken from the build that serves the + /// server interface: the build set in actorStandby.build (a tag or a build number), or latest if + /// none is set. See . + /// + /// A token to cancel the requests. + /// The Actor is not a Server Actor, or the build that serves its server interface does not exist. + /// The Actor does not exist. + public async Task GetOpenApiSpecAsync(CancellationToken cancellationToken = default) + { + var actor = await GetServerActorAsync(cancellationToken).ConfigureAwait(false); + var configuredBuild = actor.ActorStandby?["build"] is JsonValue value && value.TryGetValue(out var text) ? text : null; + var buildRef = string.IsNullOrEmpty(configuredBuild) ? DefaultBuildTag : configuredBuild; + + var buildId = TaggedBuildId(actor, buildRef); + if (buildId is null && ParseBuildNumber(buildRef) is { } target) + { + // Not a tag, so look `buildRef` up as a build number, which the API cannot resolve directly. + buildId = await FindBuildIdByNumberAsync(buildRef, target, cancellationToken).ConfigureAwait(false); + } + + var build = buildId is null ? null : await BuildClientFor(buildId).GetAsync(cancellationToken: cancellationToken).ConfigureAwait(false); + if (build is null) + { + throw new ActorServerException($"Build {buildRef} of Actor {Id} does not exist."); + } + + return build.ActorDefinition?["webServerSchema"] as JsonObject; + } + + /// + /// Sends an HTTP request to the Actor's server and returns its response, whatever its status. + /// + /// + /// + /// The request goes to the URL returned by and carries the client's token in the + /// X-Apify-Authorization header, which the platform consumes, so it never reaches the Actor's code. + /// Headers in , Authorization included, reach the Actor's + /// server as they are. The first request to an idle Actor waits for the platform to start a server run, which + /// is why the timeout defaults to the Long tier. + /// + /// + /// A rate limit (429) or Service Unavailable (503) response is retried with the client's retry settings, and + /// the last one is returned once the retries run out. The Actor's code can return these statuses too, and + /// then it gets the request again. Other statuses are not retried, since they may come from the Actor's code, + /// and neither are network errors and timeouts, since the Actor may have already handled the request. A + /// redirect is returned as it is, since following it would send the token to a host the Actor's code picked. + /// Request bodies are sent uncompressed unless is set. + /// + /// + /// + /// The path on the Actor's server, for example /search. It is always resolved against the server URL, + /// so the request, and the token with it, cannot be sent to another host. Pass the query in + /// . A fragment (#...) is dropped, since it is never sent + /// to the server. + /// + /// Optional request settings. + /// A token to cancel the request. + /// The response of the Actor's server; dispose it when done. + /// The Actor is not a Server Actor. + /// The Actor does not exist. + /// The request failed or timed out without a response. + /// + /// The client uses an that wraps a caller-supplied + /// without a noRedirectHttpClient, so it cannot send a request that must not follow redirects. + /// + public async Task RequestAsync( + string path = DefaultRequestPath, + ActorServerRequestOptions? options = null, + CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(path); + options ??= new ActorServerRequestOptions(); + + var url = BuildRequestUrl(await GetUrlAsync(cancellationToken).ConfigureAwait(false), path, options); + string? body; + byte[]? bodyBytes; + if (options.Body is string rawText) + { + body = rawText; + bodyBytes = null; + } + else + { + ResourceContext.EncodeInputBody(options.Body, out body, out bodyBytes); + } + + var policy = new RequestPolicy + { + AuthorizationHeader = ServerAuthorizationHeader, + ThrowOnErrorStatus = false, + RetryStatusCodes = ServerRetryStatusCodes, + RetryTransportErrors = false, + FollowRedirects = false, + CompressBody = options.Compressor is not null, + Compressor = options.Compressor, + StreamResponse = options.StreamResponse, + }; + var response = await _http.CallAsync( + options.Method ?? HttpMethod.Get, + url, + body, + options.ContentType ?? FindHeader(options.Headers, HttpClientCore.ContentTypeHeader) ?? DefaultContentType(options.Body), + options.Timeout, + bodyBytes: bodyBytes, + extraHeaders: options.Headers, + tier: RequestTier.Long, + explicitContentEncoding: FindHeader(options.Headers, HttpClientCore.ContentEncodingHeader), + policy: policy, + cancellationToken: cancellationToken).ConfigureAwait(false); + return new ActorServerResponse(response); + } + + /// + /// Returns this client with the timeout of the API calls it makes (the Actor and build lookups of + /// and ) set to , + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass + /// for no timeout. A value above + /// is capped at it. It does not affect , which takes its timeout from + /// . + /// + /// The timeout to use for the API calls made through this client. + public ActorServerClient WithTimeout(TimeSpan timeout) + { + _ctx.WithTimeout(timeout); + return this; + } + + private static string BuildRequestUrl(string serverUrl, string path, ActorServerRequestOptions options) + { + var fragment = path.IndexOf('#', StringComparison.Ordinal); + var serverPath = (fragment >= 0 ? path.Substring(0, fragment) : path).TrimStart('/'); + var query = new QueryParams(); + if (options.Query is not null) + { + foreach (var (key, value) in options.Query) + { + AddQueryValue(query, key, value); + } + } + + return query.ApplyToUrl(serverUrl.TrimEnd('/') + "/" + serverPath); + } + + private static void AddQueryValue(QueryParams query, string key, object? value) + { + if (FormatQueryValue(value) is { } text) + { + query.AddRaw(key, text); + } + } + + /// + /// Converts a query value to text: dates to ISO 8601 in UTC, booleans to 1/0, lists to their + /// comma-joined values and other values to their invariant text; null stays null and is left out. + /// + private static string? FormatQueryValue(object? value) => value switch + { + null => null, + string text => text, + bool flag => flag ? "1" : "0", + DateTime time => ToUtc(time).ToString(QueryTimestampFormat, CultureInfo.InvariantCulture), + DateTimeOffset time => time.UtcDateTime.ToString(QueryTimestampFormat, CultureInfo.InvariantCulture), + IFormattable formattable => formattable.ToString(null, CultureInfo.InvariantCulture), + IEnumerable items => string.Join(QueryListSeparator, items.Cast().Select(FormatQueryValue).Where(static item => item is not null)), + _ => value.ToString(), + }; + + /// A date as UTC; a date of unspecified kind is taken as UTC too, so it is sent the same on every machine. + private static DateTime ToUtc(DateTime time) + => time.Kind == DateTimeKind.Unspecified ? DateTime.SpecifyKind(time, DateTimeKind.Utc) : time.ToUniversalTime(); + + private static string DefaultContentType(object? body) => body switch + { + string => TextContentType, + byte[] => BinaryContentType, + _ => ResourceContext.ContentTypeJson, + }; + + private static string? FindHeader(IReadOnlyDictionary? headers, string name) + { + if (headers is null) + { + return null; + } + + foreach (var header in headers) + { + if (string.Equals(header.Key, name, StringComparison.OrdinalIgnoreCase)) + { + return header.Value; + } + } + + return null; + } + + /// Fetches the Actor, checks that it is a Server Actor, and remembers its server URL. + private async Task GetServerActorAsync(CancellationToken cancellationToken) + { + var actor = new Actor(await _ctx.GetResourceRequiredAsync("", new QueryParams(), RequestTier.Short, cancellationToken).ConfigureAwait(false)); + if (string.IsNullOrEmpty(actor.StandbyUrl)) + { + throw new ActorServerException($"Actor {Id} is not a Server Actor."); + } + + _serverUrl = actor.StandbyUrl; + return actor; + } + + private static string? TaggedBuildId(Actor actor, string tag) + => actor.TaggedBuilds?[tag] is JsonObject tagged && tagged["buildId"] is JsonValue id && id.TryGetValue(out var buildId) + ? buildId + : null; + + private async Task FindBuildIdByNumberAsync(string buildNumber, (long Major, long Minor, long Sequence) target, CancellationToken cancellationToken) + { + var builds = new BuildCollectionClient(_http, _ctx.SubUrl(""), "builds"); + if (_ctx.RequestTimeout is { } timeout) + { + builds.WithTimeout(timeout); + } + + // Builds are listed newest first and the sequence numbers of a version grow over time, so meeting an older + // build of the same version means the target does not exist. + await foreach (var build in builds.IterateAsync(new ListOptions { Desc = true }, cancellationToken).ConfigureAwait(false)) + { + if (build.BuildNumber == buildNumber) + { + return build.Id; + } + + if (ParseBuildNumber(build.BuildNumber) is { } parsed + && parsed.Major == target.Major && parsed.Minor == target.Minor && parsed.Sequence < target.Sequence) + { + break; + } + } + + return null; + } + + private BuildClient BuildClientFor(string buildId) + { + var client = new BuildClient(_http, _baseUrl, buildId); + if (_ctx.RequestTimeout is { } timeout) + { + client.WithTimeout(timeout); + } + + return client; + } + + /// + /// Splits a build number like 0.1.23 into its parts, or returns null for anything else, including + /// numbers too large to be a real build number. + /// + private static (long Major, long Minor, long Sequence)? ParseBuildNumber(string? buildNumber) + { + var match = BuildNumberPattern.Match(buildNumber ?? string.Empty); + if (!match.Success + || !long.TryParse(match.Groups[1].Value, NumberStyles.None, CultureInfo.InvariantCulture, out var major) + || !long.TryParse(match.Groups[2].Value, NumberStyles.None, CultureInfo.InvariantCulture, out var minor) + || !long.TryParse(match.Groups[3].Value, NumberStyles.None, CultureInfo.InvariantCulture, out var sequence)) + { + return null; + } + + return (major, minor, sequence); + } +} diff --git a/src/Apify.Client/Resources/ActorServerResponse.cs b/src/Apify.Client/Resources/ActorServerResponse.cs new file mode 100644 index 0000000..2db329c --- /dev/null +++ b/src/Apify.Client/Resources/ActorServerResponse.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Http; +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Threading; +using System.Threading.Tasks; +using Apify.Client.Exceptions; +using Apify.Client.Internal; + +namespace Apify.Client.Resources; + +/// +/// The response of an Actor's server, whatever its status. Dispose it when done; a response read as a stream +/// keeps its connection open until then. +/// +public sealed class ActorServerResponse : IDisposable +{ + private readonly HttpResponseMessage _response; + private readonly Lazy> _headers; + + internal ActorServerResponse(HttpResponseMessage response) + { + _response = response; + _headers = new Lazy>(() => CollectHeaders(response)); + } + + /// The HTTP status code of the response. + public int StatusCode => (int)_response.StatusCode; + + /// Whether the status code is in the 2xx range. + public bool IsSuccess => _response.IsSuccessStatusCode; + + /// The response headers, names compared case-insensitively; repeated values are joined with , . + public IReadOnlyDictionary Headers => _headers.Value; + + /// The Content-Type header of the response, or null if it has none. + public string? ContentType => _response.Content.Headers.ContentType?.ToString(); + + /// Reads the response body as raw bytes. + /// A token to cancel the read. + public Task ReadAsBytesAsync(CancellationToken cancellationToken = default) + => _response.Content.ReadAsByteArrayAsync(cancellationToken); + + /// Reads the response body as text, decoded by the charset of its content type (UTF-8 by default). + /// A token to cancel the read. + public Task ReadAsStringAsync(CancellationToken cancellationToken = default) + => _response.Content.ReadAsStringAsync(cancellationToken); + + /// + /// Reads the response body as a stream. With + /// the body is not read yet and arrives as it is received; the stream is valid until this response is + /// disposed. + /// + /// A token to cancel the read. + public Task ReadAsStreamAsync(CancellationToken cancellationToken = default) + => _response.Content.ReadAsStreamAsync(cancellationToken); + + /// Reads the response body as JSON (null for an empty body). + /// A token to cancel the read. + /// The body is not valid JSON. + public async Task ReadAsJsonAsync(CancellationToken cancellationToken = default) + { + var body = await _response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + try + { + return Json.Decode(body); + } + catch (JsonException ex) + { + throw new InvalidResponseBodyException( + "response body is not valid JSON: " + ex.Message, + StatusCode, + _response.RequestMessage?.Method.Method ?? string.Empty, + _response.RequestMessage?.RequestUri is { } uri ? HttpClientCore.ExtractPath(uri.ToString()) : string.Empty, + body, + ex); + } + } + + /// Releases the connection of the response. + public void Dispose() => _response.Dispose(); + + private static Dictionary CollectHeaders(HttpResponseMessage response) + { + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var header in response.Headers) + { + headers[header.Key] = string.Join(", ", header.Value); + } + + foreach (var header in response.Content.Headers) + { + headers[header.Key] = string.Join(", ", header.Value); + } + + return headers; + } +} diff --git a/src/Apify.Client/Resources/ActorVersionClient.cs b/src/Apify.Client/Resources/ActorVersionClient.cs index 012db24..2d7f8f0 100644 --- a/src/Apify.Client/Resources/ActorVersionClient.cs +++ b/src/Apify.Client/Resources/ActorVersionClient.cs @@ -61,7 +61,7 @@ public ActorEnvVarClient EnvVar(string name) /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/ActorVersionCollectionClient.cs b/src/Apify.Client/Resources/ActorVersionCollectionClient.cs index eab89bf..6f13162 100644 --- a/src/Apify.Client/Resources/ActorVersionCollectionClient.cs +++ b/src/Apify.Client/Resources/ActorVersionCollectionClient.cs @@ -53,7 +53,7 @@ public async IAsyncEnumerable IterateAsync([EnumeratorCancellation /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/BuildClient.cs b/src/Apify.Client/Resources/BuildClient.cs index 6c35e95..33eacf7 100644 --- a/src/Apify.Client/Resources/BuildClient.cs +++ b/src/Apify.Client/Resources/BuildClient.cs @@ -71,7 +71,7 @@ public async Task WaitForFinishAsync(int? waitSecs = null, CancellationTo /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/BuildCollectionClient.cs b/src/Apify.Client/Resources/BuildCollectionClient.cs index ed355cd..14a9074 100644 --- a/src/Apify.Client/Resources/BuildCollectionClient.cs +++ b/src/Apify.Client/Resources/BuildCollectionClient.cs @@ -46,7 +46,7 @@ public IAsyncEnumerable IterateAsync(ListOptions? options = null, Cancell /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/DatasetClient.cs b/src/Apify.Client/Resources/DatasetClient.cs index e2dc9b8..57eab05 100644 --- a/src/Apify.Client/Resources/DatasetClient.cs +++ b/src/Apify.Client/Resources/DatasetClient.cs @@ -74,8 +74,7 @@ public async Task UpdateAsync(object newFields, CancellationToken cance options ??= new DatasetListItemsOptions(); var q = new QueryParams(); options.AppendTo(q); - var (page, _) = await FetchItemsPageAsync(q, options.Desc ?? false, cancellationToken).ConfigureAwait(false); - return page; + return await FetchItemsPageAsync(q, options.Desc ?? false, cancellationToken).ConfigureAwait(false); } /// @@ -111,14 +110,14 @@ public async Task UpdateAsync(object newFields, CancellationToken cance limitCountsRows: true, async (offset, pageLimit, token) => { - var (page, scannedCount) = await FetchItemsPageAsync(baseQuery.PageQuery(offset, pageLimit), desc, token).ConfigureAwait(false); - return new FetchedPage(page.Items, scannedCount); + var page = await FetchItemsPageAsync(baseQuery.PageQuery(offset, pageLimit), desc, token).ConfigureAwait(false); + return new FetchedPage(page.Items, page.Count); }, cancellationToken); } /// Fetches a single page of items for the given options (see the query overload). - internal Task<(PaginationList Page, long ScannedCount)> FetchItemsPageAsync(DatasetListItemsOptions options, CancellationToken cancellationToken) + internal Task> FetchItemsPageAsync(DatasetListItemsOptions options, CancellationToken cancellationToken) { var q = new QueryParams(); options.AppendTo(q); @@ -127,11 +126,12 @@ public async Task UpdateAsync(object newFields, CancellationToken cance /// /// Fetches a single page of dataset items. The endpoint returns a bare JSON array with pagination in - /// X-Apify-Pagination-* response headers. Returns the page alongside the number of rows the API - /// scanned to produce it (X-Apify-Pagination-Count), which the offset iterator paginates by (see - /// ); it falls back to the item count when the header is absent. + /// X-Apify-Pagination-* response headers. The page's is the + /// number of rows the API scanned to produce it (X-Apify-Pagination-Count), which the offset + /// iterator paginates by (see ). The header is derived from the dataset's + /// item count, which lags a fresh push, so the item count is used when it is larger or the header is absent. /// - private async Task<(PaginationList Page, long ScannedCount)> FetchItemsPageAsync(QueryParams q, bool desc, CancellationToken cancellationToken) + private async Task> FetchItemsPageAsync(QueryParams q, bool desc, CancellationToken cancellationToken) { var url = _ctx.MergedParams(q).ApplyToUrl(_ctx.SubUrl("items")); using var response = await _http.CallAsync(HttpMethod.Get, url, timeout: _ctx.RequestTimeout, tier: RequestTier.Long, cancellationToken: cancellationToken).ConfigureAwait(false); @@ -141,15 +141,14 @@ public async Task UpdateAsync(object newFields, CancellationToken cance items.Add(item); } - var count = items.Count; - var page = PaginationList.FromItems( + var returned = items.Count; + return PaginationList.FromItems( items, - HeaderInt(response, "X-Apify-Pagination-Total", count), + Math.Max(HeaderInt(response, "X-Apify-Pagination-Count", returned), returned), + HeaderInt(response, "X-Apify-Pagination-Total", returned), HeaderInt(response, "X-Apify-Pagination-Offset", 0), - HeaderInt(response, "X-Apify-Pagination-Limit", count), + HeaderInt(response, "X-Apify-Pagination-Limit", returned), desc); - var scannedCount = HeaderInt(response, "X-Apify-Pagination-Count", count); - return (page, scannedCount); } /// @@ -301,7 +300,7 @@ public async Task GetStatisticsAsync(CancellationToken cancellationT /// non-expiring). The URL is built from the configured public base URL. /// /// Optional item filtering/projection options forwarded into the URL. - /// Optional expiry in seconds for a signed URL. + /// Optional expiry in seconds for a signed URL; must be positive (omit it for a URL that never expires). /// Output format served by the URL (null defaults to ). /// A token to cancel the request. public async Task CreateItemsPublicUrlAsync( @@ -310,6 +309,7 @@ public async Task CreateItemsPublicUrlAsync( DownloadItemsFormat? format = null, CancellationToken cancellationToken = default) { + Signatures.ValidateExpiry(expiresInSecs, nameof(expiresInSecs)); var q = new QueryParams(); (options ?? new DatasetListItemsOptions()).AppendTo(q); if (format is not null) @@ -350,7 +350,7 @@ private static long HeaderInt(HttpResponseMessage response, string name, long fa /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/DatasetCollectionClient.cs b/src/Apify.Client/Resources/DatasetCollectionClient.cs index de136ac..c723d45 100644 --- a/src/Apify.Client/Resources/DatasetCollectionClient.cs +++ b/src/Apify.Client/Resources/DatasetCollectionClient.cs @@ -57,7 +57,7 @@ public IAsyncEnumerable IterateAsync(StorageListOptions? options = null /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/KeyValueStoreClient.cs b/src/Apify.Client/Resources/KeyValueStoreClient.cs index f9de3a3..b5f8d3a 100644 --- a/src/Apify.Client/Resources/KeyValueStoreClient.cs +++ b/src/Apify.Client/Resources/KeyValueStoreClient.cs @@ -278,10 +278,11 @@ public async Task GetRecordPublicUrlAsync(string key, CancellationToken /// the caller already supplied one. optionally bounds a signed URL. /// /// Optional key-listing filters forwarded into the URL. - /// Optional expiry in seconds for a signed URL. + /// Optional expiry in seconds for a signed URL; must be positive (omit it for a URL that never expires). /// A token to cancel the request. public async Task CreateKeysPublicUrlAsync(ListKeysOptions? options = null, int? expiresInSecs = null, CancellationToken cancellationToken = default) { + Signatures.ValidateExpiry(expiresInSecs, nameof(expiresInSecs)); options ??= new ListKeysOptions(); var q = new QueryParams(); options.AppendTo(q); @@ -303,7 +304,7 @@ public async Task CreateKeysPublicUrlAsync(ListKeysOptions? options = nu /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/KeyValueStoreCollectionClient.cs b/src/Apify.Client/Resources/KeyValueStoreCollectionClient.cs index def2ad5..0ba2252 100644 --- a/src/Apify.Client/Resources/KeyValueStoreCollectionClient.cs +++ b/src/Apify.Client/Resources/KeyValueStoreCollectionClient.cs @@ -56,7 +56,7 @@ public IAsyncEnumerable IterateAsync(StorageListOptions? options /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/LogClient.cs b/src/Apify.Client/Resources/LogClient.cs index 3f53f0a..23b6032 100644 --- a/src/Apify.Client/Resources/LogClient.cs +++ b/src/Apify.Client/Resources/LogClient.cs @@ -117,7 +117,7 @@ internal static LogClient Nested(HttpClientCore http, string baseUrl, QueryParam /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/NestedWebhookCollectionClient.cs b/src/Apify.Client/Resources/NestedWebhookCollectionClient.cs index 8a03f94..067cb9b 100644 --- a/src/Apify.Client/Resources/NestedWebhookCollectionClient.cs +++ b/src/Apify.Client/Resources/NestedWebhookCollectionClient.cs @@ -18,7 +18,7 @@ internal NestedWebhookCollectionClient(HttpClientCore http, string baseUrl) /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/RequestQueueCollectionClient.cs b/src/Apify.Client/Resources/RequestQueueCollectionClient.cs index bb865cd..f0cd1ae 100644 --- a/src/Apify.Client/Resources/RequestQueueCollectionClient.cs +++ b/src/Apify.Client/Resources/RequestQueueCollectionClient.cs @@ -54,7 +54,7 @@ public IAsyncEnumerable IterateAsync(StorageListOptions? options = /// /// Returns this client with every subsequent call's timeout set to , - /// overriding the tier default (see the "Timeout tiers" section of the top-level README). Pass + /// overriding the tier default (see the "Timeout tiers" section of docs/README.md). Pass /// for no timeout, matching the reference client's 'noTimeout'. A /// value above (the overall budget) is capped at it — /// raise itself to allow a longer per-call timeout. diff --git a/src/Apify.Client/Resources/RunClient.cs b/src/Apify.Client/Resources/RunClient.cs index b7d5baf..533e268 100644 --- a/src/Apify.Client/Resources/RunClient.cs +++ b/src/Apify.Client/Resources/RunClient.cs @@ -315,7 +315,7 @@ internal async Task WaitForFinishWithLogAsync(int? waitSecs, Action WaitForFinishWithLogAsync(int? waitSecs, Action WaitForFinishWithLogAsync(int? waitSecs, Action