scrapely-client-python 1.0.3__tar.gz → 1.0.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. scrapely_client_python-1.0.7/CHANGELOG.md +34 -0
  2. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/CONTRIBUTING.md +2 -0
  3. scrapely_client_python-1.0.7/NOTICE +7 -0
  4. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/PKG-INFO +11 -9
  5. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/README.md +4 -2
  6. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/pyproject.toml +11 -14
  7. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/pyproject.toml.orig +13 -16
  8. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_charging.py +3 -4
  9. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_consts.py +1 -1
  10. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_logging.py +1 -1
  11. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_models.py +37 -43
  12. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/__init__.py +8 -0
  13. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/_resource_client.py +2 -2
  14. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/actor.py +2 -2
  15. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/actor_collection.py +2 -2
  16. scrapely_client_python-1.0.7/src/scrapely_client/_resource_clients/automation.py +330 -0
  17. scrapely_client_python-1.0.7/src/scrapely_client/_resource_clients/automation_collection.py +169 -0
  18. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/build.py +2 -2
  19. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/build_collection.py +2 -2
  20. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/dataset.py +2 -2
  21. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/dataset_collection.py +2 -2
  22. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/key_value_store.py +2 -2
  23. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/key_value_store_collection.py +2 -2
  24. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/log.py +2 -2
  25. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/request_queue.py +2 -2
  26. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/request_queue_collection.py +2 -2
  27. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/run.py +2 -2
  28. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/run_collection.py +2 -2
  29. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/schedule.py +2 -2
  30. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/schedule_collection.py +2 -2
  31. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/store_collection.py +2 -2
  32. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/task.py +2 -2
  33. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/task_collection.py +2 -2
  34. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/user.py +2 -2
  35. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/webhook.py +2 -2
  36. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/webhook_collection.py +2 -2
  37. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/webhook_dispatch.py +2 -2
  38. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/webhook_dispatch_collection.py +2 -2
  39. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_scrapely_client.py +54 -26
  40. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_utils/errors.py +1 -1
  41. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/errors.py +3 -3
  42. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/http_clients/_base.py +5 -5
  43. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/http_clients/_impit.py +4 -4
  44. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/http_compressors/_brotli.py +1 -1
  45. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/types.py +1 -1
  46. scrapely_client_python-1.0.3/CHANGELOG.md +0 -14
  47. scrapely_client_python-1.0.3/NOTICE +0 -23
  48. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/LICENSE +0 -0
  49. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/__init__.py +0 -0
  50. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_client_registry.py +0 -0
  51. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_docs.py +0 -0
  52. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_literals.py +0 -0
  53. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_pagination.py +0 -0
  54. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/actor_env_var.py +0 -0
  55. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/actor_env_var_collection.py +0 -0
  56. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/actor_version.py +0 -0
  57. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_resource_clients/actor_version_collection.py +0 -0
  58. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_statistics.py +0 -0
  59. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_status_message_watcher.py +0 -0
  60. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_streamed_log.py +0 -0
  61. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_typeddicts.py +0 -0
  62. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_utils/__init__.py +0 -0
  63. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_utils/crypto.py +0 -0
  64. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_utils/encoding.py +0 -0
  65. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_utils/http.py +0 -0
  66. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_utils/time.py +0 -0
  67. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/_utils/try_import.py +0 -0
  68. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/http_clients/__init__.py +0 -0
  69. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/http_compressors/__init__.py +0 -0
  70. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/http_compressors/_base.py +0 -0
  71. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/http_compressors/_gzip.py +0 -0
  72. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/http_compressors/_resolve.py +0 -0
  73. {scrapely_client_python-1.0.3 → scrapely_client_python-1.0.7}/src/scrapely_client/py.typed +0 -0
@@ -0,0 +1,34 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [1.0.7] - 2026-10-20
6
+
7
+ - License: README, CONTRIBUTING, the docs pages and code samples derived from apify-client-python, and `_resource_clients/__init__.py`, now carry an Apache-2.0 notice.
8
+
9
+ ## [1.0.6] - 2026-10-20
10
+
11
+ - New Scrapely-only `client.automations()` (`list` with `actor_id`, `saved_input_id` and `search` filters, `create`) and `client.automation(id)` (`get`, `update`, `delete`, `run`, `list_runs`, `get_run`, `duplicate`) for `/v2/automations`, sync and async. They return the API's camelCase dictionaries; `update` sends fields as given, so `{'ai': None}` removes the AI step.
12
+
13
+ ## [1.0.5] - 2026-10-20
14
+
15
+ - Removed `apify_margin_percentage` from `CommonActorPricingInfo` and `CurrentPricingInfo`; the API no longer returns it (models allow extra fields, so older payloads still parse).
16
+
17
+ ## [1.0.4] - 2026-10-19
18
+
19
+ - The `User-Agent` header reports the installed client version. Older versions always sent `ScrapelyClient/0.0.0`.
20
+
21
+ ## [1.0.3] - 2026-10-15
22
+
23
+ - The package ships the Apache-2.0 licence text and NOTICE.
24
+
25
+ ## [1.0.2] - 2026-10-13
26
+
27
+ - Builds are owner-only: `build_id` on runs and metamorphs and `build` in run options are optional, since runs of someone else's Actor carry no build info. Older versions raise a validation error on those runs.
28
+ - `actor().update(default_non_owner_build=...)` sets the User Build (the build everyone else runs); `''` clears it.
29
+
30
+ ## [1.0.0] - 2026-09-08
31
+
32
+ Initial release.
33
+
34
+ - Python client for the Scrapely API: Actors, runs, datasets, key-value stores, request queues, task management, and webhooks
@@ -1,3 +1,5 @@
1
+ <!-- Derived from apify-client-python (CONTRIBUTING.md), Copyright Apify Technologies s.r.o., Apache License 2.0. Modified by TeraShift GmbH. -->
2
+
1
3
  # Development
