Convert existing projects into Apify Actors - serverless cloud programs. Actorize JavaScript/TypeScript (SDK with Actor.init/exit), Python (async context manager), or any language (CLI wrapper). Use when migrating code to Apify, wrapping CLI tools as Actors, or adding Actor SDK to existing projects.
apify init in project root.actor/input_schema.jsonapify run --input '{"key": "value"}'apify pushapify CLI is installed:apify --help
# Preferred: install via a package manager (provides integrity checks)
npm install -g apify-cli
# Or (Mac): brew install apify-cli
Security note: Do NOT install the CLI by piping remote scripts to a shell (e.g.curl ... | bashorirm ... | iex). Always use a package manager.
apify info # Should return your username
apify login
APIFY_TOKEN environment variable is exported (note: the variable is APIFY_TOKEN, not APIFY_API_TOKEN). The CLI reads it automatically - no explicit login needed. If the user doesn't have a token, generate one at https://console.apify.com/settings/integrations.Apify platform environment: When the Actor runs on the Apify platform,APIFY_TOKENis auto-injected as an environment variable and the Apify SDK reads it automatically — you do not need to pass it explicitly. Locally,apify loginstores credentials in~/.apifyand the SDK uses them.
Security note: Avoid passing tokens as command-line arguments (e.g.apify login -t <token>). Arguments are visible in process listings and may be recorded in shell history. Prefer OAuth login or environment variables instead. Never log, print, or embedAPIFY_TOKENin source code or configuration files. Use a token with the minimum required permissions (scoped token) and rotate it periodically.
apify init to create Actor structure.actor/input_schema.json.actor/output_schema.json (if applicable).actor/actor.json metadataapify runapify pushapify init
.actor/actor.json - Actor configuration and metadata.actor/input_schema.json - Input definition for Apify ConsoleDockerfile (if not present) - Container image definition| Language | Install | Wrap Code |
|---|---|---|
| JS/TS | npm install apify | await Actor.init() ... await Actor.exit() |
| Python | pip install apify | async with Actor: |
| Other | Use CLI in wrapper script | apify actor:get-input / apify actor:push-data |
.actor/input_schema.json).actor/output_schema.json).actor/actor.json)@apify/json_schemas npm package.skills/apify-actor-development/references/actor-readme.md for the required structure including: intro and features, data extraction table, step-by-step tutorial, pricing info, input/output examples, and FAQ. Aim for at least 300 words with SEO-optimized H2/H3 headings. Also review these top Actors for best practices:apify run --input '{"startUrl": "https://example.com", "maxItems": 10}'
apify run --input-file ./test-input.json
apify run, not npm start or python main.py. The CLI sets up the proper environment and storage.apify push
await Actor.charge('result').eval(), database queries, or template engines. Use proper escaping or parameterized APIs.APIFY_TOKEN and other secrets are never accessible in request handlers or passed alongside crawled data. Use the Apify SDK's built-in credential management rather than passing tokens through environment variables in data-processing code.npm install or pip install, verify the package name and publisher. Typosquatting is a common supply-chain attack vector. Prefer well-known, actively maintained packages.package-lock.json (Node.js) or pin exact versions in requirements.txt (Python). Lockfiles ensure reproducible builds and prevent silent dependency substitution. Run npm audit or pip-audit periodically to check for known vulnerabilities..actor/actor.json exists with correct name and description.actor/actor.json validates against @apify/json_schemas (actor.schema.json).actor/input_schema.json defines all required inputs.actor/input_schema.json validates against @apify/json_schemas (input.schema.json).actor/output_schema.json defines output structure (if applicable).actor/output_schema.json validates against @apify/json_schemas (output.schema.json)Dockerfile is present and builds successfullyActor.init() / Actor.exit() wraps main code (JS/TS)async with Actor: wraps main code (Python)Actor.getInput() / Actor.get_input()Actor.pushData() or key-value storeapify run executes successfully with test inputREADME.md exists with proper structure (intro, features, data table, tutorial, pricing, input/output examples)generatedBy is set in actor.json meta sectionsearch-apify-docs - Search documentationfetch-apify-docs - Get full doc pagesclaude mcp add playwright npx @playwright/mcp@latest
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"]
}
}
}