Contributing to Apify documentation
June 19, 2026 ยท View on GitHub
Before you start
- Review this guide completely
- Setup you development environment
- Familiarize yourself with our documentation style guide
Development setup
Prerequisites
- Git
- Node.js 22 (see .nvmrc file)
- GitHub access
- pnpm 10 package manager (pinned via
packageManagerinpackage.json;corepack enablepicks it up automatically)
Installation steps
- Clone the repository
- Run
pnpm install - Start development server:
pnpm start
This will be enough to work on Platform, Academy and OpenAPI. If you want to work on the entire documentation set, you need to join them using nginx.
Join all repositories with nginx
-
Clone all the repositories
-
Run
pnpm start:devinstead ofpnpm startfrom the main repository -
Run
pnpm start -- --port <number>to start Docusaurus instance on specific port, refer to the table for each repository portRepository Port apify-docs 3000 apify-client-js 3001 apify-client-python 3002 apify-sdk-js 3003 apify-sdk-python 3004 apify-cli 3005 -
To serve them together, setup the nginx server with the following configuration:
server { listen 80; server_name docs.apify.loc; location / { proxy_pass http://localhost:3000; } location /api/client/js { proxy_pass http://localhost:3001; } location /api/client/python { proxy_pass http://localhost:3002; } location /sdk/js { proxy_pass http://localhost:3003; } location /sdk/python { proxy_pass http://localhost:3004; } location /cli { proxy_pass http://localhost:3005; } } -
Add a record to
/etc/hosts, which maps thedocs.apify.locto a localhost:127.0.0.1 docs.apify.loc
You should be able to open https://docs.apify.loc in your browser and run all the repositories jointly as one project.
Documentation style guide
Language guidelines
- Use US English
- Write in inclusive language
- Avoid directional language (like "left" or "right" or instead of "see" use "check out")
- Use active voice whenever possible
Formatting conventions
-
Text emphasis:
- use Bold for UI elements
- use Italics for emphasis
- use
codefor inline code, by using back-ticks (``) - use code blocks with language specification
- use code tabs whenever you want to include examples of implementation in more than one language
-
Documentation elements:
- Use admonitions to emphasize crucial information, available admonitions are:
- note
- tip
- info
- caution
- danger
- Use code tabs for multiple languages
- Include proper metadata in front matter
- Use concise, meaningful headings:
- Use sentence case.
- Avoid question-like titles ("How to...", "What is...").
Example of proper usage and formatting:
:::note Your Title Here Your important message here. ::: - Use admonitions to emphasize crucial information, available admonitions are:
-
Screenshots:
- Keep screenshots to a minimum. If an image shows what your prose already describes, it's probably not needed.
- Always include meaningful alt texts. Remember that it might be the only way for some users to understand the content.
- Use light theme when taking screenshots.
- To highlight UI elements, use
#F86606color for indicators. Don't use arrows.
Front matter metadata best practices
- Keep descriptions between 140 and 160 characters
- Use action-oriented phrasing
- Avoid repetitive keywords
- Avoid the word "documentation" in descriptions
File naming conventions
For file names, use lowercase letters and hyphens (kebab-case). For example web-scraping-basics.mdx
AI assistant rules structure
This project uses an agent-agnostic approach: standards and workflows live at the repo root, with thin adapter files for each AI tool.
Source of truth
standards/- Writing, formatting, terminology, and quality rules.agents/skills/- Documentation skills with processes, references, and scripts (AgentSkills spec)AGENTS.md- Condensed summary + pointers (alsoCLAUDE.mdvia symlink)
Skills (AgentSkills standard)
.agents/skills/- Skill definitions following the AgentSkills spec (discoverable by Codex, Gemini CLI, OpenCode, Cursor, and others).claude/skills/- Symlinks to.agents/skills/for Claude Code discovery
Agent-specific adapters
.cursor/rules/- Thin pointers tostandards/for Cursor
Usage
- Any AI assistant can follow
AGENTS.mdand readstandards/directly - Skills-compatible agents (Claude Code, Codex, Gemini CLI, OpenCode, Cursor): discover skills from
.agents/skills/ - Claude Code users: use
/doc-write,/api-doc,/tutorial,/review-docsskills - Cursor users: rules auto-load via glob patterns on
sources/**/*.mdfiles
Repository structure
Theme management
- uses
@apify/docs-themepackage - automatic synchronization via CI
- Theme updates trigger rebuilds across all projects
Content organization
Content lives in the following locations:
- Main content like Platform documentation & Academy:
/sourcesdirectory - API reference: Generated from OpenAPI specs within
/apify-apidirectory - SDK docs: separate repositories
- Client docs: separate repositories
- CLI docs: separate repositories
API Documentation
Overview
The API reference documentation at docs.apify.com/api/v2 is built from our OpenAPI specification. The source of truth lives in the /apify-api/openapi directory.
Tooling
We use the following tools for API documentation:
- OpenAPI 3.1.2 - API specification format
- Redocly CLI - Linting and validation of OpenAPI specs
docusaurus-plugin-openapi-docs- Generates MDX docs from OpenAPIdocusaurus-theme-openapi-docs- Renders API reference with interactive explorer
Basic commands
pnpm start- Starts docs preview server including API referencepnpm openapi:lint:redocly- Validates OpenAPI spec with Redocly CLIpnpm api:rebuild- Regenerates API docs from OpenAPI specs
Adding new documentation
Schema documentation
- Navigate to
apify-api/openapi/components/schemas - Create a new file named after your schema
- Define the schema structure
- Reference schema using
$refin other files
Example schema
type: object
properties:
id:
description: The resource ID
readOnly: true
allOf:
-$ref: ./ResourceId.yaml
Path documentation
- Navigate to
apify-api/openapi/paths - Create YAML file following the URL structure replacing
/with@ - Place path parameters in curly braces (e.g., {queueId})
- Add path reference to openapi.yaml
Example addition to openapi.yaml file:
'/requests-queues':
$ref: './paths/request-queues/request-queues.yaml'
'/requests-queues/{queueId}':
$ref: './paths/request-queues/request-queues@{queueId}.yaml'
Example YAML file request-queues@{queueId}.yaml in the paths/request-queues folder :
get:
tags:
- Request Queues
summary: Get a Request Queue
operationId: requestQueues_get
description: |
You can have a markdown description here.
parameters:
responses:
'200':
'401':
x-code-samples:
- lang: PHP
source:
$ref: ../code_samples/PHP/customers/get.php
Operation ID conventions
Operation IDs must follow this format:
- Generated from path structure and HTTP method
- Use camelCase for object names
- Single object for paths with {id}, plural otherwise
- Underscore separator between object name and action
- Method name in lowercase at the end
Examples:
/requests-queuesGET ->requestQueues_get/requests-queues/{queueId}PUT ->requestQueue_put/acts/{actorId}/runsPOST ->act_runs_post
Code samples
- Navigate to the
openapi/code_samplesfolder - Navigate to the
<language>sub-folder - Navigate to the
pathfolder, and add ref to the code sample
Add languages by adding new folders at the appropriate path level.
Submitting changes
- Make your changes following the guidelines above
- Test locally using provided pnpm commands
- Submit a pull request to the
masterbranch - Ensure all CI checks pass
Development workflow
Local development
-
Basic setup
pnpm install pnpm start -
Full setup with nginx:
- Clone all documentation repositories
- Configure nginx server
- Update hosts file
- Use
pnpm start:dev
Quality check
Linting
-
Markdown:
pnpm lint:md # Checks for any issues using markdownlint pnpm lint:md:fix # Applies fixes -
Code:
pnpm lint:code # Checks .js & .ts files pnpm lint:code:fix # Applies fixes -
Prose:
- Use Vale for content linting
- Run
vale syncto download styles - Configure exceptions in
accepts.txt
Testing
-
Broken links: Periodic GitHub Action checks broken links by lychee. If the Action fails, we manually fix the issues.
-
Academy exercises: At the end of each lesson in the academy courses, there are exercises that target real-world websites. Each exercise includes a solution, stored as a separate file containing executable code. These files are included in the docs using the
!!raw-loadersyntax. Each course has a Bats test file namedtest.bats. The tests run each solution as a standalone program and verify that it produces output matching the expected results. A periodic GitHub Action runs all these tests usingpnpm test:academy. If the Action fails, we rework the exercises.
Pull request process
- Follow Conventional Commits
- Pass all CI checks
- Include comprehensive documentation updates
Deployment
- Automatic deployment on merge to
master - Builds deploy to appropriate subdomains
- Updates trigger theme synchronization