2
4
 
3
5
  Here you'll find a contributing guide to get started with development.
@@ -0,0 +1,7 @@
1
+ scrapely-client-python
2
+ Copyright (c) 2025-2026 TeraShift GmbH (Scrape.ly)
3
+
4
+ Derived from apify-client-python (https://github.com/apify/apify-client-python),
5
+ Copyright Apify Technologies s.r.o., licensed under the Apache License,
6
+ Version 2.0 (see LICENSE). Modified by TeraShift GmbH; modified files carry
7
+ a notice at the top of the file.
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scrapely-client-python
3
- Version: 1.0.3
3
+ Version: 1.0.7
4
4
  Summary: Scrapely API client for Python
5
5
  Keywords: scrapely,api,client,automation,crawling,scraping
6
- Author: Scrapely
6
+ Author: TeraShift GmbH (Scrape.ly)
7
7
  License-Expression: Apache-2.0
8
8
  License-File: LICENSE
9
9
  License-File: NOTICE
@@ -23,14 +23,16 @@ Requires-Dist: pydantic[email]>=2.11.0
23
23
  Requires-Dist: typing-extensions>=4.6.0
24
24
  Requires-Dist: brotli>=1.0.9 ; extra == 'brotli'
25
25
  Requires-Python: >=3.11
26
- Project-URL: Homepage, https://api.scrape.ly
27
- Project-URL: Changelog, https://github.com/SandeepDev1/scrapely/blob/main/scrapely-client-python/CHANGELOG.md
28
- Project-URL: Documentation, https://api.scrape.ly
29
- Project-URL: Issue Tracker, https://github.com/SandeepDev1/scrapely/issues
30
- Project-URL: Source Code, https://github.com/SandeepDev1/scrapely
26
+ Project-URL: Homepage, https://scrape.ly
27
+ Project-URL: Changelog, https://github.com/scrapely-app/scrapely-client-python/blob/main/CHANGELOG.md
28
+ Project-URL: Documentation, https://scrape.ly/docs/client-python
29
+ Project-URL: Issue Tracker, https://github.com/scrapely-app/scrapely-client-python/issues
30
+ Project-URL: Source Code, https://github.com/scrapely-app/scrapely-client-python
31
31
  Provides-Extra: brotli
32
32
  Description-Content-Type: text/markdown
33
33
 
34
+ <!-- Derived from apify-client-python (README.md), Copyright Apify Technologies s.r.o., Apache License 2.0. Modified by TeraShift GmbH. -->
35
+
34
36
  <h1 align="center">Scrapely API client for Python</h1>
35
37
 
36
38
  <p align="center">
@@ -90,7 +92,7 @@ Description-Content-Type: text/markdown
90
92
 
91
93
  ## Quick start
92
94
 
93
- You'll need a Scrapely API token — find yours in the integrations section of the Scrapely Console. Pass it to the client and you're ready to go.
95
+ You'll need a Scrapely API token — find yours in the integrations section of the Scrapely dashboard. Pass it to the client and you're ready to go.
94
96
 
95
97
  ### Synchronous client
96
98
 
@@ -242,4 +244,4 @@ uv run poe check-code # lint, type-check, unit tests, docstring check
242
244
 
243
245
  ## License
244
246
 
245
- Released under the [Apache License 2.0](./LICENSE). Derived from [apify-client-python](https://github.com/apify/apify-client-python); see [NOTICE](./NOTICE).
247
+ Released under the [Apache License 2.0](./LICENSE); see [NOTICE](./NOTICE).
@@ -1,3 +1,5 @@
1
+ <!-- Derived from apify-client-python (README.md), Copyright Apify Technologies s.r.o., Apache License 2.0. Modified by TeraShift GmbH. -->
2
+
1
3
  <h1 align="center">Scrapely API client for Python</h1>
2
4
 
3
5
  <p align="center">
@@ -57,7 +59,7 @@
57
59
 
58
60
  ## Quick start
59
61
 
60
- You'll need a Scrapely API token — find yours in the integrations section of the Scrapely Console. Pass it to the client and you're ready to go.
62
+ You'll need a Scrapely API token — find yours in the integrations section of the Scrapely dashboard. Pass it to the client and you're ready to go.
61
63
 
62
64
  ### Synchronous client
63
65
 
@@ -209,4 +211,4 @@ uv run poe check-code # lint, type-check, unit tests, docstring check
209
211
 
210
212
  ## License
211
213
 
212
- Released under the [Apache License 2.0](./LICENSE). Derived from [apify-client-python](https://github.com/apify/apify-client-python); see [NOTICE](./NOTICE).
214
+ Released under the [Apache License 2.0](./LICENSE); see [NOTICE](./NOTICE).
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "scrapely-client-python"
7
- version = "1.0.3"
7
+ version = "1.0.7"
8
8
  description = "Scrapely API client for Python"
9
9
  license = "Apache-2.0"
10
10
  license-files = [
@@ -41,17 +41,17 @@ dependencies = [
41
41
  ]
42
42
 
43
43
  [[project.authors]]
44
- name = "Scrapely"
44
+ name = "TeraShift GmbH (Scrape.ly)"
45
45
 
46
46
  [project.optional-dependencies]
47
47
  brotli = ["brotli>=1.0.9"]
48
48
 
49
49
  [project.urls]
50
- Homepage = "https://api.scrape.ly"
51
- Changelog = "https://github.com/SandeepDev1/scrapely/blob/main/scrapely-client-python/CHANGELOG.md"
52
- Documentation = "https://api.scrape.ly"
53
- "Issue Tracker" = "https://github.com/SandeepDev1/scrapely/issues"
54
- "Source Code" = "https://github.com/SandeepDev1/scrapely"
50
+ Homepage = "https://scrape.ly"
51
+ Changelog = "https://github.com/scrapely-app/scrapely-client-python/blob/main/CHANGELOG.md"
52
+ Documentation = "https://scrape.ly/docs/client-python"
53
+ "Issue Tracker" = "https://github.com/scrapely-app/scrapely-client-python/issues"
54
+ "Source Code" = "https://github.com/scrapely-app/scrapely-client-python"
55
55
 
56
56
  [dependency-groups]
57
57
  dev = [
@@ -261,7 +261,7 @@ custom_file_header = "# generated by datamodel-codegen"
261
261
  disable_timestamp = true
262
262
  keep_model_order = true
263
263
 
264
- [tool.apify.openapi-spec]
264
+ [tool.scrapely.openapi-spec]
265
265
  version = "v2-2026-08-05T133145Z"
266
266
 
267
267
  [tool.uv]
@@ -275,9 +275,6 @@ source-include = [
275
275
  ]
276
276
 
277
277
  [tool.uv.exclude-newer-package]
278
- apify-client = false
279
- apify-shared = false
280
- apify_fingerprint_datapoints = false
281
278
  crawlee = false
282
279
 
283
280
  [tool.poe.tasks]
@@ -287,9 +284,9 @@ build = "uv build"
287
284
  publish-to-pypi = "uv publish --token ${SCRAPELY_PYPI_TOKEN}"
288
285
  type-check = "uv run ty check"
289
286
  unit-tests = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} tests/unit"
290
- unit-tests-cov = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} --cov=src/apify_client --cov-report=xml:coverage-unit.xml tests/unit"
287
+ unit-tests-cov = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} --cov=src/scrapely_client --cov-report=xml:coverage-unit.xml tests/unit"
291
288
  integration-tests = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} tests/integration"
292
- integration-tests-cov = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} --cov=src/apify_client --cov-report=xml:coverage-integration.xml tests/integration"
289
+ integration-tests-cov = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} --cov=src/scrapely_client --cov-report=xml:coverage-integration.xml tests/integration"
293
290
  check-docstrings = "uv run python -m scripts.check_docstrings"
