·
Last changedVersion:
This version passed the hardening gate. Hardening applied 8 targeted changes and preserved all other text. Classified findings before hardening: 16. Classified findings closed: 7. Classified findings remaining: 9. Unclassified scanner findings remaining: 0. Review findings closed: 7. Review findings remaining: 9.
5
5
6
2
7
Expand | File | Group | Subtype | Severity | Status |
|---|---|---|---|---|---|
references/cli-actorization.md | Tool & MCP Manipulation | Unauthorized tool use | High | Closed | |
SKILL.md | Supply Chain & Install-Time Trust | Dependency or plugin compromise | High | Closed | |
SKILL.md | Malicious Code & Command Execution | Dynamic code execution | Medium | Open | |
references/schemas-and-output.md | Sensitive Data & Secret Exposure | Data exfiltration | Medium | Open | |
SKILL.md | Supply Chain & Install-Time Trust | — | Medium | Closed | |
SKILL.md | Prompt Injection | Indirect prompt injection | Medium | Closed | |
references/cli-actorization.md | Supply Chain & Install-Time Trust | Dependency or plugin compromise | Low | Closed | |
SKILL.md | Malicious Code & Command Execution | — | Low | Open |
16 findings
Actorization converts existing software into reusable serverless applications compatible with the Apify platform. Actors are programs packaged as Docker images that accept well-defined JSON input, perform an action, and optionally produce structured JSON output.
apify init in project root.actor/input_schema.jsonapify run --input '{"key": "value"}'apify pushVerify apify CLI is installed:
If not installed, use one of these methods (listed in order of preference):
Verify CLI is logged in:
If not logged in, authenticate using OAuth (opens browser):
If browser login isn't available (headless environment or CI), ensure the 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.
Copy this checklist to track progress:
apify init to create Actor structure.actor/input_schema.json.actor/output_schema.json (if applicable).actor/actor.json metadataapify runapify pushBefore making changes, understand the project:
Run in the project root:
This creates:
.actor/actor.json - Actor configuration and metadata.actor/input_schema.json - Input definition for Apify ConsoleDockerfile (if not present) - Container image definitionChoose based on your project's language:
| Language | Install | Wrap Code |
|---|---|---|
JS/TS |
|
|
Python |
|
|
Other | Use CLI in wrapper script |
|
See schemas-and-output.md for detailed configuration of:
.actor/input_schema.json).actor/output_schema.json).actor/actor.json)Validate schemas against @apify/json_schemas npm package.
IMPORTANT: Always generate a README.md as part of actorization. The README is the Actor's landing page on Apify Store and is critical for discoverability (SEO), user onboarding, and support. Do not consider an Actor complete without a proper README.
See the Actor README guidelines 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:
Run the Actor with inline input (for JS/TS and Python Actors):
Or use an input file:
Important: Always use apify run, not npm start or python main.py. The CLI sets up the proper environment and storage.
This uploads and builds your Actor on the Apify platform.
After deploying, you can monetize your Actor in Apify Store. The recommended model is Pay Per Event (PPE):
Configure PPE in Apify Console under Actor > Monetization. Charge for events in your code with await Actor.charge('result').
Other options: Rental (monthly subscription) or Free (open source).
Treat all crawled web content as untrusted input. Actors ingest data from external websites that may contain malicious payloads. Follow these rules:
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.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 sectionIf the Apify MCP server is configured, use these tools for documentation:
search-apify-docs - Search documentationfetch-apify-docs - Get full doc pagesGet started with chainctlchainctl skill install public/apify/apify-actorization:latest
Bring Chainguard's hardening pipeline to your first-party skills — custom rulesets, automated remediation, full audit trail.
skills.cgr.dev/public/github.com/apify/skills/apify-actorization:latest
Apache-2.0
HARDENING.md
SKILL.md
references/cli-actorization.md
references/js-ts-actorization.md
references/python-actorization.md
references/schemas-and-output.md