From 24c843aec1c487bcf25f8dd2f72b8115218328c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Olender?=
<92638966+TC-MO@users.noreply.github.com>
Date: Wed, 1 Jul 2026 13:38:48 +0200
Subject: [PATCH 1/2] Revert "feat: flip to the v3 information architecture
(#2702)"
This reverts commit e4463fba33a43f188c597c4e5e148e4e45fb1aa7.
---
.github/workflows/test.yaml | 10 +-
.../components/objects/actor-runs/charge.yaml | 2 +-
.../parameters/datasetParameters.yaml | 2 +-
.../schemas/actors/ActorDefinition.yaml | 2 +-
.../components/schemas/datasets/Dataset.yaml | 2 +-
.../schemas/users/UpdateLimitsRequest.yaml | 2 +-
apify-docs-theme/src/config.js | 196 ++++++++----------
.../src/theme/DocItemContent/index.js | 9 +-
apify-docs-theme/src/theme/SearchBar/index.js | 12 +-
docusaurus.config.js | 2 +-
nginx.conf | 46 ++--
scripts/checkNavHeaders.mjs | 17 +-
sources/academy/ai/ai-agents.mdx | 4 +-
.../what_software_an_actor_can_be.md | 2 +-
.../how_actor_monetization_works.md | 12 +-
.../apify-store-basics/how_store_works.md | 10 +-
.../how-to-build/actorization_playbook.mdx | 28 +--
.../how_to_create_a_great_input_schema.md | 6 +-
.../how-to-build/running_a_web_server.md | 2 +-
.../academy/build-and-publish/why_publish.md | 4 +-
.../platform/deploying_your_code/deploying.md | 2 +-
.../platform/deploying_your_code/index.md | 2 +-
.../deploying_your_code/input_schema.md | 8 +-
.../deploying_your_code/inputs_outputs.md | 2 +-
.../deploying_your_code/output_schema.md | 2 +-
.../actors_webhooks.md | 4 +-
.../bypassing_anti_scraping.md | 2 +-
.../managing_source_code.md | 2 +-
.../migrations_maintaining_state.md | 4 +-
.../solutions/handling_migrations.md | 2 +-
.../tasks_and_storage.md | 6 +-
.../getting_started/creating_actors.md | 8 +-
.../getting_started/inputs_outputs.md | 4 +-
.../01_developing_scraper_ai_chat.md | 2 +-
.../02_developing_scraper_ai_agent.md | 2 +-
sources/academy/tutorials/api/index.md | 2 +-
.../run_actor_and_retrieve_data_via_api.md | 22 +-
.../tutorials/api/using_apify_from_php.md | 10 +-
.../apify_actors/adding_rapidapi_project.md | 4 +-
.../apify_scrapers/cheerio_scraper.md | 2 +-
.../apify_scrapers/getting_started.md | 8 +-
.../apify_scrapers/puppeteer_scraper.md | 2 +-
.../tutorials/apify_scrapers/web_scraper.md | 2 +-
.../analyzing_pages_and_fixing_errors.md | 2 +-
.../node_js/apify_free_google_serp_api.md | 2 +-
.../filter_blocked_requests_using_sessions.md | 4 +-
.../handle_blocked_requests_puppeteer.md | 2 +-
.../scraping_urls_list_from_google_sheets.md | 2 +-
.../python/process_data_using_python.md | 4 +-
.../tutorials/python/scrape_data_python.md | 4 +-
.../crawling/crawling-with-search.md | 2 +-
.../webscraping/anti_scraping/index.md | 2 +-
.../scraping_basics_javascript/13_platform.md | 14 +-
.../scraping_basics_python/13_platform.md | 14 +-
sources/platform/account/index.mdx | 40 ----
.../actor_definition/actor_json.md | 10 +-
.../dataset_schema/validation.md | 4 +-
.../development/actor_definition/docker.md | 2 +-
.../development/actor_definition/index.md | 4 +-
.../input_schema/secret_input.md | 2 +-
.../input_schema/specification.md | 10 +-
.../actor_definition/output_schema/index.md | 4 +-
.../web_server_schema/index.md | 10 +-
.../development/builds_and_runs/runs.md | 2 +-
.../deployment/continuous_integration.md | 4 +-
.../actors/development/deployment/index.md | 2 +-
.../development/deployment/source_types.md | 8 +-
sources/platform/actors/development/index.md | 25 +--
.../environment_variables.md | 18 +-
.../programming_interface/index.mdx | 14 +-
.../programming_interface/metamorph.md | 2 +-
.../development/quick-start/build_with_ai.md} | 12 +-
.../quick-start/develop_ai_agents.md} | 18 +-
.../images/build-actor-in-web-ide.svg | 0
.../images/copy-for-llm-button.svg | 0
.../actors/development/quick-start/index.mdx | 46 ++++
.../development/quick-start/start_locally.md} | 18 +-
.../development/quick-start/start_web_ide.md} | 12 +-
sources/platform/actors/index.mdx | 13 +-
.../actors/publishing/actor-rating.mdx | 4 +-
sources/platform/actors/publishing/index.mdx | 2 +-
.../actors/publishing/monetize/index.mdx | 22 +-
.../publishing/monetize/pay_per_event.mdx | 14 +-
.../actors/publishing/monetize/rental.mdx | 2 +-
.../actors/publishing/publish-task.mdx | 10 +-
.../platform/actors/publishing/publish.mdx | 2 +-
.../actors/publishing/quality_score.mdx | 10 +-
.../platform/actors/publishing/testing.mdx | 2 +-
.../platform/actors/running/actor_standby.md | 4 +-
.../actors/running/input_and_output.md | 2 +-
.../actors/running/runs_and_builds.md | 2 +-
.../platform/actors/running/store/index.md | 4 +-
.../platform/actors/running/store/reviews.mdx | 2 +-
sources/platform/actors/running/tasks.md | 6 +-
.../collaboration/access_rights.md | 4 +-
.../collaboration/general-resource-access.md | 4 +-
.../account-setting.png | Bin
.../copy-record-url-kv-store.png | Bin
.../copy-shareable-link.png | Bin
.../creating-actor-issue.png | Bin
.../share-resource-dialog.png | Bin
.../organizations/configure-permissions.png | Bin
.../images/organizations/integrations.png | Bin
.../images/organizations/members.png | Bin
.../images/organizations/my-organizations.png | Bin
.../images/organizations/roles.png | Bin
.../organizations/switch-to-organization.png | Bin
.../collaboration/images/share-actor.svg | 0
.../{account => }/collaboration/index.md | 18 +-
.../collaboration/list_of_permissions.md | 18 +-
.../organization_account}/how_to_use.md | 4 +-
.../organization_account}/index.md | 4 +-
.../organization_account}/setup.md | 4 +-
.../platform/{account => console}/billing.md | 2 +-
.../images/console-billing-current-period.png | Bin
...ole-billing-historical-usage-by-actors.png | Bin
.../console-billing-historical-usage.png | Bin
.../images/console-billing-invoices.png | Bin
.../images/console-billing-limits.png | Bin
.../images/console-billing-pricing.png | Bin
.../images/console-billing-subscription.png | Bin
.../images/two-factor-authentication.svg | 0
.../{account/console.md => console/index.md} | 26 +--
.../platform/{account => console}/settings.md | 6 +-
sources/platform/console/store.md | 4 +-
.../two-factor-authentication.md | 2 +-
.../get-started/building/_category_.json | 5 -
.../platform/get-started/building/index.mdx | 36 ----
.../images/actor-create-button.png | Bin 108064 -> 0 bytes
.../images/actor-create-templates.png | Bin 288409 -> 0 bytes
.../get-started/images/actor-create.gif | Bin 167521 -> 0 bytes
.../get-started/images/actor-input.png | Bin 123946 -> 0 bytes
.../get-started/images/actor-local-code.png | Bin 190661 -> 0 bytes
.../get-started/images/actor-local-run.png | Bin 207491 -> 0 bytes
.../get-started/images/actor-pull.png | Bin 83474 -> 0 bytes
.../get-started/images/actor-source-code.png | Bin 742768 -> 0 bytes
.../platform/get-started/images/claude.png | Bin 142581 -> 0 bytes
.../get-started/images/copy-for-ai.png | Bin 74301 -> 0 bytes
.../platform/get-started/images/cursor.png | Bin 104076 -> 0 bytes
.../get-started/images/github-copilot.png | Bin 115440 -> 0 bytes
.../platform/get-started/images/windsurf.png | Bin 134014 -> 0 bytes
sources/platform/get-started/index.mdx | 35 ----
.../images/schedules-actor-input.png | Bin
.../images/schedules-bulk-notifications.png | Bin
.../images/schedules-overview.png | Bin
.../images/schedules-setup-tool.png | Bin
.../images/schedules-task-input.png | Bin
sources/platform/index.mdx | 56 +++++
sources/platform/integrations/actors/index.md | 8 +-
.../actors/integration-ready-actors.md | 2 +-
.../agent-onboarding.md | 32 ++-
sources/platform/integrations/ai/agno.md | 4 +-
.../platform/integrations/ai/aws-bedrock.md | 2 +-
.../integrations/ai/claude/claude-code-cli.md | 8 +-
.../integrations/ai/claude/claude-desktop.md | 4 +-
.../platform/integrations/ai/claude/index.mdx | 4 +-
sources/platform/integrations/ai/crewai.md | 6 +-
.../platform/integrations/ai/google-adk.md | 6 +-
sources/platform/integrations/ai/haystack.md | 2 +-
sources/platform/integrations/ai/index.mdx | 26 +--
sources/platform/integrations/ai/langchain.md | 2 +-
sources/platform/integrations/ai/langflow.md | 10 +-
sources/platform/integrations/ai/langgraph.md | 6 +-
sources/platform/integrations/ai/lindy.md | 2 +-
sources/platform/integrations/ai/llama.md | 2 +-
sources/platform/integrations/ai/manus.md | 6 +-
sources/platform/integrations/ai/mastra.md | 8 +-
.../integrations/ai/mcp-connectors/index.md | 14 +-
.../using-connectors-in-actors.md | 10 +-
sources/platform/integrations/ai/mcp.md | 10 +-
sources/platform/integrations/ai/milvus.md | 2 +-
.../integrations/ai/openai/chatgpt.md | 12 +-
.../platform/integrations/ai/openai/index.mdx | 6 +-
.../integrations/ai/openai/openai-agents.md | 8 +-
.../ai/openai/openai-assistants.md | 26 +--
sources/platform/integrations/ai/openclaw.md | 2 +-
sources/platform/integrations/ai/pinecone.md | 2 +-
sources/platform/integrations/ai/qdrant.md | 2 +-
sources/platform/integrations/ai/skyfire.md | 12 +-
.../integrations/ai/strands-agents.md | 2 +-
sources/platform/integrations/ai/upsonic.md | 4 +-
.../platform/integrations/ai/vercel-ai-sdk.md | 6 +-
sources/platform/integrations/ai/x402.md | 12 +-
.../integrations/data-and-storage/airbyte.md | 2 +-
.../integrations/data-and-storage/airtable.md | 4 +-
.../integrations/data-and-storage/hubspot.md | 2 +-
.../integrations/data-and-storage/index.mdx | 8 +-
sources/platform/integrations/index.mdx | 55 +++--
.../integrations/integrate-with-apify.md | 14 +-
.../platform/integrations/programming/api.md | 6 +-
.../integrations/programming/github.md | 14 +-
.../integrations/programming/index.mdx | 6 +-
.../programming/webhooks/actions.md | 6 +-
.../programming/webhooks/events.md | 2 +-
.../programming/webhooks/index.md | 6 +-
.../activepieces.md | 6 +-
.../gumloop/index.md | 8 +-
.../gumloop/instagram.md | 6 +-
.../gumloop/maps.md | 6 +-
.../gumloop/tiktok.md | 6 +-
.../gumloop/youtube.md | 6 +-
.../workflows-and-notifications/ifttt.md | 8 +-
.../workflows-and-notifications/index.mdx | 8 +-
.../make/ai-crawling.md | 2 +-
.../workflows-and-notifications/make/index.md | 2 +-
.../workflows-and-notifications/make/llm.md | 2 +-
.../workflows-and-notifications/n8n/index.md | 6 +-
.../n8n/website-content-crawler.md | 2 +-
.../workflows-and-notifications/pipedream.md | 6 +-
.../workflows-and-notifications/slack.md | 4 +-
.../workflows-and-notifications/windmill.md | 4 +-
.../workflows-and-notifications/zapier.md | 6 +-
sources/platform/limits.md | 2 +-
.../running => }/monitoring/images/alerts.png | Bin
.../monitoring/images/daily-run-statuses.png | Bin
.../monitoring/images/email-notification.png | Bin
.../monitoring/images/in-app-notification.png | Bin
.../monitoring/images/metric-options.png | Bin
.../monitoring/images/monitoring.png | Bin
.../monitoring/images/notifications.png | Bin
.../images/run-statistics-chart.png | Bin
.../{actors/running => }/monitoring/index.md | 6 +-
sources/platform/proxy/index.md | 11 +-
.../{actors/running => }/schedules.md | 10 +-
sources/platform/sidebars.js | 12 +-
sources/platform/storage/dataset.md | 14 +-
sources/platform/storage/index.md | 17 +-
sources/platform/storage/key_value_store.md | 12 +-
sources/platform/storage/request_queue.md | 12 +-
src/pages/api/index.tsx | 2 +-
src/pages/index.tsx | 26 +--
src/utils/agents-prompt.js | 2 +-
232 files changed, 821 insertions(+), 910 deletions(-)
delete mode 100644 sources/platform/account/index.mdx
rename sources/platform/{get-started/building/build-with-ai.md => actors/development/quick-start/build_with_ai.md} (93%)
rename sources/platform/{get-started/building/develop-ai-agents.md => actors/development/quick-start/develop_ai_agents.md} (84%)
rename sources/platform/{get-started => actors/development/quick-start}/images/build-actor-in-web-ide.svg (100%)
rename sources/platform/{get-started => actors/development/quick-start}/images/copy-for-llm-button.svg (100%)
create mode 100644 sources/platform/actors/development/quick-start/index.mdx
rename sources/platform/{get-started/building/locally.md => actors/development/quick-start/start_locally.md} (86%)
rename sources/platform/{get-started/building/web-ide.md => actors/development/quick-start/start_web_ide.md} (91%)
rename sources/platform/{account => }/collaboration/access_rights.md (76%)
rename sources/platform/{account => }/collaboration/general-resource-access.md (99%)
rename sources/platform/{account => }/collaboration/images/general-resouce-access/account-setting.png (100%)
rename sources/platform/{account => }/collaboration/images/general-resouce-access/copy-record-url-kv-store.png (100%)
rename sources/platform/{account => }/collaboration/images/general-resouce-access/copy-shareable-link.png (100%)
rename sources/platform/{account => }/collaboration/images/general-resouce-access/creating-actor-issue.png (100%)
rename sources/platform/{account => }/collaboration/images/general-resouce-access/share-resource-dialog.png (100%)
rename sources/platform/{account => }/collaboration/images/organizations/configure-permissions.png (100%)
rename sources/platform/{account => }/collaboration/images/organizations/integrations.png (100%)
rename sources/platform/{account => }/collaboration/images/organizations/members.png (100%)
rename sources/platform/{account => }/collaboration/images/organizations/my-organizations.png (100%)
rename sources/platform/{account => }/collaboration/images/organizations/roles.png (100%)
rename sources/platform/{account => }/collaboration/images/organizations/switch-to-organization.png (100%)
rename sources/platform/{account => }/collaboration/images/share-actor.svg (100%)
rename sources/platform/{account => }/collaboration/index.md (72%)
rename sources/platform/{account => }/collaboration/list_of_permissions.md (85%)
rename sources/platform/{account/collaboration/organization => collaboration/organization_account}/how_to_use.md (93%)
rename sources/platform/{account/collaboration/organization => collaboration/organization_account}/index.md (92%)
rename sources/platform/{account/collaboration/organization => collaboration/organization_account}/setup.md (87%)
rename sources/platform/{account => console}/billing.md (99%)
rename sources/platform/{account => console}/images/console-billing-current-period.png (100%)
rename sources/platform/{account => console}/images/console-billing-historical-usage-by-actors.png (100%)
rename sources/platform/{account => console}/images/console-billing-historical-usage.png (100%)
rename sources/platform/{account => console}/images/console-billing-invoices.png (100%)
rename sources/platform/{account => console}/images/console-billing-limits.png (100%)
rename sources/platform/{account => console}/images/console-billing-pricing.png (100%)
rename sources/platform/{account => console}/images/console-billing-subscription.png (100%)
rename sources/platform/{account => console}/images/two-factor-authentication.svg (100%)
rename sources/platform/{account/console.md => console/index.md} (71%)
rename sources/platform/{account => console}/settings.md (96%)
rename sources/platform/{account => console}/two-factor-authentication.md (99%)
delete mode 100644 sources/platform/get-started/building/_category_.json
delete mode 100644 sources/platform/get-started/building/index.mdx
delete mode 100644 sources/platform/get-started/images/actor-create-button.png
delete mode 100644 sources/platform/get-started/images/actor-create-templates.png
delete mode 100644 sources/platform/get-started/images/actor-create.gif
delete mode 100644 sources/platform/get-started/images/actor-input.png
delete mode 100644 sources/platform/get-started/images/actor-local-code.png
delete mode 100644 sources/platform/get-started/images/actor-local-run.png
delete mode 100644 sources/platform/get-started/images/actor-pull.png
delete mode 100644 sources/platform/get-started/images/actor-source-code.png
delete mode 100644 sources/platform/get-started/images/claude.png
delete mode 100644 sources/platform/get-started/images/copy-for-ai.png
delete mode 100644 sources/platform/get-started/images/cursor.png
delete mode 100644 sources/platform/get-started/images/github-copilot.png
delete mode 100644 sources/platform/get-started/images/windsurf.png
delete mode 100644 sources/platform/get-started/index.mdx
rename sources/platform/{actors/running => }/images/schedules-actor-input.png (100%)
rename sources/platform/{actors/running => }/images/schedules-bulk-notifications.png (100%)
rename sources/platform/{actors/running => }/images/schedules-overview.png (100%)
rename sources/platform/{actors/running => }/images/schedules-setup-tool.png (100%)
rename sources/platform/{actors/running => }/images/schedules-task-input.png (100%)
create mode 100644 sources/platform/index.mdx
rename sources/platform/{get-started => integrations}/agent-onboarding.md (87%)
rename sources/platform/{actors/running => }/monitoring/images/alerts.png (100%)
rename sources/platform/{actors/running => }/monitoring/images/daily-run-statuses.png (100%)
rename sources/platform/{actors/running => }/monitoring/images/email-notification.png (100%)
rename sources/platform/{actors/running => }/monitoring/images/in-app-notification.png (100%)
rename sources/platform/{actors/running => }/monitoring/images/metric-options.png (100%)
rename sources/platform/{actors/running => }/monitoring/images/monitoring.png (100%)
rename sources/platform/{actors/running => }/monitoring/images/notifications.png (100%)
rename sources/platform/{actors/running => }/monitoring/images/run-statistics-chart.png (100%)
rename sources/platform/{actors/running => }/monitoring/index.md (90%)
rename sources/platform/{actors/running => }/schedules.md (92%)
diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index 52f2cfab86..d14c646bd2 100644
--- a/.github/workflows/test.yaml
+++ b/.github/workflows/test.yaml
@@ -138,14 +138,14 @@ jobs:
assert_no_redirect "http://localhost:8080" --request-target '/\evil.com/'
assert_no_redirect "http://localhost:8080" --request-target '///\evil.com/'
# Normal trailing-slash redirect must still work
- assert_status "http://localhost:8080/proxy/datacenter-proxy/" "302"
+ assert_status "http://localhost:8080/platform/proxy/datacenter-proxy/" "302"
echo "đź§Ş Checking Nginx responses... (apify-docs)"
assert_header "http://localhost:8080/" "Content-Type" "text/html"
assert_header "http://localhost:8080/" "Content-Type" "text/markdown" -H "Accept: text/markdown"
- assert_header "http://localhost:8080/proxy/datacenter-proxy" "Content-Type" "text/html"
- assert_header "http://localhost:8080/proxy/datacenter-proxy.md" "Content-Type" "text/markdown"
- assert_header "http://localhost:8080/proxy/datacenter-proxy" "Content-Type" "text/markdown" -H "Accept: text/markdown"
+ assert_header "http://localhost:8080/platform/proxy/datacenter-proxy" "Content-Type" "text/html"
+ assert_header "http://localhost:8080/platform/proxy/datacenter-proxy.md" "Content-Type" "text/markdown"
+ assert_header "http://localhost:8080/platform/proxy/datacenter-proxy" "Content-Type" "text/markdown" -H "Accept: text/markdown"
assert_header "http://localhost:8080/img/docs-og.png" "Content-Type" "image/png"
assert_header "http://localhost:8080/img/javascript-40x40.svg" "Content-Type" "image/svg"
assert_header "http://localhost:8080/llms.txt" "Content-Type" "text/markdown"
@@ -172,7 +172,7 @@ jobs:
assert_html_md_alternate "http://localhost:8080/api/v2/dataset-get" "https://docs.apify.com/api/v2/dataset-get.md"
assert_html_md_alternate "http://localhost:8080/academy/tutorials" "https://docs.apify.com/academy/tutorials.md"
# Sanity check: a regular (non-excluded) page also has the alternate.
- assert_html_md_alternate "http://localhost:8080/proxy/datacenter-proxy" "https://docs.apify.com/proxy/datacenter-proxy.md"
+ assert_html_md_alternate "http://localhost:8080/platform/proxy/datacenter-proxy" "https://docs.apify.com/platform/proxy/datacenter-proxy.md"
echo "đź§Ş Checking Nginx responses... (apify-sdk-js)"
assert_final_content_type "http://localhost:8080/sdk/js" "text/html"
diff --git a/apify-api/openapi/components/objects/actor-runs/charge.yaml b/apify-api/openapi/components/objects/actor-runs/charge.yaml
index f690647a6f..612f22da3c 100644
--- a/apify-api/openapi/components/objects/actor-runs/charge.yaml
+++ b/apify-api/openapi/components/objects/actor-runs/charge.yaml
@@ -9,7 +9,7 @@ byRunId:
:::info Learn more about pay-per-event pricing
- For more details about pay-per-event (PPE) pricing, refer to our [PPE documentation](/actors/publishing/monetize/pay-per-event).
+ For more details about pay-per-event (PPE) pricing, refer to our [PPE documentation](/platform/actors/publishing/monetize/pay-per-event).
:::
diff --git a/apify-api/openapi/components/parameters/datasetParameters.yaml b/apify-api/openapi/components/parameters/datasetParameters.yaml
index e89eac2f8b..a00474ad3d 100644
--- a/apify-api/openapi/components/parameters/datasetParameters.yaml
+++ b/apify-api/openapi/components/parameters/datasetParameters.yaml
@@ -236,7 +236,7 @@ view:
description: |
Defines the view configuration for dataset items based on the schema definition.
This parameter determines how the data will be filtered and presented.
- For complete specification details, see the [dataset schema documentation](/actors/development/actor-definition/dataset-schema).
+ For complete specification details, see the [dataset schema documentation](/platform/actors/development/actor-definition/dataset-schema).
schema:
type: string
example: overview
diff --git a/apify-api/openapi/components/schemas/actors/ActorDefinition.yaml b/apify-api/openapi/components/schemas/actors/ActorDefinition.yaml
index de1db5010b..f4cd18036d 100644
--- a/apify-api/openapi/components/schemas/actors/ActorDefinition.yaml
+++ b/apify-api/openapi/components/schemas/actors/ActorDefinition.yaml
@@ -48,7 +48,7 @@ properties:
examples: [get(input, startUrls.length, 1) * 1024]
- type: integer
examples: [1024]
- description: Specifies the default amount of memory in megabytes to be used when the Actor is started. Can be an integer or a [dynamic memory expression](/actors/development/actor-definition/dynamic-actor-memory).
+ description: Specifies the default amount of memory in megabytes to be used when the Actor is started. Can be an integer or a [dynamic memory expression](/platform/actors/development/actor-definition/dynamic-actor-memory).
minMemoryMbytes:
type: integer
minimum: 128
diff --git a/apify-api/openapi/components/schemas/datasets/Dataset.yaml b/apify-api/openapi/components/schemas/datasets/Dataset.yaml
index af8afcff41..38fc28b9f8 100644
--- a/apify-api/openapi/components/schemas/datasets/Dataset.yaml
+++ b/apify-api/openapi/components/schemas/datasets/Dataset.yaml
@@ -50,7 +50,7 @@ properties:
description: ""
schema:
type: [object, "null"]
- description: Defines the schema of items in your dataset, the full specification can be found in [Apify docs](/actors/development/actor-definition/dataset-schema)
+ description: Defines the schema of items in your dataset, the full specification can be found in [Apify docs](/platform/actors/development/actor-definition/dataset-schema)
example:
actorSpecification: 1
title: My dataset
diff --git a/apify-api/openapi/components/schemas/users/UpdateLimitsRequest.yaml b/apify-api/openapi/components/schemas/users/UpdateLimitsRequest.yaml
index bf0247f341..472c10103d 100644
--- a/apify-api/openapi/components/schemas/users/UpdateLimitsRequest.yaml
+++ b/apify-api/openapi/components/schemas/users/UpdateLimitsRequest.yaml
@@ -10,4 +10,4 @@ properties:
type: integer
examples: [90]
description: |
- Apify 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](https://docs.apify.com/storage#data-retention).
+ Apify 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](https://docs.apify.com/platform/storage/usage#data-retention).
diff --git a/apify-docs-theme/src/config.js b/apify-docs-theme/src/config.js
index 634b1ca7c9..c53b8d035c 100644
--- a/apify-docs-theme/src/config.js
+++ b/apify-docs-theme/src/config.js
@@ -20,118 +20,119 @@ const themeConfig = {
},
items: [
{
- label: 'Get started',
- href: `${absoluteUrl}/get-started`,
- activeBasePath: 'get-started',
+ label: 'Academy',
+ href: `${absoluteUrl}/academy`,
+ activeBasePath: 'academy',
position: 'left',
target: '_self',
rel: 'dofollow',
},
{
- label: 'Actors',
- href: `${absoluteUrl}/actors`,
- activeBasePath: 'actors',
+ label: 'Platform',
+ href: `${absoluteUrl}/platform`,
+ className: 'navbar__active',
+ activeBasePath: 'platform',
position: 'left',
target: '_self',
rel: 'dofollow',
},
{
- label: 'Storage',
- href: `${absoluteUrl}/storage`,
- activeBasePath: 'storage',
- position: 'left',
+ label: 'API',
+ type: 'dropdown',
+ to: `${absoluteUrl}/api`,
target: '_self',
rel: 'dofollow',
- },
- {
- label: 'Proxy',
- href: `${absoluteUrl}/proxy`,
- activeBasePath: 'proxy',
+ activeBasePath: 'api',
position: 'left',
- target: '_self',
- rel: 'dofollow',
+ items: [
+ {
+ label: 'Reference',
+ href: `${absoluteUrl}/api/v2`,
+ target: '_self',
+ rel: 'dofollow',
+ },
+ {
+ label: 'Client for JavaScript',
+ href: `${absoluteUrl}/api/client/js/docs`,
+ target: '_self',
+ rel: 'dofollow',
+ },
+ {
+ label: 'Client for Python',
+ href: `${absoluteUrl}/api/client/python/docs`,
+ target: '_self',
+ rel: 'dofollow',
+ },
+ ],
},
{
- label: 'Account',
- href: `${absoluteUrl}/account`,
- activeBasePath: 'account',
+ label: 'SDK',
+ type: 'dropdown',
+ to: `${absoluteUrl}/sdk`,
+ activeBasePath: 'sdk',
position: 'left',
target: '_self',
rel: 'dofollow',
+ items: [
+ {
+ label: 'SDK for JavaScript',
+ href: `${absoluteUrl}/sdk/js/docs/overview`,
+ target: '_self',
+ rel: 'dofollow',
+ },
+ {
+ html: 'SDK for Python',
+ href: `${absoluteUrl}/sdk/python/docs/overview`,
+ target: '_self',
+ rel: 'dofollow',
+ },
+ ],
},
{
- label: 'Integrations',
- href: `${absoluteUrl}/integrations`,
- activeBasePath: 'integrations',
+ label: 'CLI',
+ href: `${absoluteUrl}/cli/docs`,
position: 'left',
+ activeBasePath: 'cli',
target: '_self',
rel: 'dofollow',
},
{
- label: 'Limits',
- href: `${absoluteUrl}/limits`,
- activeBasePath: 'limits',
- position: 'left',
+ label: 'Open source',
+ type: 'dropdown',
+ to: `${absoluteUrl}/open-source`,
+ activeBasePath: 'open-source',
target: '_self',
- rel: 'dofollow',
- },
- {
- label: 'Security',
- href: `${absoluteUrl}/security`,
- activeBasePath: 'security',
position: 'left',
- target: '_self',
- rel: 'dofollow',
- },
- {
- label: 'Academy',
- href: `${absoluteUrl}/academy`,
- activeBasePath: 'academy',
- position: 'right',
- target: '_self',
- rel: 'dofollow',
- },
- {
- label: 'APIs, SDKs & CLI',
- type: 'dropdown',
- activeBaseRegex: '^/(api|sdk|cli)/',
- position: 'right',
+ className: 'navbar__item',
items: [
{
- label: 'API Reference',
- href: `${absoluteUrl}/api/v2`,
- target: '_self',
+ label: 'Crawlee',
+ href: 'https://crawlee.dev',
rel: 'dofollow',
},
{
- label: 'SDK for JavaScript',
- href: `${absoluteUrl}/sdk/js/docs/overview`,
- target: '_self',
- rel: 'dofollow',
+ label: 'Fingerprint Suite',
+ href: 'https://github.com/apify/fingerprint-suite',
},
{
- label: 'SDK for Python',
- href: `${absoluteUrl}/sdk/python/docs/overview`,
- target: '_self',
- rel: 'dofollow',
+ label: 'impit',
+ href: 'https://github.com/apify/impit',
},
{
- label: 'Client for JavaScript',
- href: `${absoluteUrl}/api/client/js/docs`,
- target: '_self',
- rel: 'dofollow',
+ label: 'MCP CLI',
+ href: 'https://github.com/apify/mcpc',
},
{
- label: 'Client for Python',
- href: `${absoluteUrl}/api/client/python/docs`,
- target: '_self',
- rel: 'dofollow',
+ label: 'Actor whitepaper',
+ href: 'https://whitepaper.actor',
},
{
- label: 'CLI',
- href: `${absoluteUrl}/cli/docs`,
- target: '_self',
- rel: 'dofollow',
+ label: 'proxy-chain',
+ href: 'https://github.com/apify/proxy-chain',
+ },
+ {
+ label: 'Apify on GitHub',
+ href: 'https://github.com/apify',
},
],
},
@@ -162,14 +163,8 @@ const themeConfig = {
rel: 'dofollow',
},
{
- label: 'Get started',
- href: `${absoluteUrl}/get-started`,
- target: '_self',
- rel: 'dofollow',
- },
- {
- label: 'Actors',
- href: `${absoluteUrl}/actors`,
+ label: 'Platform',
+ href: `${absoluteUrl}/platform`,
target: '_self',
rel: 'dofollow',
},
@@ -215,40 +210,6 @@ const themeConfig = {
},
],
},
- {
- title: 'Open source',
- items: [
- {
- label: 'Crawlee',
- href: 'https://crawlee.dev',
- rel: 'dofollow',
- },
- {
- label: 'Fingerprint Suite',
- href: 'https://github.com/apify/fingerprint-suite',
- },
- {
- label: 'impit',
- href: 'https://github.com/apify/impit',
- },
- {
- label: 'MCP CLI',
- href: 'https://github.com/apify/mcpc',
- },
- {
- label: 'Actor whitepaper',
- href: 'https://whitepaper.actor',
- },
- {
- label: 'proxy-chain',
- href: 'https://github.com/apify/proxy-chain',
- },
- {
- label: 'Apify on GitHub',
- href: 'https://github.com/apify',
- },
- ],
- },
{
title: 'Other',
items: [
@@ -259,6 +220,13 @@ const themeConfig = {
target: '_self',
rel: 'dofollow',
},
+ {
+ label: 'Open source',
+ href: `${absoluteUrl}/open-source`,
+ position: 'left',
+ target: '_self',
+ rel: 'dofollow',
+ },
{
label: 'llms.txt',
href: `${absoluteUrl}/llms.txt`,
diff --git a/apify-docs-theme/src/theme/DocItemContent/index.js b/apify-docs-theme/src/theme/DocItemContent/index.js
index 219637daf8..c7a02d2ccc 100644
--- a/apify-docs-theme/src/theme/DocItemContent/index.js
+++ b/apify-docs-theme/src/theme/DocItemContent/index.js
@@ -51,14 +51,7 @@ export default function DocItemContent({ children }) {
'/api/v2/logs',
'/api/v2/users',
'/api/client',
- '/get-started',
- '/actors',
- '/storage',
- '/proxy',
- '/account',
- '/integrations',
- '/limits',
- '/security',
+ '/platform',
'/sdk',
'/cli',
'/academy',
diff --git a/apify-docs-theme/src/theme/SearchBar/index.js b/apify-docs-theme/src/theme/SearchBar/index.js
index 70837cd564..1a3dd6c2fc 100644
--- a/apify-docs-theme/src/theme/SearchBar/index.js
+++ b/apify-docs-theme/src/theme/SearchBar/index.js
@@ -17,17 +17,7 @@ import './styles.css';
*/
function matchesCurrentInstance(href, baseUrl) {
if (baseUrl === '/') {
- return (
- href.startsWith('/academy') ||
- href.startsWith('/get-started') ||
- href.startsWith('/actors') ||
- href.startsWith('/storage') ||
- href.startsWith('/proxy') ||
- href.startsWith('/account') ||
- href.startsWith('/integrations') ||
- href.startsWith('/limits') ||
- href.startsWith('/security')
- );
+ return href.startsWith('/academy') || href.startsWith('/platform');
}
return href.startsWith(baseUrl);
diff --git a/docusaurus.config.js b/docusaurus.config.js
index f23b9ccef9..4b45acf131 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -120,7 +120,7 @@ module.exports = {
showLastUpdateTime: false,
editUrl: 'https://github.com/apify/apify-docs/edit/master/',
path: './sources/platform',
- routeBasePath: '/',
+ routeBasePath: 'platform',
sidebarPath: require.resolve('./sources/platform/sidebars.js'),
rehypePlugins: [externalLinkProcessor],
},
diff --git a/nginx.conf b/nginx.conf
index 0c8e5eedb3..45c2370440 100644
--- a/nginx.conf
+++ b/nginx.conf
@@ -318,42 +318,57 @@ server {
rewrite ^/about$ /platform permanent;
rewrite ^/access-rights$ /platform/collaboration/access-rights permanent;
rewrite ^/actor$ /platform/actors permanent;
+ rewrite ^/actors$ /platform/actors permanent;
rewrite ^/tutorials/integrations$ /platform/integrations permanent;
+ rewrite ^/integrations$ /platform/integrations permanent;
rewrite ^/monitoring$ /platform/monitoring permanent;
+ rewrite ^/proxy$ /platform/proxy permanent;
rewrite ^/robotic-process-automation$ / permanent;
rewrite ^/scheduler$ /platform/schedules permanent;
rewrite ^/schedules$ /platform/schedules permanent;
+ rewrite ^/storage$ /platform/storage permanent;
rewrite ^/scraping$ /platform/actors/running permanent;
rewrite ^/tutorials$ /platform/actors/running permanent;
rewrite ^/web-scraping-101$ /academy/scraping-basics-javascript?legacy-js-course=/ permanent;
rewrite ^/access-rights/list-of-permissions$ /platform/collaboration/list-of-permissions permanent;
rewrite ^/access-rights/organization-account$ /platform/collaboration/organization-account permanent;
rewrite ^/actor/development$ /platform/actors/development permanent;
+ rewrite ^/actors/development$ /platform/actors/development permanent;
rewrite ^/actor/examples$ /platform/actors permanent;
rewrite ^/actors/examples$ /platform/actors permanent;
rewrite ^/actor/limits$ /platform/limits permanent;
rewrite ^/actors/limits$ /platform/limits permanent;
rewrite ^/actors/paid-actors$ /platform/actors/running/actors-in-store#paid-actors permanent;
+ rewrite ^/actors/publishing$ /platform/actors/publishing permanent;
rewrite ^/actor/run$ /platform/actors/running permanent;
rewrite ^/actor/running$ /platform/actors/running permanent;
rewrite ^/actors/run$ /platform/actors/running permanent;
+ rewrite ^/actors/running$ /platform/actors/running permanent;
rewrite ^/actor/security$ /platform/security permanent;
rewrite ^/actors/security$ /platform/security permanent;
rewrite ^/tasks$ /platform/actors/running/tasks permanent;
rewrite ^/actors/tasks$ /platform/actors/running/tasks permanent;
+ rewrite ^/integrations/slack$ /platform/integrations/slack permanent;
rewrite ^/webhooks$ /platform/integrations/webhooks permanent;
+ rewrite ^/integrations/webhooks$ /platform/integrations/webhooks permanent;
rewrite ^/monitoring/actor-or-task-run-failure$ /platform/monitoring permanent;
rewrite ^/monitoring/check-data-quality$ /platform/monitoring permanent;
rewrite ^/monitoring/monitor-multiple-tasks$ /platform/monitoring permanent;
rewrite ^/monitoring/monitor-shared-datasets$ /platform/monitoring permanent;
rewrite ^/robotic-process-automation/tips-and-tricks$ /academy/advanced-web-scraping/tips-and-tricks-robustness permanent;
rewrite ^/proxy/connection-settings$ /platform/proxy/usage permanent;
+ rewrite ^/proxy/datacenter-proxy$ /platform/proxy/datacenter-proxy permanent;
+ rewrite ^/proxy/google-serp-proxy$ /platform/proxy/google-serp-proxy permanent;
rewrite ^/proxy/residential-proxy/nodejs-examples$ /platform/proxy/residential-proxy permanent;
rewrite ^/proxy/residential-proxy/python-examples$ /platform/proxy/residential-proxy permanent;
rewrite ^/proxy/residential-proxy/php-examples$ /platform/proxy/residential-proxy permanent;
+ rewrite ^/proxy/residential-proxy$ /platform/proxy/residential-proxy permanent;
rewrite ^/proxy/troubleshooting$ /platform/proxy permanent;
rewrite ^/web-scraping-101/anti-scraping-techniques$ /academy/anti-scraping/techniques permanent;
rewrite ^/web-scraping-101/web-scraping-techniques$ / permanent;
+ rewrite ^/storage/dataset$ /platform/storage/dataset permanent;
+ rewrite ^/storage/key-value-store$ /platform/storage/key-value-store permanent;
+ rewrite ^/storage/request-queue$ /platform/storage/request-queue permanent;
rewrite ^/access-rights/organization-account/how-to-use$ /platform/collaboration/organization-account/how-to-use permanent;
rewrite ^/access-rights/organization-account/setup$ /platform/collaboration/organization-account/setup permanent;
rewrite ^/tutorials/analyze-pages-and-fix-errors$ /academy/node-js/analyzing-pages-and-fixing-errors permanent;
@@ -380,6 +395,7 @@ server {
rewrite ^/tutorials/use-apify-from-php$ /academy/php/use-apify-from-php permanent;
rewrite ^/actors/running/compute-units$ /platform/actors/running/usage-and-resources#what-is-a-compute-unit permanent;
rewrite ^/actor/running/input-and-output$ /platform/actors/running/input-and-output#input permanent;
+ rewrite ^/actors/running/input-and-output$ /platform/actors/running/input-and-output#input permanent;
rewrite ^/actors/running/input$ /platform/actors/running/input-and-output#input permanent;
rewrite ^/actors/memory-and-cpu$ /platform/actors/running/usage-and-resources#memory permanent;
rewrite ^/actors/running/memory-and-cpu$ /platform/actors/running/usage-and-resources#memory permanent;
@@ -408,8 +424,11 @@ server {
rewrite ^/actors/development/state-persistence$ /platform/actors/development/builds-and-runs/state-persistence permanent;
rewrite ^/actors/development/testing-and-maintenance$ /platform/actors/development/automated-tests permanent;
rewrite ^/webhooks/actions$ /platform/integrations/webhooks/actions permanent;
+ rewrite ^/integrations/webhooks/actions$ /platform/integrations/webhooks/actions permanent;
rewrite ^/webhooks/ad-hoc-webhooks$ /platform/integrations/webhooks/ad-hoc-webhooks permanent;
+ rewrite ^/integrations/webhooks/ad-hoc-webhooks$ /platform/integrations/webhooks/ad-hoc-webhooks permanent;
rewrite ^/webhooks/events$ /platform/integrations/webhooks/events permanent;
+ rewrite ^/integrations/webhooks/events$ /platform/integrations/webhooks/events permanent;
rewrite ^/proxy/datacenter-proxy/nodejs-examples$ /platform/proxy/datacenter-proxy permanent;
rewrite ^/proxy/datacenter-proxy/python-examples$ /platform/proxy/datacenter-proxy permanent;
rewrite ^/proxy/datacenter-proxy/php-examples$ /platform/proxy/datacenter-proxy permanent;
@@ -787,33 +806,6 @@ server {
# Misc
rewrite ^/platform/integrations/llama$ /platform/integrations/llama-index permanent;
-
- # === IA v3 flip: drop the /platform prefix ===
- # Structural moves first (these MUST precede the blanket catch-all, because a
- # naive /platform/X -> /X strip would 404 for sections that relocated).
- # console/store is KEPT at /console/store on the v3 branch (open decision D12),
- # so it gets a clean strip, not a "page removed" soft-land.
- rewrite ^/platform/console/store$ /console/store permanent;
- rewrite ^/platform/console$ /account/console permanent;
- rewrite ^/platform/console/(.*)$ /account/$1 permanent;
- rewrite ^/platform/collaboration/organization-account(/.*)?$ /account/collaboration/organization$1 permanent;
- rewrite ^/platform/collaboration(/.*)?$ /account/collaboration$1 permanent;
- rewrite ^/platform/actors/development/quick-start/?(.*)$ /get-started/$1 permanent;
- rewrite ^/platform/schedules$ /actors/running/schedules permanent;
- rewrite ^/platform/monitoring$ /actors/running/monitoring permanent;
- # "Apify for AI agents" moved from Integrations into Get Started
- rewrite ^/platform/integrations/agent-onboarding$ /get-started/agent-onboarding permanent;
- # (storage/usage and proxy/usage already redirect to /platform/storage and
- # /platform/proxy via the reorg rules above; the catch-all below carries them
- # the rest of the way to /storage and /proxy. The post-flip cleanup PR collapses
- # that double-hop.)
-
- # Soft-landings for deleted URLs (better UX than a 404)
- rewrite ^/platform/integrations/airtable/console-integration$ /integrations/airtable permanent;
- rewrite ^/platform/?$ / permanent;
-
- # Catch-all: blanket /platform/X -> /X. MUST be the last /platform rule.
- rewrite ^/platform/(.*)$ /$1 permanent;
}
# Note: crawlee.dev server block has been moved to crawlee repository:
diff --git a/scripts/checkNavHeaders.mjs b/scripts/checkNavHeaders.mjs
index 7078206e14..550a738764 100644
--- a/scripts/checkNavHeaders.mjs
+++ b/scripts/checkNavHeaders.mjs
@@ -47,21 +47,20 @@ const MD_LINK = /^\[(?:\\.|[^\]\\])+\]\(https:\/\/docs\.apify\.com\/\S+\)$/;
// children, previous and next, while each page only asserts what its position in
// the tree guarantees (so reordering siblings can't make it flaky).
const PAGES = [
- // Section landings: only the universal keys, sometimes a `next`. In the v3 IA
- // each section has its own sidebar, so a section landing is the first item
- // (no `previous`) and a sibling link rather than a category (no `children`).
+ // Section landings: only the universal keys, sometimes a `next`.
+ { path: '/platform.md', keys: ['next'] },
{ path: '/academy.md', keys: [] },
{ path: '/api.md', keys: [] },
{ path: '/legal.md', keys: ['next'] },
- { path: '/actors.md', keys: ['next'] },
- { path: '/storage.md', keys: ['next'] },
- { path: '/integrations.md', keys: ['next'] },
// Category pages: have a `children` list plus neighbours.
- { path: '/actors/running.md', keys: ['children', 'previous', 'next'] },
+ { path: '/platform/actors.md', keys: ['children', 'previous', 'next'] },
+ { path: '/platform/actors/running.md', keys: ['children', 'previous', 'next'] },
+ { path: '/platform/storage.md', keys: ['children', 'previous', 'next'] },
+ { path: '/platform/integrations.md', keys: ['children', 'previous', 'next'] },
{ path: '/api/v2.md', keys: ['children', 'next'] },
// Leaf pages: no children, but sit between two neighbours.
- { path: '/storage/dataset.md', keys: ['previous', 'next'] },
- { path: '/proxy/datacenter-proxy.md', keys: ['previous', 'next'] },
+ { path: '/platform/storage/dataset.md', keys: ['previous', 'next'] },
+ { path: '/platform/proxy/datacenter-proxy.md', keys: ['previous', 'next'] },
{ path: '/api/v2/dataset-get.md', keys: ['previous', 'next'] },
{ path: '/academy/tutorials.md', keys: ['next'] },
{ path: '/legal/general-terms-and-conditions.md', keys: ['previous', 'next'] },
diff --git a/sources/academy/ai/ai-agents.mdx b/sources/academy/ai/ai-agents.mdx
index fec6e3898f..33276a465d 100644
--- a/sources/academy/ai/ai-agents.mdx
+++ b/sources/academy/ai/ai-agents.mdx
@@ -52,7 +52,7 @@ _Example input:_
_Example output:_
- Text response with insights
-- Data stored in Apify [Dataset](/storage/dataset)
+- Data stored in Apify [Dataset](/platform/storage/dataset)
:::note Agent memory
@@ -253,7 +253,7 @@ Apify's pay-per-event (PPE) pricing model allows charging users based on specifi
:::info How pay-per-event pricing works
-If you want more details about PPE pricing, refer to our [PPE documentation](/actors/publishing/monetize/pay-per-event).
+If you want more details about PPE pricing, refer to our [PPE documentation](/platform/actors/publishing/monetize/pay-per-event).
:::
diff --git a/sources/academy/build-and-publish/actor-ideas/what_software_an_actor_can_be.md b/sources/academy/build-and-publish/actor-ideas/what_software_an_actor_can_be.md
index 3b54ca1376..12df65bc90 100644
--- a/sources/academy/build-and-publish/actor-ideas/what_software_an_actor_can_be.md
+++ b/sources/academy/build-and-publish/actor-ideas/what_software_an_actor_can_be.md
@@ -12,7 +12,7 @@ Learn what kind of software tools are suitable to be packaged and published as A
## What can you build as an Actor
-[Actors](https://docs.apify.com/actors) are a new way for building serverless micro-apps, which are easy to develop, share, integrate, and build upon.
+[Actors](https://docs.apify.com/platform/actors) are a new way for building serverless micro-apps, which are easy to develop, share, integrate, and build upon.
They are useful for backend automation jobs, which users set up, integrate into their workflow, and let run in the background, rather than consumer-facing applications that users need to interact with.
diff --git a/sources/academy/build-and-publish/apify-store-basics/how_actor_monetization_works.md b/sources/academy/build-and-publish/apify-store-basics/how_actor_monetization_works.md
index b9796d88b1..7e6f014fd0 100644
--- a/sources/academy/build-and-publish/apify-store-basics/how_actor_monetization_works.md
+++ b/sources/academy/build-and-publish/apify-store-basics/how_actor_monetization_works.md
@@ -34,7 +34,7 @@ Monetizing your Actor on the Apify platform involves several key steps:
:::info Pass platform usage costs to users
-Optionally, you can [pass costs associated with the platform usage](/actors/publishing/monetize/pay-per-event#platform-usage-costs) to the users.
+Optionally, you can [pass costs associated with the platform usage](../../../platform/actors/publishing/monetize/pay-per-event#pass-platform-usage-to-users) to the users.
Profit calculation: `profit = 0.8 * revenue`
@@ -62,7 +62,7 @@ Profit calculation: `profit = 0.8 * revenue`
:::info Pay-per-event details
-If you want more details about PPE pricing, refer to our [PPE documentation](/actors/publishing/monetize/pay-per-event).
+If you want more details about PPE pricing, refer to our [PPE documentation](/platform/actors/publishing/monetize/pay-per-event).
:::
@@ -80,7 +80,7 @@ If you want more details about PPE pricing, refer to our [PPE documentation](/ac
:::info Rental pricing details
-If you want more details about rental pricing, refer to our [rental pricing documentation](/actors/publishing/monetize/rental).
+If you want more details about rental pricing, refer to our [rental pricing documentation](/platform/actors/publishing/monetize/rental).
:::
@@ -130,7 +130,7 @@ Learn more about what makes a good readme here: [How to create an Actor README](
### Adapt when needed
-Don’t be afraid to experiment with pricing, especially at the start. You can monitor your results in the dashboard and adjust if necessary. You can also choose to [pass platform usage costs to users](/actors/publishing/monetize/pay-per-event#platform-usage-costs) while you’re still figuring out the right price.
+Don’t be afraid to experiment with pricing, especially at the start. You can monitor your results in the dashboard and adjust if necessary. You can also choose to [pass platform usage costs to users](/platform/actors/publishing/monetize/pay-per-event#pass-platform-usage-to-users) while you’re still figuring out the right price.
To estimate pricing, run a few test runs and review the statistics in the Actor [**Analytics**](https://console.apify.com/actors?tab=analytics) tab.
@@ -157,8 +157,8 @@ Example of useful pricing estimates from the **Analytics** tab:
## Resources
- Learn about [incentives behind monetization](https://apify.com/partners/actor-developers)
-- Detailed guide to [setting up monetization models](/actors/publishing/monetize)
-- Guide to [publishing Actors](/actors/publishing)
+- Detailed guide to [setting up monetization models](/platform/actors/publishing/monetize)
+- Guide to [publishing Actors](/platform/actors/publishing)
- Watch our webinar on how to [build, publish and monetize Actors](https://www.youtube.com/watch?v=4nxStxC1BJM)
- Read a blog post from our CEO on the [reasoning behind monetizing Actors](https://blog.apify.com/make-regular-passive-income-developing-web-automation-actors-b0392278d085/)
- Learn about the [Creator plan](https://apify.com/pricing/creator-plan), which allows you to create and freely test your own Actors for $1
diff --git a/sources/academy/build-and-publish/apify-store-basics/how_store_works.md b/sources/academy/build-and-publish/apify-store-basics/how_store_works.md
index ce76977a58..aad7af8155 100644
--- a/sources/academy/build-and-publish/apify-store-basics/how_store_works.md
+++ b/sources/academy/build-and-publish/apify-store-basics/how_store_works.md
@@ -102,9 +102,9 @@ Learn more about how to handle the [Issues tab](/academy/actor-marketing-playboo
## How Apify Store search works
-Search ranking evaluates parameters similar to those in the [Actor quality score](/actors/publishing/quality-score). As a result, the two correlate strongly: Actors with higher quality scores tend to rank higher in [Apify Store](https://apify.com/store) search and the [Apify MCP server](/integrations/mcp) `search-actors` tool, though no specific position is guaranteed.
+Search ranking evaluates parameters similar to those in the [Actor quality score](/platform/actors/publishing/quality-score). As a result, the two correlate strongly: Actors with higher quality scores tend to rank higher in [Apify Store](https://apify.com/store) search and the [Apify MCP server](/platform/integrations/mcp) `search-actors` tool, though no specific position is guaranteed.
-To improve your Actor's visibility in search, focus on improving its quality score. For what the score measures and how to influence each category, see [Actor quality score](/actors/publishing/quality-score).
+To improve your Actor's visibility in search, focus on improving its quality score. For what the score measures and how to influence each category, see [Actor quality score](/platform/actors/publishing/quality-score).
### Search in Apify Console is personalized
@@ -112,8 +112,8 @@ In [Apify Console](https://console.apify.com), search results are personalized f
## Resources
-- Best practices on setting up [testing for your Actor](https://docs.apify.com/actors/publishing/test)
+- Best practices on setting up [testing for your Actor](https://docs.apify.com/platform/actors/publishing/test)
- What are Apify-maintained and [Community-maintained Actors](https://help.apify.com/en/articles/6999799-what-are-apify-maintained-and-community-maintained-actors)? On ownership, maintenance, features, and support
-- Step-by-step guide on how to [publish your Actor](https://docs.apify.com/actors/publishing)
+- Step-by-step guide on how to [publish your Actor](https://docs.apify.com/platform/actors/publishing)
- Watch our webinar on how to [build, publish and monetize Actors](https://www.youtube.com/watch?v=4nxStxC1BJM)
-- Detailed [guide on pricing models](https://docs.apify.com/actors/running/actors-in-store) for Actors in Store
+- Detailed [guide on pricing models](https://docs.apify.com/platform/actors/running/actors-in-store) for Actors in Store
diff --git a/sources/academy/build-and-publish/how-to-build/actorization_playbook.mdx b/sources/academy/build-and-publish/how-to-build/actorization_playbook.mdx
index c4e9251404..7b19cd4dfc 100644
--- a/sources/academy/build-and-publish/how-to-build/actorization_playbook.mdx
+++ b/sources/academy/build-and-publish/how-to-build/actorization_playbook.mdx
@@ -37,7 +37,7 @@ For open-source developers, Actorization adds value without extra costs:
:::
-For example, IBM’s [Docling project](https://github.com/docling-project/docling) merged our pull request that actorized their popular open-source GitHub repo and added the [Apify Actor status badge](/actors/publishing/status-badge) to the README:
+For example, IBM’s [Docling project](https://github.com/docling-project/docling) merged our pull request that actorized their popular open-source GitHub repo and added the [Apify Actor status badge](/platform/actors/publishing/status-badge) to the README:

@@ -60,14 +60,14 @@ For more inspiration on which open-source libraries to wrap as Actors, see the [
Use these criteria to decide if your project is a good candidate for Actorization:
-1. _Is it self-contained?_ Does the project work non-interactively, with a well-defined, preferably structured input and output format? Positive examples include various data processing utilities, web scrapers and other automation scripts. Negative examples are GUI applications or applications that run indefinitely. If you want to run HTTP APIs on Apify, you can do so using [Actor Standby](/actors/development/programming-interface/standby).
-2. _Can the state be stored in Apify storages?_ If the application has state that can be stored in a small number of files it can utilize [key-value store](/storage/key-value-store), or if it processes records that can be stored in Apify’s [request queue](/storage/request-queue). If the output consists of one or many similar JSON objects, it can utilize [dataset](/storage/dataset).
+1. _Is it self-contained?_ Does the project work non-interactively, with a well-defined, preferably structured input and output format? Positive examples include various data processing utilities, web scrapers and other automation scripts. Negative examples are GUI applications or applications that run indefinitely. If you want to run HTTP APIs on Apify, you can do so using [Actor Standby](/platform/actors/development/programming-interface/standby).
+2. _Can the state be stored in Apify storages?_ If the application has state that can be stored in a small number of files it can utilize [key-value store](/platform/storage/key-value-store), or if it processes records that can be stored in Apify’s [request queue](/platform/storage/request-queue). If the output consists of one or many similar JSON objects, it can utilize [dataset](/platform/storage/dataset).
3. _Can it be containerized?_ The project needs to be able to run in a Docker container. Apify currently does not support GPU workloads. External services (e.g., databases) need to be managed by developer.
4. _Can it use Apify tooling?_ Javascript/Typescript applications and Python applications can be Actorized with the help of the [Apify SDK](/sdk), which makes easy for your code to interacts with the Apify platform. Applications that can be run using just the CLI can also be Actorized using the Apify CLI by writing a simple shell script that retrieves user input using [Apify CLI](/cli/), then runs your application and sends the results back to Apify (also using the CLI). If your application is implemented differently, you can still call the [Apify API](/api/v2) directly - it’s just HTTP and pretty much every language has support for that but the implementation is less straightforward.
## Actorization guide
-This guide outlines the steps to convert your application into an Apify [Actor](/actors). Follow the documentation links for detailed information - this guide provides an overview rather than exhaustive instructions.
+This guide outlines the steps to convert your application into an Apify [Actor](/platform/actors). Follow the documentation links for detailed information - this guide provides an overview rather than exhaustive instructions.
### 1. Add Actor metadata - the `.actor` folder
@@ -85,14 +85,14 @@ In case you're starting a new project, we strongly advise to start with a [templ
:::note Quick Start for beginners
- For a step-by-step introduction to creating your first Actor (including tech stack choices and development paths), see [Get started](/get-started).
+ For a step-by-step introduction to creating your first Actor (including tech stack choices and development paths), see [Quick Start](/platform/actors/development/quick-start).
:::
-The newly created `.actor` folder contains an `actor.json` file - a manifest of the Actor. See [documentation](/actors/development/actor-definition/actor-json) for more details
+The newly created `.actor` folder contains an `actor.json` file - a manifest of the Actor. See [documentation](/platform/actors/development/actor-definition/actor-json) for more details
-You must also make sure your Actor has a Dockerfile and that it installs everything needed to successfully run your application. Check out [Dockerfile documentation](/actors/development/actor-definition/dockerfile) by Apify. If you don't want to use these, you are free to use any image as the base of your Actor.
+You must also make sure your Actor has a Dockerfile and that it installs everything needed to successfully run your application. Check out [Dockerfile documentation](/platform/actors/development/actor-definition/dockerfile) by Apify. If you don't want to use these, you are free to use any image as the base of your Actor.
When launching the Actor, the Apify platform will simply run your Docker image. This means that a) you need to configure the `ENTRYPOINT` and `CMD` directives so that it launches your application and b) you can test your image locally using Docker.
@@ -102,7 +102,7 @@ These steps are the bare minimum you need to run your code on Apify. The rest of
Most Actors accept an input and produce an output. As part of Actorization, you need to define the input and output structure of your application.
-For detailed information, read the docs for [input schema](/actors/development/actor-definition/input-schema), [dataset schema](/actors/development/actor-definition/dataset-schema), and general [storage](/storage).
+For detailed information, read the docs for [input schema](/platform/actors/development/actor-definition/input-schema), [dataset schema](/platform/actors/development/actor-definition/dataset-schema), and general [storage](/platform/storage).
#### Design guidelines
@@ -115,11 +115,11 @@ For detailed information, read the docs for [input schema](/actors/development/a
### 3. Handle state persistence (optional)
-If your application performs a number of well-defined subtasks, the [request queue](/storage/request-queue) lets you pause and resume execution on job restart. This is important for long-running jobs that might be migrated between servers at some point. In addition, this allows the Apify platform to display the progress to your users in the UI.
+If your application performs a number of well-defined subtasks, the [request queue](/platform/storage/request-queue) lets you pause and resume execution on job restart. This is important for long-running jobs that might be migrated between servers at some point. In addition, this allows the Apify platform to display the progress to your users in the UI.
A lightweight alternative to the request queue is simply storing the state of your application as a JSON object in the key-value store and checking for that when your Actor is starting.
-Fully-fledged Actors will often combine these two approaches for maximum reliability. More on this topic you find in the [state persistence](/actors/development/builds-and-runs/state-persistence) article.
+Fully-fledged Actors will often combine these two approaches for maximum reliability. More on this topic you find in the [state persistence](/platform/actors/development/builds-and-runs/state-persistence) article.
### 4. Write Actorization code
@@ -129,14 +129,14 @@ Unless you’re writing an application targeted directly on the Apify platform,
Apify provides SDKs for [JavaScript](/sdk/js/) and [Python](/sdk/python/) plus the [Apify CLI](/cli/) allowing an easy interaction with the Apify platform from the command line.
-Check out [programming interface](/actors/development/programming-interface/) documentation article for details on interacting with the Apify platform in your Actor's code.
+Check out [programming interface](/platform/actors/development/programming-interface/) documentation article for details on interacting with the Apify platform in your Actor's code.
### 5. Deploy the Actor
-Deployment to the Apify platform can be done easily via `apify push` command of the [Apify CLI](/cli/) and for details see [deployment](/actors/development/deployment) documentation.
+Deployment to the Apify platform can be done easily via `apify push` command of the [Apify CLI](/cli/) and for details see [deployment](/platform/actors/development/deployment) documentation.
### 6. Publish and monetize
-For details on publishing the Actor in [Apify Store](https://apify.com/store) see the [Publishing and monetization](/actors/publishing). You can also follow the guide on [How to create an Actor README](/academy/actor-marketing-playbook/actor-basics/how-to-create-an-actor-readme) and [Marketing checklist](/academy/actor-marketing-playbook/promote-your-actor/checklist).
+For details on publishing the Actor in [Apify Store](https://apify.com/store) see the [Publishing and monetization](/platform/actors/publishing). You can also follow the guide on [How to create an Actor README](/academy/actor-marketing-playbook/actor-basics/how-to-create-an-actor-readme) and [Marketing checklist](/academy/actor-marketing-playbook/promote-your-actor/checklist).
-To show your Actor's current status and usage in your README or documentation, add the [Actor status badge](/actors/publishing/status-badge).
+To show your Actor's current status and usage in your README or documentation, add the [Actor status badge](/platform/actors/publishing/status-badge).
diff --git a/sources/academy/build-and-publish/how-to-build/how_to_create_a_great_input_schema.md b/sources/academy/build-and-publish/how-to-build/how_to_create_a_great_input_schema.md
index fac04c700b..51d97247fa 100644
--- a/sources/academy/build-and-publish/how-to-build/how_to_create_a_great_input_schema.md
+++ b/sources/academy/build-and-publish/how-to-build/how_to_create_a_great_input_schema.md
@@ -31,7 +31,7 @@ In this article, _we’ll refer to the input schema as the user interface_ of yo
:::tip Understand input schemas
-To fully understand the recommendations in this blog post, you’ll first need to familiarize yourself with the [technical aspects of the input schema](https://docs.apify.com/actors/development/actor-definition/input-schema). This context is essential to make good use of the insights shared here.
+To fully understand the recommendations in this blog post, you’ll first need to familiarize yourself with the [technical aspects of the input schema](https://docs.apify.com/platform/actors/development/actor-definition/input-schema). This context is essential to make good use of the insights shared here.
:::
@@ -118,7 +118,7 @@ Unfortunately, when it comes to UX, there's only so much you can achieve armed w
- Use them to attract attention or as visual shortcuts. Use emojis consistently to invoke a user's iconic memory. The visual language should match across the whole input schema (and README) so the user can understand what section or field is referred to without reading the whole title.
- Don't overload the schema with emojis. They attract attention, so you need to use them sparingly.
-:::tip Using emojis
+:::tip
Read more on the use of emojis: [Actors and emojis](/academy/actor-marketing-playbook/actor-basics/actors-and-emojis)
@@ -170,4 +170,4 @@ The version above was the improved input schema. Here's what this tool's input s
## Resources
- Basics of input schema: [https://docs.apify.com/academy/deploying-your-code/input-schema](https://docs.apify.com/academy/deploying-your-code/input-schema)
-- Specifications of input schema: [https://docs.apify.com/actors/development/actor-definition/input-schema](https://docs.apify.com/actors/development/actor-definition/input-schema)
+- Specifications of input schema: [https://docs.apify.com/platform/actors/development/actor-definition/input-schema](https://docs.apify.com/platform/actors/development/actor-definition/input-schema)
diff --git a/sources/academy/build-and-publish/how-to-build/running_a_web_server.md b/sources/academy/build-and-publish/how-to-build/running_a_web_server.md
index b1ff2264a1..8a4eaecc86 100644
--- a/sources/academy/build-and-publish/how-to-build/running_a_web_server.md
+++ b/sources/academy/build-and-publish/how-to-build/running_a_web_server.md
@@ -19,7 +19,7 @@ Running a web server in an Actor is a piece of cake! Each Actor run is available
If you start a web server on the port defined by the **APIFY_CONTAINER_PORT** environment variable (the default value is **4321**), the container URL becomes available and gets displayed in the **Live View** tab in the Actor run console.
-For more details, see [the documentation](/actors/development/programming-interface/container-web-server).
+For more details, see [the documentation](/platform/actors/development/programming-interface/container-web-server).
## Building the Actor {#building-the-actor}
diff --git a/sources/academy/build-and-publish/why_publish.md b/sources/academy/build-and-publish/why_publish.md
index 72c80de41d..d7e61a6b21 100644
--- a/sources/academy/build-and-publish/why_publish.md
+++ b/sources/academy/build-and-publish/why_publish.md
@@ -58,7 +58,7 @@ Apify Store is a growing library of thousands of Actors, most created by communi
### Maintain quality
-Public Actors require higher standards than private ones. Since users depend on your Actor, you'll need to commit to regular maintenance - reserve approximately 2 hours per week for bug fixes, updates, and user support. Thorough documentation is essential; write clear README files using simple language since users may not be developers. Set up automated testing or use manual testing to prevent user issues, and respond promptly to issues through the Issues tab, where your response time is publicly visible. Learn more about metrics determining quality in [Actor quality score documentation](/actors/publishing/quality-score).
+Public Actors require higher standards than private ones. Since users depend on your Actor, you'll need to commit to regular maintenance - reserve approximately 2 hours per week for bug fixes, updates, and user support. Thorough documentation is essential; write clear README files using simple language since users may not be developers. Set up automated testing or use manual testing to prevent user issues, and respond promptly to issues through the Issues tab, where your response time is publicly visible. Learn more about metrics determining quality in [Actor quality score documentation](/platform/actors/publishing/quality-score).
### When you need to change things
@@ -78,4 +78,4 @@ Learn more:
- [How to build Actors](/academy/actor-marketing-playbook/store-basics/how-to-build-actors)
- [How Apify Store works](/academy/actor-marketing-playbook/store-basics/how-store-works)
-- [Publish your Actor](/actors/publishing/publish)
+- [Publish your Actor](/platform/actors/publishing/publish)
diff --git a/sources/academy/platform/deploying_your_code/deploying.md b/sources/academy/platform/deploying_your_code/deploying.md
index 4d373cc691..2f3185affa 100644
--- a/sources/academy/platform/deploying_your_code/deploying.md
+++ b/sources/academy/platform/deploying_your_code/deploying.md
@@ -75,4 +75,4 @@ The next step is to test your Actor and experiment with the vast amount of featu
## Wrap up {#next}
-That's it! In this short section, you've learned how to take your code written in any programming language and turn it into a usable Actor that can run on the Apify platform! The next step is to start looking into the [paid Actors](/actors/publishing) program, which allows you to monetize your work.
+That's it! In this short section, you've learned how to take your code written in any programming language and turn it into a usable Actor that can run on the Apify platform! The next step is to start looking into the [paid Actors](/platform/actors/publishing) program, which allows you to monetize your work.
diff --git a/sources/academy/platform/deploying_your_code/index.md b/sources/academy/platform/deploying_your_code/index.md
index bdb8334412..7c579aaab6 100644
--- a/sources/academy/platform/deploying_your_code/index.md
+++ b/sources/academy/platform/deploying_your_code/index.md
@@ -31,7 +31,7 @@ Here are a few examples of Actors in other languages:
Follow these main steps to turn a piece of code into an Actor:
1. Handle [accepting inputs and writing outputs](./inputs_outputs.md).
-2. Create the [`.actor` directory](/actors/development/actor-definition) and an `actor.json` configuration file.
+2. Create the [`.actor` directory](/platform/actors/development/actor-definition) and an `actor.json` configuration file.
3. Create an [input schema](./input_schema.md) _(optional)_.
4. Add a [Dockerfile](./docker_file.md).
5. [Deploy](./deploying.md) to the Apify platform!
diff --git a/sources/academy/platform/deploying_your_code/input_schema.md b/sources/academy/platform/deploying_your_code/input_schema.md
index 042273af8c..92664136ea 100644
--- a/sources/academy/platform/deploying_your_code/input_schema.md
+++ b/sources/academy/platform/deploying_your_code/input_schema.md
@@ -9,7 +9,7 @@ slug: /deploying-your-code/input-schema
---
-Writing an [input schema](/actors/development/actor-definition/input-schema) for an Actor is optional, but recommended. The Apify platform reads input schema and generates a user interface for entering input into your Actor, which makes it easier for non-developers and developers alike to configure and understand the inputs your Actor accepts. Because of this, we'll write an input schema for our example Actor.
+Writing an [input schema](/platform/actors/development/actor-definition/input-schema) for an Actor is optional, but recommended. The Apify platform reads input schema and generates a user interface for entering input into your Actor, which makes it easier for non-developers and developers alike to configure and understand the inputs your Actor accepts. Because of this, we'll write an input schema for our example Actor.
:::note JSON requirement
@@ -23,7 +23,7 @@ Inside the `.actor` directory at the root of our project, we'll create `INPUT_SC
:::tip Actor configuration directory
-Create a `.actor` directory at the root of your project. It holds your Actor's configuration: `actor.json`, `INPUT_SCHEMA.json`, `Dockerfile`, and `README.md`. See [Actor definition](/actors/development/actor-definition) for the full reference.
+Create a `.actor` directory at the root of your project. It holds your Actor's configuration: `actor.json`, `INPUT_SCHEMA.json`, `Dockerfile`, and `README.md`. See [Actor definition](/platform/actors/development/actor-definition) for the full reference.
:::
@@ -61,7 +61,7 @@ Each property's key corresponds to the name we're expecting within our code, whi
## Property types & editor types {#property-types}
-Within our new **numbers** property, there are two more fields we must specify. Firstly, we must let the platform know that we're expecting an array of numbers with the **type** field. Then, we should also instruct Apify on which UI component to render for this input property. In our case, we have an array of numbers, which means we should use the **json** editor type that we discovered in the ["array" section](/actors/development/actor-definition/input-schema/specification/v1#array) of the input schema documentation. We could also use **stringList**, but then we'd have to parse out the numbers from the strings.
+Within our new **numbers** property, there are two more fields we must specify. Firstly, we must let the platform know that we're expecting an array of numbers with the **type** field. Then, we should also instruct Apify on which UI component to render for this input property. In our case, we have an array of numbers, which means we should use the **json** editor type that we discovered in the ["array" section](/platform/actors/development/actor-definition/input-schema/specification/v1#array) of the input schema documentation. We could also use **stringList**, but then we'd have to parse out the numbers from the strings.
```json
{
@@ -112,7 +112,7 @@ Here is what the input schema we wrote will render on the platform:
Later on, we'll be building more complex input schemas, as well as discussing how to write quality input schemas that allow the user to understand the Actor.
-It's not expected to memorize all of the fields that properties can take or the different editor types available, which is why it's always good to reference the [input schema documentation](/actors/development/actor-definition/input-schema) when writing a schema.
+It's not expected to memorize all of the fields that properties can take or the different editor types available, which is why it's always good to reference the [input schema documentation](/platform/actors/development/actor-definition/input-schema) when writing a schema.
## Next up {#next}
diff --git a/sources/academy/platform/deploying_your_code/inputs_outputs.md b/sources/academy/platform/deploying_your_code/inputs_outputs.md
index fe63ee83c7..59de298473 100644
--- a/sources/academy/platform/deploying_your_code/inputs_outputs.md
+++ b/sources/academy/platform/deploying_your_code/inputs_outputs.md
@@ -19,7 +19,7 @@ Understanding inputs and outputs is essential because they are read/written diff
## A bit about storage {#about-storage}
-You can read/write your inputs/outputs: to the [key-value store](/storage/key-value-store), or to the [dataset](/storage/dataset). The key-value store can be used to store any sort of unorganized/unrelated data in any format, while the data pushed to a dataset typically resembles a table with columns (fields) and rows (items). Each Actor's run is allocated both a default dataset and a default key-value store.
+You can read/write your inputs/outputs: to the [key-value store](/platform/storage/key-value-store), or to the [dataset](/platform/storage/dataset). The key-value store can be used to store any sort of unorganized/unrelated data in any format, while the data pushed to a dataset typically resembles a table with columns (fields) and rows (items). Each Actor's run is allocated both a default dataset and a default key-value store.
When running locally, these storages are accessible through the **storage** folder within your project's root directory, while on the platform they are accessible via Apify's API.
diff --git a/sources/academy/platform/deploying_your_code/output_schema.md b/sources/academy/platform/deploying_your_code/output_schema.md
index 31d1fb6495..ed3c6156ee 100644
--- a/sources/academy/platform/deploying_your_code/output_schema.md
+++ b/sources/academy/platform/deploying_your_code/output_schema.md
@@ -162,7 +162,7 @@ Great! Now that everything is set up, it's time to run the Actor and admire your
:::tip Additional resources
-Visit the [dataset schema documentation](/actors/development/actor-definition/dataset-schema) for more detailed information about how to implement this feature.
+Visit the [dataset schema documentation](/platform/actors/development/actor-definition/dataset-schema) for more detailed information about how to implement this feature.
:::
diff --git a/sources/academy/platform/expert_scraping_with_apify/actors_webhooks.md b/sources/academy/platform/expert_scraping_with_apify/actors_webhooks.md
index 18cd962a0c..1ca7b927c8 100644
--- a/sources/academy/platform/expert_scraping_with_apify/actors_webhooks.md
+++ b/sources/academy/platform/expert_scraping_with_apify/actors_webhooks.md
@@ -32,8 +32,8 @@ Webhooks are a powerful tool that can be used for just about anything. You can s
Prior to moving forward, please read over these resources:
-- Read about [running Actors, handling Actor inputs, memory and CPU](/actors/running).
-- Learn about [Actor webhooks](/integrations/webhooks), which we will implement in the next lesson.
+- Read about [running Actors, handling Actor inputs, memory and CPU](/platform/actors/running).
+- Learn about [Actor webhooks](/platform/integrations/webhooks), which we will implement in the next lesson.
- Learn [how to run Actors](/academy/api/run-actor-and-retrieve-data-via-api) using Apify's REST API.
## Knowledge check 📝 {#quiz}
diff --git a/sources/academy/platform/expert_scraping_with_apify/bypassing_anti_scraping.md b/sources/academy/platform/expert_scraping_with_apify/bypassing_anti_scraping.md
index ccd4f3bbb4..e5f034e1aa 100644
--- a/sources/academy/platform/expert_scraping_with_apify/bypassing_anti_scraping.md
+++ b/sources/academy/platform/expert_scraping_with_apify/bypassing_anti_scraping.md
@@ -19,7 +19,7 @@ You might have already noticed that we've been using the **RESIDENTIAL** proxy g
## Learning đź§ {#learning}
- Skim [this page](https://apify.com/proxy) for a general idea of Apify Proxy.
-- Give the [proxy documentation](/proxy) a solid readover (feel free to skip most of the examples).
+- Give the [proxy documentation](/platform/proxy) a solid readover (feel free to skip most of the examples).
- Check out the [anti-scraping guide](../../webscraping/anti_scraping/index.md).
- Gain a solid understanding of the [SessionPool](https://crawlee.dev/api/core/class/SessionPool).
- Look at a few Actors on the [Apify store](https://apify.com/store). How are they utilizing proxies?
diff --git a/sources/academy/platform/expert_scraping_with_apify/managing_source_code.md b/sources/academy/platform/expert_scraping_with_apify/managing_source_code.md
index 47c439209e..6aec1b39f0 100644
--- a/sources/academy/platform/expert_scraping_with_apify/managing_source_code.md
+++ b/sources/academy/platform/expert_scraping_with_apify/managing_source_code.md
@@ -16,7 +16,7 @@ In this brief lesson, we'll discuss how to better manage an Actor's source code.
Thus far, every time we've updated our code on the Apify platform, we've used the `apify push` CLI command; however, this can be problematic for a few reasons - mainly because, if someone else wants to make a change to/maintain your code, they don't have access to it, as it is on your local machine.
-If you're not yet familiar with Git, please get familiar with it through the [Git documentation](https://git-scm.com/docs), then take a quick moment to read about [GitHub integration](/integrations/github) in the Apify docs.
+If you're not yet familiar with Git, please get familiar with it through the [Git documentation](https://git-scm.com/docs), then take a quick moment to read about [GitHub integration](/platform/integrations/github) in the Apify docs.
Also, try to explore the **Multifile editor** in one of the Actors you developed in the previous lessons before moving forward.
diff --git a/sources/academy/platform/expert_scraping_with_apify/migrations_maintaining_state.md b/sources/academy/platform/expert_scraping_with_apify/migrations_maintaining_state.md
index cf5d05baa1..707e64fd7d 100644
--- a/sources/academy/platform/expert_scraping_with_apify/migrations_maintaining_state.md
+++ b/sources/academy/platform/expert_scraping_with_apify/migrations_maintaining_state.md
@@ -18,14 +18,14 @@ When a migration happens, you want to do a so-called "state transition", which m
## Learning đź§ {#learning}
-Read this [article](/actors/development/builds-and-runs/state-persistence) on migrations and dealing with state transitions.
+Read this [article](/platform/actors/development/builds-and-runs/state-persistence) on migrations and dealing with state transitions.
Before moving forward, read about Actor [events](/sdk/js/docs/upgrading/upgrading-to-v3#events) and how to listen for them.
## Knowledge check 📝 {#quiz}
1. Actors have an option in the **Settings** tab to **Restart on error**. Would you use this feature for regular Actors? When would you use this feature?
-2. Migrations happen randomly, but by [aborting **gracefully**](/actors/running/runs-and-builds#aborting-runs), you can simulate a similar situation. Try this out on the platform and observe what happens. What changes occur, and what remains the same for the restarted Actor's run?
+2. Migrations happen randomly, but by [aborting **gracefully**](/platform/actors/running/runs-and-builds#aborting-runs), you can simulate a similar situation. Try this out on the platform and observe what happens. What changes occur, and what remains the same for the restarted Actor's run?
3. Why don't you (usually) need to add any special migration handling code for a standard crawling/scraping Actor? Are there any features in the Crawlee/Apify SDK that handle this under the hood?
4. How can you intercept the migration event? How much time do you have after this event happens and before the Actor migrates?
5. When would you persist data to the default key-value store instead of to a named key-value store?
diff --git a/sources/academy/platform/expert_scraping_with_apify/solutions/handling_migrations.md b/sources/academy/platform/expert_scraping_with_apify/solutions/handling_migrations.md
index 2628ff0914..24399f8df6 100644
--- a/sources/academy/platform/expert_scraping_with_apify/solutions/handling_migrations.md
+++ b/sources/academy/platform/expert_scraping_with_apify/solutions/handling_migrations.md
@@ -230,7 +230,7 @@ That's everything! Now, even if the Actor migrates (or is gracefully aborted and
**A:** It's not best to use this option by default. If it fails, there must be a reason, which would need to be thought through first - meaning that the edge case of failing should be handled when resurrecting the Actor. The state should be persisted beforehand.
-**Q: Migrations happen randomly, but by [aborting gracefully](/actors/running/runs-and-builds#aborting-runs), you can simulate a similar situation. Try this out on the platform and observe what happens. What changes occur, and what remains the same for the restarted Actor's run?**
+**Q: Migrations happen randomly, but by [aborting gracefully](/platform/actors/running/runs-and-builds#aborting-runs), you can simulate a similar situation. Try this out on the platform and observe what happens. What changes occur, and what remains the same for the restarted Actor's run?**
**A:** After aborting or throwing an error mid-process, it manages to start back from where it was upon resurrection.
diff --git a/sources/academy/platform/expert_scraping_with_apify/tasks_and_storage.md b/sources/academy/platform/expert_scraping_with_apify/tasks_and_storage.md
index cf6dc6ae5c..17e31cf6cb 100644
--- a/sources/academy/platform/expert_scraping_with_apify/tasks_and_storage.md
+++ b/sources/academy/platform/expert_scraping_with_apify/tasks_and_storage.md
@@ -22,9 +22,9 @@ Storage allows us to save persistent data for further processing. As you'll lear
## Learning đź§ {#learning}
-- Check out [the docs about Actor tasks](/actors/running/tasks).
-- Read about the [two main storage options](/storage/dataset) on the Apify platform.
-- Understand the [differences between named and unnamed storages](/storage#named-and-unnamed-storages).
+- Check out [the docs about Actor tasks](/platform/actors/running/tasks).
+- Read about the [two main storage options](/platform/storage/dataset) on the Apify platform.
+- Understand the [differences between named and unnamed storages](/platform/storage#named-and-unnamed-storages).
- Learn about the [`Dataset`](/sdk/js/reference/class/Dataset) and [`KeyValueStore`](/sdk/js/reference/class/KeyValueStore) objects in the Apify SDK.
## Knowledge check 📝 {#quiz}
diff --git a/sources/academy/platform/getting_started/creating_actors.md b/sources/academy/platform/getting_started/creating_actors.md
index 0ba7bb10fa..cb208178a2 100644
--- a/sources/academy/platform/getting_started/creating_actors.md
+++ b/sources/academy/platform/getting_started/creating_actors.md
@@ -22,7 +22,7 @@ You have two options:
## Create Actor from existing source code {#existing-source-code}
-If you already have your code hosted by a Git provider, you can use it to create an Actor by linking the repository. If you use GitHub, you can use the [GitHub integration](/integrations/github) to create an Actor from your public or private repository. You can also use GitLab, Bitbucket or other Git providers or external repositories. To see all available options, select **Import from Git**.
+If you already have your code hosted by a Git provider, you can use it to create an Actor by linking the repository. If you use GitHub, you can use the [GitHub integration](/platform/integrations/github) to create an Actor from your public or private repository. You can also use GitLab, Bitbucket or other Git providers or external repositories. To see all available options, select **Import from Git**.
You can also push your existing code from your local machine using [Apify CLI](/cli). This option is useful when you develop your code locally and then you want to push it to Apify Console to run the code as an Actor in the cloud. For details, see [Quick start](/cli/docs/quick-start) in the Apify CLI docs.
@@ -38,7 +38,7 @@ You will end up on a template detail page where you can see all the important in
### Use templates in Web IDE {#web-ide}
-By clicking **Use this template** button you will create the Actor in Apify Console and you will be moved to the **Code** tab with the [Web IDE](/get-started/web-ide) where you can see the code of the template and start editing it.
+By clicking **Use this template** button you will create the Actor in Apify Console and you will be moved to the **Code** tab with the [Web IDE](/platform/actors/development/quick-start/web-ide) where you can see the code of the template and start editing it.
:::tip Web IDE
@@ -125,7 +125,7 @@ The Actor takes the `url` from the input and then:
3. Extracts headings (H1 - H6) from the page.
4. Stores the extracted data.
-The extracted data is stored in the [Dataset](/storage/dataset) where you can preview it and download it. We'll show how to do that later in [Run the Actor](#run-the-actor) section.
+The extracted data is stored in the [Dataset](/platform/storage/dataset) where you can preview it and download it. We'll show how to do that later in [Run the Actor](#run-the-actor) section.
:::tip Customize template
@@ -139,7 +139,7 @@ Learn more about the Actor input and output [in the next page](/academy/getting-
## Build the Actor
-In order to run the Actor, you need to [build](/actors/development/builds-and-runs/builds) it first. Click on the **Build** button at the bottom of the page or **Build now** button right under the code editor.
+In order to run the Actor, you need to [build](/platform/actors/development/builds-and-runs/builds) it first. Click on the **Build** button at the bottom of the page or **Build now** button right under the code editor.

diff --git a/sources/academy/platform/getting_started/inputs_outputs.md b/sources/academy/platform/getting_started/inputs_outputs.md
index 08998b1b58..9555afe4a0 100644
--- a/sources/academy/platform/getting_started/inputs_outputs.md
+++ b/sources/academy/platform/getting_started/inputs_outputs.md
@@ -69,7 +69,7 @@ This step isn't necessary, as the Actor will still be able to take input in JSON
:::tip Learn more
-If you're interested in learning more about how the code works, and what the `INPUT_SCHEMA.json` means, read about [inputs](/sdk/js/docs/examples/accept-user-input) and [adding data to a dataset](/sdk/js/docs/examples/add-data-to-dataset) in the Apify SDK documentation, and refer to the [input schema docs](/actors/development/actor-definition/input-schema/specification/v1#integer).
+If you're interested in learning more about how the code works, and what the `INPUT_SCHEMA.json` means, read about [inputs](/sdk/js/docs/examples/accept-user-input) and [adding data to a dataset](/sdk/js/docs/examples/add-data-to-dataset) in the Apify SDK documentation, and refer to the [input schema docs](/platform/actors/development/actor-definition/input-schema/specification/v1#integer).
:::
@@ -96,7 +96,7 @@ On the results tab, there are a whole lot of options for which format to view/do
There's our solution! Did it work for you as well? Now, we can download the data right from the Dataset tab to be used elsewhere, or even programmatically retrieve it by using [Apify's API](/api/v2) (we'll be discussing how to do this in the next lesson).
-It's important to note that the default dataset of the Actor, which we pushed our solution to, will be retained for 7 days. If we wanted the data to be retained for an indefinite period of time, we'd have to use a named dataset. For more information about named storages vs unnamed storages, read a bit about [data retention on the Apify platform](/storage#data-retention).
+It's important to note that the default dataset of the Actor, which we pushed our solution to, will be retained for 7 days. If we wanted the data to be retained for an indefinite period of time, we'd have to use a named dataset. For more information about named storages vs unnamed storages, read a bit about [data retention on the Apify platform](/platform/storage#data-retention).
## Next up {#next}
diff --git a/sources/academy/platform/scraping_with_apify_and_ai/01_developing_scraper_ai_chat.md b/sources/academy/platform/scraping_with_apify_and_ai/01_developing_scraper_ai_chat.md
index 9590084b84..621cf1fb05 100644
--- a/sources/academy/platform/scraping_with_apify_and_ai/01_developing_scraper_ai_chat.md
+++ b/sources/academy/platform/scraping_with_apify_and_ai/01_developing_scraper_ai_chat.md
@@ -186,7 +186,7 @@ If you're still stuck, open a clean new chat in ChatGPT and try the same prompt
Despite a few flaws, we've successfully created our first working prototype of a price-watching app with no coding knowledge.
-And thanks to Apify, our scraper can [run automatically on a weekly basis](https://docs.apify.com/actors/running/schedules), we have its output [ready to download in a variety of formats](https://docs.apify.com/storage/dataset), we can [monitor its runs](https://docs.apify.com/actors/running/monitoring), and we can [work around anti-scraping measures](https://docs.apify.com/proxy).
+And thanks to Apify, our scraper can [run automatically on a weekly basis](https://docs.apify.com/platform/schedules), we have its output [ready to download in a variety of formats](https://docs.apify.com/platform/storage/dataset), we can [monitor its runs](https://docs.apify.com/platform/monitoring), and we can [work around anti-scraping measures](https://docs.apify.com/platform/proxy).
To improve our project further, we'd copy the code, ask ChatGPT to refine it, paste it back into the Web IDE, and rebuild.
diff --git a/sources/academy/platform/scraping_with_apify_and_ai/02_developing_scraper_ai_agent.md b/sources/academy/platform/scraping_with_apify_and_ai/02_developing_scraper_ai_agent.md
index c43ee378cb..f466c22349 100644
--- a/sources/academy/platform/scraping_with_apify_and_ai/02_developing_scraper_ai_agent.md
+++ b/sources/academy/platform/scraping_with_apify_and_ai/02_developing_scraper_ai_agent.md
@@ -307,7 +307,7 @@ We've done it, the prices save as numbers!
:::tip Specifying output schema
-If we didn't want to always click on **All fields** to see full items, we need to specify an [output schema](https://docs.apify.com/actors/development/actor-definition/output-schema) so that the platform knows what it can expect and how it should display it in the interface. With Cursor, such change is just a single prompt away:
+If we didn't want to always click on **All fields** to see full items, we need to specify an [output schema](https://docs.apify.com/platform/actors/development/actor-definition/output-schema) so that the platform knows what it can expect and how it should display it in the interface. With Cursor, such change is just a single prompt away:
```text
Change the output schema of the Actor
diff --git a/sources/academy/tutorials/api/index.md b/sources/academy/tutorials/api/index.md
index 9fe065de62..4cd998bdd9 100644
--- a/sources/academy/tutorials/api/index.md
+++ b/sources/academy/tutorials/api/index.md
@@ -10,7 +10,7 @@ slug: /api
---
-This section explains how you can run [Apify Actors](/actors) using Apify's [API](/api/v2), retrieve their results, and integrate them into your own product and workflows. You can do this using a raw HTTP client, or you can benefit from using one of our API clients for:
+This section explains how you can run [Apify Actors](/platform/actors) using Apify's [API](/api/v2), retrieve their results, and integrate them into your own product and workflows. You can do this using a raw HTTP client, or you can benefit from using one of our API clients for:
- [JavaScript](/api/client/js/)
- [Python](/api/client/python)
diff --git a/sources/academy/tutorials/api/run_actor_and_retrieve_data_via_api.md b/sources/academy/tutorials/api/run_actor_and_retrieve_data_via_api.md
index 48df68945d..06ba1119d0 100644
--- a/sources/academy/tutorials/api/run_actor_and_retrieve_data_via_api.md
+++ b/sources/academy/tutorials/api/run_actor_and_retrieve_data_via_api.md
@@ -11,7 +11,7 @@ slug: /api/run-actor-and-retrieve-data-via-api
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-The most popular way of [integrating](https://help.apify.com/en/collections/1669769-integrations) the Apify platform with an external project/application is by programmatically running an [Actor](/actors) or [task](/actors/running/tasks), waiting for it to complete its run, then collecting its data and using it within the project. Follow this tutorial to have an idea on how to approach this, it isn't as complicated as it sounds!
+The most popular way of [integrating](https://help.apify.com/en/collections/1669769-integrations) the Apify platform with an external project/application is by programmatically running an [Actor](/platform/actors) or [task](/platform/actors/running/tasks), waiting for it to complete its run, then collecting its data and using it within the project. Follow this tutorial to have an idea on how to approach this, it isn't as complicated as it sounds!
> Remember to check out our [API documentation](/api/v2) with examples in different languages and a live API console. We also recommend testing the API with a desktop client like [Postman](https://www.postman.com/) or [Insomnia](https://insomnia.rest).
@@ -25,7 +25,7 @@ If the Actor being run via API takes 5 minutes or less to complete a typical run
## Run an Actor or task {#run-an-actor-or-task}
-> If you are unsure about the differences between an Actor and a task, you can read about them in the [tasks](/actors/running/tasks) documentation. In brief, tasks are pre-configured inputs for Actors.
+> If you are unsure about the differences between an Actor and a task, you can read about them in the [tasks](/platform/actors/running/tasks) documentation. In brief, tasks are pre-configured inputs for Actors.
The API endpoints and usage (for both sync and async) for [Actors](/api/v2#tag/ActorsRun-collection/operation/act_runs_post) and [tasks](/api/v2/actor-task-runs-post) are essentially the same.
@@ -33,7 +33,7 @@ To run, or **call**, an Actor/task, you will need a few things:
- The name or ID of the Actor/task. The name looks like `username~actorName` or `username~taskName`. The ID can be retrieved on the **Settings** page of the Actor/task.
-- Your [API token](/integrations), which you can find on the **API & Integrations** page in [Apify Console](https://console.apify.com/settings/integrations) (do not share it with anyone!).
+- Your [API token](/platform/integrations), which you can find on the **API & Integrations** page in [Apify Console](https://console.apify.com/settings/integrations) (do not share it with anyone!).
- Possibly an input, which is passed in JSON format as the request's **body**.
@@ -61,7 +61,7 @@ We can also add settings for the Actor (which will override the default settings
https://api.apify.com/v2/actors/ACTOR_NAME_OR_ID/runs?token=YOUR_TOKEN&memory=8192&build=beta
```
-This works in almost exactly the same way for both Actors and tasks; however, for tasks, there is no reason to specify a [`build`](/actors/development/builds-and-runs/builds) parameter, as a task already has only one specific Actor build which cannot be changed with query parameters.
+This works in almost exactly the same way for both Actors and tasks; however, for tasks, there is no reason to specify a [`build`](/platform/actors/development/builds-and-runs/builds) parameter, as a task already has only one specific Actor build which cannot be changed with query parameters.
### Input JSON {#input-json}
@@ -149,7 +149,7 @@ If your synchronous run exceeds the 5-minute time limit, the response will be a
### Synchronous runs with dataset output {#synchronous-runs-with-dataset-output}
-Most Actor runs will store their data in the default [dataset](/storage/dataset). The Apify API provides **run-sync-get-dataset-items** endpoints for [Actors](/api/v2/act-run-sync-get-dataset-items-post) and [tasks](/api/v2/actor-task-run-sync-get-dataset-items-post), which allow you to run an Actor and receive the items from the default dataset once the run has finished.
+Most Actor runs will store their data in the default [dataset](/platform/storage/dataset). The Apify API provides **run-sync-get-dataset-items** endpoints for [Actors](/api/v2/act-run-sync-get-dataset-items-post) and [tasks](/api/v2/actor-task-run-sync-get-dataset-items-post), which allow you to run an Actor and receive the items from the default dataset once the run has finished.
Here is a Node.js example of calling a task via the API and logging the dataset items to the console:
@@ -186,7 +186,7 @@ items.forEach((item) => {
### Synchronous runs with key-value store output {#synchronous-runs-with-key-value-store-output}
-[Key-value stores](/storage/key-value-store) are useful for storing files like images, HTML snapshots, or JSON data. The Apify API provides **run-sync** endpoints for [Actors](/api/v2/act-run-sync-post) and [tasks](/api/v2/actor-task-run-sync-post), which allow you to run a specific task and receive the output. By default, they return the `OUTPUT` record from the default key-value store.
+[Key-value stores](/platform/storage/key-value-store) are useful for storing files like images, HTML snapshots, or JSON data. The Apify API provides **run-sync** endpoints for [Actors](/api/v2/act-run-sync-post) and [tasks](/api/v2/actor-task-run-sync-post), which allow you to run a specific task and receive the output. By default, they return the `OUTPUT` record from the default key-value store.
## Asynchronous flow {#asynchronous-flow}
@@ -218,13 +218,13 @@ Once again, the final response will be the **run info object**; however, now its
#### Webhooks {#webhooks}
-If you have a server, [webhooks](/integrations/webhooks) are the most elegant and flexible solution for integrations with Apify. You can set up a webhook for any Actor or task, and that webhook will send a POST request to your server after an [event](/integrations/webhooks/events) has occurred.
+If you have a server, [webhooks](/platform/integrations/webhooks) are the most elegant and flexible solution for integrations with Apify. You can set up a webhook for any Actor or task, and that webhook will send a POST request to your server after an [event](/platform/integrations/webhooks/events) has occurred.
Usually, this event is a successfully finished run, but you can also set a different webhook for failed runs, etc.

-The webhook will send you a pretty complicated [JSON object](/integrations/webhooks/actions), but usually, you would only be interested in the `resource` object within the response, which is like the **run info** JSON from the previous sections. We can leave the payload template as is for our example since it is all we need.
+The webhook will send you a pretty complicated [JSON object](/platform/integrations/webhooks/actions), but usually, you would only be interested in the `resource` object within the response, which is like the **run info** JSON from the previous sections. We can leave the payload template as is for our example since it is all we need.
Once your server receives this request from the webhook, you know that the event happened, and you can ask for the complete data.
@@ -248,11 +248,11 @@ Once a status of `SUCCEEDED` or `FAILED` has been received, we know the run has
Unless you used the [synchronous call](#synchronous-flow) mentioned above, you will have to make one additional request to the API to retrieve the data.
-The **run info** JSON also contains the IDs of the default [dataset](/storage/dataset) and [key-value store](/storage/key-value-store) that are allocated separately for each run, which is usually everything you need. The fields are called `defaultDatasetId` and `defaultKeyValueStoreId`.
+The **run info** JSON also contains the IDs of the default [dataset](/platform/storage/dataset) and [key-value store](/platform/storage/key-value-store) that are allocated separately for each run, which is usually everything you need. The fields are called `defaultDatasetId` and `defaultKeyValueStoreId`.
#### Retrieving a dataset {#retrieve-a-dataset}
-> If you are scraping products, or any list of items with similar fields, the [dataset](/storage/dataset) should be your storage of choice. Don't forget though, that dataset items are immutable. This means that you can only add to the dataset, and not change the content that is already inside it.
+> If you are scraping products, or any list of items with similar fields, the [dataset](/platform/storage/dataset) should be your storage of choice. Don't forget though, that dataset items are immutable. This means that you can only add to the dataset, and not change the content that is already inside it.
To retrieve the data from a dataset, send a GET request to the [**Get dataset items**](/api/v2/dataset-items-get) endpoint and pass the `defaultDatasetId` into the URL. For a GET request to the default dataset, no token is needed.
@@ -272,7 +272,7 @@ https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&offset=250000
#### Retrieving a key-value store {#retrieve-a-key-value-store}
-> [Key-value stores](/storage/key-value-store) are mainly useful if you have a single output or any kind of files that cannot be [stringified](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) (such as images or PDFs).
+> [Key-value stores](/platform/storage/key-value-store) are mainly useful if you have a single output or any kind of files that cannot be [stringified](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) (such as images or PDFs).
When you want to retrieve something from a key-value store, the `defaultKeyValueStoreId` is _not_ enough. You also need to know the name (or **key**) of the record you want to retrieve.
diff --git a/sources/academy/tutorials/api/using_apify_from_php.md b/sources/academy/tutorials/api/using_apify_from_php.md
index f5959ddc1a..f491f86827 100644
--- a/sources/academy/tutorials/api/using_apify_from_php.md
+++ b/sources/academy/tutorials/api/using_apify_from_php.md
@@ -79,7 +79,7 @@ $data = $parsedResponse['data'];
echo \json_encode($data, JSON_PRETTY_PRINT);
```
-You should see information about the run, including its ID and the ID of its default [dataset](/storage/dataset). Take note of these, we will need them later.
+You should see information about the run, including its ID and the ID of its default [dataset](/platform/storage/dataset). Take note of these, we will need them later.
## Getting the results from dataset
@@ -125,7 +125,7 @@ All the available parameters are described in [our API reference](/api/v2/datase
## Getting the results from key-value stores
-Datasets are great for structured data, but are not suited for binary files like images or PDFs. In these cases, Actors store their output in [key-value stores](/storage/key-value-store). One such Actor is the **HTML String To PDF** ([mhamas/html-string-to-pdf](https://apify.com/mhamas/html-string-to-pdf)) converter. Let's run it.
+Datasets are great for structured data, but are not suited for binary files like images or PDFs. In these cases, Actors store their output in [key-value stores](/platform/storage/key-value-store). One such Actor is the **HTML String To PDF** ([mhamas/html-string-to-pdf](https://apify.com/mhamas/html-string-to-pdf)) converter. Let's run it.
```php
$response = $client->post('acts/mhamas~html-string-to-pdf/runs', [
@@ -202,7 +202,7 @@ file_put_contents(__DIR__ . '/hi-world.pdf', $response->getBody());
## Webhooks
-For Actors that take longer to run, we can use [webhooks](/integrations/webhooks). A webhook is an HTML POST request that is sent to a specified URL when an Actor's status changes. We can use them as a kind of notification that is sent when your run finishes. You can set them up using query parameters. If we used webhooks in the example above, it would look like this:
+For Actors that take longer to run, we can use [webhooks](/platform/integrations/webhooks). A webhook is an HTML POST request that is sent to a specified URL when an Actor's status changes. We can use them as a kind of notification that is sent when your run finishes. You can set them up using query parameters. If we used webhooks in the example above, it would look like this:
```php
// Webhooks need to be passed as a base64-encoded JSON string
@@ -227,7 +227,7 @@ $response = $client->post('acts/mhamas~html-string-to-pdf/runs', [
## How to use Apify Proxy
-Let's use another important feature: [proxy](/proxy). If you want to make sure that your server's IP address won't get blocked somewhere when making requests, you can use the automatic proxy selection mode.
+Let's use another important feature: [proxy](/platform/proxy). If you want to make sure that your server's IP address won't get blocked somewhere when making requests, you can use the automatic proxy selection mode.
```php
$client = new \GuzzleHttp\Client([
@@ -258,7 +258,7 @@ $response = $client->get("https://api.apify.com/v2/browser-info");
echo $response->getBody();
```
-[See the proxy docs](/proxy) for more details on using specific proxies.
+[See the proxy docs](/platform/proxy) for more details on using specific proxies.
## Feedback
diff --git a/sources/academy/tutorials/apify_actors/adding_rapidapi_project.md b/sources/academy/tutorials/apify_actors/adding_rapidapi_project.md
index 41bda37656..fa2f8ea595 100644
--- a/sources/academy/tutorials/apify_actors/adding_rapidapi_project.md
+++ b/sources/academy/tutorials/apify_actors/adding_rapidapi_project.md
@@ -120,7 +120,7 @@ Once you’ve saved the settings, go to the **Standby** tab, and click the **Tes
Ready to monetize your Actor and start earning? Check out these guides:
-- [Set up monetization for your Actor](https://docs.apify.com/actors/publishing/monetize)
-- [Publish your Actor on Apify Store](https://docs.apify.com/actors/publishing/publish)
+- [Set up monetization for your Actor](https://docs.apify.com/platform/actors/publishing/monetize)
+- [Publish your Actor on Apify Store](https://docs.apify.com/platform/actors/publishing/publish)
You can also extend your Actor with custom logic and leverage additional Apify platform features, such as storage or web scraping capabilities.
diff --git a/sources/academy/tutorials/apify_scrapers/cheerio_scraper.md b/sources/academy/tutorials/apify_scrapers/cheerio_scraper.md
index eb685aee07..586a835b40 100644
--- a/sources/academy/tutorials/apify_scrapers/cheerio_scraper.md
+++ b/sources/academy/tutorials/apify_scrapers/cheerio_scraper.md
@@ -502,7 +502,7 @@ Thank you for reading this whole tutorial! Really! It's important to us that our
## What's next
* Check out the [Apify SDK](https://docs.apify.com/sdk) and its [Getting started](https://docs.apify.com/sdk/js/docs/guides/apify-platform) tutorial if you'd like to try building your own Actors. It's a bit more complex and involved than writing a `pageFunction`, but it allows you to fine-tune all the details of your scraper to your liking.
-* [Take a deep dive into Actors](/actors), from how they work to [publishing](/actors/publishing) them in Apify Store, and even [making money](https://blog.apify.com/make-regular-passive-income-developing-web-automation-actors-b0392278d085/) on Actors.
+* [Take a deep dive into Actors](/platform/actors), from how they work to [publishing](/platform/actors/publishing) them in Apify Store, and even [making money](https://blog.apify.com/make-regular-passive-income-developing-web-automation-actors-b0392278d085/) on Actors.
* Found out you're not into the coding part but would still to use Apify Actors? Check out our [ready-made solutions](https://apify.com/store) or [order a custom Actor](https://apify.com/contact-sales) from an Apify-certified developer.
diff --git a/sources/academy/tutorials/apify_scrapers/getting_started.md b/sources/academy/tutorials/apify_scrapers/getting_started.md
index 061b969822..9b05130eba 100644
--- a/sources/academy/tutorials/apify_scrapers/getting_started.md
+++ b/sources/academy/tutorials/apify_scrapers/getting_started.md
@@ -17,7 +17,7 @@ Welcome to the getting started tutorial! It will walk you through creating your
It doesn't matter whether you arrived here from **Web Scraper** ([apify/web-scraper](https://apify.com/apify/web-scraper)), **Puppeteer Scraper** ([apify/puppeteer-scraper](https://apify.com/apify/puppeteer-scraper)) or **Cheerio Scraper** ([apify/cheerio-scraper](https://apify.com/apify/cheerio-scraper)). All of them are **Actors** and for now, let's think of an **Actor** as an application that you can use with your own configuration. **apify/web-scraper** is therefore an application called **web-scraper**, built by **apify**, that you can configure to scrape any webpage. We call these configurations **tasks**.
-> If you need help choosing the right scraper, see this [great article](https://help.apify.com/en/articles/3024655-choosing-the-right-solution). If you want to learn more about Actors in general, you can read our [Actors page](https://apify.com/actors) or [browse the documentation](/actors).
+> If you need help choosing the right scraper, see this [great article](https://help.apify.com/en/articles/3024655-choosing-the-right-solution). If you want to learn more about Actors in general, you can read our [Actors page](https://apify.com/actors) or [browse the documentation](/platform/actors).
You can create 10 different **tasks** for 10 different websites, with very different options, but there will always be just one **Actor**, the `apify/*-scraper` you chose. This is the essence of tasks. They are nothing but **saved configurations** of the Actor that you can run repeatedly.
@@ -35,7 +35,7 @@ This takes you to the **Input and options** tab of the task configuration. Befor
Scroll down to the **Performance and limits** section and set the **Max pages per run** option to **10**. This tells your task to finish after 10 pages have been visited. We don't need to crawl the whole domain to see that the Actor works.
-> This also helps with keeping your [compute unit](/actors/running/usage-and-resources) (CU) consumption low. To get an idea, our free plan includes 10 CUs and this run will consume about 0.04 CU, so you can run it 250 times a month for free. If you accidentally go over the limit, no worries, we won't charge you for it. You just won't be able to run more tasks that month.
+> This also helps with keeping your [compute unit](/platform/actors/running/usage-and-resources) (CU) consumption low. To get an idea, our free plan includes 10 CUs and this run will consume about 0.04 CU, so you can run it 250 times a month for free. If you accidentally go over the limit, no worries, we won't charge you for it. You just won't be able to run more tasks that month.
Now click **Save & Run**! *(in the bottom-left part of your screen)*
@@ -77,7 +77,7 @@ You can find all the task runs and their detail pages here. Every time you start
### Webhooks
-Webhooks are a feature that help keep you aware of what's happening with your tasks. You can set them up to inform you when a task starts, finishes, fails etc., or you can even use them to run more tasks, depending on the outcome of the original one. [See webhooks documentation](/integrations/webhooks).
+Webhooks are a feature that help keep you aware of what's happening with your tasks. You can set them up to inform you when a task starts, finishes, fails etc., or you can even use them to run more tasks, depending on the outcome of the original one. [See webhooks documentation](/platform/integrations/webhooks).
### Information
@@ -254,7 +254,7 @@ When a **Pseudo URL** is set, the scraper attempts to enqueue matching links on
The `pageFunction` may only return nothing, `null`, `Object` or `Object[]`. If an `Object` is returned, it will be saved as a single result. Returning an `Array` of `Objects` will save each item in the array as a result.
-The scraping results are saved in a [dataset](/storage/dataset) (one of the tabs in the run console, as you may remember). It behaves like a table. Each item is a row in the table and its properties are its columns. Returning the following `Object`:
+The scraping results are saved in a [dataset](/platform/storage/dataset) (one of the tabs in the run console, as you may remember). It behaves like a table. Each item is a row in the table and its properties are its columns. Returning the following `Object`:
```js
async function pageFunction(context) {
diff --git a/sources/academy/tutorials/apify_scrapers/puppeteer_scraper.md b/sources/academy/tutorials/apify_scrapers/puppeteer_scraper.md
index 16067dbb52..130713691a 100644
--- a/sources/academy/tutorials/apify_scrapers/puppeteer_scraper.md
+++ b/sources/academy/tutorials/apify_scrapers/puppeteer_scraper.md
@@ -822,7 +822,7 @@ Thank you for reading this whole tutorial! Really! It's important to us that our
## What's next
- Check out the [Apify SDK](https://docs.apify.com/sdk) and its [Getting started](https://docs.apify.com/sdk/js/docs/guides/apify-platform) tutorial if you'd like to try building your own Actors. It's a bit more complex and involved than writing a `pageFunction`, but it allows you to fine-tune all the details of your scraper to your liking.
-- [Take a deep dive into Actors](/actors), from how they work to [publishing](/actors/publishing) them in Apify Store, and even [making money](https://blog.apify.com/make-regular-passive-income-developing-web-automation-actors-b0392278d085/) on Actors.
+- [Take a deep dive into Actors](/platform/actors), from how they work to [publishing](/platform/actors/publishing) them in Apify Store, and even [making money](https://blog.apify.com/make-regular-passive-income-developing-web-automation-actors-b0392278d085/) on Actors.
- Found out you're not into the coding part but would still to use Apify Actors? Check out our [ready-made solutions](https://apify.com/store) or [order a custom Actor](https://apify.com/contact-sales) from an Apify-certified developer.
diff --git a/sources/academy/tutorials/apify_scrapers/web_scraper.md b/sources/academy/tutorials/apify_scrapers/web_scraper.md
index 7bdeb0fb75..3b468e198f 100644
--- a/sources/academy/tutorials/apify_scrapers/web_scraper.md
+++ b/sources/academy/tutorials/apify_scrapers/web_scraper.md
@@ -556,7 +556,7 @@ Thank you for reading this whole tutorial! Really! It's important to us that our
## What's next
- Check out the [Apify SDK](https://docs.apify.com/sdk) and its [Getting started](https://docs.apify.com/sdk/js/docs/guides/apify-platform) tutorial if you'd like to try building your own Actors. It's a bit more complex and involved than writing a `pageFunction`, but it allows you to fine-tune all the details of your scraper to your liking.
-- [Take a deep dive into Actors](/actors), from how they work to [publishing](/actors/publishing) them in Apify Store, and even [making money](https://blog.apify.com/make-regular-passive-income-developing-web-automation-actors-b0392278d085/) on Actors.
+- [Take a deep dive into Actors](/platform/actors), from how they work to [publishing](/platform/actors/publishing) them in Apify Store, and even [making money](https://blog.apify.com/make-regular-passive-income-developing-web-automation-actors-b0392278d085/) on Actors.
- Found out you're not into the coding part but would still to use Apify Actors? Check out our [ready-made solutions](https://apify.com/store) or [order a custom Actor](https://apify.com/contact-sales) from an Apify-certified developer.
diff --git a/sources/academy/tutorials/node_js/analyzing_pages_and_fixing_errors.md b/sources/academy/tutorials/node_js/analyzing_pages_and_fixing_errors.md
index baabdb545a..d653a6affd 100644
--- a/sources/academy/tutorials/node_js/analyzing_pages_and_fixing_errors.md
+++ b/sources/academy/tutorials/node_js/analyzing_pages_and_fixing_errors.md
@@ -123,7 +123,7 @@ Logging and snapshotting are great tools but once you reach a certain run size,
## With the Apify SDK {#with-the-apify-sdk}
-This example extends our snapshot solution above by creating a [named dataset](/storage#named-and-unnamed-storages) (named datasets have infinite retention), where we will accumulate error reports. Those reports will explain what happened and will link to a saved snapshot, so we can do a quick visual check.
+This example extends our snapshot solution above by creating a [named dataset](/platform/storage#named-and-unnamed-storages) (named datasets have infinite retention), where we will accumulate error reports. Those reports will explain what happened and will link to a saved snapshot, so we can do a quick visual check.
```js
import { Actor } from 'apify';
diff --git a/sources/academy/tutorials/node_js/apify_free_google_serp_api.md b/sources/academy/tutorials/node_js/apify_free_google_serp_api.md
index 2888b054bf..ceafc6177a 100644
--- a/sources/academy/tutorials/node_js/apify_free_google_serp_api.md
+++ b/sources/academy/tutorials/node_js/apify_free_google_serp_api.md
@@ -10,7 +10,7 @@ You need to regularly grab SERP data about your target keywords? Apify provides

-Hit `Save & Run` and you'll have the downloaded data as soon as the query finishes. To have it run at a regular frequency, you can set up the task to run on an [automatic schedule](/actors/running/schedules#setting-up-a-new-schedule).
+Hit `Save & Run` and you'll have the downloaded data as soon as the query finishes. To have it run at a regular frequency, you can set up the task to run on an [automatic schedule](/platform/schedules#setting-up-a-new-schedule).
To run from the API, send a [synchronous POST request](/api/v2/actor-task-run-sync-get-dataset-items-post) to an endpoint such as `https://api.apify.com/v2/actors/TASK_NAME_OR_ID/runs?token=YOUR_TOKEN`. Include any required input in a JSON object in the request's body.
diff --git a/sources/academy/tutorials/node_js/filter_blocked_requests_using_sessions.md b/sources/academy/tutorials/node_js/filter_blocked_requests_using_sessions.md
index c9c4131268..13fcdb4f4c 100644
--- a/sources/academy/tutorials/node_js/filter_blocked_requests_using_sessions.md
+++ b/sources/academy/tutorials/node_js/filter_blocked_requests_using_sessions.md
@@ -21,13 +21,13 @@ You want to crawl a website with a proxy pool, but most of your proxies are bloc
5. The proxies actually got banned before anyone used them to crawl the website because they use anti-bot protection that bans proxies across websites (e.g. Cloudflare).
-Nobody can make sure that a proxy will work infinitely. The only real solution to this problem is to use [residential proxies](/proxy/residential-proxy), but they can sometimes be too costly.
+Nobody can make sure that a proxy will work infinitely. The only real solution to this problem is to use [residential proxies](/platform/proxy/residential-proxy), but they can sometimes be too costly.
However, usually, at least some of our proxies work. To crawl successfully, it is therefore imperative to handle blocked requests properly. You first need to discover that you are blocked, which usually means that either your request returned status greater or equal to 400 (it didn't return the proper response) or that the page displayed a captcha. To ensure that this bad request is retried, you usually throw an error and it gets automatically retried later (our [SDK](/sdk/js/) handles this for you). Check out [this article](https://docs.apify.com/academy/node-js/handle-blocked-requests-puppeteer) as inspiration for how to handle this situation with `PuppeteerCrawler`Â class.
## Solution
-Now we are able to retry bad requests and eventually unless all of our proxies get banned, we should be able to successfully crawl what we want. The problem is that it takes too long and our log is full of errors. Fortunately, we can overcome this with [proxy sessions](/proxy/datacenter-proxy#username-parameters) (look at the proxy and SDK documentation for how to use them in your Actors.)
+Now we are able to retry bad requests and eventually unless all of our proxies get banned, we should be able to successfully crawl what we want. The problem is that it takes too long and our log is full of errors. Fortunately, we can overcome this with [proxy sessions](/platform/proxy/datacenter-proxy#username-parameters) (look at the proxy and SDK documentation for how to use them in your Actors.)
First we define `sessions` Â object at the top of our code (in global scope) to hold the state of our working sessions.
diff --git a/sources/academy/tutorials/node_js/handle_blocked_requests_puppeteer.md b/sources/academy/tutorials/node_js/handle_blocked_requests_puppeteer.md
index fb6402e588..e762716b0b 100644
--- a/sources/academy/tutorials/node_js/handle_blocked_requests_puppeteer.md
+++ b/sources/academy/tutorials/node_js/handle_blocked_requests_puppeteer.md
@@ -5,7 +5,7 @@ sidebar_position: 15.9
slug: /node-js/handle-blocked-requests-puppeteer
---
-One of the main defense mechanisms websites use to ensure they are not scraped by bots is allowing only a limited number of requests from a specific IP address. That's why Apify provides a [proxy](https://docs.apify.com/proxy) component with intelligent rotation. With a large enough pool of proxies, you can multiply the number of allowed requests per day to cover your crawling needs. Let's look at how we can rotate proxies when using our [JavaScript SDK](https://github.com/apify/apify-sdk-js).
+One of the main defense mechanisms websites use to ensure they are not scraped by bots is allowing only a limited number of requests from a specific IP address. That's why Apify provides a [proxy](https://docs.apify.com/platform/proxy) component with intelligent rotation. With a large enough pool of proxies, you can multiply the number of allowed requests per day to cover your crawling needs. Let's look at how we can rotate proxies when using our [JavaScript SDK](https://github.com/apify/apify-sdk-js).
> Getting around website defense mechanisms when crawling.
diff --git a/sources/academy/tutorials/node_js/scraping_urls_list_from_google_sheets.md b/sources/academy/tutorials/node_js/scraping_urls_list_from_google_sheets.md
index a7fd2e84a7..fa0c546a7d 100644
--- a/sources/academy/tutorials/node_js/scraping_urls_list_from_google_sheets.md
+++ b/sources/academy/tutorials/node_js/scraping_urls_list_from_google_sheets.md
@@ -5,7 +5,7 @@ sidebar_position: 15
slug: /node-js/scraping-urls-list-from-google-sheets
---
-You can export URLs from [Google Sheets](https://workspace.google.com/products/sheets/) such as [this one](https://docs.google.com/spreadsheets/d/1-2mUcRAiBbCTVA5KcpFdEYWflLMLp9DDU3iJutvES4w) directly into an [Actor](/actors)'s Start URLs field.
+You can export URLs from [Google Sheets](https://workspace.google.com/products/sheets/) such as [this one](https://docs.google.com/spreadsheets/d/1-2mUcRAiBbCTVA5KcpFdEYWflLMLp9DDU3iJutvES4w) directly into an [Actor](/platform/actors)'s Start URLs field.
1. Make sure the spreadsheet has one sheet and a simple structure to help the Actor find the URLs.
diff --git a/sources/academy/tutorials/python/process_data_using_python.md b/sources/academy/tutorials/python/process_data_using_python.md
index 1614bfbb46..d6030597c2 100644
--- a/sources/academy/tutorials/python/process_data_using_python.md
+++ b/sources/academy/tutorials/python/process_data_using_python.md
@@ -17,7 +17,7 @@ In this tutorial, we will use the Actor we created in the [previous tutorial](/a
## Processing previously scraped data
-In the previous tutorial, we set out to select our next holiday destination based on the forecast of the upcoming weather there. We have written an Actor that scrapes the BBC Weather forecast for the upcoming two weeks for three destinations: Prague, New York, and Honolulu. It then saves the scraped data to a [dataset](/storage/dataset) on the Apify platform.
+In the previous tutorial, we set out to select our next holiday destination based on the forecast of the upcoming weather there. We have written an Actor that scrapes the BBC Weather forecast for the upcoming two weeks for three destinations: Prague, New York, and Honolulu. It then saves the scraped data to a [dataset](/platform/storage/dataset) on the Apify platform.
Now, we need to process the scraped data and make a visualization that will help us decide which location has the best weather, and will therefore become our next holiday destination.
@@ -108,7 +108,7 @@ axes.legend(loc='best')
axes.figure.tight_layout()
```
-As the last step, we need to save the plot to a record in a [key-value store](/storage/key-value-store) on the Apify platform, so that we can access it later. We save the rendered figure with the plot to an in-memory buffer, and then save the contents of that buffer to the default key-value store of the Actor run through its resource subclient.
+As the last step, we need to save the plot to a record in a [key-value store](/platform/storage/key-value-store) on the Apify platform, so that we can access it later. We save the rendered figure with the plot to an in-memory buffer, and then save the contents of that buffer to the default key-value store of the Actor run through its resource subclient.
```py
# Get the resource sub-client for working with the default key-value store of the run
diff --git a/sources/academy/tutorials/python/scrape_data_python.md b/sources/academy/tutorials/python/scrape_data_python.md
index 50e9a16749..440d296958 100644
--- a/sources/academy/tutorials/python/scrape_data_python.md
+++ b/sources/academy/tutorials/python/scrape_data_python.md
@@ -217,7 +217,7 @@ Earlier in this tutorial, we learned how to scrape data from the web in Python u
## Processing previously scraped data
-In the previous tutorial, we set out to select our next holiday destination based on the forecast of the upcoming weather there. We have written an Actor that scrapes the BBC Weather forecast for the upcoming two weeks for three destinations: Prague, New York, and Honolulu. It then saves the scraped data to a [dataset](/storage/dataset) on the Apify platform.
+In the previous tutorial, we set out to select our next holiday destination based on the forecast of the upcoming weather there. We have written an Actor that scrapes the BBC Weather forecast for the upcoming two weeks for three destinations: Prague, New York, and Honolulu. It then saves the scraped data to a [dataset](/platform/storage/dataset) on the Apify platform.
Now, we need to process the scraped data and make a visualization that will help us decide which location has the best weather, and will therefore become our next holiday destination.
@@ -308,7 +308,7 @@ axes.legend(loc='best')
axes.figure.tight_layout()
```
-As the last step, we need to save the plot to a record in a [key-value store](/storage/key-value-store) on the Apify platform, so that we can access it later. We save the rendered figure with the plot to an in-memory buffer, and then save the contents of that buffer to the default key-value store of the Actor run through its resource subclient.
+As the last step, we need to save the plot to a record in a [key-value store](/platform/storage/key-value-store) on the Apify platform, so that we can access it later. We save the rendered figure with the plot to an in-memory buffer, and then save the contents of that buffer to the default key-value store of the Actor run through its resource subclient.
```py
# Get the resource sub-client for working with the default key-value store of the run
diff --git a/sources/academy/webscraping/advanced_web_scraping/crawling/crawling-with-search.md b/sources/academy/webscraping/advanced_web_scraping/crawling/crawling-with-search.md
index 93fccb4ee4..ccd82fa71c 100644
--- a/sources/academy/webscraping/advanced_web_scraping/crawling/crawling-with-search.md
+++ b/sources/academy/webscraping/advanced_web_scraping/crawling/crawling-with-search.md
@@ -73,7 +73,7 @@ Some sites will allow you to construct non-overlapping ranges. For example, you
Non-overlapping ranges should remove the possibility of duplicate products (unless a [listing has multiple values](#can-a-listing-have-more-values)) and the lowest number of pages.
-If the website supports only overlapping ranges (e.g. **$0-$5**, **$5–10**), it is not a big problem. Only a small portion of the listings will be duplicates, and they can be removed using a [request queue](/storage/request-queue).
+If the website supports only overlapping ranges (e.g. **$0-$5**, **$5–10**), it is not a big problem. Only a small portion of the listings will be duplicates, and they can be removed using a [request queue](/platform/storage/request-queue).
#### Can a listing have more values? {#can-a-listing-have-more-values}
diff --git a/sources/academy/webscraping/anti_scraping/index.md b/sources/academy/webscraping/anti_scraping/index.md
index 423318a719..45b081b50e 100644
--- a/sources/academy/webscraping/anti_scraping/index.md
+++ b/sources/academy/webscraping/anti_scraping/index.md
@@ -20,7 +20,7 @@ In development, it is crucial to check and adjust the configurations related to
If you don't have time to read about the theory behind anti-scraping protections to fine-tune your scraping project and instead you need to get unblocked ASAP, here are some quick tips:
-- Use high-quality proxies. [Residential proxies](/proxy/residential-proxy) are the least blocked. You can find many providers out there like Apify, BrightData, Oxylabs, NetNut, etc.
+- Use high-quality proxies. [Residential proxies](/platform/proxy/residential-proxy) are the least blocked. You can find many providers out there like Apify, BrightData, Oxylabs, NetNut, etc.
- Set **real-user-like HTTP settings** and **browser fingerprints**. [Crawlee](https://crawlee.dev/) uses statistically generated realistic HTTP headers and browser fingerprints by default for all of its crawlers.
- Use a browser to pass bot capture challenges. We recommend [Playwright with Firefox](https://crawlee.dev/docs/examples/playwright-crawler-firefox) because it is not that common for scraping. You can also play with [non-headless mode](https://crawlee.dev/api/playwright-crawler/interface/PlaywrightCrawlerOptions#headless) and adjust other [fingerprint settings](https://crawlee.dev/api/browser-pool/interface/FingerprintGeneratorOptions).
- Consider extracting data from **[private APIs](../api_scraping/index.md)** or **mobile app APIs**. They are usually much less protected.
diff --git a/sources/academy/webscraping/scraping_basics_javascript/13_platform.md b/sources/academy/webscraping/scraping_basics_javascript/13_platform.md
index 2e2ee42ec9..7aa9bfea54 100644
--- a/sources/academy/webscraping/scraping_basics_javascript/13_platform.md
+++ b/sources/academy/webscraping/scraping_basics_javascript/13_platform.md
@@ -2,7 +2,7 @@
title: Using a scraping platform with Node.js
sidebar_label: Using a platform
description: Lesson about building a Node.js application for watching prices. Using the Apify platform to deploy a scraper.
-slug: /scraping-basics-javascript/
+slug: /scraping-basics-javascript/platform
---
import LegacyJsCourseAdmonition from '@site/src/components/LegacyJsCourseAdmonition';
@@ -64,7 +64,7 @@ Success: You are logged in to Apify as user1234!
## Turning our program to an Actor
-Every program that runs on the Apify platform first needs to be packaged as a so-called [Actor](https://docs.apify.com/actors) - a standardized container with designated places for input and output.
+Every program that runs on the Apify platform first needs to be packaged as a so-called [Actor](https://docs.apify.com/platform/actors) - a standardized container with designated places for input and output.
Many [Actor templates](https://apify.com/templates/categories/javascript) simplify the setup for new projects. We'll skip those, as we're about to package an existing program.
@@ -183,7 +183,7 @@ When the run finishes, the interface will turn green. On the **Output** tab, we
:::info Accessing data
-We don't need to click buttons to download the data. It's possible to retrieve it also using Apify's API, the `apify datasets` CLI command, or the JavaScript SDK. Learn more in the [Dataset docs](https://docs.apify.com/storage/dataset).
+We don't need to click buttons to download the data. It's possible to retrieve it also using Apify's API, the `apify datasets` CLI command, or the JavaScript SDK. Learn more in the [Dataset docs](https://docs.apify.com/platform/storage/dataset).
:::
@@ -191,15 +191,15 @@ We don't need to click buttons to download the data. It's possible to retrieve i
Now that our scraper is deployed, let's automate its execution. In the Apify web interface, we'll go to [Schedules](https://console.apify.com/schedules). Let's click **Create new**, review the periodicity (default: daily), and specify the Actor to run. Then we'll click **Enable** - that's it!
-From now on, the Actor will execute daily. We can inspect each run, view logs, check collected data, [monitor stats and charts](https://docs.apify.com/actors/running/monitoring), and even set up alerts.
+From now on, the Actor will execute daily. We can inspect each run, view logs, check collected data, [monitor stats and charts](https://docs.apify.com/platform/monitoring), and even set up alerts.

## Adding support for proxies
-If monitoring shows that our scraper frequently fails to reach the Warehouse Shop website, it's likely being blocked. To avoid this, we can [configure proxies](https://docs.apify.com/proxy) so our requests come from different locations, reducing the chances of detection and blocking.
+If monitoring shows that our scraper frequently fails to reach the Warehouse Shop website, it's likely being blocked. To avoid this, we can [configure proxies](https://docs.apify.com/platform/proxy) so our requests come from different locations, reducing the chances of detection and blocking.
-Proxy configuration is a type of [Actor input](https://docs.apify.com/actors/running/input-and-output#input). Crawlee scrapers automatically connect their default dataset to the Actor output, but input must be handled manually. Inside the `.actor` directory we'll create a new file, `inputSchema.json`, with the following content:
+Proxy configuration is a type of [Actor input](https://docs.apify.com/platform/actors/running/input-and-output#input). Crawlee scrapers automatically connect their default dataset to the Actor output, but input must be handled manually. Inside the `.actor` directory we'll create a new file, `inputSchema.json`, with the following content:
```json title=".actor/inputSchema.json"
{
@@ -331,4 +331,4 @@ We've reached the end of the course - congratulations! Together, we've built a p
- Executes periodically without manual intervention, collecting data over time.
- Uses proxies to avoid being blocked.
-We hope this serves as a solid foundation for your next scraping project. Perhaps you'll even [start publishing scrapers](https://docs.apify.com/actors/publishing) for others to use - for a fee?
+We hope this serves as a solid foundation for your next scraping project. Perhaps you'll even [start publishing scrapers](https://docs.apify.com/platform/actors/publishing) for others to use - for a fee?
diff --git a/sources/academy/webscraping/scraping_basics_python/13_platform.md b/sources/academy/webscraping/scraping_basics_python/13_platform.md
index 18730d07b5..6b8b2f86d2 100644
--- a/sources/academy/webscraping/scraping_basics_python/13_platform.md
+++ b/sources/academy/webscraping/scraping_basics_python/13_platform.md
@@ -2,7 +2,7 @@
title: Using a scraping platform with Python
sidebar_label: Using a platform
description: Lesson about building a Python application for watching prices. Using the Apify platform to deploy a scraper.
-slug: /scraping-basics-python/
+slug: /scraping-basics-python/platform
---
**In this lesson, we'll deploy our application to a scraping platform that automatically runs it daily. We'll also use the platform's API to retrieve and work with the results.**
@@ -80,9 +80,9 @@ Info: To install additional Python packages, you need to activate the virtual en
Inside the `warehouse-watchdog` directory, we should see a `src` subdirectory containing several Python files, including `main.py`. This is a sample Beautiful Soup scraper provided by the template.
-The file contains a single asynchronous function, `main()`. At the beginning, it handles [input](https://docs.apify.com/actors/running/input-and-output#input), then passes that input to a small crawler built on top of the Crawlee framework.
+The file contains a single asynchronous function, `main()`. At the beginning, it handles [input](https://docs.apify.com/platform/actors/running/input-and-output#input), then passes that input to a small crawler built on top of the Crawlee framework.
-Every program that runs on the Apify platform first needs to be packaged as a so-called [Actor](https://docs.apify.com/actors) - a standardized container with designated places for input and output. Crawlee scrapers automatically connect their default dataset to the Actor output, but input must be handled explicitly in the code.
+Every program that runs on the Apify platform first needs to be packaged as a so-called [Actor](https://docs.apify.com/platform/actors) - a standardized container with designated places for input and output. Crawlee scrapers automatically connect their default dataset to the Actor output, but input must be handled explicitly in the code.

@@ -266,7 +266,7 @@ When the run finishes, the interface will turn green. On the **Output** tab, we
:::info Accessing data
-We don't need to click buttons to download the data. It's possible to retrieve it also using Apify's API, the `apify datasets` CLI command, or the Python SDK. Learn more in the [Dataset docs](https://docs.apify.com/storage/dataset).
+We don't need to click buttons to download the data. It's possible to retrieve it also using Apify's API, the `apify datasets` CLI command, or the Python SDK. Learn more in the [Dataset docs](https://docs.apify.com/platform/storage/dataset).
:::
@@ -274,13 +274,13 @@ We don't need to click buttons to download the data. It's possible to retrieve i
Now that our scraper is deployed, let's automate its execution. In the Apify web interface, we'll go to [Schedules](https://console.apify.com/schedules). Let's click **Create new**, review the periodicity (default: daily), and specify the Actor to run. Then we'll click **Enable** - that's it!
-From now on, the Actor will execute daily. We can inspect each run, view logs, check collected data, [monitor stats and charts](https://docs.apify.com/actors/running/monitoring), and even set up alerts.
+From now on, the Actor will execute daily. We can inspect each run, view logs, check collected data, [monitor stats and charts](https://docs.apify.com/platform/monitoring), and even set up alerts.

## Adding support for proxies
-If monitoring shows that our scraper frequently fails to reach the Warehouse Shop website, it's likely being blocked. To avoid this, we can [configure proxies](https://docs.apify.com/proxy) so our requests come from different locations, reducing the chances of detection and blocking.
+If monitoring shows that our scraper frequently fails to reach the Warehouse Shop website, it's likely being blocked. To avoid this, we can [configure proxies](https://docs.apify.com/platform/proxy) so our requests come from different locations, reducing the chances of detection and blocking.
Proxy configuration is a type of Actor input, so let's start by reintroducing the necessary code. We'll update `warehouse-watchdog/src/main.py` like this:
@@ -434,4 +434,4 @@ We've reached the end of the course - congratulations! Together, we've built a p
- Executes periodically without manual intervention, collecting data over time.
- Uses proxies to avoid being blocked.
-We hope this serves as a solid foundation for your next scraping project. Perhaps you'll even [start publishing scrapers](https://docs.apify.com/actors/publishing) for others to use - for a fee?
+We hope this serves as a solid foundation for your next scraping project. Perhaps you'll even [start publishing scrapers](https://docs.apify.com/platform/actors/publishing) for others to use - for a fee?
diff --git a/sources/platform/account/index.mdx b/sources/platform/account/index.mdx
deleted file mode 100644
index 097aaa8861..0000000000
--- a/sources/platform/account/index.mdx
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: Account
-description: Manage your Apify account, billing, security, organization, and access permissions.
-sidebar_label: Overview
-sidebar_position: 0
-slug: /account
----
-
-import Card from "@site/src/components/Card";
-import CardGrid from "@site/src/components/CardGrid";
-
-Manage your Apify account settings, billing, security, and team collaboration.
-
-
-
-
-
-
-
-
diff --git a/sources/platform/actors/development/actor_definition/actor_json.md b/sources/platform/actors/development/actor_definition/actor_json.md
index 83b848e79a..c8a42af095 100644
--- a/sources/platform/actors/development/actor_definition/actor_json.md
+++ b/sources/platform/actors/development/actor_definition/actor_json.md
@@ -81,13 +81,13 @@ Actor `name`, `version`, `buildTag`, and `environmentVariables` are currently on
| `dockerContextDir` | Optional | The path to the directory to be used as the Docker context when building the Actor. The path is relative to the location of the `actor.json` file. This property is useful for monorepos containing multiple Actors. Refer to the [Actor monorepos](../deployment/source_types.md#actor-monorepos) section for more details. |
| `readme` | Optional | The path to the README file to be used on the platform. If not specified, the system will look for README files in the `.actor/README.md` and `README.md` paths, in that order of preference. Check out [Apify Marketing Playbook to learn how to write a quality README files](https://apify.notion.site/How-to-create-an-Actor-README-759a1614daa54bee834ee39fe4d98bc2) guidance. |
| `input` | Optional | You can embed your [input schema](./input_schema/index.md) object directly in `actor.json` under the `input` field. You can also provide a path to a custom input schema. If not provided, the input schema at `.actor/INPUT_SCHEMA.json` or `INPUT_SCHEMA.json` is used, in this order of preference. You can also use the `inputSchema` alias interchangeably. |
-| `output` | Optional | You can embed your [output schema](./output_schema/index.md) object directly in `actor.json` under the `output` field. You can also provide a path to a custom output schema. [Read more](/actors/development/actor-definition/output-schema) about Actor output schemas. You can also use the `outputSchema` alias interchangeably. |
+| `output` | Optional | You can embed your [output schema](./output_schema/index.md) object directly in `actor.json` under the `output` field. You can also provide a path to a custom output schema. [Read more](/platform/actors/development/actor-definition/output-schema) about Actor output schemas. You can also use the `outputSchema` alias interchangeably. |
| `changelog` | Optional | The path to the CHANGELOG file displayed in the Information tab of the Actor in Apify Console next to Readme. If not provided, the CHANGELOG at `.actor/CHANGELOG.md` or `CHANGELOG.md` is used, in this order of preference. Your Actor doesn't need to have a CHANGELOG but it is a good practice to keep it updated for published Actors. |
-| `storages.dataset` | Optional | You can define the schema of the items in your dataset under the `storages.dataset` field. This can be either an embedded object or a path to a JSON schema file. [Read more](/actors/development/actor-definition/dataset-schema) about Actor dataset schemas. |
-| `storages.datasets` | Optional | You can define multiple datasets for the Actor under the `storages.datasets` field. This can be an object containing embedded objects or paths to a JSON schema files. [Read more](/actors/development/actor-definition/dataset-schema/multiple-datasets) about multiple dataset schemas. |
+| `storages.dataset` | Optional | You can define the schema of the items in your dataset under the `storages.dataset` field. This can be either an embedded object or a path to a JSON schema file. [Read more](/platform/actors/development/actor-definition/dataset-schema) about Actor dataset schemas. |
+| `storages.datasets` | Optional | You can define multiple datasets for the Actor under the `storages.datasets` field. This can be an object containing embedded objects or paths to a JSON schema files. [Read more](/platform/actors/development/actor-definition/dataset-schema/multiple-datasets) about multiple dataset schemas. |
| `defaultMemoryMbytes` | Optional | Specifies the default amount of memory in megabytes to be used when the Actor is started. Can be an integer or a [dynamic memory expression string](./dynamic_actor_memory/index.md). |
-| `minMemoryMbytes` | Optional | Specifies the minimum amount of memory in megabytes required by the Actor to run. Requires an _integer_ value. If both `minMemoryMbytes` and `maxMemoryMbytes` are set, then `minMemoryMbytes` must be equal or lower than `maxMemoryMbytes`. Refer to the [Usage and resources](https://docs.apify.com/actors/running/usage-and-resources#memory) for more details about memory allocation. |
-| `maxMemoryMbytes` | Optional | Specifies the maximum amount of memory in megabytes required by the Actor to run. It can be used to control the costs of run. Requires an _integer_ value. Refer to the [Usage and resources](https://docs.apify.com/actors/running/usage-and-resources#memory) for more details about memory allocation. |
+| `minMemoryMbytes` | Optional | Specifies the minimum amount of memory in megabytes required by the Actor to run. Requires an _integer_ value. If both `minMemoryMbytes` and `maxMemoryMbytes` are set, then `minMemoryMbytes` must be equal or lower than `maxMemoryMbytes`. Refer to the [Usage and resources](https://docs.apify.com/platform/actors/running/usage-and-resources#memory) for more details about memory allocation. |
+| `maxMemoryMbytes` | Optional | Specifies the maximum amount of memory in megabytes required by the Actor to run. It can be used to control the costs of run. Requires an _integer_ value. Refer to the [Usage and resources](https://docs.apify.com/platform/actors/running/usage-and-resources#memory) for more details about memory allocation. |
| `usesStandbyMode` | Optional | Boolean specifying whether the Actor will have [Standby mode](../programming_interface/actor_standby.md) enabled. |
| `webServerSchema` | Optional | Defines an OpenAPI v3 schema for the web server running in the Actor. This can be either an embedded object or a path to a JSON schema file. Use this when your Actor starts its own HTTP server and you want to describe its interface. |
| `webServerMcpPath` | Optional | The HTTP endpoint path where the Actor exposes its MCP (Model Context Protocol) server functionality. When set, the Actor is recognized as an MCP server. For example, setting `"/mcp"` designates the `/mcp` endpoint as the MCP interface. This path becomes part of the Actor's stable URL when [Standby mode](../programming_interface/actor_standby.md) is enabled. |
diff --git a/sources/platform/actors/development/actor_definition/dataset_schema/validation.md b/sources/platform/actors/development/actor_definition/dataset_schema/validation.md
index 8102adbeb5..fafd46cfca 100644
--- a/sources/platform/actors/development/actor_definition/dataset_schema/validation.md
+++ b/sources/platform/actors/development/actor_definition/dataset_schema/validation.md
@@ -10,7 +10,7 @@ import TabItem from '@theme/TabItem';
To define a schema for a default dataset of an Actor run, you need to set `fields` property in the dataset schema.
-:::info Define a single item
+:::info
The schema defines a single item in the dataset. Be careful not to define the schema as an array, it always needs to be a schema of an object.
@@ -247,4 +247,4 @@ When you configure the dataset fields schema, we generate a field list and measu
- For objects, this tracks the number of keys
- For booleans, this tracks whether the boolean was set to true. Minimum is always 0, but maximum can be either 1 or 0 based on whether at least one item in the dataset has the boolean field set to true.
-You can use them in [monitoring](/actors/running/monitoring#alert-configuration).
+You can use them in [monitoring](../../../../monitoring#alert-configuration).
diff --git a/sources/platform/actors/development/actor_definition/docker.md b/sources/platform/actors/development/actor_definition/docker.md
index ccce6709a8..18f8c48156 100644
--- a/sources/platform/actors/development/actor_definition/docker.md
+++ b/sources/platform/actors/development/actor_definition/docker.md
@@ -5,7 +5,7 @@ slug: /actors/development/actor-definition/dockerfile
sidebar_position: 8
---
-When developing an [Actor](/actors) on the Apify platform, you can choose from a variety of pre-built Docker images to serve as the base for your Actor. These base images come with pre-installed dependencies and tools, making it easier to set up your development environment and ensuring consistent behavior across different environments.
+When developing an [Actor](/sources/platform/actors/index.mdx) on the Apify platform, you can choose from a variety of pre-built Docker images to serve as the base for your Actor. These base images come with pre-installed dependencies and tools, making it easier to set up your development environment and ensuring consistent behavior across different environments.
## Base Docker images
diff --git a/sources/platform/actors/development/actor_definition/index.md b/sources/platform/actors/development/actor_definition/index.md
index 9df2034405..6655f8c368 100644
--- a/sources/platform/actors/development/actor_definition/index.md
+++ b/sources/platform/actors/development/actor_definition/index.md
@@ -14,12 +14,12 @@ Actors have the following elements:
- The main **[actor.json](./actor_json.md)** file contains **metadata** such as the Actor name, description, author, version, and links pointing to the other definition files below.
- **[Dockerfile](./docker.md)** which specifies where is the Actor's source code, how to build it, and run it.
- **Documentation** in the form of a **README.md** file.
-- **[Input](./input_schema/index.md)** and **[dataset schemas](/actors/development/actor-definition/dataset-schema)** that describe what input the Actor requires and what results it produces.
+- **[Input](./input_schema/index.md)** and **[dataset schemas](/platform/actors/development/actor-definition/dataset-schema)** that describe what input the Actor requires and what results it produces.
- Access to an out-of-box **[storage](../../../storage/index.md)** system for Actor data, results, and files.
The documentation and the input/dataset schemas make it possible for people to easily understand what the Actor does, enter the required inputs both in the user interface or API, and integrate the Actor's results with their other workflows. Actors can easily call and interact with each other, enabling building more complex systems on top of simple ones.
-The Apify platform provides an open [API](/api/v2), cron-style [scheduler](/actors/running/schedules), [webhooks](../../../integrations/programming/webhooks/index.md), and [integrations](../../integrations) to services such as Zapier or Make, which make it easy for users to integrate Actors with their existing workflows. Anyone is welcome to [publish Actors](/actors/publishing) in [Apify Store](https://apify.com/store), and you can even [monetize your Actors](/actors/publishing/monetize).
+The Apify platform provides an open [API](/api/v2), cron-style [scheduler](../../schedules), [webhooks](../../../integrations/programming/webhooks/index.md), and [integrations](../../integrations) to services such as Zapier or Make, which make it easy for users to integrate Actors with their existing workflows. Anyone is welcome to [publish Actors](/platform/actors/publishing) in [Apify Store](https://apify.com/store), and you can even [monetize your Actors](/platform/actors/publishing/monetize).
Actors can be developed and run locally and then easily deployed to the Apify platform using the [Apify CLI](/cli) or a [GitHub integration](../../../integrations/programming/github.md). For more details, see the [Deployment](../deployment/index.md) section.
diff --git a/sources/platform/actors/development/actor_definition/input_schema/secret_input.md b/sources/platform/actors/development/actor_definition/input_schema/secret_input.md
index 1a88897488..89c360b17f 100644
--- a/sources/platform/actors/development/actor_definition/input_schema/secret_input.md
+++ b/sources/platform/actors/development/actor_definition/input_schema/secret_input.md
@@ -9,7 +9,7 @@ The secret input feature lets you mark specific input fields of an Actor as sens
:::tip MCP connectors for third-party credentials
-If the third-party service you need exposes a [Model Context Protocol](https://modelcontextprotocol.io/docs/getting-started/intro) (MCP) server, consider using [MCP connectors](/integrations/mcp-connectors) instead. The user authorizes the service once in their account settings, and the Actor receives a connector ID rather than a credential. The service token, API key, or PAT stays server-side and is injected by the MCP Proxy at runtime. For credentials without an MCP server (database passwords, generic API keys), continue to use `isSecret: true`.
+If the third-party service you need exposes a [Model Context Protocol](https://modelcontextprotocol.io/docs/getting-started/intro) (MCP) server, consider using [MCP connectors](/platform/integrations/mcp-connectors) instead. The user authorizes the service once in their account settings, and the Actor receives a connector ID rather than a credential. The service token, API key, or PAT stays server-side and is injected by the MCP Proxy at runtime. For credentials without an MCP server (database passwords, generic API keys), continue to use `isSecret: true`.
:::
diff --git a/sources/platform/actors/development/actor_definition/input_schema/specification.md b/sources/platform/actors/development/actor_definition/input_schema/specification.md
index aeb87950df..ee440c6e25 100644
--- a/sources/platform/actors/development/actor_definition/input_schema/specification.md
+++ b/sources/platform/actors/development/actor_definition/input_schema/specification.md
@@ -890,7 +890,7 @@ As with objects, the sub-schema feature for arrays only works for level 1 sub-pr
Resource type identifies what kind of Apify Platform object is referred to in the input field. For example, the Key-value store resource type can be referred to using a string ID.
-Supported resource types are storage resources (dataset, key-value store, request queue) and [MCP connectors](/integrations/mcp-connectors), which let an Actor call third-party MCP servers using credentials the user has authorized in their account.
+Supported resource types are storage resources (dataset, key-value store, request queue) and [MCP connectors](/platform/integrations/mcp-connectors), which let an Actor call third-party MCP servers using credentials the user has authorized in their account.
For Actor developers, the resource input value is a string representing either the resource ID or (unique) name.
The type of the property is either `string` or `array`. In case of `array` (for multiple resources) the return value is an array of IDs or names.
@@ -937,7 +937,7 @@ Rendered input:
| --- | --- | --- | --- |
| `type` | `string` | Yes | Specifies the type of input - `string` for single value. |
| `editor` | One of
- `resourcePicker`
- `textfield`
- `hidden`
| No | Visual editor used for
the input field. Defaults to `resourcePicker`. |
-| `resourceType` | One of - `dataset`
- `keyValueStore`
- `requestQueue`
- `mcpConnector`
| Yes | Type of Apify Platform resource. Use `mcpConnector` to accept an [MCP connector](/integrations/mcp-connectors) as input. |
+| `resourceType` | One of - `dataset`
- `keyValueStore`
- `requestQueue`
- `mcpConnector`
| Yes | Type of Apify Platform resource. Use `mcpConnector` to accept an [MCP connector](/platform/integrations/mcp-connectors) as input. |
| `resourcePermissions` | Array of strings; allowed values: | Yes for storage resources; not used for `mcpConnector` | Permissions requested for the referenced resource. Use [\"READ\"] for read-only access, or [\"READ\", \"WRITE\"] to allow writes. |
| `pattern` | String | No | Regular expression that will be used to validate the input. If validation fails, the Actor will not run. |
| `minLength` | Integer | No | Minimum length of the string. |
@@ -949,7 +949,7 @@ Rendered input:
| --- | --- | --- | --- |
| `type` | `array` | Yes | Specifies the type of input - `array` for multiple values. |
| `editor` | One of | No | Visual editor used for
the input field. Defaults to `resourcePicker`. |
-| `resourceType` | One of - `dataset`
- `keyValueStore`
- `requestQueue`
- `mcpConnector`
| Yes | Type of Apify Platform resource. Use `mcpConnector` to accept [MCP connectors](/integrations/mcp-connectors) as input. |
+| `resourceType` | One of - `dataset`
- `keyValueStore`
- `requestQueue`
- `mcpConnector`
| Yes | Type of Apify Platform resource. Use `mcpConnector` to accept [MCP connectors](/platform/integrations/mcp-connectors) as input. |
| `resourcePermissions` | Array of strings; allowed values: | Yes for storage resources; not used for `mcpConnector` | Permissions requested for the referenced resources. Use [\"READ\"] for read-only access, or [\"READ\", \"WRITE\"] to allow writes. Applies to each selected resource. |
| `minItems` | Integer | No | Minimum number of items the array can contain. |
| `maxItems` | Integer | No | Maximum number of items the array can contain. |
@@ -969,7 +969,7 @@ This setting defines runtime access only and doesn't change field visibility or
#### MCP connector resource type
-When `resourceType` is `mcpConnector`, the input field accepts one or more [MCP connectors](/integrations/mcp-connectors) the user has authorized in their account. The Actor receives the connector ID (or an array of IDs) as the input value and connects to the upstream MCP server through the Apify MCP Proxy at runtime.
+When `resourceType` is `mcpConnector`, the input field accepts one or more [MCP connectors](/platform/integrations/mcp-connectors) the user has authorized in their account. The Actor receives the connector ID (or an array of IDs) as the input value and connects to the upstream MCP server through the Apify MCP Proxy at runtime.
The `mcpConnector` resource type does not use `resourcePermissions`. Instead, eligibility and per-tool access are declared through a required `mcpServers` field, which lists the upstream MCP server URLs and tool constraints the Actor accepts:
@@ -993,7 +993,7 @@ The `mcpConnector` resource type does not use `resourcePermissions`. Instead, el
}
```
-The same declaration acts as both eligibility filter (the input picker only offers compatible connectors) and runtime ceiling (the proxy rejects tool calls outside the declared set). For the full `mcpServers` schema, behavioral hints, and code samples, see [Build Actors with MCP connectors](/integrations/mcp-connectors/use-in-actors).
+The same declaration acts as both eligibility filter (the input picker only offers compatible connectors) and runtime ceiling (the proxy rejects tool calls outside the declared set). For the full `mcpServers` schema, behavioral hints, and code samples, see [Build Actors with MCP connectors](/platform/integrations/mcp-connectors/use-in-actors).
### Deprecation of `patternKey` and `patternValue`
diff --git a/sources/platform/actors/development/actor_definition/output_schema/index.md b/sources/platform/actors/development/actor_definition/output_schema/index.md
index 3c939e4939..96694a4d10 100644
--- a/sources/platform/actors/development/actor_definition/output_schema/index.md
+++ b/sources/platform/actors/development/actor_definition/output_schema/index.md
@@ -6,7 +6,7 @@ description: Define an output schema to specify where your Actor stores its resu
slug: /actors/development/actor-definition/output-schema
---
-The Actor output schema builds upon the schemas for the [dataset](/actors/development/actor-definition/dataset-schema) and [key-value store](/actors/development/actor-definition/key-value-store-schema). It specifies where an Actor stores its output and defines templates for accessing that output. Apify Console uses these output definitions to display run results, and the Actor run's `GET` endpoint includes them in the output property.
+The Actor output schema builds upon the schemas for the [dataset](/platform/actors/development/actor-definition/dataset-schema) and [key-value store](/platform/actors/development/actor-definition/key-value-store-schema). It specifies where an Actor stores its output and defines templates for accessing that output. Apify Console uses these output definitions to display run results, and the Actor run's `GET` endpoint includes them in the output property.
## Why output schema matters
@@ -263,7 +263,7 @@ After you define `views` and `collections` in `dataset_schema.json` and `key_val
:::note Output schema complements dataset schema
-The output schema defines *where* data is stored and how to access it. The [dataset schema](/actors/development/actor-definition/dataset-schema) defines *what* fields each item contains, including descriptions and examples. Use both schemas together:
+The output schema defines *where* data is stored and how to access it. The [dataset schema](/platform/actors/development/actor-definition/dataset-schema) defines *what* fields each item contains, including descriptions and examples. Use both schemas together:
- Output schema: Declares that results are in the default dataset
- Dataset schema: Describes each field with `title`, `description`, and `example`
diff --git a/sources/platform/actors/development/actor_definition/web_server_schema/index.md b/sources/platform/actors/development/actor_definition/web_server_schema/index.md
index f4628e9937..cf13896e1b 100644
--- a/sources/platform/actors/development/actor_definition/web_server_schema/index.md
+++ b/sources/platform/actors/development/actor_definition/web_server_schema/index.md
@@ -6,7 +6,7 @@ description: Attach an OpenAPI specification to your Actor to enable the interac
slug: /actors/development/actor-definition/web-server-schema
---
-The `webServerSchema` field in `.actor/actor.json` attaches an [OpenAPI 3.x](https://spec.openapis.org/oas/v3.0.3) specification to your Actor. You can define the schema for any Actor that exposes an HTTP server. When you enable [standby mode](/actors/development/programming-interface/standby), Apify Console and Apify Store render an interactive **Standby** tab on the Actor's detail page. From there you can browse endpoints, inspect request and response schemas, and send requests directly from the browser.
+The `webServerSchema` field in `.actor/actor.json` attaches an [OpenAPI 3.x](https://spec.openapis.org/oas/v3.0.3) specification to your Actor. You can define the schema for any Actor that exposes an HTTP server. When you enable [standby mode](/platform/actors/development/programming-interface/standby), Apify Console and Apify Store render an interactive **Standby** tab on the Actor's detail page. From there you can browse endpoints, inspect request and response schemas, and send requests directly from the browser.

@@ -90,9 +90,9 @@ Follow the standard [OpenAPI 3.x format](https://spec.openapis.org/oas/latest.ht
## Build and deploy
-The build process validates `webServerSchema`, similar to other Actor schemas like [input schema](/actors/development/actor-definition/input-schema) and [dataset schema](/actors/development/actor-definition/dataset-schema). If the spec is malformed, the build fails with a validation error.
+The build process validates `webServerSchema`, similar to other Actor schemas like [input schema](/platform/actors/development/actor-definition/input-schema) and [dataset schema](/platform/actors/development/actor-definition/dataset-schema). If the spec is malformed, the build fails with a validation error.
-Once deployed, the **Standby** tab appears automatically on the Actor's detail page when you enable [standby mode](/actors/development/programming-interface/standby). It renders your spec with [Swagger UI](https://swagger.io/tools/swagger-ui/) and handles authentication automatically - Actor users can send requests without configuring API tokens.
+Once deployed, the **Standby** tab appears automatically on the Actor's detail page when you enable [standby mode](/platform/actors/development/programming-interface/standby). It renders your spec with [Swagger UI](https://swagger.io/tools/swagger-ui/) and handles authentication automatically - Actor users can send requests without configuring API tokens.
:::note Servers field is overwritten
@@ -104,5 +104,5 @@ Your `servers` array is replaced with the Actor's standby URL at display time. C
| Field | Description |
| --- | --- |
-| `usesStandbyMode` | Must be `true` for the **Standby** tab to appear. See [standby mode](/actors/development/programming-interface/standby). |
-| `webServerSchema` | The OpenAPI spec that powers the **Standby** tab. Defined in [`.actor/actor.json`](/actors/development/actor-definition/actor-json) as an inline object or a path to a JSON file. |
+| `usesStandbyMode` | Must be `true` for the **Standby** tab to appear. See [standby mode](/platform/actors/development/programming-interface/standby). |
+| `webServerSchema` | The OpenAPI spec that powers the **Standby** tab. Defined in [`.actor/actor.json`](/platform/actors/development/actor-definition/actor-json) as an inline object or a path to a JSON file. |
diff --git a/sources/platform/actors/development/builds_and_runs/runs.md b/sources/platform/actors/development/builds_and_runs/runs.md
index 2e2bb0964e..5c949873d2 100644
--- a/sources/platform/actors/development/builds_and_runs/runs.md
+++ b/sources/platform/actors/development/builds_and_runs/runs.md
@@ -13,7 +13,7 @@ You can start an Actor in several ways:
- Manually from the [Apify Console](https://console.apify.com/actors) UI
- Via the [Apify API](/api/v2/act-runs-post)
-- Using the [Scheduler](/actors/running/schedules) provided by the Apify platform
+- Using the [Scheduler](../../../schedules.md) provided by the Apify platform
- By one of the available [integrations](../../../integrations/index.mdx)
## Input and environment variables
diff --git a/sources/platform/actors/development/deployment/continuous_integration.md b/sources/platform/actors/development/deployment/continuous_integration.md
index 8bf09dc596..4a6ec15eee 100644
--- a/sources/platform/actors/development/deployment/continuous_integration.md
+++ b/sources/platform/actors/development/deployment/continuous_integration.md
@@ -164,8 +164,8 @@ For a more complete Bitbucket setup with automated tests, see the [Bitbucket CI
## Use the Apify GitHub integration {#github-integration}
-Apify Console includes a built-in [GitHub integration](/integrations/github) that links an Actor directly to a GitHub repository. When you connect a repository, Apify automatically rebuilds the Actor on every push - no workflow files or webhook configuration needed.
+Apify Console includes a built-in [GitHub integration](/platform/integrations/github) that links an Actor directly to a GitHub repository. When you connect a repository, Apify automatically rebuilds the Actor on every push - no workflow files or webhook configuration needed.
This is the quickest way to get automated builds running, but it's less flexible than the GitHub Actions approach. It doesn't support running tests before building, managing multiple version tags from different branches, or customizing the build pipeline.
-To set it up, see the [GitHub integration](/integrations/github) documentation.
+To set it up, see the [GitHub integration](/platform/integrations/github) documentation.
diff --git a/sources/platform/actors/development/deployment/index.md b/sources/platform/actors/development/deployment/index.md
index 5ffe326d53..d14cf0c5db 100644
--- a/sources/platform/actors/development/deployment/index.md
+++ b/sources/platform/actors/development/deployment/index.md
@@ -5,7 +5,7 @@ description: Learn how to deploy your Actor to the Apify platform using the Apif
slug: /actors/development/deployment
---
-Deploying an Actor involves uploading your [source code](/actors/development/actor-definition) and [building](/actors/development/builds-and-runs/builds) it on the Apify platform. Once deployed, you can run and scale your Actor in the cloud.
+Deploying an Actor involves uploading your [source code](/platform/actors/development/actor-definition) and [building](/platform/actors/development/builds-and-runs/builds) it on the Apify platform. Once deployed, you can run and scale your Actor in the cloud.
## Deploy using the Apify CLI
diff --git a/sources/platform/actors/development/deployment/source_types.md b/sources/platform/actors/development/deployment/source_types.md
index e0731b1aea..fa3d535123 100644
--- a/sources/platform/actors/development/deployment/source_types.md
+++ b/sources/platform/actors/development/deployment/source_types.md
@@ -17,11 +17,11 @@ This section explains the various sources types available for Apify Actors and h
## Web IDE
-This is the default option when your Actor's source code is hosted on the Apify platform. It offers quick previews and updates to your source code, easy file and directory browsing, and direct testing of the [`INPUT_SCHEMA.json`](/actors/development/actor-definition/input-schema) on the Apify platform.
+This is the default option when your Actor's source code is hosted on the Apify platform. It offers quick previews and updates to your source code, easy file and directory browsing, and direct testing of the [`INPUT_SCHEMA.json`](/platform/actors/development/actor-definition/input-schema) on the Apify platform.
A `Dockerfile` is mandatory for all Actors. When using the default NodeJS Dockerfile, you'll typically need `main.js` for your source code and `package.json` for [npm](https://www.npmjs.com/) package configurations.
-For more information on creating custom Dockerfiles or using Apify's base images, refer to the [Dockerfile](/actors/development/actor-definition/dockerfile#custom-dockerfile) and [base Docker images](/actors/development/actor-definition/dockerfile#base-docker-images) documentation.
+For more information on creating custom Dockerfiles or using Apify's base images, refer to the [Dockerfile](/platform/actors/development/actor-definition/dockerfile#custom-dockerfile) and [base Docker images](/platform/actors/development/actor-definition/dockerfile#base-docker-images) documentation.
## Git repository
@@ -35,7 +35,7 @@ To use a specific directory, add it after the branch/tag, separated by a colon (
:::note GitHub integration
-You can easily set up an integration where the Actor is automatically rebuilt on every commit to the Git repository. For more details, see [GitHub integration](/integrations/github).
+You can easily set up an integration where the Actor is automatically rebuilt on every commit to the Git repository. For more details, see [GitHub integration](/platform/integrations/github).
:::
@@ -69,7 +69,7 @@ Remember that each key can only be used once per Git hosting service (GitHub, Bi
### Actor monorepos
-To manage multiple Actors in a single repository, use the `dockerContextDir` property in the [Actor definition](/actors/development/actor-definition/actor-json) to set the Docker context directory (if not provided then the repository root is used). In the Dockerfile, copy both the Actor's source and any shared code into the Docker image.
+To manage multiple Actors in a single repository, use the `dockerContextDir` property in the [Actor definition](/platform/actors/development/actor-definition/actor-json) to set the Docker context directory (if not provided then the repository root is used). In the Dockerfile, copy both the Actor's source and any shared code into the Docker image.
To enable sharing Dockerfiles between multiple Actors, the Actor build process passes the `ACTOR_PATH_IN_DOCKER_CONTEXT` build argument to the Docker build.
It contains the relative path from `dockerContextDir` to the directory selected as the root of the Actor in Apify Console (the "directory" part of the Actor's git URL).
diff --git a/sources/platform/actors/development/index.md b/sources/platform/actors/development/index.md
index 290647092d..3c14545181 100644
--- a/sources/platform/actors/development/index.md
+++ b/sources/platform/actors/development/index.md
@@ -8,43 +8,40 @@ slug: /actors/development
This section will guide you through the whole story of [Actor](../index.mdx) development.
-New to building Actors? Start with [Get started](/get-started) to create your first one in minutes. This section covers the technical Actor model in depth, from the Actor definition through to the [Performance](/actors/development/performance) section, where you learn to fine-tune your Actor to get the most out of the Apify platform.
-
-## Technology stack
-
-Any code that can run inside of a Docker container can be turned into an Apify [Actor](../index.mdx). This gives you freedom in choosing your technical stack, including programming language and technologies.
-
-But to fully benefit from running on top of the Apify platform, we recommend you choose either JavaScript/Node.js or Python, where Apify provides first-level support regarding its SDK, API clients, and learning materials.
-
-For these languages, you can also [choose from many code templates](https://apify.com/templates) that help you to kickstart your project quickly.
+You can follow chapters sequentially from [Quick start](/platform/actors/development/quick-start), where you learn how to create your first Actor in just a few minutes, through the more technical sections describing the whole Actor model, up to the [Performance](/sources/platform/actors/development/performance.md) section, where you learn how to fine-tune your Actor to get the most out of the Apify platform.
import Card from "@site/src/components/Card";
import CardGrid from "@site/src/components/CardGrid";
+
diff --git a/sources/platform/actors/development/programming_interface/environment_variables.md b/sources/platform/actors/development/programming_interface/environment_variables.md
index fd47075e68..d457b1bd11 100644
--- a/sources/platform/actors/development/programming_interface/environment_variables.md
+++ b/sources/platform/actors/development/programming_interface/environment_variables.md
@@ -40,7 +40,7 @@ Variables prefixed with `ACTOR_` are defined by the [Actor specification](https:
| `ACTOR_DEFAULT_DATASET_ID` | Unique identifier for the default dataset associated with the current Actor run. |
| `ACTOR_DEFAULT_KEY_VALUE_STORE_ID` | Unique identifier for the default key-value store associated with the current Actor run. |
| `ACTOR_DEFAULT_REQUEST_QUEUE_ID` | Unique identifier for the default request queue associated with the current Actor run. |
-| `ACTOR_INPUT_KEY` | Key of the record in the default key-value store that holds the [Actor input](/actors/running/input-and-output#input). |
+| `ACTOR_INPUT_KEY` | Key of the record in the default key-value store that holds the [Actor input](/platform/actors/running/input-and-output#input). |
| `ACTOR_STORAGES_JSON` | JSON-encoded unique identifiers of storages associated with the current Actor run, e.g. `{ "keyValueStores": { "default": "" }, "datasets": { "default": "" }, "requestQueues": { "default": "" } }`. |
| `ACTOR_MEMORY_MBYTES` | Size of memory allocated for the Actor run, in megabytes. Can be used to optimize memory usage or finetuning of low-level external libraries. |
| `ACTOR_MAX_TOTAL_CHARGE_USD` | For pay-per-event Actors, the user-set limit on run cost. Do not exceed this limit. |
@@ -53,9 +53,9 @@ Variables prefixed with `ACTOR_` are defined by the [Actor specification](https:
| `ACTOR_BUILD_TAGS` | A comma-separated list of tags of the Actor build used in the run. Note that this environment variable is assigned at the time of start of the Actor and doesn't change over time, even if the assigned build tags change. |
| `ACTOR_TASK_ID` | ID of the Actor task. Empty if Actor is run outside of any task, e.g. directly using the API. |
| `ACTOR_WEB_SERVER_URL` | Unique public URL for accessing the Actor run web server from the outside world. |
-| `ACTOR_WEB_SERVER_PORT` | TCP port for the Actor to start an HTTP server on. This server can be used to receive external messages or expose monitoring and control interfaces. The server also receives messages from the [Actor Standby](/actors/development/programming-interface/standby) mode. |
-| `ACTOR_STANDBY_URL` | URL for accessing web servers of Actor runs in the [Actor Standby](/actors/development/programming-interface/standby) mode. |
-| `ACTOR_EVENTS_WEBSOCKET_URL` | Websocket URL where Actor may listen for [events](/actors/development/programming-interface/system-events) from Actor platform. |
+| `ACTOR_WEB_SERVER_PORT` | TCP port for the Actor to start an HTTP server on. This server can be used to receive external messages or expose monitoring and control interfaces. The server also receives messages from the [Actor Standby](/platform/actors/development/programming-interface/standby) mode. |
+| `ACTOR_STANDBY_URL` | URL for accessing web servers of Actor runs in the [Actor Standby](/platform/actors/development/programming-interface/standby) mode. |
+| `ACTOR_EVENTS_WEBSOCKET_URL` | Websocket URL where Actor may listen for [events](/platform/actors/development/programming-interface/system-events) from Actor platform. |
@@ -81,10 +81,10 @@ Variables prefixed with `APIFY_` are Apify-platform-specific extensions that go
| `APIFY_PROXY_PORT` | TCP port number to be used for connecting to Apify Proxy. |
| `APIFY_PROXY_STATUS_URL` | URL for retrieving proxy status information. Appending `?format=json` to this URL returns the data in JSON format for programmatic processing. |
| `APIFY_API_PUBLIC_BASE_URL` | Public URL of the Apify API. May be used to interact with the platform programmatically. Typically set to `api.apify.com`. |
-| `APIFY_MCP_PROXY_URL` | Base URL of the Apify MCP Proxy. Connect to an [MCP connector](/integrations/mcp-connectors) at `${APIFY_MCP_PROXY_URL}/` using `APIFY_TOKEN` as the bearer token. |
+| `APIFY_MCP_PROXY_URL` | Base URL of the Apify MCP Proxy. Connect to an [MCP connector](/platform/integrations/mcp-connectors) at `${APIFY_MCP_PROXY_URL}/` using `APIFY_TOKEN` as the bearer token. |
| `APIFY_WORKFLOW_KEY` | Identifier used for grouping related runs and API calls together. |
-| `APIFY_META_ORIGIN` | Specifies how an Actor run was started. Possible values are in [Runs and builds](/actors/running/runs-and-builds#origin) documentation. |
-| `APIFY_INPUT_SECRETS_PRIVATE_KEY_FILE` | Path to the secret key used to decrypt [Secret inputs](/actors/development/actor-definition/input-schema/secret-input). |
+| `APIFY_META_ORIGIN` | Specifies how an Actor run was started. Possible values are in [Runs and builds](/platform/actors/running/runs-and-builds#origin) documentation. |
+| `APIFY_INPUT_SECRETS_PRIVATE_KEY_FILE` | Path to the secret key used to decrypt [Secret inputs](/platform/actors/development/actor-definition/input-schema/secret-input). |
| `APIFY_INPUT_SECRETS_PRIVATE_KEY_PASSPHRASE` | Passphrase for the input secret key specified in `APIFY_INPUT_SECRETS_PRIVATE_KEY_FILE`. |
| ~~`APIFY_HEADLESS`~~ | _Deprecated_ - on the Apify platform this is always set to **1**, so web browsers inside the Actor always run in headless mode (no windowing system available). |
@@ -100,7 +100,7 @@ To use Console variables, remove the `environmentVariables` key from the local f
### Define in `actor.json`
-Actor owners can define custom environment variables in [`.actor/actor.json`](/actors/development/actor-definition/actor-json). All keys from `environmentVariables` will be set as environment variables into the Apify platform after you push Actor to Apify.
+Actor owners can define custom environment variables in [`.actor/actor.json`](/platform/actors/development/actor-definition/actor-json). All keys from `environmentVariables` will be set as environment variables into the Apify platform after you push Actor to Apify.
```json
{
@@ -136,7 +136,7 @@ For sensitive data such as API keys or passwords, enable the **Secret** option w
:::caution Visibility of environment variables in public Actors
-When you [publish your Actor](/actors/publishing/publish), environment variables not marked as **Secret** are visible to anyone on the Actor detail page alongside the source code. Enable **Hide source files from Actor detail** in the Actor's **Settings** to hide both.
+When you [publish your Actor](/platform/actors/publishing/publish), environment variables not marked as **Secret** are visible to anyone on the Actor detail page alongside the source code. Enable **Hide source files from Actor detail** in the Actor's **Settings** to hide both.
Secret environment variables are never exposed on the Actor detail page regardless of this setting. Always mark sensitive values as **Secret**.
diff --git a/sources/platform/actors/development/programming_interface/index.mdx b/sources/platform/actors/development/programming_interface/index.mdx
index 914c431c08..b51c87ddc2 100644
--- a/sources/platform/actors/development/programming_interface/index.mdx
+++ b/sources/platform/actors/development/programming_interface/index.mdx
@@ -14,36 +14,36 @@ This chapter will guide you through all the commands you need to build your firs
diff --git a/sources/platform/actors/development/programming_interface/metamorph.md b/sources/platform/actors/development/programming_interface/metamorph.md
index e470586622..3d05f73088 100644
--- a/sources/platform/actors/development/programming_interface/metamorph.md
+++ b/sources/platform/actors/development/programming_interface/metamorph.md
@@ -35,7 +35,7 @@ To make your Actor compatible with metamorph, use `Actor.getInput()` instead of
:::note Runtime limits
-There's a limit to how many times you can metamorph a single run. Refer to the [Actor runtime limits](/limits#actor-limits) for more details.
+There's a limit to how many times you can metamorph a single run. Refer to the [Actor runtime limits](/platform/limits#actor-limits) for more details.
:::
diff --git a/sources/platform/get-started/building/build-with-ai.md b/sources/platform/actors/development/quick-start/build_with_ai.md
similarity index 93%
rename from sources/platform/get-started/building/build-with-ai.md
rename to sources/platform/actors/development/quick-start/build_with_ai.md
index 6547073daa..ba93e82aaa 100644
--- a/sources/platform/get-started/building/build-with-ai.md
+++ b/sources/platform/actors/development/quick-start/build_with_ai.md
@@ -3,10 +3,8 @@ title: Build Actors with AI
sidebar_position: 3
sidebar_label: Build with AI
description: Build new Actors or improve existing ones using AI coding tools by providing the right context, prompts, Agent Skills, and the Apify MCP server.
-slug: /get-started/build-with-ai
+slug: /actors/development/quick-start/build-with-ai
toc_max_heading_level: 4
-pagination_next: null
-pagination_prev: null
---
import { AGENTS_PROMPT } from "@site/src/utils/agents-prompt";
@@ -19,8 +17,8 @@ This guide provides best practices for building new Actors or improving existing
:::tip Different goal?
-- _Building and deploying AI agents as Actors on Apify?_ See [Develop AI agents on Apify](/get-started/develop-ai-agents) for the full stack - templates, sandboxes, LLM access, and monetization.
-- _Connecting an external AI agent to Apify?_ See [Apify for AI agents](/get-started/agent-onboarding) for MCP, Agent Skills, client libraries, and the REST API.
+- _Building and deploying AI agents as Actors on Apify?_ See [Develop AI agents on Apify](/platform/actors/development/quick-start/develop-ai-agents) for the full stack - templates, sandboxes, LLM access, and monetization.
+- _Connecting an external AI agent to Apify?_ See [Apify for AI agents](/platform/integrations/agent-onboarding) for MCP, Agent Skills, client libraries, and the REST API.
:::
@@ -146,7 +144,7 @@ claude mcp add apify "https://mcp.apify.com/?tools=docs" -t http
Every page in the Apify documentation has a **Copy for LLM** button. Use it to add more context to your AI assistant, or even open the page in ChatGPT, Claude, or Perplexity and ask additional questions.
-
+
## Use `/llms.txt` files
@@ -159,7 +157,7 @@ The entire Apify documentation is available in Markdown format for use with LLMs
Add `.md` to any documentation page URL to view its Markdown source.
-Example: `https://docs.apify.com/actors` > `https://docs.apify.com/actors.md`
+Example: `https://docs.apify.com/platform/actors` > `https://docs.apify.com/platform/actors.md`
:::
diff --git a/sources/platform/get-started/building/develop-ai-agents.md b/sources/platform/actors/development/quick-start/develop_ai_agents.md
similarity index 84%
rename from sources/platform/get-started/building/develop-ai-agents.md
rename to sources/platform/actors/development/quick-start/develop_ai_agents.md
index 70e79d4e52..0003e24f43 100644
--- a/sources/platform/get-started/building/develop-ai-agents.md
+++ b/sources/platform/actors/development/quick-start/develop_ai_agents.md
@@ -3,9 +3,7 @@ title: Develop AI agents on Apify
description: Build and deploy AI agents on Apify with framework templates, sandboxes, OpenRouter for LLM access, and pay-per-event pricing.
sidebar_position: 4.0
sidebar_label: Develop AI agents
-slug: /get-started/develop-ai-agents
-pagination_next: null
-pagination_prev: null
+slug: /actors/development/quick-start/develop-ai-agents
---
The Apify platform provides everything you need to build, test, and deploy AI agents. This page walks you through the complete toolkit: templates, sandbox code execution, LLM access through OpenRouter, pay-per-event monetization, and deployment to [Apify Store](https://apify.com/store).
@@ -20,7 +18,7 @@ This page covers:
:::note Build with AI
-Looking to use AI coding assistants (Claude Code, Cursor, GitHub Copilot) to help you develop Actors? See [Build Actors with AI](/get-started/build-with-ai).
+Looking to use AI coding assistants (Claude Code, Cursor, GitHub Copilot) to help you develop Actors? See [Build Actors with AI](/platform/actors/development/quick-start/build-with-ai).
:::
@@ -28,7 +26,7 @@ Looking to use AI coding assistants (Claude Code, Cursor, GitHub Copilot) to hel
- An [Apify account](https://console.apify.com/sign-up).
- The [Apify CLI](/cli/docs/installation) installed.
-- Your `APIFY_TOKEN` environment variable set. See [API token](/integrations/api#api-token) for details.
+- Your `APIFY_TOKEN` environment variable set. See [API token](/platform/integrations/api#api-token) for details.
## Start from a template
@@ -82,7 +80,7 @@ AI Sandbox runs on a Debian image with Node.js version 24 and Python 3.11 pre-in
## Connect to user services with MCP connectors
-If your agent needs to act on a user's third-party accounts - posting to Slack, writing to Notion, querying GitHub - use [MCP connectors](/integrations/mcp-connectors). The user authorizes each service once in their account settings, and your Actor receives a connector ID as input. Your Actor uses its Apify run token to reach the MCP Proxy; the third-party service credential stored in the connector stays server-side and never enters the Actor. Declare which services your Actor accepts in the input schema with `resourceType: "mcpConnector"`. See [Build Actors with MCP connectors](/integrations/mcp-connectors/use-in-actors) for the full schema and code samples.
+If your agent needs to act on a user's third-party accounts - posting to Slack, writing to Notion, querying GitHub - use [MCP connectors](/platform/integrations/mcp-connectors). The user authorizes each service once in their account settings, and your Actor receives a connector ID as input. Your Actor uses its Apify run token to reach the MCP Proxy; the third-party service credential stored in the connector stays server-side and never enters the Actor. Declare which services your Actor accepts in the input schema with `resourceType: "mcpConnector"`. See [Build Actors with MCP connectors](/platform/integrations/mcp-connectors/use-in-actors) for the full schema and code samples.
## Access LLMs with OpenRouter
@@ -122,7 +120,7 @@ Pay-per-event pricing can charge users per token. To do this, extract token coun
## Monetize with pay-per-event pricing
-[Pay-per-event (PPE)](/actors/publishing/monetize/pay-per-event) pricing lets you charge users for specific actions your agent performs. Use `Actor.charge()` from the [JavaScript SDK](/sdk/js/reference/class/Actor#charge) or [Python SDK](/sdk/python/reference/class/Actor#charge) to bill users for events like API calls, generated results, or token usage.
+[Pay-per-event (PPE)](/platform/actors/publishing/monetize/pay-per-event) pricing lets you charge users for specific actions your agent performs. Use `Actor.charge()` from the [JavaScript SDK](/sdk/js/reference/class/Actor#charge) or [Python SDK](/sdk/python/reference/class/Actor#charge) to bill users for events like API calls, generated results, or token usage.
### PPE for AI agents
@@ -143,7 +141,7 @@ If an Actor's net profit goes negative (for example, from free-tier users consum
:::
-For detailed pricing guidance, see the [pay-per-event documentation](/actors/publishing/monetize/pay-per-event).
+For detailed pricing guidance, see the [pay-per-event documentation](/platform/actors/publishing/monetize/pay-per-event).
## Deploy to Apify
@@ -155,8 +153,8 @@ apify push
This builds and deploys your Actor. Once deployed, you can:
-- Publish to Apify Store - make your agent available to other users and start earning with PPE pricing. See the [publishing documentation](/actors/publishing).
+- Publish to Apify Store - make your agent available to other users and start earning with PPE pricing. See the [publishing documentation](/platform/actors/publishing).
- Run via API - trigger your agent programmatically through the [Apify API](/api/v2).
- Set up schedules - run your agent on a recurring schedule.
-For more deployment options, see the [deployment documentation](/actors/development/deployment).
+For more deployment options, see the [deployment documentation](/platform/actors/development/deployment).
diff --git a/sources/platform/get-started/images/build-actor-in-web-ide.svg b/sources/platform/actors/development/quick-start/images/build-actor-in-web-ide.svg
similarity index 100%
rename from sources/platform/get-started/images/build-actor-in-web-ide.svg
rename to sources/platform/actors/development/quick-start/images/build-actor-in-web-ide.svg
diff --git a/sources/platform/get-started/images/copy-for-llm-button.svg b/sources/platform/actors/development/quick-start/images/copy-for-llm-button.svg
similarity index 100%
rename from sources/platform/get-started/images/copy-for-llm-button.svg
rename to sources/platform/actors/development/quick-start/images/copy-for-llm-button.svg
diff --git a/sources/platform/actors/development/quick-start/index.mdx b/sources/platform/actors/development/quick-start/index.mdx
new file mode 100644
index 0000000000..56be64aae1
--- /dev/null
+++ b/sources/platform/actors/development/quick-start/index.mdx
@@ -0,0 +1,46 @@
+---
+title: Actor development quick start
+sidebar_label: Quick start
+sidebar_position: 0.5
+description: Create your first Apify Actor using the web IDE in Apify Console or locally with the Apify CLI, then choose from a library of ready-made code templates.
+slug: /actors/development/quick-start
+---
+
+import Card from "@site/src/components/Card";
+import CardGrid from "@site/src/components/CardGrid";
+
+:::info Before you build
+
+Before you start building your own Actor, try out a couple of existing Actors from [Apify Store](https://apify.com/store). See the [Running Actors](/platform/actors/running) section for more information on running existing Actors.
+
+:::
+
+## Technology stack
+
+Any code that can run inside of a Docker container can be turned into Apify [Actor](/platform/actors). This gives you freedom in choosing your technical stack, including programming language and technologies.
+
+But to fully benefit from running on top of the Apify platform, we recommend you choose either JavaScript/Node.js or Python, where Apify provides first-level support regarding its SDK, API clients, and learning materials.
+
+For these languages, you can also [choose from many code templates](https://apify.com/templates) that help you to kickstart your project quickly.
+
+## Development paths
+
+You can choose from three main ways to build your Actor, depending on your preferences and requirements:
+
+
+
+
+
+
diff --git a/sources/platform/get-started/building/locally.md b/sources/platform/actors/development/quick-start/start_locally.md
similarity index 86%
rename from sources/platform/get-started/building/locally.md
rename to sources/platform/actors/development/quick-start/start_locally.md
index 37dba9c4a2..82ccc5d4a3 100644
--- a/sources/platform/get-started/building/locally.md
+++ b/sources/platform/actors/development/quick-start/start_locally.md
@@ -3,9 +3,7 @@ title: Local Actor development
sidebar_label: Local development
sidebar_position: 1
description: Create your first Actor locally using the Apify CLI, configure its input and storage, then deploy it to the Apify platform to run in the cloud.
-slug: /get-started/locally
-pagination_next: null
-pagination_prev: null
+slug: /actors/development/quick-start/locally
---
import PromptButton from "@site/src/components/PromptButton";
@@ -80,7 +78,7 @@ Let's explore the Actor structure.
#### The `.actor` folder
-The `.actor` folder contains the Actor configuration. The `actor.json` file defines the Actor's name, description, and other settings. Find more info in the [actor.json](https://docs.apify.com/actors/development/actor-definition/actor-json) definition.
+The `.actor` folder contains the Actor configuration. The `actor.json` file defines the Actor's name, description, and other settings. Find more info in the [actor.json](https://docs.apify.com/platform/actors/development/actor-definition/actor-json) definition.
#### Actor's `input`
@@ -95,11 +93,11 @@ This JSON Schema validates input automatically (no error handling needed), power
:::
-Find more info in the [Input schema](/actors/development/actor-definition/input-schema) documentation.
+Find more info in the [Input schema](/platform/actors/development/actor-definition/input-schema) documentation.
#### Actor's `storage`
-The Actor system provides two storage types for files and results: [key-value](/storage/key-value-store) store and [dataset](/storage/dataset).
+The Actor system provides two storage types for files and results: [key-value](/platform/storage/key-value-store) store and [dataset](/platform/storage/dataset).
##### Key-value store
@@ -113,8 +111,8 @@ The dataset stores a series of data objects from web scraping, crawling, or data
You define the Actor output using the Output schema files:
-- [Dataset Schema Specification](/actors/development/actor-definition/dataset-schema)
-- [Key-value Store Schema Specification](/actors/development/actor-definition/key-value-store-schema)
+- [Dataset Schema Specification](/platform/actors/development/actor-definition/dataset-schema)
+- [Key-value Store Schema Specification](/platform/actors/development/actor-definition/key-value-store-schema)
The system uses this to generate an immutable JSON file that tells users where to find the Actor's results.
@@ -148,5 +146,5 @@ Good job! 🎉 You're ready to develop your Actor. You can make changes to your
- Visit the [Apify Academy](/academy) to access a comprehensive collection of tutorials, documentation, and learning resources.
- To understand Actors in detail, read the [Actor Whitepaper](https://whitepaper.actor/).
-- Check [Continuous integration](/actors/development/deployment/continuous-integration) documentation to automate your Actor development process.
-- After you finish building your first Actor, you can [share it with other users and even monetize it](/actors/publishing).
+- Check [Continuous integration](/platform/actors/development/deployment/continuous-integration) documentation to automate your Actor development process.
+- After you finish building your first Actor, you can [share it with other users and even monetize it](/platform/actors/publishing).
diff --git a/sources/platform/get-started/building/web-ide.md b/sources/platform/actors/development/quick-start/start_web_ide.md
similarity index 91%
rename from sources/platform/get-started/building/web-ide.md
rename to sources/platform/actors/development/quick-start/start_web_ide.md
index 089952e3f4..2eac4668e2 100644
--- a/sources/platform/get-started/building/web-ide.md
+++ b/sources/platform/actors/development/quick-start/start_web_ide.md
@@ -2,9 +2,7 @@
title: Web IDE
sidebar_position: 2
description: Create and run your first Actor using the web IDE in Apify Console, from writing your first lines of code to deploying it live in the cloud.
-slug: /get-started/web-ide
-pagination_next: null
-pagination_prev: null
+slug: /actors/development/quick-start/web-ide
---
import Tabs from '@theme/Tabs';
@@ -57,7 +55,7 @@ The next step it to build the Actor:
Once the build starts, you're redirected to the **Last build** tab. Here you can check the build progress and view Docker build logs.
-
+
## Step 4: Run the Actor
@@ -68,7 +66,7 @@ Finally, it's time to run the Actor:
1. _(Optional)_ To customize the run, expand the **Run options** section. You can adjust the following options:
- **Build** – select the build version to run.
- **Timeout** – set the timeout for the run in seconds.
- - **Memory limit** – allocate the memory for the run. For details, see [Usage and resources](/actors/running/usage-and-resources).
+ - **Memory limit** – allocate the memory for the run. For details, see [Usage and resources](/platform/actors/running/usage-and-resources).
- **Maximum cost per run**.
1. Click **Start**.
@@ -140,5 +138,5 @@ Once you've made the desired changes, you can push the updated code back to the
- Visit the [Apify Academy](/academy) to access a comprehensive collection of tutorials, documentation, and learning resources.
- To understand Actors in detail, read the [Actor Whitepaper](https://whitepaper.actor/).
-- Check [Continuous integration](/actors/development/deployment/continuous-integration) documentation to automate your Actor development process.
-- After you finish building your first Actor, you can [share it with other users and even monetize it](/actors/publishing).
+- Check [Continuous integration](/platform/actors/development/deployment/continuous-integration) documentation to automate your Actor development process.
+- After you finish building your first Actor, you can [share it with other users and even monetize it](/platform/actors/publishing).
diff --git a/sources/platform/actors/index.mdx b/sources/platform/actors/index.mdx
index 4f6adf1ba0..c284f76c21 100644
--- a/sources/platform/actors/index.mdx
+++ b/sources/platform/actors/index.mdx
@@ -1,8 +1,7 @@
---
title: Actors
description: Learn how to develop, run and share serverless cloud programs. Create your own web scraping and automation tools and publish them on the Apify platform.
-sidebar_label: Overview
-sidebar_position: 0
+sidebar_position: 7
category: platform
slug: /actors
---
@@ -10,7 +9,7 @@ slug: /actors
import Card from "@site/src/components/Card";
import CardGrid from "@site/src/components/CardGrid";
-Actors are serverless cloud programs that take a structured JSON input, perform a task (web scraping, browser automation, data processing, and more), and optionally produce a structured output. Run them manually in [Apify Console](https://console.apify.com/actors), through the [API](/api) or [CLI](/cli), or on a [schedule](/actors/running/schedules), and combine them into larger automations.
+Actors are serverless cloud programs that take a structured JSON input, perform a task (web scraping, browser automation, data processing, and more), and optionally produce a structured output. Run them manually in [Apify Console](https://console.apify.com/actors), through the [API](/api) or [CLI](/cli), or on a [schedule](/platform/schedules), and combine them into larger automations.
:::info Additional context
@@ -24,17 +23,17 @@ For more context, read the [Actor whitepaper](https://whitepaper.actor/).
@@ -54,4 +53,4 @@ The documentation and input/output schemas help people understand what the Actor
## Public and private Actors
-Actors can be [public](/actors/running/actors-in-store) or private. Private Actors are yours to use and keep; no one will see them if you don't want them to. Public Actors are available to everyone in [Apify Store](https://apify.com/store). You can make them free to use, or you can [charge for them](https://blog.apify.com/make-regular-passive-income-developing-web-automation-actors-b0392278d085/).
+Actors can be [public](/platform/actors/running/actors-in-store) or private. Private Actors are yours to use and keep; no one will see them if you don't want them to. Public Actors are available to everyone in [Apify Store](https://apify.com/store). You can make them free to use, or you can [charge for them](https://blog.apify.com/make-regular-passive-income-developing-web-automation-actors-b0392278d085/).
diff --git a/sources/platform/actors/publishing/actor-rating.mdx b/sources/platform/actors/publishing/actor-rating.mdx
index 3fabe2d4f4..5f396f19ef 100644
--- a/sources/platform/actors/publishing/actor-rating.mdx
+++ b/sources/platform/actors/publishing/actor-rating.mdx
@@ -5,7 +5,7 @@ slug: /actors/publishing/actor-rating
sidebar_position: 6
---
-Users can review your Actor in Apify Store. Their ratings impact your Actor's [quality score](/actors/publishing/quality-score) and help it rank higher in search results. User reviews are also a great source of feedback that you can use to improve your Actor.
+Users can review your Actor in Apify Store. Their ratings impact your Actor's [quality score](/platform/actors/publishing/quality-score) and help it rank higher in search results. User reviews are also a great source of feedback that you can use to improve your Actor.
## About the Actor rating
@@ -35,7 +35,7 @@ To edit your response, on your reply, select **Options** > **Edit**.
## Report a review
-If you believe that a review doesn't follow the community standards, you can report it. For details, see [Report a review](/actors/running/reviews#report-a-review).
+If you believe that a review doesn't follow the community standards, you can report it. For details, see [Report a review](/platform/actors/running/reviews#report-a-review).
Note that the support team verifies all reports and only deletes the reviews that violate Apify policies. Users can share their experience even if it's negative. Here are some invalid reasons for reporting a review:
diff --git a/sources/platform/actors/publishing/index.mdx b/sources/platform/actors/publishing/index.mdx
index 57db42c5ff..65a18f5a58 100644
--- a/sources/platform/actors/publishing/index.mdx
+++ b/sources/platform/actors/publishing/index.mdx
@@ -35,7 +35,7 @@ Packaging your software as an Actor allows you to launch new SaaS product faster
- Pay-per-event for specific operations
- Fixed rental fee for continuous access
-To learn more, visit the [Actors in Store](/actors/running/actors-in-store#pricing-models) page.
+To learn more, visit the [Actors in Store](/platform/actors/running/actors-in-store#pricing-models) page.
## Maintain public Actors
diff --git a/sources/platform/actors/publishing/monetize/index.mdx b/sources/platform/actors/publishing/monetize/index.mdx
index bbc59d3fb4..dba01faa18 100644
--- a/sources/platform/actors/publishing/monetize/index.mdx
+++ b/sources/platform/actors/publishing/monetize/index.mdx
@@ -15,10 +15,10 @@ Apify Store allows you to monetize your web scraping, automation, and AI agent p
You can publish Actors on Apify Store under one of the following pricing models:
-- [Pay per event (PPE)](/actors/publishing/monetize/pay-per-event): Users pay for specific events that are programmatically triggered from the Actor's source code. You can define these events and include actions such as generating a single result or starting an Actor. You can also choose whether to pass the platform usage costs on to users.
+- [Pay per event (PPE)](/platform/actors/publishing/monetize/pay-per-event): Users pay for specific events that are programmatically triggered from the Actor's source code. You can define these events and include actions such as generating a single result or starting an Actor. You can also choose whether to pass the platform usage costs on to users.
- Pay per usage: Users can run the Actor without any additional charges beyond the platform usage costs generated by the Actor.
-For a detailed comparison of pricing models from the perspective of your users, see [Actors in Store](/actors/running/actors-in-store).
+For a detailed comparison of pricing models from the perspective of your users, see [Actors in Store](/platform/actors/running/actors-in-store).
## Set up monetization
@@ -33,10 +33,10 @@ To set up monetization for your Actor, first complete your billing and payment d
The monetization setup consists of three steps:
1. In the **Actor pricing** step, you can:
- - Modify or delete the [`apify-actor-start`](/actors/publishing/monetize/pay-per-event#synthetic-start-event) event.
- - Modify or delete the [`apify-default-dataset-item`](/actors/publishing/monetize/pay-per-event#synthetic-default-dataset-item-event) event.
- - Define [custom events](/actors/publishing/monetize/pay-per-event#actor-events) and their prices.
- - [Transfer the platform usage costs on to users](/actors/publishing/monetize/pay-per-event#platform-usage-costs).
+ - Modify or delete the [`apify-actor-start`](/platform/actors/publishing/monetize/pay-per-event#synthetic-start-event) event.
+ - Modify or delete the [`apify-default-dataset-item`](/platform/actors/publishing/monetize/pay-per-event#synthetic-default-dataset-item-event) event.
+ - Define [custom events](/platform/actors/publishing/monetize/pay-per-event#actor-events) and their prices.
+ - [Transfer the platform usage costs on to users](/platform/actors/publishing/monetize/pay-per-event#platform-usage-costs).
- Set the minimal cost that users can choose as max cost per run.
1. In the **Primary event** step, select the event that best represents the main value of your Actor. By default, the dataset event or the only existing event is used.
1. In the **Review** step, verify the final pricing for your Actor before confirming.
@@ -65,13 +65,13 @@ You can make major monetization changes to each Actor only **once per month**. A
## Make your Actor eligible for agentic payments
-Agentic payments let AI agents discover, run, and pay for your Actor without an Apify account, using protocols such as [x402](/integrations/x402) and [Skyfire](/integrations/skyfire). Eligible Actors are flagged with `allowsAgenticUsers=true` and surface in agentic discovery, for example when [searching the store via API](https://docs.apify.com/api/v2#/reference/store/store-actors-collection/get-list-of-actors-in-store) with `allowsAgenticUsers=true`.
+Agentic payments let AI agents discover, run, and pay for your Actor without an Apify account, using protocols such as [x402](/platform/integrations/x402) and [Skyfire](/platform/integrations/skyfire). Eligible Actors are flagged with `allowsAgenticUsers=true` and surface in agentic discovery, for example when [searching the store via API](https://docs.apify.com/api/v2#/reference/store/store-actors-collection/get-list-of-actors-in-store) with `allowsAgenticUsers=true`.
To be eligible for agentic payments, your Actor must:
-- Use the [pay per event](/actors/publishing/monetize/pay-per-event) pricing model. Rental and pay-per-usage Actors are not supported.
-- Run with [limited permissions](/actors/development/permissions). Actors that request full permissions are excluded.
-- Not use [Standby](/actors/running/standby) mode for now. Standby support is coming later.
+- Use the [pay per event](/platform/actors/publishing/monetize/pay-per-event) pricing model. Rental and pay-per-usage Actors are not supported.
+- Run with [limited permissions](/platform/actors/development/permissions). Actors that request full permissions are excluded.
+- Not use [Standby](/platform/actors/running/standby) mode for now. Standby support is coming later.
Actors that meet these criteria become available to agentic users automatically - there is no separate opt-in.
@@ -99,7 +99,7 @@ If the monthly profit does not meet these thresholds, as per the [Terms & Condit
When monetizing your Actor, you might want to limit features or usage for users on the Apify free plan. If you choose to do this, you _must_ handle it transparently:
- Communicate upfront: Clearly state any limitations in your Actor's `README` and input schema. Users should know about restrictions _before_ they run the Actor.
-- Graceful exits: If a free user hits a limit, don't crash the Actor or return a system error. Instead, exit gracefully with a clear [status message](/actors/development/programming-interface/status-messages#communicating-limitations) explaining the limit (e.g., "Free tier limit reached").
+- Graceful exits: If a free user hits a limit, don't crash the Actor or return a system error. Instead, exit gracefully with a clear [status message](/platform/actors/development/programming-interface/status-messages#communicating-limitations) explaining the limit (e.g., "Free tier limit reached").
- Avoid confusion: Never make a policy restriction look like a bug or platform error.
## Actor analytics
diff --git a/sources/platform/actors/publishing/monetize/pay_per_event.mdx b/sources/platform/actors/publishing/monetize/pay_per_event.mdx
index 143868fc90..d602db7fd2 100644
--- a/sources/platform/actors/publishing/monetize/pay_per_event.mdx
+++ b/sources/platform/actors/publishing/monetize/pay_per_event.mdx
@@ -42,7 +42,7 @@ Your profit is calculated from the mentioned formula:
where:
- _Revenue_: The amount charged for events via the PPE charging API or through JS/Python SDK. You receive 80% of this revenue.
-- _Platform costs_: The underlying platform usage costs for running the Actor. For more details, visit the [Computing your costs for PPE Actors](/actors/publishing/monetize/pricing-and-costs#computing-your-costs-for-ppe-actors) section.
+- _Platform costs_: The underlying platform usage costs for running the Actor. For more details, visit the [Computing your costs for PPE Actors](/platform/actors/publishing/monetize/pricing-and-costs#computing-your-costs-for-ppe-actors) section.
Only revenue and cost for Apify customers on paid plans are taken into consideration when computing your profit. Users on free plans are not reflected there.
@@ -77,7 +77,7 @@ Charging platform usage separately is less transparent for users and may discour
:::
-To pass platform usage costs on to users, in the **Actor pricing** step of the [monetization setup](/actors/publishing/monetize#set-up-monetization), switch on the **Pay per event + usage** toggle.
+To pass platform usage costs on to users, in the **Actor pricing** step of the [monetization setup](/platform/actors/publishing/monetize#set-up-monetization), switch on the **Pay per event + usage** toggle.
Turning this option on takes 14 days to take effect. However, you can turn it off immediately, as it is a positive change for users.
@@ -89,7 +89,7 @@ The `eventChargeLimitReached` property checks if the user's limit allows for ano
:::info ACTOR_MAX_TOTAL_CHARGE_USD environment variable
-For pay-per-event Actors, users set a spending limit through Apify Console. This limit is available in your Actor code as the `ACTOR_MAX_TOTAL_CHARGE_USD` [environment variable](/actors/development/programming-interface/environment-variables), which contains the user's maximum cost.
+For pay-per-event Actors, users set a spending limit through Apify Console. This limit is available in your Actor code as the `ACTOR_MAX_TOTAL_CHARGE_USD` [environment variable](/platform/actors/development/programming-interface/environment-variables), which contains the user's maximum cost.
The Apify SDK's `ChargeResult` respects the user set limit already.
:::
@@ -169,7 +169,7 @@ Apify recommends using the synthetic Actor start event in all Actors. It benefit
Starting an Actor takes time, and creates additional cost for the Actor creator, because the profit equals revenue minus platform costs.
-One of the options to charge for the time spent on starting the Actor is to charge an “Actor start” event. Unfortunately, this makes your Actor comparably expensive with other tools on the market (outside of [Apify Store](/console/store)) that do not incur this startup cost.
+One of the options to charge for the time spent on starting the Actor is to charge an “Actor start” event. Unfortunately, this makes your Actor comparably expensive with other tools on the market (outside of [Apify Store](/platform/console/store)) that do not incur this startup cost.
We want to make it easier for Actor creators to stay competitive, but also help them to be profitable. Therefore, we have the Apify Actor synthetic start event `apify-actor-start`. This event is enabled by default for all new PPE Actors, and when you use it Apify will cover the compute unit cost of the first 5 seconds of every Actor run.
@@ -194,7 +194,7 @@ For new Actors, the `apify-actor-start` event is added automatically.
For existing Actors, you can add this event manually:
-1. Access your Actor's [monetization setup](/actors/publishing/monetize#set-up-monetization).
+1. Access your Actor's [monetization setup](/platform/actors/publishing/monetize#set-up-monetization).
1. In the **Actor pricing** step, under **Event name**, add `apify-actor-start`.
1. Complete the remaining event details: title, description, and price.
@@ -219,7 +219,7 @@ This event charges users automatically for each default dataset item, requiring
### Set memory limits
-Set memory limits using `minMemoryMbytes` and `maxMemoryMbytes` in your [`actor.json`](https://docs.apify.com/actors/development/actor-definition/actor-json) file to control platform usage costs.
+Set memory limits using `minMemoryMbytes` and `maxMemoryMbytes` in your [`actor.json`](https://docs.apify.com/platform/actors/development/actor-definition/actor-json) file to control platform usage costs.
```json
{
@@ -426,7 +426,7 @@ Fixed pricing is simpler for users to predict, while usage-based pricing more ac
Your profit and costs are computed _only from the first two users_ since they are on Apify paid plans.
-The platform usage costs are just examples, but you can see the actual costs in the [Computing your costs for PPE Actors](/actors/publishing/monetize/pricing-and-costs#computing-your-costs-for-ppe-actors) section.
+The platform usage costs are just examples, but you can see the actual costs in the [Computing your costs for PPE Actors](/platform/actors/publishing/monetize/pricing-and-costs#computing-your-costs-for-ppe-actors) section.
### Revenue breakdown
diff --git a/sources/platform/actors/publishing/monetize/rental.mdx b/sources/platform/actors/publishing/monetize/rental.mdx
index 467b3bebcf..0724c0174d 100644
--- a/sources/platform/actors/publishing/monetize/rental.mdx
+++ b/sources/platform/actors/publishing/monetize/rental.mdx
@@ -35,7 +35,7 @@ The rental model, while easy to set up, is less profitable because its pricing d
### AI compatibility limitations
-The growing limitation is AI compatibility. [Apify's MCP server](/integrations/mcp) explicitly excludes rental Actors from search results, making them invisible to AI systems that dynamically select and execute tools. This significantly reduces your Actor's discoverability in AI workflows.
+The growing limitation is AI compatibility. [Apify's MCP server](/platform/integrations/mcp) explicitly excludes rental Actors from search results, making them invisible to AI systems that dynamically select and execute tools. This significantly reduces your Actor's discoverability in AI workflows.
## Example of a rental pricing model
diff --git a/sources/platform/actors/publishing/publish-task.mdx b/sources/platform/actors/publishing/publish-task.mdx
index dbb59b7f63..1841f33e03 100644
--- a/sources/platform/actors/publishing/publish-task.mdx
+++ b/sources/platform/actors/publishing/publish-task.mdx
@@ -5,7 +5,7 @@ slug: /actors/publishing/publish-task
sidebar_position: 2
---
-[Actor tasks](/actors/running/tasks) are shareable, pre-configured inputs for your Actors. [Publishing a task](#publish-your-tasks) creates a public landing page that shows what the Actor does, what inputs it uses, and what output to expect. Public tasks also appear in your Actor's **Examples** tab, which helps users discover your Actor through search engines and AI agents. For monetized Actors, this can lead to more page views, more runs, and more revenue.
+[Actor tasks](/platform/actors/running/tasks) are shareable, pre-configured inputs for your Actors. [Publishing a task](#publish-your-tasks) creates a public landing page that shows what the Actor does, what inputs it uses, and what output to expect. Public tasks also appear in your Actor's **Examples** tab, which helps users discover your Actor through search engines and AI agents. For monetized Actors, this can lead to more page views, more runs, and more revenue.
You can create up to 50 tasks per Actor.
@@ -14,8 +14,8 @@ You can create up to 50 tasks per Actor.
Before you publish a task, make sure you have:
- A [published Actor](./publish.mdx) that you own or maintain.
-- A [saved task](/actors/running/tasks) with a complete input configuration.
-- An [input schema](/actors/development/actor-definition/input-schema) and at least one [dataset schema view](/actors/development/actor-definition/dataset-schema) defined on the Actor.
+- A [saved task](/platform/actors/running/tasks) with a complete input configuration.
+- An [input schema](/platform/actors/development/actor-definition/input-schema) and at least one [dataset schema view](/platform/actors/development/actor-definition/dataset-schema) defined on the Actor.
## What tasks to publish
@@ -111,7 +111,7 @@ Use this section to:
:::info Secret fields are protected automatically
-All input fields with `"isSecret": true` in the Actor's [input schema](/actors/development/actor-definition/input-schema) are automatically masked and never shown on the landing page. Before publishing, confirm sensitive fields are marked as secret.
+All input fields with `"isSecret": true` in the Actor's [input schema](/platform/actors/development/actor-definition/input-schema) are automatically masked and never shown on the landing page. Before publishing, confirm sensitive fields are marked as secret.
:::
@@ -121,7 +121,7 @@ The Dataset schema section selects which view of the Actor's dataset is rendered

-For more on configuring views, see [Dataset schema](/actors/development/actor-definition/dataset-schema).
+For more on configuring views, see [Dataset schema](/platform/actors/development/actor-definition/dataset-schema).
## Task landing page
diff --git a/sources/platform/actors/publishing/publish.mdx b/sources/platform/actors/publishing/publish.mdx
index c6db8d6b61..f3e2d3c109 100644
--- a/sources/platform/actors/publishing/publish.mdx
+++ b/sources/platform/actors/publishing/publish.mdx
@@ -59,6 +59,6 @@ Note that the complexity of your README should match the complexity of your Acto
## Source code visibility
-When you publish an Actor, its source code files and non-secret [environment variables](/actors/development/programming-interface/environment-variables) are publicly visible by default on the Actor detail page.
+When you publish an Actor, its source code files and non-secret [environment variables](/platform/actors/development/programming-interface/environment-variables) are publicly visible by default on the Actor detail page.
To hide them, go to your Actor's **Settings** tab in Apify Console and check **Hide source files from Actor detail**. Secret environment variables are never exposed regardless of this setting.
diff --git a/sources/platform/actors/publishing/quality_score.mdx b/sources/platform/actors/publishing/quality_score.mdx
index 19133413ff..6ae2ead575 100644
--- a/sources/platform/actors/publishing/quality_score.mdx
+++ b/sources/platform/actors/publishing/quality_score.mdx
@@ -14,7 +14,7 @@ The Actor quality score is a metric that evaluates your Actor's performance acro
Search ranking evaluates parameters similar to those in the quality score. As a result, the two correlate strongly across Apify search surfaces:
- _Apify Store search_ at [apify.com/store](https://apify.com/store).
-- The _Apify MCP server_ `search-actors` tool used by external AI agents. See [Apify MCP server](/integrations/mcp).
+- The _Apify MCP server_ `search-actors` tool used by external AI agents. See [Apify MCP server](/platform/integrations/mcp).
Actors with higher quality scores tend to rank higher on both surfaces, though no specific position is guaranteed. Search in Apify Console is personalized to each individual user, so the same query can return different Actors than the public Store - quality score still correlates with ranking, the order is just adjusted per user. See [How Apify Store search works](/academy/actor-marketing-playbook/store-basics/how-store-works#how-apify-store-search-works) for the publisher-facing guidance.
@@ -53,9 +53,9 @@ These are the quality categories:
### Reliability
-Reliability measures your Actor's operational stability and consistency. A reliable Actor maintains high run success rates and passes automated quality assurance tests. Poor reliability significantly impacts your quality score. For more information on testing requirements, see [Automated Testing](https://docs.apify.com/actors/publishing/test).
+Reliability measures your Actor's operational stability and consistency. A reliable Actor maintains high run success rates and passes automated quality assurance tests. Poor reliability significantly impacts your quality score. For more information on testing requirements, see [Automated Testing](https://docs.apify.com/platform/actors/publishing/test).
-Implementing an [input schema](https://docs.apify.com/actors/development/actor-definition/input-schema) helps prevent runtime failures by validating user input before execution begins, reducing errors caused by invalid or malformed inputs.
+Implementing an [input schema](https://docs.apify.com/platform/actors/development/actor-definition/input-schema) helps prevent runtime failures by validating user input before execution begins, reducing errors caused by invalid or malformed inputs.
### Popularity
@@ -71,7 +71,7 @@ Ease of use evaluates how quickly users can understand and successfully run your
### Pricing transparency
-Pricing transparency evaluates how clearly users can understand and predict the costs of running your Actor. Transparent pricing models help users make informed decisions and budget accordingly. The [Pay per event (PPE)](https://docs.apify.com/actors/publishing/monetize/pay-per-event) monetization model provides predictable, event-based pricing that makes costs explicit and easier to estimate.
+Pricing transparency evaluates how clearly users can understand and predict the costs of running your Actor. Transparent pricing models help users make informed decisions and budget accordingly. The [Pay per event (PPE)](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) monetization model provides predictable, event-based pricing that makes costs explicit and easier to estimate.
Consider offering discounts for Bronze, Silver, and Gold subscription tiers. These incentives reward committed platform users and can increase your Actor's adoption among engaged customers.
@@ -89,4 +89,4 @@ Developers with a proven track record of publishing successful Actors receive re
### Congruency
-Congruency measures the consistency and coherence across your Actor's components. A well-designed Actor maintains alignment between its title, description, documentation, and schemas. Ensure that your [input schema](https://docs.apify.com/actors/development/actor-definition/input-schema), [dataset schema](https://docs.apify.com/actors/development/actor-definition/dataset-schema), [key-value store schema](https://docs.apify.com/actors/development/actor-definition/key-value-store-schema), and README documentation all reflect consistent terminology and accurately describe the Actor's behavior. This coherence reduces user confusion and improves the overall experience.
+Congruency measures the consistency and coherence across your Actor's components. A well-designed Actor maintains alignment between its title, description, documentation, and schemas. Ensure that your [input schema](https://docs.apify.com/platform/actors/development/actor-definition/input-schema), [dataset schema](https://docs.apify.com/platform/actors/development/actor-definition/dataset-schema), [key-value store schema](https://docs.apify.com/platform/actors/development/actor-definition/key-value-store-schema), and README documentation all reflect consistent terminology and accurately describe the Actor's behavior. This coherence reduces user confusion and improves the overall experience.
diff --git a/sources/platform/actors/publishing/testing.mdx b/sources/platform/actors/publishing/testing.mdx
index 67c5a942a0..fe6f0aa59d 100644
--- a/sources/platform/actors/publishing/testing.mdx
+++ b/sources/platform/actors/publishing/testing.mdx
@@ -12,7 +12,7 @@ This helps us to flag Actors that temporarily don't work as expected `under main
## How we test
-The test runs the Actor with its default input (defined by the [**prefill**](https://docs.apify.com/actors/development/actor-definition/input-schema/specification/v1#prefill-vs-default-vs-required) option in the input schema file)
+The test runs the Actor with its default input (defined by the [**prefill**](https://docs.apify.com/platform/actors/development/actor-definition/input-schema/specification/v1#prefill-vs-default-vs-required) option in the input schema file)
and expects it to finish with a **Succeeded** status and non-empty default dataset within 5 minutes of the beginning of the run.

diff --git a/sources/platform/actors/running/actor_standby.md b/sources/platform/actors/running/actor_standby.md
index bd87983cb4..9cdfdc2454 100644
--- a/sources/platform/actors/running/actor_standby.md
+++ b/sources/platform/actors/running/actor_standby.md
@@ -47,9 +47,9 @@ This approach can be useful if you cannot modify the request headers.
```
:::tip Scoped tokens
-You can use [scoped tokens](/integrations/api#limited-permissions) to send standby requests. This is useful for allowing third-party services to interact with your Actor without granting access to your entire account.
+You can use [scoped tokens](/platform/integrations/api#limited-permissions) to send standby requests. This is useful for allowing third-party services to interact with your Actor without granting access to your entire account.
-However, [restricting what an Actor can access](/integrations/api#restricted-access-restrict-what-actors-can-access-using-the-scope-of-this-actor) using a scoped token is not supported when running in Standby mode.
+However, [restricting what an Actor can access](/platform/integrations/api#restricted-access-restrict-what-actors-can-access-using-the-scope-of-this-actor) using a scoped token is not supported when running in Standby mode.
:::
## Can I still run the Actor in normal mode
diff --git a/sources/platform/actors/running/input_and_output.md b/sources/platform/actors/running/input_and_output.md
index bde08ae5a3..2d0b706555 100644
--- a/sources/platform/actors/running/input_and_output.md
+++ b/sources/platform/actors/running/input_and_output.md
@@ -45,7 +45,7 @@ If the Actor is configured by developer to use [dynamic memory](../development/a
An Actor can produce results in several places. Structured, tabular results are usually stored in the run's default (or additional) [Dataset](../../storage/dataset), while files and other unstructured data go to its [Key-value store](../../storage/key-value-store). Always read the Actor's README to learn what an Actor produces and where it stores it. For more details about storages, visit the [Storage](../../storage/index.md) section.
-To describe where its results are and how to reach them, an Actor can define an [output schema](/actors/development/actor-definition/output-schema). The platform uses this schema to automatically generate the Actor _output object_ - an immutable JSON object whose properties link to the run's results. The output object is defined solely by the output schema, not by the Actor's code, and the API returns it as the run's `output` property immediately when the run starts, without waiting for the run to finish or for the results to be produced. This makes it useful for previewing results, generating API examples, and building integrations.
+To describe where its results are and how to reach them, an Actor can define an [output schema](/platform/actors/development/actor-definition/output-schema). The platform uses this schema to automatically generate the Actor _output object_ - an immutable JSON object whose properties link to the run's results. The output object is defined solely by the output schema, not by the Actor's code, and the API returns it as the run's `output` property immediately when the run starts, without waiting for the run to finish or for the results to be produced. This makes it useful for previewing results, generating API examples, and building integrations.
The output object is separate from the storages that hold the data: its properties point to results wherever they live, whether that's the dataset, the key-value store, or a URL exposed by the running Actor.
diff --git a/sources/platform/actors/running/runs_and_builds.md b/sources/platform/actors/running/runs_and_builds.md
index 07c8647d3b..aab1249697 100644
--- a/sources/platform/actors/running/runs_and_builds.md
+++ b/sources/platform/actors/running/runs_and_builds.md
@@ -145,4 +145,4 @@ Apify securely stores your ten most recent runs indefinitely, ensuring your reco
## Share
-Share your Actor runs with other Apify users via the [access rights](/account/collaboration) system.
+Share your Actor runs with other Apify users via the [access rights](../../collaboration/index.md) system.
diff --git a/sources/platform/actors/running/store/index.md b/sources/platform/actors/running/store/index.md
index 70d7e99b8f..bb2a767f43 100644
--- a/sources/platform/actors/running/store/index.md
+++ b/sources/platform/actors/running/store/index.md
@@ -10,7 +10,7 @@ toc_max_heading_level: 4
:::info Publishing and monetizing Actors
-Anyone is welcome to [publish Actors](/actors/publishing) in the store, and you can even [monetize your Actors](/actors/publishing/monetize). For more information about how to monetize your Actor, best practices, SEO, and promotion tips and tricks, head over to the [Marketing checklist](/academy/actor-marketing-playbook/promote-your-actor/checklist) section of the Apify Developers Academy.
+Anyone is welcome to [publish Actors](/platform/actors/publishing) in the store, and you can even [monetize your Actors](/platform/actors/publishing/monetize). For more information about how to monetize your Actor, best practices, SEO, and promotion tips and tricks, head over to the [Marketing checklist](/academy/actor-marketing-playbook/promote-your-actor/checklist) section of the Apify Developers Academy.
:::
@@ -59,7 +59,7 @@ If charges seem incorrect, contact the Actor author or the Apify support team. Y
### Pay per usage
-When you use a pay per usage Actor, you are only charged for the platform usage that the runs of this Actor generate. [Platform usage](../usage_and_resources.md) includes components such as compute units, operations on [storages](/storage), and usage of [residential proxies](/proxy/residential-proxy) or [SERPs](/proxy/google-serp-proxy).
+When you use a pay per usage Actor, you are only charged for the platform usage that the runs of this Actor generate. [Platform usage](../usage_and_resources.md) includes components such as compute units, operations on [storages](/platform/storage), and usage of [residential proxies](/platform/proxy/residential-proxy) or [SERPs](/platform/proxy/google-serp-proxy).

diff --git a/sources/platform/actors/running/store/reviews.mdx b/sources/platform/actors/running/store/reviews.mdx
index 8f134202a8..4b4606a8f4 100644
--- a/sources/platform/actors/running/store/reviews.mdx
+++ b/sources/platform/actors/running/store/reviews.mdx
@@ -26,7 +26,7 @@ To share your opinion of an Actor:
- To only rate the Actor, use the star rating.
- To rate and review the Actor, select **Write review**.
-If you have a problem with the Actor that you're reviewing, consider [opening an issue](/actors/running/actors-in-store#report-issues-with-actors).
+If you have a problem with the Actor that you're reviewing, consider [opening an issue](/platform/actors/running/actors-in-store#report-issues-with-actors).
### Edit a review
diff --git a/sources/platform/actors/running/tasks.md b/sources/platform/actors/running/tasks.md
index a4b2752b88..734c57a8c1 100644
--- a/sources/platform/actors/running/tasks.md
+++ b/sources/platform/actors/running/tasks.md
@@ -6,7 +6,7 @@ slug: /actors/running/tasks
sidebar_label: Tasks
---
-Actor tasks let you create multiple reusable configurations of a single Actor, adapted for specific use cases. For example, you can create one [_Web Scraper_](https://apify.com/apify/web-scraper) configuration (task) that scrapes the latest reviews from [IMDb](https://www.imdb.com/), another that scrapes nike.com for the latest sneakers, and a third that scrapes your competitor's e-shop. You can then use and reuse these configurations directly from [Apify Console](https://console.apify.com/actors/tasks), [Schedules](/actors/running/schedules), or [API](/api/v2/actor-task-runs-post).
+Actor tasks let you create multiple reusable configurations of a single Actor, adapted for specific use cases. For example, you can create one [_Web Scraper_](https://apify.com/apify/web-scraper) configuration (task) that scrapes the latest reviews from [IMDb](https://www.imdb.com/), another that scrapes nike.com for the latest sneakers, and a third that scrapes your competitor's e-shop. You can then use and reuse these configurations directly from [Apify Console](https://console.apify.com/actors/tasks), [Schedules](../../schedules.md), or [API](/api/v2/actor-task-runs-post).
You can find all your tasks in the [Apify Console](https://console.apify.com/actors/tasks).
@@ -42,11 +42,11 @@ Or using the **Start** button positioned following the input configuration.
You can also run tasks using:
-- [Schedules](/actors/running/schedules).
+- [Schedules](../../schedules.md).
- Directly via the [Apify API](/api/v2/actor-task-runs-post).
- The [JavaScript API client](/api/client/js/reference/class/TaskClient).
- The [Python API client](/api/client/python/reference/class/TaskClient).
## Share
-Like any other resource, you can share your Actor tasks with other Apify users via the [access rights](/account/collaboration) system.
+Like any other resource, you can share your Actor tasks with other Apify users via the [access rights](../../collaboration/index.md) system.
diff --git a/sources/platform/account/collaboration/access_rights.md b/sources/platform/collaboration/access_rights.md
similarity index 76%
rename from sources/platform/account/collaboration/access_rights.md
rename to sources/platform/collaboration/access_rights.md
index 78f2b0a961..2b0df3c6ed 100644
--- a/sources/platform/account/collaboration/access_rights.md
+++ b/sources/platform/collaboration/access_rights.md
@@ -3,12 +3,12 @@ title: Access rights
description: Manage permissions for your private resources such as Actors, Actor runs, and storages. Allow other users to read, run, modify, or build new versions.
sidebar_position: 12
category: platform
-slug: /account/collaboration/access-rights
+slug: /collaboration/access-rights
---
You can securely share your resources with others by using a granular permissions system. Such resources include Actors, tasks, key-value stores, datasets, and request queues.
-For example, you can let your colleague run an [Actor](/actors) or view a [dataset](/storage/dataset) but not modify it. You can also grant permission to update an Actor and build a new version. [Storages](/storage) are sharable in the same way as a **read** permission or a combination of both **read** and **write** permissions.
+For example, you can let your colleague run an [Actor](../actors/index.mdx) or view a [dataset](../storage/dataset.md) but not modify it. You can also grant permission to update an Actor and build a new version. [Storages](../storage/index.md) are sharable in the same way as a **read** permission or a combination of both **read** and **write** permissions.
## Grant access to resources
diff --git a/sources/platform/account/collaboration/general-resource-access.md b/sources/platform/collaboration/general-resource-access.md
similarity index 99%
rename from sources/platform/account/collaboration/general-resource-access.md
rename to sources/platform/collaboration/general-resource-access.md
index 208e4a12eb..78d321fce9 100644
--- a/sources/platform/account/collaboration/general-resource-access.md
+++ b/sources/platform/collaboration/general-resource-access.md
@@ -3,7 +3,7 @@ title: General resource access
description: Control how Apify resources are shared. Set default access to open ID-based access or restricted, and manage link sharing and pre-signed URLs.
sidebar_position: 1
category: platform
-slug: /account/collaboration/general-resource-access
+slug: /collaboration/general-resource-access
---
Some resources, like storages, Actor runs or Actor builds, can be shared simply by sending their unique resource ID or Console link and the recipient can then view the data in Console or fetch it via API without needing an API token. This is very useful for ad-hoc collaboration, integrating third party tools that connect to data in your Apify account or quick prototypes.
@@ -305,7 +305,7 @@ const recordUrl = await storeClient.getRecordPublicUrl(recordKey);
await Actor.pushData({ recordUrl });
```
-To learn more about generating pre-signed URLs, refer to the section [Sharing restricted resources with pre-signed URLs](/account/collaboration/general-resource-access#pre-signed-urls).
+To learn more about generating pre-signed URLs, refer to the section [Sharing restricted resources with pre-signed URLs](/platform/collaboration/general-resource-access#pre-signed-urls).
:::note Using Console URLs
diff --git a/sources/platform/account/collaboration/images/general-resouce-access/account-setting.png b/sources/platform/collaboration/images/general-resouce-access/account-setting.png
similarity index 100%
rename from sources/platform/account/collaboration/images/general-resouce-access/account-setting.png
rename to sources/platform/collaboration/images/general-resouce-access/account-setting.png
diff --git a/sources/platform/account/collaboration/images/general-resouce-access/copy-record-url-kv-store.png b/sources/platform/collaboration/images/general-resouce-access/copy-record-url-kv-store.png
similarity index 100%
rename from sources/platform/account/collaboration/images/general-resouce-access/copy-record-url-kv-store.png
rename to sources/platform/collaboration/images/general-resouce-access/copy-record-url-kv-store.png
diff --git a/sources/platform/account/collaboration/images/general-resouce-access/copy-shareable-link.png b/sources/platform/collaboration/images/general-resouce-access/copy-shareable-link.png
similarity index 100%
rename from sources/platform/account/collaboration/images/general-resouce-access/copy-shareable-link.png
rename to sources/platform/collaboration/images/general-resouce-access/copy-shareable-link.png
diff --git a/sources/platform/account/collaboration/images/general-resouce-access/creating-actor-issue.png b/sources/platform/collaboration/images/general-resouce-access/creating-actor-issue.png
similarity index 100%
rename from sources/platform/account/collaboration/images/general-resouce-access/creating-actor-issue.png
rename to sources/platform/collaboration/images/general-resouce-access/creating-actor-issue.png
diff --git a/sources/platform/account/collaboration/images/general-resouce-access/share-resource-dialog.png b/sources/platform/collaboration/images/general-resouce-access/share-resource-dialog.png
similarity index 100%
rename from sources/platform/account/collaboration/images/general-resouce-access/share-resource-dialog.png
rename to sources/platform/collaboration/images/general-resouce-access/share-resource-dialog.png
diff --git a/sources/platform/account/collaboration/images/organizations/configure-permissions.png b/sources/platform/collaboration/images/organizations/configure-permissions.png
similarity index 100%
rename from sources/platform/account/collaboration/images/organizations/configure-permissions.png
rename to sources/platform/collaboration/images/organizations/configure-permissions.png
diff --git a/sources/platform/account/collaboration/images/organizations/integrations.png b/sources/platform/collaboration/images/organizations/integrations.png
similarity index 100%
rename from sources/platform/account/collaboration/images/organizations/integrations.png
rename to sources/platform/collaboration/images/organizations/integrations.png
diff --git a/sources/platform/account/collaboration/images/organizations/members.png b/sources/platform/collaboration/images/organizations/members.png
similarity index 100%
rename from sources/platform/account/collaboration/images/organizations/members.png
rename to sources/platform/collaboration/images/organizations/members.png
diff --git a/sources/platform/account/collaboration/images/organizations/my-organizations.png b/sources/platform/collaboration/images/organizations/my-organizations.png
similarity index 100%
rename from sources/platform/account/collaboration/images/organizations/my-organizations.png
rename to sources/platform/collaboration/images/organizations/my-organizations.png
diff --git a/sources/platform/account/collaboration/images/organizations/roles.png b/sources/platform/collaboration/images/organizations/roles.png
similarity index 100%
rename from sources/platform/account/collaboration/images/organizations/roles.png
rename to sources/platform/collaboration/images/organizations/roles.png
diff --git a/sources/platform/account/collaboration/images/organizations/switch-to-organization.png b/sources/platform/collaboration/images/organizations/switch-to-organization.png
similarity index 100%
rename from sources/platform/account/collaboration/images/organizations/switch-to-organization.png
rename to sources/platform/collaboration/images/organizations/switch-to-organization.png
diff --git a/sources/platform/account/collaboration/images/share-actor.svg b/sources/platform/collaboration/images/share-actor.svg
similarity index 100%
rename from sources/platform/account/collaboration/images/share-actor.svg
rename to sources/platform/collaboration/images/share-actor.svg
diff --git a/sources/platform/account/collaboration/index.md b/sources/platform/collaboration/index.md
similarity index 72%
rename from sources/platform/account/collaboration/index.md
rename to sources/platform/collaboration/index.md
index 974070a924..3c7b4c4272 100644
--- a/sources/platform/account/collaboration/index.md
+++ b/sources/platform/collaboration/index.md
@@ -3,7 +3,7 @@ title: Collaboration
description: Learn how to collaborate with other users and manage permissions for organizations or private resources such as Actors, Actor runs, and storages.
sidebar_position: 12
category: platform
-slug: /account/collaboration
+slug: /collaboration
---
Apify was built from the ground up as a collaborative platform. Whether you’re publishing your Actor in Apify Store or sharing a dataset with a teammate, collaboration is deeply integrated into how Apify works. You can share your resources (like Actors, runs, or storages) with others, manage permissions, or invite collaborators to your organization. By default, each system resource you create is only available to you, the owner. However, you can grant access to other users, making it easy to collaborate effectively and securely.
@@ -11,8 +11,8 @@ Apify was built from the ground up as a collaborative platform. Whether you’re
While most resources can be shared by assigning permissions (see [Access Rights](./access_rights.md)), some resources can also be shared simply by using their unique links or IDs. There are two types of resources in terms of sharing:
- _Resources that require explicit access by default:_
- - [Actors](/actors/running), [tasks](/actors/running/tasks)
- - Can be shared only by inviting collaborators using [Access Rights](./access_rights.md)) or using [Organization Accounts](/account/collaboration/organization)
+ - [Actors](../actors/running/index.md), [tasks](../actors/running/tasks.md)
+ - Can be shared only by inviting collaborators using [Access Rights](./access_rights.md)) or using [Organization Accounts](./organization_account/index.md)
- _Resources supporting both explicit access and link sharing:_
- Actor runs, Actor builds and storage resources (datasets, key-value stores, request queues)
- Can be shared by inviting collaborators or simply by sharing a unique direct link
@@ -21,19 +21,19 @@ You can control access to your resources in four ways:
diff --git a/sources/platform/account/collaboration/list_of_permissions.md b/sources/platform/collaboration/list_of_permissions.md
similarity index 85%
rename from sources/platform/account/collaboration/list_of_permissions.md
rename to sources/platform/collaboration/list_of_permissions.md
index ea12f4ba54..02a6ed1e54 100644
--- a/sources/platform/account/collaboration/list_of_permissions.md
+++ b/sources/platform/collaboration/list_of_permissions.md
@@ -2,14 +2,14 @@
title: List of permissions
description: Learn about the access rights you can grant to other users. See a list of all access options for Apify resources such as Actors, Actor runs/tasks and storage.
sidebar_position: 12.2
-slug: /account/collaboration/list-of-permissions
+slug: /collaboration/list-of-permissions
---
This document contains all the access options that can be granted to resources on the Apify platform.
## Actors
-To learn about Apify Actors, check out the [documentation](/actors).
+To learn about Apify Actors, check out the [documentation](../actors/index.mdx).
### Actor
@@ -30,11 +30,11 @@ To learn about Apify Actors, check out the [documentation](/actors).
| View runs | View a list of Actor task runs and their details. |
| Manage access rights | Manage Actor task access rights. |
-To learn about Actor tasks, see the [documentation](/actors/running/tasks).
+To learn about Actor tasks, see the [documentation](../actors/running/tasks.md).
## Storage
-For more information about Storage, see its [documentation](/storage).
+For more information about Storage, see its [documentation](../storage/index.md).
### Dataset
@@ -44,7 +44,7 @@ For more information about Storage, see its [documentation](/storage).
| Write | Edit dataset settings, push data to it, and remove the dataset. |
| Manage access rights | Manage dataset access rights. |
-To learn about dataset storage, see its [documentation](/storage/dataset).
+To learn about dataset storage, see its [documentation](../storage/dataset.md).
### Key-value-store
@@ -54,7 +54,7 @@ To learn about dataset storage, see its [documentation](/storage/dataset).
| Write | Edit key-value store settings, add, update or remove its records, and delete the key-value store. |
| Manage access rights | Manage key-value store access rights. |
-To learn about key-value stores, see the [documentation](/storage/key-value-store).
+To learn about key-value stores, see the [documentation](../storage/key_value_store.md).
### Request queue
@@ -64,7 +64,7 @@ To learn about key-value stores, see the [documentation](/storage/key-value-stor
| Write | Edit request queue settings, add, update, or remove its records, and delete the request queue. |
| Manage access rights | Manage request queue access rights. |
-To learn about request queue storage, see the [documentation](/storage/request-queue).
+To learn about request queue storage, see the [documentation](../storage/request_queue.md).
## Proxy
@@ -72,11 +72,11 @@ To learn about request queue storage, see the [documentation](/storage/request-q
|------------|---------------------------|
| Proxy | Allow to use Apify Proxy. |
-To learn about Apify Proxy, see its [documentation](/proxy).
+To learn about Apify Proxy, see its [documentation](../proxy/index.md).
## User permissions
-Permissions that can be granted to members of organizations. To learn about the organization account, see its [documentation](/account/collaboration/organization).
+Permissions that can be granted to members of organizations. To learn about the organization account, see its [documentation](./organization_account/index.md).
| Permission | Description |
|---------------------|-----------------------------------------------------------------------|
diff --git a/sources/platform/account/collaboration/organization/how_to_use.md b/sources/platform/collaboration/organization_account/how_to_use.md
similarity index 93%
rename from sources/platform/account/collaboration/organization/how_to_use.md
rename to sources/platform/collaboration/organization_account/how_to_use.md
index 1150a63980..6dab78b62b 100644
--- a/sources/platform/account/collaboration/organization/how_to_use.md
+++ b/sources/platform/collaboration/organization_account/how_to_use.md
@@ -2,7 +2,7 @@
title: Using the organization account
description: Learn to use and manage your organization account using Apify Console or the Apify API. View the organizations you are in and manage your memberships.
sidebar_position: 2
-slug: /account/collaboration/organization/how-to-use
+slug: /collaboration/organization-account/how-to-use
sidebar_label: How to use
---
@@ -40,7 +40,7 @@ The organization, its Actors, and its integrations will keep running as they are
While you cannot manage an organization account's settings and members via API, you can access its Actor and task runs, webhooks, schedules, and storages just as you would with any other account.
-As a member of an organization, you are assigned an [API token](/integrations) (under the **API & Integrations** tab) and proxy password (click the **Proxy** button in the left menu) for accessing the Apify platform via REST API.
+As a member of an organization, you are assigned an [API token](../../integrations/index.mdx) (under the **API & Integrations** tab) and proxy password (click the **Proxy** button in the left menu) for accessing the Apify platform via REST API.

diff --git a/sources/platform/account/collaboration/organization/index.md b/sources/platform/collaboration/organization_account/index.md
similarity index 92%
rename from sources/platform/account/collaboration/organization/index.md
rename to sources/platform/collaboration/organization_account/index.md
index a1242ebc64..52945b3057 100644
--- a/sources/platform/account/collaboration/organization/index.md
+++ b/sources/platform/collaboration/organization_account/index.md
@@ -2,7 +2,7 @@
title: Organization account
description: Create a specialized account for your organization to encourage collaboration and manage permissions. Convert an existing account, or create one from scratch.
sidebar_position: 12.1
-slug: /account/collaboration/organization
+slug: /collaboration/organization-account
---
Organization accounts allow groups to collaborate on projects. It enables you to manage your team members' [permissions](../list_of_permissions.md) and to centralize your billing without having to share the credentials of a single personal account.
@@ -12,7 +12,7 @@ You can [switch](./how_to_use.md) between your personal and organization account
You can set up an organization in two ways:
- [Create a new organization](#create-a-new-organization). If you don't have integrations set up yet, or if they are easy to change, you can create a new organization, preserving your personal account.
-- [Convert an existing account](#convert-an-existing-account) into an organization. If your Actors and [integrations](/integrations) are set up in a personal account, it is probably best to convert that account into an organization. This will preserve all your integrations but means you will have a new personal account created for you.
+- [Convert an existing account](#convert-an-existing-account) into an organization. If your Actors and [integrations](../../integrations/index.mdx) are set up in a personal account, it is probably best to convert that account into an organization. This will preserve all your integrations but means you will have a new personal account created for you.
Prefer video to reading? [See the video tutorial](https://www.youtube.com/watch?v=BIL6HqtnvKk) for organization accounts.
diff --git a/sources/platform/account/collaboration/organization/setup.md b/sources/platform/collaboration/organization_account/setup.md
similarity index 87%
rename from sources/platform/account/collaboration/organization/setup.md
rename to sources/platform/collaboration/organization_account/setup.md
index 0fed008fb8..f5807b07d1 100644
--- a/sources/platform/account/collaboration/organization/setup.md
+++ b/sources/platform/collaboration/organization_account/setup.md
@@ -2,7 +2,7 @@
title: Setup
description: Configure your organization account by inviting new members and assigning their roles. Manage team members' access permissions to the organization's resources.
sidebar_position: 1
-slug: /account/collaboration/organization/setup
+slug: /collaboration/organization-account/setup
---
After creating your organization, you can configure its settings. The **Account** tab allows you to:
@@ -37,7 +37,7 @@ To edit the permissions for each role, click on the **Configure permissions** bu
> Each member can only have one role to avoid conflicting permissions.
-You can configure individual permissions for each resource type such as Actors, Actor tasks or storage. Bear in mind that if a user has the **read** permission for [storages](/storage), you cannot prevent them from accessing a particular storage (e.g. a certain [dataset](/storage)) - they will have access to all of the organization's storages.
+You can configure individual permissions for each resource type such as Actors, Actor tasks or storage. Bear in mind that if a user has the **read** permission for [storages](../../storage/index.md), you cannot prevent them from accessing a particular storage (e.g. a certain [dataset](../../storage/index.md)) - they will have access to all of the organization's storages.
**Some permissions have dependencies**. For example, if someone has the **Actor run** permission, it is likely they will also need the **storage write** permission, so they can store the results from their Actor runs.
diff --git a/sources/platform/account/billing.md b/sources/platform/console/billing.md
similarity index 99%
rename from sources/platform/account/billing.md
rename to sources/platform/console/billing.md
index 9ab311f5a2..640046b5b2 100644
--- a/sources/platform/account/billing.md
+++ b/sources/platform/console/billing.md
@@ -3,7 +3,7 @@ title: Billing
description: View invoices, track current billing cycle usage, manage subscriptions and limits, and review historical usage from the Billings page in Console.
sidebar_position: 3
category: platform
-slug: /account/billing
+slug: /console/billing
---
## Current period
diff --git a/sources/platform/account/images/console-billing-current-period.png b/sources/platform/console/images/console-billing-current-period.png
similarity index 100%
rename from sources/platform/account/images/console-billing-current-period.png
rename to sources/platform/console/images/console-billing-current-period.png
diff --git a/sources/platform/account/images/console-billing-historical-usage-by-actors.png b/sources/platform/console/images/console-billing-historical-usage-by-actors.png
similarity index 100%
rename from sources/platform/account/images/console-billing-historical-usage-by-actors.png
rename to sources/platform/console/images/console-billing-historical-usage-by-actors.png
diff --git a/sources/platform/account/images/console-billing-historical-usage.png b/sources/platform/console/images/console-billing-historical-usage.png
similarity index 100%
rename from sources/platform/account/images/console-billing-historical-usage.png
rename to sources/platform/console/images/console-billing-historical-usage.png
diff --git a/sources/platform/account/images/console-billing-invoices.png b/sources/platform/console/images/console-billing-invoices.png
similarity index 100%
rename from sources/platform/account/images/console-billing-invoices.png
rename to sources/platform/console/images/console-billing-invoices.png
diff --git a/sources/platform/account/images/console-billing-limits.png b/sources/platform/console/images/console-billing-limits.png
similarity index 100%
rename from sources/platform/account/images/console-billing-limits.png
rename to sources/platform/console/images/console-billing-limits.png
diff --git a/sources/platform/account/images/console-billing-pricing.png b/sources/platform/console/images/console-billing-pricing.png
similarity index 100%
rename from sources/platform/account/images/console-billing-pricing.png
rename to sources/platform/console/images/console-billing-pricing.png
diff --git a/sources/platform/account/images/console-billing-subscription.png b/sources/platform/console/images/console-billing-subscription.png
similarity index 100%
rename from sources/platform/account/images/console-billing-subscription.png
rename to sources/platform/console/images/console-billing-subscription.png
diff --git a/sources/platform/account/images/two-factor-authentication.svg b/sources/platform/console/images/two-factor-authentication.svg
similarity index 100%
rename from sources/platform/account/images/two-factor-authentication.svg
rename to sources/platform/console/images/two-factor-authentication.svg
diff --git a/sources/platform/account/console.md b/sources/platform/console/index.md
similarity index 71%
rename from sources/platform/account/console.md
rename to sources/platform/console/index.md
index 01cb8dafda..09ca5868bf 100644
--- a/sources/platform/account/console.md
+++ b/sources/platform/console/index.md
@@ -3,7 +3,7 @@ title: Apify Console
description: "Get started with Apify Console: create an account, sign in with email, Google, or GitHub, and manage your web scraping projects from one place."
sidebar_position: 1
category: platform
-slug: /account/console
+slug: /console
---
[Apify Console](https://console.apify.com) is a web application where you can manage all your Apify projects and resources.
@@ -59,17 +59,17 @@ To navigate Apify Console, use the left-side panel or keyboard shortcuts.
| Section | Keyboard shortcut | Description |
| :--- | :--- | :--- |
-| [Apify Store](/console/store) | G + O | Search for Actors that suit your web-scraping needs. |
-| [Dashboard](/account/console) | G + H | Overview of your account with recently viewed Actors, suggestions, and recent runs. |
-| [Actors](/actors) | G + A | View recent and bookmarked Actors. |
-| [Runs](/actors/running/runs-and-builds) | G + R | View your recent runs. |
-| [Saved tasks](/actors/running/tasks) | G + T | View your saved tasks. |
-| [Integrations](/integrations) | G + I | View your integrations. |
-| [Schedules](/actors/running/schedules) | G + U | Schedule Actor runs and tasks to run at a specified time. |
-| [Development](/actors/development) | G + D | • **My Actors** - see Actors developed by you.
• **Insights** - see analytics for your Actors.
• **Messaging** - check reported issues or send emails to users of your Actors. |
-| [Proxy](/proxy) | G + P | View your proxy usage and credentials. |
-| [Storage](/storage) | G + E | View stored results of your runs in various data formats. |
-| [Billing](/account/billing) | G + B | View billing information, statistics, and invoices. |
-| [Settings](/account/settings) | G + S | Change settings of your account. |
+| [Apify Store](/platform/console/store) | G + O | Search for Actors that suit your web-scraping needs. |
+| [Dashboard](/platform/console) | G + H | Overview of your account with recently viewed Actors, suggestions, and recent runs. |
+| [Actors](/platform/actors) | G + A | View recent and bookmarked Actors. |
+| [Runs](/platform/actors/running/runs-and-builds) | G + R | View your recent runs. |
+| [Saved tasks](/platform/actors/running/tasks) | G + T | View your saved tasks. |
+| [Integrations](/platform/integrations) | G + I | View your integrations. |
+| [Schedules](/platform/schedules) | G + U | Schedule Actor runs and tasks to run at a specified time. |
+| [Development](/platform/actors/development) | G + D | • **My Actors** - see Actors developed by you.
• **Insights** - see analytics for your Actors.
• **Messaging** - check reported issues or send emails to users of your Actors. |
+| [Proxy](/platform/proxy) | G + P | View your proxy usage and credentials. |
+| [Storage](/platform/storage) | G + E | View stored results of your runs in various data formats. |
+| [Billing](/platform/console/billing) | G + B | View billing information, statistics, and invoices. |
+| [Settings](/platform/console/settings) | G + S | Change settings of your account. |
To view all keyboard shortcuts, press Shift + ?.
diff --git a/sources/platform/account/settings.md b/sources/platform/console/settings.md
similarity index 96%
rename from sources/platform/account/settings.md
rename to sources/platform/console/settings.md
index 27136da8bd..25df3408f7 100644
--- a/sources/platform/account/settings.md
+++ b/sources/platform/console/settings.md
@@ -3,7 +3,7 @@ title: Account settings
description: Learn how to manage your Apify account, configure integrations, create and manage organizations, and set notification preferences in the Settings tab.
sidebar_position: 4
category: platform
-slug: /account/settings
+slug: /console/settings
---
## Account
@@ -36,11 +36,11 @@ In the **Session information** section, you can adjust the session configuration
## API & Integrations
-The **API & Integrations** tab provides essential tools for accessing the Apify platform programmatically. Here, you can manage your **API tokens**, which are necessary for using the [Apify API](https://docs.apify.com/api/v2). The tab also shows **third-party apps and services** connected to your account, **account-level integrations**, and **Actor OAuth accounts**. For detailed guidance on utilizing these integrations, refer to the [Integrations documentation](https://docs.apify.com/integrations).
+The **API & Integrations** tab provides essential tools for accessing the Apify platform programmatically. Here, you can manage your **API tokens**, which are necessary for using the [Apify API](https://docs.apify.com/api/v2). The tab also shows **third-party apps and services** connected to your account, **account-level integrations**, and **Actor OAuth accounts**. For detailed guidance on utilizing these integrations, refer to the [Integrations documentation](https://docs.apify.com/platform/integrations).
### MCP connectors
-The **MCP connectors** section lets you authorize third-party MCP servers (such as Notion, Slack, GitHub, or Supabase) once and reuse those connections across any Actor that accepts them. For an overview of the feature, see [MCP connectors](/integrations/mcp-connectors).
+The **MCP connectors** section lets you authorize third-party MCP servers (such as Notion, Slack, GitHub, or Supabase) once and reuse those connections across any Actor that accepts them. For an overview of the feature, see [MCP connectors](/platform/integrations/mcp-connectors).
#### Create a connector
diff --git a/sources/platform/console/store.md b/sources/platform/console/store.md
index ad1d1e3e12..256ce435da 100644
--- a/sources/platform/console/store.md
+++ b/sources/platform/console/store.md
@@ -20,6 +20,6 @@ Once you select an Actor from the store, you'll be directed to its specific page
## Search
-Search results in Apify Console are personalized to each individual user, so the same query can return different Actors than the public Store at [apify.com/store](https://apify.com/store). Both Console and the public Store rank Actors using parameters similar to those in the [Actor quality score](/actors/publishing/quality-score).
+Search results in Apify Console are personalized to each individual user, so the same query can return different Actors than the public Store at [apify.com/store](https://apify.com/store). Both Console and the public Store rank Actors using parameters similar to those in the [Actor quality score](/platform/actors/publishing/quality-score).
-For more information, see [Actors in Store](/actors/running/actors-in-store).
+For more information, see [Actors in Store](/sources/platform/actors/running/store/index.md).
diff --git a/sources/platform/account/two-factor-authentication.md b/sources/platform/console/two-factor-authentication.md
similarity index 99%
rename from sources/platform/account/two-factor-authentication.md
rename to sources/platform/console/two-factor-authentication.md
index abfda9a62b..0715634be3 100644
--- a/sources/platform/account/two-factor-authentication.md
+++ b/sources/platform/console/two-factor-authentication.md
@@ -3,7 +3,7 @@ title: Two-factor authentication
description: Enable two-factor authentication on your Apify Console account using an authenticator app to add a second layer of security against unauthorized access.
sidebar_position: 5
category: platform
-slug: /account/two-factor-authentication
+slug: /console/two-factor-authentication
---
Two-factor authentication (2FA) provides an extra layer of security that helps protect your Apify account. With 2FA enabled, logging into your account consists of two steps:
diff --git a/sources/platform/get-started/building/_category_.json b/sources/platform/get-started/building/_category_.json
deleted file mode 100644
index 588c9544ca..0000000000
--- a/sources/platform/get-started/building/_category_.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "label": "Build",
- "position": 2,
- "collapsed": false
-}
diff --git a/sources/platform/get-started/building/index.mdx b/sources/platform/get-started/building/index.mdx
deleted file mode 100644
index e4d2a42679..0000000000
--- a/sources/platform/get-started/building/index.mdx
+++ /dev/null
@@ -1,36 +0,0 @@
----
-title: Build an Actor
-sidebar_position: 0
-slug: /get-started/build
-description: Choose how to build your first Actor on Apify - local development with the CLI, the web IDE, AI-assisted coding, or building an AI agent on the platform.
-pagination_next: null
-pagination_prev: null
----
-
-import Card from '@site/src/components/Card';
-import CardGrid from '@site/src/components/CardGrid';
-
-There's more than one way to build an Actor. Pick the path that fits how you work and what you're building:
-
-
-
-
-
-
-
diff --git a/sources/platform/get-started/images/actor-create-button.png b/sources/platform/get-started/images/actor-create-button.png
deleted file mode 100644
index f38a7bbe6ce444c555c520ac764a3db284eb4b97..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 108064
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