294
291
  fix-docstrings = "uv run python -m scripts.fix_docstrings"
295
292
  check-code = [
@@ -327,7 +324,7 @@ uv run python -m scripts.openapi_spec fetch && uv run datamodel-codegen --input
327
324
 
328
325
  [tool.poe.tasks.generate-models-from-file]
329
326
  shell = """
330
- uv run datamodel-codegen --input $input_file --alias-generator to_camel && uv run datamodel-codegen --input $input_file --output src/scrapely_client/_typeddicts.py --output-model-type typing.TypedDict --no-use-closed-typed-dict && python scripts/postprocess_generated_models.py && echo "Generated from $input_file - the version in [tool.apify.openapi-spec] still names the published specification, so do not commit these models."
327
+ uv run datamodel-codegen --input $input_file --alias-generator to_camel && uv run datamodel-codegen --input $input_file --output src/scrapely_client/_typeddicts.py --output-model-type typing.TypedDict --no-use-closed-typed-dict && python scripts/postprocess_generated_models.py && echo "Generated from $input_file - the version in [tool.scrapely.openapi-spec] still names the published specification, so do not commit these models."
331
328
  """
332
329
 
333
330
  [[tool.poe.tasks.generate-models-from-file.args]]
@@ -4,9 +4,9 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "scrapely-client-python"
7
- version = "1.0.3"
7
+ version = "1.0.7"
8
8
  description = "Scrapely API client for Python"
9
- authors = [{ name = "Scrapely" }]
9
+ authors = [{ name = "TeraShift GmbH (Scrape.ly)" }]
10
10
  license = "Apache-2.0"
11
11
  license-files = ["LICENSE", "NOTICE"]
12
12
  readme = "README.md"
@@ -36,11 +36,11 @@ dependencies = [
36
36
  brotli = ["brotli>=1.0.9"]
37
37
 
38
38
  [project.urls]
39
- "Homepage" = "https://api.scrape.ly"
40
- "Changelog" = "https://github.com/SandeepDev1/scrapely/blob/main/scrapely-client-python/CHANGELOG.md"
41
- "Documentation" = "https://api.scrape.ly"
42
- "Issue Tracker" = "https://github.com/SandeepDev1/scrapely/issues"
43
- "Source Code" = "https://github.com/SandeepDev1/scrapely"
39
+ "Homepage" = "https://scrape.ly"
40
+ "Changelog" = "https://github.com/scrapely-app/scrapely-client-python/blob/main/CHANGELOG.md"
41
+ "Documentation" = "https://scrape.ly/docs/client-python"
42
+ "Issue Tracker" = "https://github.com/scrapely-app/scrapely-client-python/issues"
43
+ "Source Code" = "https://github.com/scrapely-app/scrapely-client-python"
44
44
 
45
45
  [dependency-groups]
46
46
  dev = [
@@ -248,13 +248,13 @@ keep_model_order = true
248
248
 
249
249
  # Which published OpenAPI specification the committed `_models.py`, `_typeddicts.py`, and `_literals.py` were
250
250
  # generated from. A coarse marker, not a content identity: the specification is served latest-only, so the version
251
- # can't fetch that document back, and apify-docs bumps `components/version.yaml` in a follow-up `[skip ci]` commit,
251
+ # can't fetch that document back, and the docs repository bumps `components/version.yaml` in a follow-up `[skip ci]` commit,
252
252
  # so a deploy can publish new content under the old stamp.
253
253
  #
254
254
  # `poe generate-models` records whatever it downloaded, unconditionally; what keeps the value honest is the nightly
255
255
  # workflow committing nothing unless the models changed. A local regeneration that only moves this line is that
256
256
  # same case - drop it rather than committing it alone.
257
- [tool.apify.openapi-spec]
257
+ [tool.scrapely.openapi-spec]
258
258
  version = "v2-2026-08-05T133145Z"
259
259
 
260
260
  [tool.uv]
@@ -262,10 +262,7 @@ version = "v2-2026-08-05T133145Z"
262
262
  exclude-newer = "24 hours"
263
263
 
264
264
  [tool.uv.exclude-newer-package]
265
- # Allow internal Apify packages to install immediately.
266
- apify-client = false
267
- apify-shared = false
268
- apify_fingerprint_datapoints = false
265
+ # Allow these packages to install immediately.
269
266
  crawlee = false
270
267
 
271
268
  # Run tasks with: uv run poe <task>
@@ -276,9 +273,9 @@ build = "uv build"
276
273
  publish-to-pypi = "uv publish --token ${SCRAPELY_PYPI_TOKEN}"
277
274
  type-check = "uv run ty check"
278
275
  unit-tests = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} tests/unit"
279
- unit-tests-cov = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} --cov=src/apify_client --cov-report=xml:coverage-unit.xml tests/unit"
276
+ unit-tests-cov = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} --cov=src/scrapely_client --cov-report=xml:coverage-unit.xml tests/unit"
280
277
  integration-tests = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} tests/integration"
281
- integration-tests-cov = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} --cov=src/apify_client --cov-report=xml:coverage-integration.xml tests/integration"
278
+ integration-tests-cov = "uv run pytest --numprocesses=${TESTS_CONCURRENCY:-auto} --cov=src/scrapely_client --cov-report=xml:coverage-integration.xml tests/integration"
282
279
  check-docstrings = "uv run python -m scripts.check_docstrings"
283
280
  fix-docstrings = "uv run python -m scripts.fix_docstrings"
284
281
  check-code = ["lint", "type-check", "check-docstrings", "unit-tests"]
@@ -333,6 +330,6 @@ uv run datamodel-codegen --input $input_file \
333
330
  --output-model-type typing.TypedDict \
334
331
  --no-use-closed-typed-dict \
335
332
  && python scripts/postprocess_generated_models.py \
336
- && echo "Generated from $input_file - the version in [tool.apify.openapi-spec] still names the published specification, so do not commit these models."
333
+ && echo "Generated from $input_file - the version in [tool.scrapely.openapi-spec] still names the published specification, so do not commit these models."
337
334
  """
338
335
  args = [{ name = "input-file", positional = true, required = true }]
@@ -1,12 +1,11 @@
1
1
  """Opt-in pay-per-event charging interception for dataset pushes.
2
2
 
3
- Port of ``scrapely-python``'s ``patched_apify_client.py`` semantics into the client
3
+ Charging interception for dataset pushes, implemented in the client
4
4
  itself, with the charging logic supplied by the host SDK via the
5
5
  :class:`ChargingHooks` protocol (no SDK import — the SDK adapts its
6
6
  ``ChargingManager`` to these hooks later).
7
7
 
8
- Without hooks (the default), the client behaves exactly like stock
9
- ``apify-client``.
8
+ Without hooks (the default), dataset pushes are not intercepted.
10
9
  """
11
10
 
12
11
  from __future__ import annotations
@@ -126,7 +125,7 @@ def _merge_context_charge_result(context: PpeAwarePushDataContext, hooks: Chargi
126
125
  def wrap_dataset_client_with_charging(client: Any, hooks: ChargingHooks, *, is_async: bool) -> Any:
127
126
  """Wrap a dataset client's ``push_items`` with charging interception (method swap by design).
128
127
 
129
- Semantics match ``scrapely``'s ``patched_apify_client.py``: normalize items →
128
+ Normalize items →
130
129
  ``push_and_charge`` with a ``push_fn`` that pushes the accepted subset via the
131
130
  original ``push_items``, and accumulate the charge result into the ambient
132
131
  ``push_data_charging_context`` when present.
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from datetime import timedelta
6
6
 
7
- DEFAULT_API_URL = 'https://api-staging.scrape.ly'
7
+ DEFAULT_API_URL = 'https://api.scrape.ly'
8
8
  """Default base URL for the Scrapely API."""
9
9
 
10
10
  API_VERSION = 'v2'
@@ -110,7 +110,7 @@ def create_redirect_logger(name: str) -> logging.Logger:
110
110
  """Create a logger for redirecting logs from another Actor.
111
111
 
112
112
  Args:
113
- name: Logger name. Use dot notation for hierarchy (e.g., "apify.xyz" creates "xyz" under "apify").
113
+ name: Logger name. Use dot notation for hierarchy (e.g., "scrapely.xyz" creates "xyz" under "scrapely").
114
114
 
115
115
  Returns:
116
116
  Configured logger with RedirectLogFormatter.
@@ -88,7 +88,7 @@ class Actor(BaseModel):
88
88
  """
89
89
  description: Annotated[str | None, Field(examples=['Extract data from hundreds of places fast.'])] = None
90
90
  """
91
- Short description of the Actor, displayed in Scrapely Store and Console.
91
+ Short description of the Actor, displayed in Scrapely Store and dashboard.
92
92
  """
93
93
  restart_on_error: Annotated[bool | None, Field(deprecated=True, examples=[False])] = None
94
94
  is_public: Annotated[bool, Field(examples=[False])]
@@ -133,7 +133,7 @@ class Actor(BaseModel):
133
133
  """
134
134
  title: Annotated[str | None, Field(examples=['Google Search Extractor'])] = None
135
135
  """
136
- Human-readable name of the Actor, displayed in Scrapely Store and Console.
136
+ Human-readable name of the Actor, displayed in Scrapely Store and dashboard.
137
137
  """
138
138
  tagged_builds: dict[str, TaggedBuildInfo | None] | None = None
139
139
  actor_standby: ActorStandby | None = None
@@ -143,7 +143,7 @@ class Actor(BaseModel):
143
143
  """
144
144
  seo_title: Annotated[str | None, Field(examples=['Web Scraper'])] = None
145
145
  """
146
- Name of the Actor to display by search engines such as Google. Can be different from the Actor's name displayed in Scrapely Store and Console.
146
+ Name of the Actor to display by search engines such as Google. Can be different from the Actor's name displayed in Scrapely Store and dashboard.
147
147
  """
148
148
  seo_description: Annotated[
149
149
  str | None, Field(examples=['Crawls websites using Chrome and extracts data from pages using JavaScript.'])
@@ -152,12 +152,12 @@ class Actor(BaseModel):
152
152
  Description of the Actor to display by search engines such as Google.
153
153
  """
154
154
  picture_url: Annotated[
155
- str | None, Field(examples=['https://apify-image-uploads-prod.s3.amazonaws.com/.../actor-picture.png'])
155
+ str | None, Field(examples=['https://images.scrape.ly/.../actor-picture.png'])
156
156
  ] = None
157
157
  """
158
- URL of the Actor's icon, displayed on the Actor's page in Scrapely Store and Console.
158
+ URL of the Actor's icon, displayed on the Actor's page in Scrapely Store and dashboard.
159
159
  """
160
- standby_url: Annotated[str | None, Field(examples=['https://jane35--my-actor.apify.actor'])] = None
160
+ standby_url: Annotated[str | None, Field(examples=['https://jane35--my-actor.scrape.ly'])] = None
161
161
  """
162
162
  URL for sending requests to the Actor in Standby mode.
163
163
  `null` if the Standby mode isn't enabled.
@@ -292,7 +292,7 @@ class ActorDefinition(BaseModel):
292
292
 
293
293
  @docs_group('Models')
294
294
  class ActorNotice(Enum):
295
- """A warning displayed on the Actor's page in Scrapely Store and Console. Can be set by the Actor's developer or automatically by Scrapely's quality checks."""
295
+ """A warning displayed on the Actor's page in Scrapely Store and dashboard. Can be set by the Actor's developer or automatically by Scrapely's quality checks."""
296
296
 
297
297
  NONE = 'NONE'
298
298
  RESIDENTIAL_PROXY_REQUIRED = 'RESIDENTIAL_PROXY_REQUIRED'
@@ -454,7 +454,7 @@ class AddedRequest(BaseModel):
454
454
  """
455
455
  A unique identifier assigned to the request.
456
456
  """
457
- unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api-staging.scrape.ly'])]
457
+ unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api.scrape.ly'])]
458
458
  """
459
459
  A unique key used for request de-duplication. Requests with the same unique key are considered identical.
460
460
  """
@@ -737,11 +737,6 @@ class CommonActorPricingInfo(BaseModel):
737
737
  populate_by_name=True,
738
738
  alias_generator=to_camel,
739
739
  )
740
- apify_margin_percentage: float | None = None
741
- """
742
- In [0, 1], fraction of pricePerUnitUsd that goes to Scrapely.
743
- Optional: Scrapely staging PAY_PER_EVENT payloads often omit this.
744
- """
745
740
  created_at: AwareDatetime | None = None
746
741
  """
747
742
  When this pricing info record has been created.
@@ -774,11 +769,11 @@ class CreateActorRequest(BaseModel):
774
769
  None
775
770
  )
776
771
  """
777
- Short description of the Actor, displayed in Scrapely Store and Console.
772
+ Short description of the Actor, displayed in Scrapely Store and dashboard.
778
773
  """
779
774
  title: Annotated[str | None, Field(examples=['Instagram scraper'])] = None
780
775
  """
781
- Human-readable name of the Actor, displayed in Scrapely Store and Console. Can contain spaces and capital letters. Recommended length is 40-50 characters. You can change this title without affecting the Actor's URL or SEO.
776
+ Human-readable name of the Actor, displayed in Scrapely Store and dashboard. Can contain spaces and capital letters. Recommended length is 40-50 characters. You can change this title without affecting the Actor's URL or SEO.
782
777
  """
783
778
  is_public: Annotated[bool | None, Field(examples=[False])] = None
784
779
  """
@@ -786,7 +781,7 @@ class CreateActorRequest(BaseModel):
786
781
  """
787
782
  seo_title: Annotated[str | None, Field(examples=['Free Instagram scraper'])] = None
788
783
  """
789
- Name of the Actor to display by search engines such as Google. Can be different from the Actor's name displayed in Scrapely Store and Console. Recommended length is 40-50 characters.
784
+ Name of the Actor to display by search engines such as Google. Can be different from the Actor's name displayed in Scrapely Store and dashboard. Recommended length is 40-50 characters.
790
785
  """
791
786
  seo_description: Annotated[str | None, Field(examples=['The best scraper for Instagram'])] = None
792
787
  """
@@ -920,7 +915,6 @@ class CurrentPricingInfo(BaseModel):
920
915
  alias_generator=to_camel,
921
916
  )
922
917
  pricing_model: Annotated[str, Field(examples=['FREE'])]
923
- apify_margin_percentage: Annotated[float | None, Field(examples=[0.2])] = None
924
918
  created_at: Annotated[AwareDatetime | None, Field(examples=['2023-01-01T00:00:00.000Z'])] = None
925
919
  started_at: Annotated[AwareDatetime | None, Field(examples=['2023-01-01T00:00:00.000Z'])] = None
926
920
  notified_about_change_at: Annotated[AwareDatetime | None, Field(examples=[None])] = None
@@ -998,7 +992,7 @@ class Dataset(BaseModel):
998
992
  """
999
993
  console_url: Annotated[AnyUrl, Field(examples=['https://api.scrape.ly/storage/datasets/27TmTznX9YPeAYhkC'])]
1000
994
  items_public_url: Annotated[
1001
- AnyUrl | None, Field(examples=['https://api-staging.scrape.ly/v2/datasets/WkzbQMuFYuamGv3YF/items?signature=abc123'])
995
+ AnyUrl | None, Field(examples=['https://api.scrape.ly/v2/datasets/WkzbQMuFYuamGv3YF/items?signature=abc123'])
1002
996
  ] = None
1003
997
  """
1004
998
  A public link to access the dataset items directly.
@@ -1215,7 +1209,7 @@ class DeletedRequestById(BaseModel):
1215
1209
  populate_by_name=True,
1216
1210
  alias_generator=to_camel,
1217
1211
  )
1218
- unique_key: Annotated[str | None, Field(examples=['GET|60d83e70|e3b0c442|https://api-staging.scrape.ly'])] = None
1212
+ unique_key: Annotated[str | None, Field(examples=['GET|60d83e70|e3b0c442|https://api.scrape.ly'])] = None
1219
1213
  """
1220
1214
  A unique key used for request de-duplication. Requests with the same unique key are considered identical.
1221
1215
  """
@@ -1234,7 +1228,7 @@ class DeletedRequestByUniqueKey(BaseModel):
1234
1228
  populate_by_name=True,
1235
1229
  alias_generator=to_camel,
1236
1230
  )
1237
- unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api-staging.scrape.ly'])]
1231
+ unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api.scrape.ly'])]
1238
1232
  """
1239
1233
  A unique key used for request de-duplication. Requests with the same unique key are considered identical.
1240
1234
  """
@@ -1472,11 +1466,11 @@ class HeadRequest(BaseModel):
1472
1466
  """
1473
1467
  A unique identifier assigned to the request.
1474
1468
  """
1475
- unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api-staging.scrape.ly'])]
1469
+ unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api.scrape.ly'])]
1476
1470
  """
1477
1471
  A unique key used for request de-duplication. Requests with the same unique key are considered identical.
1478
1472
  """
1479
- url: Annotated[str, Field(examples=['https://api-staging.scrape.ly'])]
1473
+ url: Annotated[str, Field(examples=['https://api.scrape.ly'])]
1480
1474
  """
1481
1475
  The URL of the request.
1482
1476
  """
@@ -1537,13 +1531,13 @@ class KeyValueStore(BaseModel):
1537
1531
  ] = None
1538
1532
  keys_public_url: Annotated[
1539
1533
  AnyUrl | None,
1540
- Field(examples=['https://api-staging.scrape.ly/v2/key-value-stores/WkzbQMuFYuamGv3YF/keys?signature=abc123']),
1534
+ Field(examples=['https://api.scrape.ly/v2/key-value-stores/WkzbQMuFYuamGv3YF/keys?signature=abc123']),
1541
1535
  ] = None
1542
1536
  """
1543
1537
  A public link to access keys of the key-value store directly.
1544
1538
  """
1545
1539
  records_public_url: Annotated[
1546
- AnyUrl | None, Field(examples=['https://api-staging.scrape.ly/v2/key-value-stores/WkzbQMuFYuamGv3YF/records'])
1540
+ AnyUrl | None, Field(examples=['https://api.scrape.ly/v2/key-value-stores/WkzbQMuFYuamGv3YF/records'])
1547
1541
  ] = None
1548
1542
  """
1549
1543
  A public link to access records of the key-value store directly.
@@ -1572,7 +1566,7 @@ class KeyValueStoreKey(BaseModel):
1572
1566
  record_public_url: Annotated[
1573
1567
  AnyUrl,
1574
1568
  Field(
1575
- examples=['https://api-staging.scrape.ly/v2/key-value-stores/WkzbQMuFYuamGv3YF/records/some-key?signature=abc123']
1569
+ examples=['https://api.scrape.ly/v2/key-value-stores/WkzbQMuFYuamGv3YF/records/some-key?signature=abc123']
1576
1570
  ),
1577
1571
  ]
1578
1572
  """
@@ -1891,11 +1885,11 @@ class LockedHeadRequest(BaseModel):
1891
1885
  """
1892
1886
  A unique identifier assigned to the request.
1893
1887
  """
1894
- unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api-staging.scrape.ly'])]
1888
+ unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api.scrape.ly'])]
1895
1889
  """
1896
1890
  A unique key used for request de-duplication. Requests with the same unique key are considered identical.
1897
1891
  """
1898
- url: Annotated[str, Field(examples=['https://api-staging.scrape.ly'])]
1892
+ url: Annotated[str, Field(examples=['https://api.scrape.ly'])]
1899
1893
  """
1900
1894
  The URL of the request.
1901
1895
  """
@@ -2212,7 +2206,7 @@ class Plan(BaseModel):
2212
2206
  max_monthly_external_data_transfer_gbytes: Annotated[float | None, Field(examples=[1000])] = None
2213
2207
  max_actor_count: Annotated[int | None, Field(examples=[100])] = None
2214
2208
  max_actor_task_count: Annotated[int | None, Field(examples=[1000])] = None
2215
- data_retention_days: Annotated[int | None, Field(examples=[14])] = None
2209
+ data_retention_days: Annotated[int | None, Field(examples=[90])] = None
2216
2210
  available_proxy_groups: dict[str, int]
2217
2211
  team_account_seat_count: Annotated[int | None, Field(examples=[1])] = None
2218
2212
  support_level: Annotated[str | None, Field(examples=['COMMUNITY'])] = None
@@ -2291,7 +2285,7 @@ class Profile(BaseModel):
2291
2285
  )
2292
2286
  bio: Annotated[str | None, Field(examples=['I started web scraping in 1985 using Altair BASIC.'])] = None
2293
2287
  name: Annotated[str | None, Field(examples=['Jane Doe'])] = None
2294
- picture_url: Annotated[AnyUrl | None, Field(examples=['https://api-staging.scrape.ly/img/anonymous_user_picture.png'])] = None
2288
+ picture_url: Annotated[AnyUrl | None, Field(examples=['https://api.scrape.ly/img/anonymous_user_picture.png'])] = None
2295
2289
  github_username: Annotated[str | None, Field(examples=['torvalds.'])] = None
2296
2290
  website_url: Annotated[AnyUrl | None, Field(examples=['http://www.example.com'])] = None
2297
2291
  twitter_username: Annotated[str | None, Field(examples=['@BillGates'])] = None
@@ -2435,11 +2429,11 @@ class RequestBase(BaseModel):
2435
2429
  populate_by_name=True,
2436
2430
  alias_generator=to_camel,
2437
2431
  )
2438
- unique_key: Annotated[str | None, Field(examples=['GET|60d83e70|e3b0c442|https://api-staging.scrape.ly'])] = None
2432
+ unique_key: Annotated[str | None, Field(examples=['GET|60d83e70|e3b0c442|https://api.scrape.ly'])] = None
2439
2433
  """
2440
2434
  A unique key used for request de-duplication. Requests with the same unique key are considered identical.
2441
2435
  """
2442
- url: Annotated[str | None, Field(examples=['https://api-staging.scrape.ly'])] = None
2436
+ url: Annotated[str | None, Field(examples=['https://api.scrape.ly'])] = None
2443
2437
  """
2444
2438
  The URL of the request.
2445
2439
  """
@@ -2448,7 +2442,7 @@ class RequestBase(BaseModel):
2448
2442
  """
2449
2443
  The number of times this request has been retried.
2450
2444
  """
2451
- loaded_url: Annotated[str | None, Field(examples=['https://api-staging.scrape.ly/jobs'])] = None
2445
+ loaded_url: Annotated[str | None, Field(examples=['https://api.scrape.ly/jobs'])] = None
2452
2446
  """
2453
2447
  The final URL that was loaded, after redirects (if any).
2454
2448
  """
@@ -2503,11 +2497,11 @@ class RequestDraft(BaseModel):
2503
2497
  """
2504
2498
  A unique identifier assigned to the request.
2505
2499
  """
2506
- unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api-staging.scrape.ly'])]
2500
+ unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api.scrape.ly'])]
2507
2501
  """
2508
2502
  A unique key used for request de-duplication. Requests with the same unique key are considered identical.
2509
2503
  """
2510
- url: Annotated[str, Field(examples=['https://api-staging.scrape.ly'])]
2504
+ url: Annotated[str, Field(examples=['https://api.scrape.ly'])]
2511
2505
  """
2512
2506
  The URL of the request.
2513
2507
  """
@@ -2527,7 +2521,7 @@ class RequestDraftDeleteById(BaseModel):
2527
2521
  """
2528
2522
  A unique identifier assigned to the request.
2529
2523
  """
2530
- unique_key: Annotated[str | None, Field(examples=['GET|60d83e70|e3b0c442|https://api-staging.scrape.ly'])] = None
2524
+ unique_key: Annotated[str | None, Field(examples=['GET|60d83e70|e3b0c442|https://api.scrape.ly'])] = None
2531
2525
  """
2532
2526
  A unique key used for request de-duplication. Requests with the same unique key are considered identical.
2533
2527
  """
@@ -2546,7 +2540,7 @@ class RequestDraftDeleteByUniqueKey(BaseModel):
2546
2540
  """
2547
2541
  A unique identifier assigned to the request.
2548
2542
  """
2549
- unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api-staging.scrape.ly'])]
2543
+ unique_key: Annotated[str, Field(examples=['GET|60d83e70|e3b0c442|https://api.scrape.ly'])]
2550
2544
  """
2551
2545
  A unique key used for request de-duplication. Requests with the same unique key are considered identical.
2552
2546
  """
@@ -2632,9 +2626,9 @@ class RequestQueue(BaseModel):
2632
2626
  """
2633
2627
  Whether the request queue has been accessed by multiple different clients.
2634
2628
  """
2635
- console_url: Annotated[AnyUrl, Field(examples=['https://api-staging.scrape.ly/v2/request-queues/27TmTznX9YPeAYhkC'])]
2629
+ console_url: Annotated[AnyUrl, Field(examples=['https://api.scrape.ly/v2/request-queues/27TmTznX9YPeAYhkC'])]
2636
2630
  """
2637
- The URL to view the request queue in the Scrapely console.
2631
+ The URL to view the request queue in the Scrapely dashboard.
2638
2632
  """
2639
2633
  stats: RequestQueueStats | None = None
2640
2634
  general_access: GeneralAccess | None = None
@@ -2952,7 +2946,7 @@ class Run(BaseModel):
2952
2946
  """
2953
2947
  Build number of the Actor build used for this run.
2954
2948
  """
2955
- container_url: Annotated[AnyUrl | None, Field(examples=['https://g8kd8kbc5ge8.runs.apify.net'])] = None
2949
+ container_url: Annotated[AnyUrl | None, Field(examples=['https://g8kd8kbc5ge8.runs.scrape.ly'])] = None
2956
2950
  """
2957
2951
  URL of the container running the Actor.
2958
2952
  """
@@ -3669,7 +3663,7 @@ class UpdateActorRequest(BaseModel):
3669
3663
  None
3670
3664
  )
3671
3665
  """
3672
- Short description of the Actor, displayed in Scrapely Store and Console.
3666
+ Short description of the Actor, displayed in Scrapely Store and dashboard.
3673
3667
  """
3674
3668
  is_public: Annotated[bool | None, Field(examples=[False])] = None
3675
3669
  """
@@ -3678,7 +3672,7 @@ class UpdateActorRequest(BaseModel):
3678
3672
  actor_permission_level: ActorPermissionLevel | None = None
3679
3673
  seo_title: Annotated[str | None, Field(examples=['Free Instagram scraper'])] = None
3680
3674
  """
3681
- Name of the Actor to display by search engines such as Google. Can be different from the Actor's name displayed in Scrapely Store and Console. Recommended length is 40-50 characters.
3675
+ Name of the Actor to display by search engines such as Google. Can be different from the Actor's name displayed in Scrapely Store and dashboard. Recommended length is 40-50 characters.
3682
3676
  """
3683
3677
  seo_description: Annotated[str | None, Field(examples=['The best scraper for Instagram'])] = None
3684
3678
  """
@@ -3686,7 +3680,7 @@ class UpdateActorRequest(BaseModel):
3686
3680
  """
3687
3681
  title: Annotated[str | None, Field(examples=['Instagram scraper'])] = None
3688
3682
  """
3689
- Human-readable name of the Actor, displayed in Scrapely Store and Console. Can contain spaces and capital letters. Recommended length is 40-50 characters. You can change this title without affecting the Actor's URL or SEO.
3683
+ Human-readable name of the Actor, displayed in Scrapely Store and dashboard. Can contain spaces and capital letters. Recommended length is 40-50 characters. You can change this title without affecting the Actor's URL or SEO.
3690
3684
  """
3691
3685
  restart_on_error: Annotated[bool | None, Field(deprecated=True, examples=[False])] = None
3692
3686
  versions: list[CreateOrUpdateVersionRequest] | None = None
@@ -3758,7 +3752,7 @@ class UpdateLimitsRequest(BaseModel):
3758
3752
  """
3759
3753
  data_retention_days: Annotated[int | None, Field(examples=[90])] = None
3760
3754
  """
3761
- Scrapely securely stores your ten most recent Actor runs indefinitely, ensuring they are always accessible. Unnamed storages and other Actor runs are automatically deleted after the retention period. If you're subscribed, you can change it to keep data for longer or to limit your usage. Lear more.
3755
+ How many days unnamed storages (datasets, key-value stores and request queues without a name) are kept: Free 2 days (48 hours), Starter 31, Scale 60, Business 90. Runs follow their own retention: on the Free plan the latest 10 runs per Actor are kept and older ones are deleted after 7 days; on paid plans runs are deleted after 31 days. This value is set by your plan and cannot be changed through the API.
3762
3756
 
3763
3757
  """
3764
3758