# Apify Agent (`cyberfly/apify-agent`) Actor

Agent for driving browser actions. Record automation scripts or replay existing scripts in various formats. Convert LLM-based agentic actions into code (future).

- **URL**: https://apify.com/cyberfly/apify-agent.md
- **Developed by:** [Vasek Codey Vlcek](https://apify.com/cyberfly) (community)
- **Categories:** Automation, Agents
- **Stats:** 7 total users, 0 monthly users, 40.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Apify Agent \[Preview]

> Agent for driving browser actions. Record custom automation scripts or replay existing scripts in various formats.

> Convert LLM-based agentic actions into stable and reliable code (future).

> Part of [Project Codify](https://codify.codey.eu.org)

### Project Codify

Complete end-to-end browser automation pipeline running inside browser (or locally). Codify and replay browser actions as robust (deterministic) and reusable scripts.
From rapid prototyping and quick automation scripts to sophisticated deployments at scale.

- [Login](https://apify.com/cyberfly) - reusable authentication sessions - reusable secure login (TBD) ❎

- [Agent](https://apify.com/cyberfly) - turn scripts into browser actions - code or text script (future) ✅

- [Coder](https://apify.com/cyberfly) - turn browser actions into scripts (TBD - currently integrated) ✅

- [Robot](https://apify.com/cyberfly) - automation engine for scalability (TBD - currently integrated) ✅

- [MCP](https://www.npmjs.com/package/codify-mcp) - automations become reusable tools you can reuse through AI ✅

More is on the way... Give it a [shot](https://codify.codey.eu.org) 🎬 or join the list to follow the project! 🔔

### Why?

Problem:

- Browser agents are useful but not always reliable.
- Code is robust but coding from scratch is tedious.

Why not have the best from both worlds? 💯

### Agent

**Agent** is the performer of browser actions to be **replayed** or **recorded** into reusable automation scripts. It manages automation scripts, from detection and normalization to execution and recovery.

#### Usage

Run the Agent actor. You will be guided through the entire process:

1. Run actor
2. Follow the logs
3. Follow the visual interface

> 💡 Remove the default input script to start the recording of your own automation!

#### Overview

Agent module is designed to **transform browser interactions** into reliable, reproducible, and **scalable automations**. The source of the browser actions can be manual recording or agentic in nature\*. It handles the execution flow, ensuring that scripts are validated, formatted correctly, and ready for execution.

#### Features

- input parameter detection
- automatic detailed logging
- automatic output and debugging tools
- automatic screen resolution detection
- code hints for script in the web editor
- support for different script formats (partial)
- automatic bot detection evasion for the replay
- automatic export to Apify task
- automatic export to AI MCP tool
- automatic export to script file

#### Highlights

- **Multi-Format Support**: Detects script formats and handles them appropriately. (Playwright, Puppeteer\*, or native)
- **Autonomous Normalization**: Transforms raw web recordings and different script formats on the fly.
- **Intelligent Flow Control**: Manages the lifecycle of an automation task, including launching the **Coder** module to generate new scripts.
- **Advanced Validation**: Ensures that scripts are validated before execution.
- **Smart Error Recovery**: Implements strategies for code generation recovery.

#### How it Works

1. **Script Ingestion**: The Agent receives a script (from input or external source).
2. **Detection & Validation**: It analyzes the script and validates its integrity.
3. **Transformation**: If necessary, it transforms the script to a normalized format.
4. **Execution Management**: It hands off the processed script for high-scale execution.
5. **Integration**: If a script is missing it will trigger the **Coder** mode to generate it.

***

Agent turns reproducible, deterministic scripts into browser actions.

\* future support

# Actor input Schema

## `browser.start` (type: `string`):

URL to load at startup of the recording

## `browser.engine` (type: `string`):

Choose browser to use for task execution

## `script` (type: `string`):

Define script for the robot to execute

## `custom` (type: `object`):

Inputs specific to this automation if actor input schema has not been customized

## `login.username` (type: `string`):

Encrypted username (if applicable)

## `login.password` (type: `string`):

Encrypted password (if applicable)

## `proxy` (type: `object`):

Define proxy to pass data through

## Actor input object example

```json
{
  "browser.start": "https://www.wikipedia.org/",
  "browser.engine": "chromium",
  "script": "// ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨\n// 🚀 LIVE DEMO SCRIPT READY TO LAUNCH WITH DEFAULT SETTINGS 🚀\n// 🎬 DELETE THIS SCRIPT TO START CODER AND RECORD YOUR OWN! 🎬\n// ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨\n\n/** @param {context} context */\ncontext => async ({page, tools: {sleep, expect, waitForPage}} = context) => {\n    // agent.will('execute recorded automation')\n    page.setDefaultNavigationTimeout(90 * 1000);\n\n    await page.goto('https://www.wikipedia.org/', {waitUntil: 'domcontentloaded'});\n    await page.getByRole('button', { name: 'Read Wikipedia in your' }).click();\n    await page.getByRole('searchbox', { name: 'Search Wikipedia' }).click();\n    await page.getByRole('searchbox', { name: 'Search Wikipedia' }).fill('hello world');\n    await page.getByRole('searchbox', { name: 'Search Wikipedia' }).press('ArrowDown');\n    await page.getByRole('searchbox', { name: 'Search Wikipedia' }).press('Enter');\n    await page.getByRole('link', { name: 'View history' }).click();\n    await page.getByRole('button', { name: 'Compare selected revisions' }).first().click();\n    await page.getByRole('switch', { name: 'Inline' }).click();\n    await page.getByRole('button', { name: 'Visual' }).click();\n    await page.getByRole('button', { name: 'Tools' }).check();\n    await page.getByRole('link', { name: 'Edit', exact: true }).click();\n\n    await page.goto('https://apify.com/store/', {waitUntil: 'domcontentloaded'});\n    await page.getByRole('combobox').click();\n    await page.locator('[data-test=\"actor-store-search\"]').click();\n    await page.locator('[data-test=\"actor-store-search\"]').fill('chrome extensions');\n    await page.locator('[data-test=\"actor-store-search\"]').press('Enter');\n    await page.locator('[data-test=\"store-filter-category\"]').click();\n    await page.locator('[data-test=\"store-filter-category\"]').click();\n    await page.locator('[data-test=\"store-filter-category\"]').press('Tab');\n    await page.locator('[data-test=\"store-filter-pricing\"]').press('Tab');\n    await page.locator('[data-test=\"store-filter-managedBy\"]').press('ArrowDown');\n    await page.getByRole('option', { name: 'All developers' }).press('ArrowDown');\n    await page.getByRole('option', { name: 'Maintained by Apify' }).press('ArrowDown');\n    await page.getByRole('option', { name: 'Maintained by Community' }).press('Enter');\n    await page.getByRole('link', { name: 'Chrome Extensions avatar' }).click();\n    await page.getByRole('tab', { name: 'Input' }).click();\n    await page.getByRole('tab', { name: 'API' }).click();\n    await page.getByRole('tab', { name: 'Reviews' }).click();\n    await page.getByRole('link', { name: 'Vasek Codey Vlcek Vasek Codey' }).click();\n    await page.locator('div').filter({ hasText: 'Vasek Codey' }).nth(2).click();\n\n    return {\n        example: true,\n        success: true,\n    };\n};\n\n// ⚙️ SETUP FOR CODE HINTS: 💡\n/** @typedef {{all: () => Promise<Locator[]>, allInnerTexts: () => Promise<string[]>, allTextContents: () => Promise<string[]>, and: (locator: Locator) => Locator, ariaSnapshot: (options?: {timeout?: number}) => Promise<string>, blur: (options?: {timeout?: number}) => Promise<void>, boundingBox: (options?: {timeout?: number}) => Promise<any>, check: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, clear: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, click: (options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, contentFrame: () => Object, count: () => Promise<number>, dblclick: (options?: {button?: 'left'|'right'|'middle', delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, describe: (description: string) => Locator, description: () => string, dispatchEvent: (type: string, eventInit?: any, options?: {timeout?: number}) => Promise<void>, dragTo: (target: Locator, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, sourcePosition?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, evaluate: (pageFunction: string|function, arg?: any, options?: {timeout?: number}) => Promise<any>, evaluateAll: (pageFunction: string|function, arg?: any) => Promise<any>, evaluateHandle: (pageFunction: string|function, arg?: any, options?: {timeout?: number}) => Promise<any>, fill: (value: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, filter: (options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, first: () => Locator, focus: (options?: {timeout?: number}) => Promise<void>, frameLocator: (selector: string) => Object, getAttribute: (name: string, options?: {timeout?: number}) => Promise<string>, getByAltText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByLabel: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByPlaceholder: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByRole: (role: 'alert'|'alertdialog'|'application'|'article'|'banner'|'blockquote'|'button'|'caption'|'cell'|'checkbox'|'code'|'complementary'|'contentinfo'|'definition'|'deletion'|'dialog'|'directory'|'document'|'emphasis'|'feed'|'figure'|'form'|'generic'|'grid'|'gridcell'|'group'|'heading'|'img'|'insertion'|'link'|'list'|'listbox'|'listitem'|'log'|'main'|'marquee'|'math'|'meter'|'menu'|'menubar'|'menuitem'|'menuitemcheckbox'|'menuitemradio'|'navigation'|'none'|'note'|'option'|'paragraph'|'presentation'|'progressbar'|'radio'|'radiogroup'|'region'|'row'|'rowgroup'|'rowheader'|'scrollbar'|'search'|'searchbox'|'separator'|'slider'|'spinbutton'|'status'|'strong'|'subscript'|'superscript'|'switch'|'tab'|'table'|'tablist'|'tabpanel'|'term'|'textbox'|'timer'|'toolbar'|'tooltip'|'tree'|'treegrid'|'treeitem', options?: {checked?: boolean, disabled?: boolean, exact?: boolean, expanded?: boolean, includeHidden?: boolean, level?: number, name?: string|RegExp, pressed?: boolean, selected?: boolean}) => Locator, getByTestId: (testId: string|RegExp) => Locator, getByText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTitle: (text: string|RegExp, options?: {exact?: boolean}) => Locator, highlight: () => Promise<void>, hover: (options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, innerHTML: (options?: {timeout?: number}) => Promise<string>, innerText: (options?: {timeout?: number}) => Promise<string>, inputValue: (options?: {timeout?: number}) => Promise<string>, isChecked: (options?: {timeout?: number}) => Promise<boolean>, isDisabled: (options?: {timeout?: number}) => Promise<boolean>, isEditable: (options?: {timeout?: number}) => Promise<boolean>, isEnabled: (options?: {timeout?: number}) => Promise<boolean>, isHidden: (options?: {timeout?: number}) => Promise<boolean>, isVisible: (options?: {timeout?: number}) => Promise<boolean>, last: () => Locator, locator: (selectorOrLocator: string|Locator, options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, nth: (index: number) => Locator, or: (locator: Locator) => Locator, page: () => Object, press: (key: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, pressSequentially: (text: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, screenshot: (options?: {animations?: 'disabled'|'allow', caret?: 'hide'|'initial', clip?: {x: number, y: number, width: number, height: number}, fullPage?: boolean, mask?: Locator[], maskColor?: string, omitBackground?: boolean, path?: string, quality?: number, scale?: 'css'|'device', style?: string, timeout?: number, type?: 'png'|'jpeg'}) => Promise<Buffer>, scrollIntoViewIfNeeded: (options?: {timeout?: number}) => Promise<void>, selectOption: (values: string|string[]|Object|any, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<string[]>, selectText: (options?: {force?: boolean, timeout?: number}) => Promise<void>, setChecked: (checked: boolean, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, setInputFiles: (files: string|string[]|Object|any[], options?: {noWaitAfter?: boolean, timeout?: number}) => Promise<void>, tap: (options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, textContent: (options?: {timeout?: number}) => Promise<string>, uncheck: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, waitFor: (options?: {state?: 'attached'|'detached'|'visible'|'hidden', timeout?: number}) => Promise<void>}} Locator */\n/** @typedef {{input: {target: string, tasks: string[], browser: string=, ipAddress: string=, retry: number=, abort: boolean=, block: boolean=, debug: boolean=, human: boolean=, notify: boolean=, silent: boolean=, server: boolean=, session: boolean=, stealth: boolean=, proxyConfig: Object=, options: Object=}, output: Object, task: {name: string, init: (context: Object) => boolean=, done: (context: Object) => boolean=, output: Object=, model: Object}, step: {name: string, attachOutput: (output: Object) => Object, output: Object, done: boolean=, will: (text: string) => void}, page: {goto: (url: string, options?: {referer?: string, timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, goBack: (options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, goForward: (options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, reload: (options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, waitForNavigation: (options?: {timeout?: number, url?: string|RegExp|function, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, waitForURL: (url: string|RegExp|function, options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, waitForSelector: (selector: string, options?: {state?: 'attached'|'detached'|'visible'|'hidden', strict?: boolean, timeout?: number}) => Promise<any>, waitForFunction: (callback: string|function, arg?: any, options?: {polling?: number|'raf', timeout?: number}) => Promise<void>, waitForLoadState: (state?: 'load'|'domcontentloaded'|'networkidle', options?: {timeout?: number}) => Promise<void>, waitForTimeout: (timeout: number) => Promise<void>, waitForEvent: (event: string, optionsOrPredicate?: {predicate?: function, timeout?: number}|function) => Promise<any>, waitForResponse: (urlOrPredicate: string|RegExp|function, options?: {timeout?: number}) => Promise<any>, waitForRequest: (urlOrPredicate: string|RegExp|function, options?: {timeout?: number}) => Promise<any>, waitForPopup: (options?: {timeout?: number}) => Promise<any>, waitForDownload: (options?: {timeout?: number}) => Promise<any>, waitForConsoleMessage: (options?: {predicate?: function, timeout?: number}) => Promise<any>, waitForWebSocket: (options?: {predicate?: function, timeout?: number}) => Promise<any>, locator: (selector: string, options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, frameLocator: (selector: string) => Object, getByRole: (role: 'alert'|'alertdialog'|'application'|'article'|'banner'|'blockquote'|'button'|'caption'|'cell'|'checkbox'|'code'|'complementary'|'contentinfo'|'definition'|'deletion'|'dialog'|'directory'|'document'|'emphasis'|'feed'|'figure'|'form'|'generic'|'grid'|'gridcell'|'group'|'heading'|'img'|'insertion'|'link'|'list'|'listbox'|'listitem'|'log'|'main'|'marquee'|'math'|'meter'|'menu'|'menubar'|'menuitem'|'menuitemcheckbox'|'menuitemradio'|'navigation'|'none'|'note'|'option'|'paragraph'|'presentation'|'progressbar'|'radio'|'radiogroup'|'region'|'row'|'rowgroup'|'rowheader'|'scrollbar'|'search'|'searchbox'|'separator'|'slider'|'spinbutton'|'status'|'strong'|'subscript'|'superscript'|'switch'|'tab'|'table'|'tablist'|'tabpanel'|'term'|'textbox'|'timer'|'toolbar'|'tooltip'|'tree'|'treegrid'|'treeitem', options?: {checked?: boolean, disabled?: boolean, exact?: boolean, expanded?: boolean, includeHidden?: boolean, level?: number, name?: string|RegExp, pressed?: boolean, selected?: boolean}) => Locator, getByLabel: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByPlaceholder: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByAltText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTitle: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTestId: (testId: string|RegExp) => Locator, $: (selector: string, options?: {strict?: boolean}) => Promise<any>, $$: (selector: string) => Promise<any[]>, $eval: (selector: string, pageFunction: function, arg?: any, options?: {strict?: boolean}) => Promise<any>, $$eval: (selector: string, pageFunction: function, arg?: any) => Promise<any[]>, type: (selector: string, text: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, fill: (selector: string, value: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, click: (selector: string, options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, dblclick: (selector: string, options?: {button?: 'left'|'right'|'middle', delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, check: (selector: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, uncheck: (selector: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, selectOption: (selector: string, values: string|string[]|Object, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, hover: (selector: string, options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, focus: (selector: string, options?: {timeout?: number}) => Promise<void>, tap: (selector: string, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, press: (selector: string, key: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, inputValue: (selector: string, options?: {timeout?: number}) => Promise<string>, isChecked: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isVisible: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isDisabled: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isEditable: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isEnabled: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isHidden: (selector: string, options?: {timeout?: number}) => Promise<boolean>, innerHTML: (selector: string, options?: {timeout?: number}) => Promise<string>, outerHTML: (selector: string, options?: {timeout?: number}) => Promise<string>, textContent: (selector: string, options?: {timeout?: number}) => Promise<string>, getAttribute: (selector: string, name: string, options?: {timeout?: number}) => Promise<any>, boundingBox: (selector: string, options?: {timeout?: number}) => Promise<any>, screenshot: (selector: string, options?: {animations?: 'disabled'|'allow', caret?: 'hide'|'initial', clip?: {x: number, y: number, width: number, height: number}, fullPage?: boolean, mask?: Locator[], maskColor?: string, omitBackground?: boolean, path?: string, quality?: number, scale?: 'css'|'device', style?: string, timeout?: number, type?: 'png'|'jpeg'}) => Promise<any>, content: () => Promise<string>, url: () => Promise<string>, title: () => Promise<string>, evaluate: (pageFunction: string|function, arg?: any) => Promise<any>, evaluateHandle: (pageFunction: string|function, arg?: any) => Promise<any>, setDefaultNavigationTimeout: (timeout: number) => void, setDefaultTimeout: (timeout: number) => void, setContent: (html: string, options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, setCookie: (cookies: any[]) => Promise<void>, deleteCookie: (cookies: any[]) => Promise<void>, cookies: () => Promise<any[]>, addScriptTag: (options: {content?: string, path?: string, type?: string, url?: string}) => Promise<any>, addStyleTag: (options: {content?: string, path?: string, url?: string}) => Promise<any>, addInitScript: (script: string|function, arg?: any) => Promise<void>, addLocatorHandler: (locator: Locator, handler: function, options?: {noWaitAfter?: boolean, times?: number}) => Promise<void>, removeLocatorHandler: (locator: Locator) => Promise<void>, dragAndDrop: (source: string, target: string, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, sourcePosition?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, dispatchEvent: (selector: string, type: string, eventInit?: any, options?: {timeout?: number}) => Promise<void>, setInputFiles: (selector: string, files: string|any[], options?: {noWaitAfter?: boolean, timeout?: number}) => Promise<void>, route: (url: string|RegExp|function, handler: function, options?: {times?: number}) => Promise<void>, routeFromHAR: (har: string, options?: {notFound?: 'abort'|'fallback', update?: boolean, updateContent?: 'attach'|'embed', url?: string|RegExp}) => Promise<void>, routeWebSocket: (url: string|RegExp|function, handler: function) => Promise<void>, unroute: (url: string|RegExp|function, handler?: function) => Promise<void>, unrouteAll: (options?: {behavior?: 'default'|'wait', timeout?: number}) => Promise<void>, pdf: (options?: {displayHeaderFooter?: boolean, footerTemplate?: string, format?: string, headerTemplate?: string, height?: string|number, landscape?: boolean, margin?: {top?: string|number, right?: string|number, bottom?: string|number, left?: string|number}, outline?: boolean, pageRanges?: string, path?: string, preferCSSPageSize?: boolean, printBackground?: boolean, scale?: number, tagged?: boolean, width?: string|number}) => Promise<Buffer>, frames: () => Promise<any[]>, frame: (frameSelector: string|Object) => Promise<any>, mainFrame: () => Promise<any>, opener: () => Promise<any>, context: () => Promise<any>, isClosed: () => Promise<boolean>, emulateMedia: (options?: {colorScheme?: 'light'|'dark'|'no-preference', media?: 'screen'|'print'|'no-preference'}) => Promise<any>, setExtraHTTPHeaders: (headers: Object) => Promise<void>, setViewportSize: (viewportSize: {width: number, height: number}) => Promise<void>, viewportSize: () => Promise<{width: number, height: number}>, bringToFront: () => Promise<void>, close: (options?: {runBeforeUnload?: boolean}) => Promise<void>, pause: () => Promise<void>, consoleMessages: () => Promise<any[]>, pageErrors: () => Promise<any[]>, requests: () => Promise<any[]>, exposeBinding: (name: string, callback: function, options?: {handle?: boolean}) => Promise<void>, exposeFunction: (name: string, callback: function) => Promise<void>, removeAllListeners: (type?: string) => Promise<void>, requestGC: () => Promise<void>, video: () => Promise<any>, keyboard: {press: (key: string, options?: {delay?: number}) => Promise<void>, insertText: (text: string) => Promise<void>, up: (key: string) => Promise<void>, down: (key: string) => Promise<void>}, mouse: {move: (x: number, y: number, options?: {steps?: number}) => Promise<void>, click: (x: number, y: number, options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number}) => Promise<void>, dblclick: (x: number, y: number, options?: {button?: 'left'|'right'|'middle', delay?: number}) => Promise<void>, up: (options?: {button?: 'left'|'right'|'middle', clickCount?: number}) => Promise<void>, down: (options?: {button?: 'left'|'right'|'middle', clickCount?: number}) => Promise<void>, wheel: (deltaX: number, deltaY: number) => Promise<void>}, touchscreen: {tap: (x: number, y: number) => Promise<void>}, request: Object, coverage: Object, clock: Object}, pages: any[], human: {press: (key: string, options?: {delay?: number}) => Promise<void>, type: (text: string, options?: {delay?: number}) => Promise<void>, click: (selector: string, options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, hover: (selector: string, options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, move: (x: number, y: number, options?: {steps?: number}) => Promise<void>, scrollPageToBottom: (options?: {timeout?: number}) => Promise<void>, waitForSelector: (selector: string, options?: {state?: 'attached'|'detached'|'visible'|'hidden', timeout?: number}) => Promise<any>}, pools: {browserPool: Object, sessionPool: Object}, events: {emit: (event: string, ...args: any[]) => void, listen: (event: string, callback: function) => void}, session: Object, server: {hypertext: Object, interface: {serve: (page: Object) => void}, websocket: {send: (message: string) => string, cast: (message: string) => string}}, state: Object, tools: {debug: (name?: string) => void, matchPattern: (page: Object, patterns: any[]) => Promise<any|undefined>, iteratePatterns: (page: Object, patterns: Object, patternOrder?: string[]) => Promise<string|undefined>, waitForPage: (index: number, timeout?: number) => Promise<any>, expect: any, test: any, login: (username?: string, password?: string) => void}}} context */",
  "custom": {
    "example": "input to be used in the script"
  },
  "proxy": {
    "useApifyProxy": false
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "browser.start": "https://www.wikipedia.org/",
    "browser.engine": "chromium",
    "script": // ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
    // 🚀 LIVE DEMO SCRIPT READY TO LAUNCH WITH DEFAULT SETTINGS 🚀
    // 🎬 DELETE THIS SCRIPT TO START CODER AND RECORD YOUR OWN! 🎬
    // ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
    
    /** @param {context} context */
    context => async ({page, tools: {sleep, expect, waitForPage}} = context) => {
        // agent.will('execute recorded automation')
        page.setDefaultNavigationTimeout(90 * 1000);
    
        await page.goto('https://www.wikipedia.org/', {waitUntil: 'domcontentloaded'});
        await page.getByRole('button', { name: 'Read Wikipedia in your' }).click();
        await page.getByRole('searchbox', { name: 'Search Wikipedia' }).click();
        await page.getByRole('searchbox', { name: 'Search Wikipedia' }).fill('hello world');
        await page.getByRole('searchbox', { name: 'Search Wikipedia' }).press('ArrowDown');
        await page.getByRole('searchbox', { name: 'Search Wikipedia' }).press('Enter');
        await page.getByRole('link', { name: 'View history' }).click();
        await page.getByRole('button', { name: 'Compare selected revisions' }).first().click();
        await page.getByRole('switch', { name: 'Inline' }).click();
        await page.getByRole('button', { name: 'Visual' }).click();
        await page.getByRole('button', { name: 'Tools' }).check();
        await page.getByRole('link', { name: 'Edit', exact: true }).click();
    
        await page.goto('https://apify.com/store/', {waitUntil: 'domcontentloaded'});
        await page.getByRole('combobox').click();
        await page.locator('[data-test="actor-store-search"]').click();
        await page.locator('[data-test="actor-store-search"]').fill('chrome extensions');
        await page.locator('[data-test="actor-store-search"]').press('Enter');
        await page.locator('[data-test="store-filter-category"]').click();
        await page.locator('[data-test="store-filter-category"]').click();
        await page.locator('[data-test="store-filter-category"]').press('Tab');
        await page.locator('[data-test="store-filter-pricing"]').press('Tab');
        await page.locator('[data-test="store-filter-managedBy"]').press('ArrowDown');
        await page.getByRole('option', { name: 'All developers' }).press('ArrowDown');
        await page.getByRole('option', { name: 'Maintained by Apify' }).press('ArrowDown');
        await page.getByRole('option', { name: 'Maintained by Community' }).press('Enter');
        await page.getByRole('link', { name: 'Chrome Extensions avatar' }).click();
        await page.getByRole('tab', { name: 'Input' }).click();
        await page.getByRole('tab', { name: 'API' }).click();
        await page.getByRole('tab', { name: 'Reviews' }).click();
        await page.getByRole('link', { name: 'Vasek Codey Vlcek Vasek Codey' }).click();
        await page.locator('div').filter({ hasText: 'Vasek Codey' }).nth(2).click();
    
        return {
            example: true,
            success: true,
        };
    };
    
    // ⚙️ SETUP FOR CODE HINTS: 💡
    /** @typedef {{all: () => Promise<Locator[]>, allInnerTexts: () => Promise<string[]>, allTextContents: () => Promise<string[]>, and: (locator: Locator) => Locator, ariaSnapshot: (options?: {timeout?: number}) => Promise<string>, blur: (options?: {timeout?: number}) => Promise<void>, boundingBox: (options?: {timeout?: number}) => Promise<any>, check: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, clear: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, click: (options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, contentFrame: () => Object, count: () => Promise<number>, dblclick: (options?: {button?: 'left'|'right'|'middle', delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, describe: (description: string) => Locator, description: () => string, dispatchEvent: (type: string, eventInit?: any, options?: {timeout?: number}) => Promise<void>, dragTo: (target: Locator, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, sourcePosition?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, evaluate: (pageFunction: string|function, arg?: any, options?: {timeout?: number}) => Promise<any>, evaluateAll: (pageFunction: string|function, arg?: any) => Promise<any>, evaluateHandle: (pageFunction: string|function, arg?: any, options?: {timeout?: number}) => Promise<any>, fill: (value: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, filter: (options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, first: () => Locator, focus: (options?: {timeout?: number}) => Promise<void>, frameLocator: (selector: string) => Object, getAttribute: (name: string, options?: {timeout?: number}) => Promise<string>, getByAltText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByLabel: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByPlaceholder: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByRole: (role: 'alert'|'alertdialog'|'application'|'article'|'banner'|'blockquote'|'button'|'caption'|'cell'|'checkbox'|'code'|'complementary'|'contentinfo'|'definition'|'deletion'|'dialog'|'directory'|'document'|'emphasis'|'feed'|'figure'|'form'|'generic'|'grid'|'gridcell'|'group'|'heading'|'img'|'insertion'|'link'|'list'|'listbox'|'listitem'|'log'|'main'|'marquee'|'math'|'meter'|'menu'|'menubar'|'menuitem'|'menuitemcheckbox'|'menuitemradio'|'navigation'|'none'|'note'|'option'|'paragraph'|'presentation'|'progressbar'|'radio'|'radiogroup'|'region'|'row'|'rowgroup'|'rowheader'|'scrollbar'|'search'|'searchbox'|'separator'|'slider'|'spinbutton'|'status'|'strong'|'subscript'|'superscript'|'switch'|'tab'|'table'|'tablist'|'tabpanel'|'term'|'textbox'|'timer'|'toolbar'|'tooltip'|'tree'|'treegrid'|'treeitem', options?: {checked?: boolean, disabled?: boolean, exact?: boolean, expanded?: boolean, includeHidden?: boolean, level?: number, name?: string|RegExp, pressed?: boolean, selected?: boolean}) => Locator, getByTestId: (testId: string|RegExp) => Locator, getByText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTitle: (text: string|RegExp, options?: {exact?: boolean}) => Locator, highlight: () => Promise<void>, hover: (options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, innerHTML: (options?: {timeout?: number}) => Promise<string>, innerText: (options?: {timeout?: number}) => Promise<string>, inputValue: (options?: {timeout?: number}) => Promise<string>, isChecked: (options?: {timeout?: number}) => Promise<boolean>, isDisabled: (options?: {timeout?: number}) => Promise<boolean>, isEditable: (options?: {timeout?: number}) => Promise<boolean>, isEnabled: (options?: {timeout?: number}) => Promise<boolean>, isHidden: (options?: {timeout?: number}) => Promise<boolean>, isVisible: (options?: {timeout?: number}) => Promise<boolean>, last: () => Locator, locator: (selectorOrLocator: string|Locator, options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, nth: (index: number) => Locator, or: (locator: Locator) => Locator, page: () => Object, press: (key: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, pressSequentially: (text: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, screenshot: (options?: {animations?: 'disabled'|'allow', caret?: 'hide'|'initial', clip?: {x: number, y: number, width: number, height: number}, fullPage?: boolean, mask?: Locator[], maskColor?: string, omitBackground?: boolean, path?: string, quality?: number, scale?: 'css'|'device', style?: string, timeout?: number, type?: 'png'|'jpeg'}) => Promise<Buffer>, scrollIntoViewIfNeeded: (options?: {timeout?: number}) => Promise<void>, selectOption: (values: string|string[]|Object|any, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<string[]>, selectText: (options?: {force?: boolean, timeout?: number}) => Promise<void>, setChecked: (checked: boolean, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, setInputFiles: (files: string|string[]|Object|any[], options?: {noWaitAfter?: boolean, timeout?: number}) => Promise<void>, tap: (options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, textContent: (options?: {timeout?: number}) => Promise<string>, uncheck: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, waitFor: (options?: {state?: 'attached'|'detached'|'visible'|'hidden', timeout?: number}) => Promise<void>}} Locator */
    /** @typedef {{input: {target: string, tasks: string[], browser: string=, ipAddress: string=, retry: number=, abort: boolean=, block: boolean=, debug: boolean=, human: boolean=, notify: boolean=, silent: boolean=, server: boolean=, session: boolean=, stealth: boolean=, proxyConfig: Object=, options: Object=}, output: Object, task: {name: string, init: (context: Object) => boolean=, done: (context: Object) => boolean=, output: Object=, model: Object}, step: {name: string, attachOutput: (output: Object) => Object, output: Object, done: boolean=, will: (text: string) => void}, page: {goto: (url: string, options?: {referer?: string, timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, goBack: (options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, goForward: (options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, reload: (options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, waitForNavigation: (options?: {timeout?: number, url?: string|RegExp|function, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, waitForURL: (url: string|RegExp|function, options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, waitForSelector: (selector: string, options?: {state?: 'attached'|'detached'|'visible'|'hidden', strict?: boolean, timeout?: number}) => Promise<any>, waitForFunction: (callback: string|function, arg?: any, options?: {polling?: number|'raf', timeout?: number}) => Promise<void>, waitForLoadState: (state?: 'load'|'domcontentloaded'|'networkidle', options?: {timeout?: number}) => Promise<void>, waitForTimeout: (timeout: number) => Promise<void>, waitForEvent: (event: string, optionsOrPredicate?: {predicate?: function, timeout?: number}|function) => Promise<any>, waitForResponse: (urlOrPredicate: string|RegExp|function, options?: {timeout?: number}) => Promise<any>, waitForRequest: (urlOrPredicate: string|RegExp|function, options?: {timeout?: number}) => Promise<any>, waitForPopup: (options?: {timeout?: number}) => Promise<any>, waitForDownload: (options?: {timeout?: number}) => Promise<any>, waitForConsoleMessage: (options?: {predicate?: function, timeout?: number}) => Promise<any>, waitForWebSocket: (options?: {predicate?: function, timeout?: number}) => Promise<any>, locator: (selector: string, options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, frameLocator: (selector: string) => Object, getByRole: (role: 'alert'|'alertdialog'|'application'|'article'|'banner'|'blockquote'|'button'|'caption'|'cell'|'checkbox'|'code'|'complementary'|'contentinfo'|'definition'|'deletion'|'dialog'|'directory'|'document'|'emphasis'|'feed'|'figure'|'form'|'generic'|'grid'|'gridcell'|'group'|'heading'|'img'|'insertion'|'link'|'list'|'listbox'|'listitem'|'log'|'main'|'marquee'|'math'|'meter'|'menu'|'menubar'|'menuitem'|'menuitemcheckbox'|'menuitemradio'|'navigation'|'none'|'note'|'option'|'paragraph'|'presentation'|'progressbar'|'radio'|'radiogroup'|'region'|'row'|'rowgroup'|'rowheader'|'scrollbar'|'search'|'searchbox'|'separator'|'slider'|'spinbutton'|'status'|'strong'|'subscript'|'superscript'|'switch'|'tab'|'table'|'tablist'|'tabpanel'|'term'|'textbox'|'timer'|'toolbar'|'tooltip'|'tree'|'treegrid'|'treeitem', options?: {checked?: boolean, disabled?: boolean, exact?: boolean, expanded?: boolean, includeHidden?: boolean, level?: number, name?: string|RegExp, pressed?: boolean, selected?: boolean}) => Locator, getByLabel: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByPlaceholder: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByAltText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTitle: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTestId: (testId: string|RegExp) => Locator, $: (selector: string, options?: {strict?: boolean}) => Promise<any>, $: (selector: string) => Promise<any[]>, $eval: (selector: string, pageFunction: function, arg?: any, options?: {strict?: boolean}) => Promise<any>, $eval: (selector: string, pageFunction: function, arg?: any) => Promise<any[]>, type: (selector: string, text: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, fill: (selector: string, value: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, click: (selector: string, options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, dblclick: (selector: string, options?: {button?: 'left'|'right'|'middle', delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, check: (selector: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, uncheck: (selector: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, selectOption: (selector: string, values: string|string[]|Object, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, hover: (selector: string, options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, focus: (selector: string, options?: {timeout?: number}) => Promise<void>, tap: (selector: string, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, press: (selector: string, key: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, inputValue: (selector: string, options?: {timeout?: number}) => Promise<string>, isChecked: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isVisible: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isDisabled: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isEditable: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isEnabled: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isHidden: (selector: string, options?: {timeout?: number}) => Promise<boolean>, innerHTML: (selector: string, options?: {timeout?: number}) => Promise<string>, outerHTML: (selector: string, options?: {timeout?: number}) => Promise<string>, textContent: (selector: string, options?: {timeout?: number}) => Promise<string>, getAttribute: (selector: string, name: string, options?: {timeout?: number}) => Promise<any>, boundingBox: (selector: string, options?: {timeout?: number}) => Promise<any>, screenshot: (selector: string, options?: {animations?: 'disabled'|'allow', caret?: 'hide'|'initial', clip?: {x: number, y: number, width: number, height: number}, fullPage?: boolean, mask?: Locator[], maskColor?: string, omitBackground?: boolean, path?: string, quality?: number, scale?: 'css'|'device', style?: string, timeout?: number, type?: 'png'|'jpeg'}) => Promise<any>, content: () => Promise<string>, url: () => Promise<string>, title: () => Promise<string>, evaluate: (pageFunction: string|function, arg?: any) => Promise<any>, evaluateHandle: (pageFunction: string|function, arg?: any) => Promise<any>, setDefaultNavigationTimeout: (timeout: number) => void, setDefaultTimeout: (timeout: number) => void, setContent: (html: string, options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, setCookie: (cookies: any[]) => Promise<void>, deleteCookie: (cookies: any[]) => Promise<void>, cookies: () => Promise<any[]>, addScriptTag: (options: {content?: string, path?: string, type?: string, url?: string}) => Promise<any>, addStyleTag: (options: {content?: string, path?: string, url?: string}) => Promise<any>, addInitScript: (script: string|function, arg?: any) => Promise<void>, addLocatorHandler: (locator: Locator, handler: function, options?: {noWaitAfter?: boolean, times?: number}) => Promise<void>, removeLocatorHandler: (locator: Locator) => Promise<void>, dragAndDrop: (source: string, target: string, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, sourcePosition?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, dispatchEvent: (selector: string, type: string, eventInit?: any, options?: {timeout?: number}) => Promise<void>, setInputFiles: (selector: string, files: string|any[], options?: {noWaitAfter?: boolean, timeout?: number}) => Promise<void>, route: (url: string|RegExp|function, handler: function, options?: {times?: number}) => Promise<void>, routeFromHAR: (har: string, options?: {notFound?: 'abort'|'fallback', update?: boolean, updateContent?: 'attach'|'embed', url?: string|RegExp}) => Promise<void>, routeWebSocket: (url: string|RegExp|function, handler: function) => Promise<void>, unroute: (url: string|RegExp|function, handler?: function) => Promise<void>, unrouteAll: (options?: {behavior?: 'default'|'wait', timeout?: number}) => Promise<void>, pdf: (options?: {displayHeaderFooter?: boolean, footerTemplate?: string, format?: string, headerTemplate?: string, height?: string|number, landscape?: boolean, margin?: {top?: string|number, right?: string|number, bottom?: string|number, left?: string|number}, outline?: boolean, pageRanges?: string, path?: string, preferCSSPageSize?: boolean, printBackground?: boolean, scale?: number, tagged?: boolean, width?: string|number}) => Promise<Buffer>, frames: () => Promise<any[]>, frame: (frameSelector: string|Object) => Promise<any>, mainFrame: () => Promise<any>, opener: () => Promise<any>, context: () => Promise<any>, isClosed: () => Promise<boolean>, emulateMedia: (options?: {colorScheme?: 'light'|'dark'|'no-preference', media?: 'screen'|'print'|'no-preference'}) => Promise<any>, setExtraHTTPHeaders: (headers: Object) => Promise<void>, setViewportSize: (viewportSize: {width: number, height: number}) => Promise<void>, viewportSize: () => Promise<{width: number, height: number}>, bringToFront: () => Promise<void>, close: (options?: {runBeforeUnload?: boolean}) => Promise<void>, pause: () => Promise<void>, consoleMessages: () => Promise<any[]>, pageErrors: () => Promise<any[]>, requests: () => Promise<any[]>, exposeBinding: (name: string, callback: function, options?: {handle?: boolean}) => Promise<void>, exposeFunction: (name: string, callback: function) => Promise<void>, removeAllListeners: (type?: string) => Promise<void>, requestGC: () => Promise<void>, video: () => Promise<any>, keyboard: {press: (key: string, options?: {delay?: number}) => Promise<void>, insertText: (text: string) => Promise<void>, up: (key: string) => Promise<void>, down: (key: string) => Promise<void>}, mouse: {move: (x: number, y: number, options?: {steps?: number}) => Promise<void>, click: (x: number, y: number, options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number}) => Promise<void>, dblclick: (x: number, y: number, options?: {button?: 'left'|'right'|'middle', delay?: number}) => Promise<void>, up: (options?: {button?: 'left'|'right'|'middle', clickCount?: number}) => Promise<void>, down: (options?: {button?: 'left'|'right'|'middle', clickCount?: number}) => Promise<void>, wheel: (deltaX: number, deltaY: number) => Promise<void>}, touchscreen: {tap: (x: number, y: number) => Promise<void>}, request: Object, coverage: Object, clock: Object}, pages: any[], human: {press: (key: string, options?: {delay?: number}) => Promise<void>, type: (text: string, options?: {delay?: number}) => Promise<void>, click: (selector: string, options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, hover: (selector: string, options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, move: (x: number, y: number, options?: {steps?: number}) => Promise<void>, scrollPageToBottom: (options?: {timeout?: number}) => Promise<void>, waitForSelector: (selector: string, options?: {state?: 'attached'|'detached'|'visible'|'hidden', timeout?: number}) => Promise<any>}, pools: {browserPool: Object, sessionPool: Object}, events: {emit: (event: string, ...args: any[]) => void, listen: (event: string, callback: function) => void}, session: Object, server: {hypertext: Object, interface: {serve: (page: Object) => void}, websocket: {send: (message: string) => string, cast: (message: string) => string}}, state: Object, tools: {debug: (name?: string) => void, matchPattern: (page: Object, patterns: any[]) => Promise<any|undefined>, iteratePatterns: (page: Object, patterns: Object, patternOrder?: string[]) => Promise<string|undefined>, waitForPage: (index: number, timeout?: number) => Promise<any>, expect: any, test: any, login: (username?: string, password?: string) => void}}} context */,
    "custom": {
        "example": "input to be used in the script"
    },
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cyberfly/apify-agent").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "browser.start": "https://www.wikipedia.org/",
    "browser.engine": "chromium",
    "script": """// ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
// 🚀 LIVE DEMO SCRIPT READY TO LAUNCH WITH DEFAULT SETTINGS 🚀
// 🎬 DELETE THIS SCRIPT TO START CODER AND RECORD YOUR OWN! 🎬
// ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

/** @param {context} context */
context => async ({page, tools: {sleep, expect, waitForPage}} = context) => {
    // agent.will('execute recorded automation')
    page.setDefaultNavigationTimeout(90 * 1000);

    await page.goto('https://www.wikipedia.org/', {waitUntil: 'domcontentloaded'});
    await page.getByRole('button', { name: 'Read Wikipedia in your' }).click();
    await page.getByRole('searchbox', { name: 'Search Wikipedia' }).click();
    await page.getByRole('searchbox', { name: 'Search Wikipedia' }).fill('hello world');
    await page.getByRole('searchbox', { name: 'Search Wikipedia' }).press('ArrowDown');
    await page.getByRole('searchbox', { name: 'Search Wikipedia' }).press('Enter');
    await page.getByRole('link', { name: 'View history' }).click();
    await page.getByRole('button', { name: 'Compare selected revisions' }).first().click();
    await page.getByRole('switch', { name: 'Inline' }).click();
    await page.getByRole('button', { name: 'Visual' }).click();
    await page.getByRole('button', { name: 'Tools' }).check();
    await page.getByRole('link', { name: 'Edit', exact: true }).click();

    await page.goto('https://apify.com/store/', {waitUntil: 'domcontentloaded'});
    await page.getByRole('combobox').click();
    await page.locator('[data-test=\"actor-store-search\"]').click();
    await page.locator('[data-test=\"actor-store-search\"]').fill('chrome extensions');
    await page.locator('[data-test=\"actor-store-search\"]').press('Enter');
    await page.locator('[data-test=\"store-filter-category\"]').click();
    await page.locator('[data-test=\"store-filter-category\"]').click();
    await page.locator('[data-test=\"store-filter-category\"]').press('Tab');
    await page.locator('[data-test=\"store-filter-pricing\"]').press('Tab');
    await page.locator('[data-test=\"store-filter-managedBy\"]').press('ArrowDown');
    await page.getByRole('option', { name: 'All developers' }).press('ArrowDown');
    await page.getByRole('option', { name: 'Maintained by Apify' }).press('ArrowDown');
    await page.getByRole('option', { name: 'Maintained by Community' }).press('Enter');
    await page.getByRole('link', { name: 'Chrome Extensions avatar' }).click();
    await page.getByRole('tab', { name: 'Input' }).click();
    await page.getByRole('tab', { name: 'API' }).click();
    await page.getByRole('tab', { name: 'Reviews' }).click();
    await page.getByRole('link', { name: 'Vasek Codey Vlcek Vasek Codey' }).click();
    await page.locator('div').filter({ hasText: 'Vasek Codey' }).nth(2).click();

    return {
        example: true,
        success: true,
    };
};

// ⚙️ SETUP FOR CODE HINTS: 💡
/** @typedef {{all: () => Promise<Locator[]>, allInnerTexts: () => Promise<string[]>, allTextContents: () => Promise<string[]>, and: (locator: Locator) => Locator, ariaSnapshot: (options?: {timeout?: number}) => Promise<string>, blur: (options?: {timeout?: number}) => Promise<void>, boundingBox: (options?: {timeout?: number}) => Promise<any>, check: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, clear: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, click: (options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, contentFrame: () => Object, count: () => Promise<number>, dblclick: (options?: {button?: 'left'|'right'|'middle', delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, describe: (description: string) => Locator, description: () => string, dispatchEvent: (type: string, eventInit?: any, options?: {timeout?: number}) => Promise<void>, dragTo: (target: Locator, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, sourcePosition?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, evaluate: (pageFunction: string|function, arg?: any, options?: {timeout?: number}) => Promise<any>, evaluateAll: (pageFunction: string|function, arg?: any) => Promise<any>, evaluateHandle: (pageFunction: string|function, arg?: any, options?: {timeout?: number}) => Promise<any>, fill: (value: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, filter: (options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, first: () => Locator, focus: (options?: {timeout?: number}) => Promise<void>, frameLocator: (selector: string) => Object, getAttribute: (name: string, options?: {timeout?: number}) => Promise<string>, getByAltText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByLabel: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByPlaceholder: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByRole: (role: 'alert'|'alertdialog'|'application'|'article'|'banner'|'blockquote'|'button'|'caption'|'cell'|'checkbox'|'code'|'complementary'|'contentinfo'|'definition'|'deletion'|'dialog'|'directory'|'document'|'emphasis'|'feed'|'figure'|'form'|'generic'|'grid'|'gridcell'|'group'|'heading'|'img'|'insertion'|'link'|'list'|'listbox'|'listitem'|'log'|'main'|'marquee'|'math'|'meter'|'menu'|'menubar'|'menuitem'|'menuitemcheckbox'|'menuitemradio'|'navigation'|'none'|'note'|'option'|'paragraph'|'presentation'|'progressbar'|'radio'|'radiogroup'|'region'|'row'|'rowgroup'|'rowheader'|'scrollbar'|'search'|'searchbox'|'separator'|'slider'|'spinbutton'|'status'|'strong'|'subscript'|'superscript'|'switch'|'tab'|'table'|'tablist'|'tabpanel'|'term'|'textbox'|'timer'|'toolbar'|'tooltip'|'tree'|'treegrid'|'treeitem', options?: {checked?: boolean, disabled?: boolean, exact?: boolean, expanded?: boolean, includeHidden?: boolean, level?: number, name?: string|RegExp, pressed?: boolean, selected?: boolean}) => Locator, getByTestId: (testId: string|RegExp) => Locator, getByText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTitle: (text: string|RegExp, options?: {exact?: boolean}) => Locator, highlight: () => Promise<void>, hover: (options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, innerHTML: (options?: {timeout?: number}) => Promise<string>, innerText: (options?: {timeout?: number}) => Promise<string>, inputValue: (options?: {timeout?: number}) => Promise<string>, isChecked: (options?: {timeout?: number}) => Promise<boolean>, isDisabled: (options?: {timeout?: number}) => Promise<boolean>, isEditable: (options?: {timeout?: number}) => Promise<boolean>, isEnabled: (options?: {timeout?: number}) => Promise<boolean>, isHidden: (options?: {timeout?: number}) => Promise<boolean>, isVisible: (options?: {timeout?: number}) => Promise<boolean>, last: () => Locator, locator: (selectorOrLocator: string|Locator, options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, nth: (index: number) => Locator, or: (locator: Locator) => Locator, page: () => Object, press: (key: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, pressSequentially: (text: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, screenshot: (options?: {animations?: 'disabled'|'allow', caret?: 'hide'|'initial', clip?: {x: number, y: number, width: number, height: number}, fullPage?: boolean, mask?: Locator[], maskColor?: string, omitBackground?: boolean, path?: string, quality?: number, scale?: 'css'|'device', style?: string, timeout?: number, type?: 'png'|'jpeg'}) => Promise<Buffer>, scrollIntoViewIfNeeded: (options?: {timeout?: number}) => Promise<void>, selectOption: (values: string|string[]|Object|any, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<string[]>, selectText: (options?: {force?: boolean, timeout?: number}) => Promise<void>, setChecked: (checked: boolean, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, setInputFiles: (files: string|string[]|Object|any[], options?: {noWaitAfter?: boolean, timeout?: number}) => Promise<void>, tap: (options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, textContent: (options?: {timeout?: number}) => Promise<string>, uncheck: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, waitFor: (options?: {state?: 'attached'|'detached'|'visible'|'hidden', timeout?: number}) => Promise<void>}} Locator */
/** @typedef {{input: {target: string, tasks: string[], browser: string=, ipAddress: string=, retry: number=, abort: boolean=, block: boolean=, debug: boolean=, human: boolean=, notify: boolean=, silent: boolean=, server: boolean=, session: boolean=, stealth: boolean=, proxyConfig: Object=, options: Object=}, output: Object, task: {name: string, init: (context: Object) => boolean=, done: (context: Object) => boolean=, output: Object=, model: Object}, step: {name: string, attachOutput: (output: Object) => Object, output: Object, done: boolean=, will: (text: string) => void}, page: {goto: (url: string, options?: {referer?: string, timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, goBack: (options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, goForward: (options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, reload: (options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, waitForNavigation: (options?: {timeout?: number, url?: string|RegExp|function, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, waitForURL: (url: string|RegExp|function, options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, waitForSelector: (selector: string, options?: {state?: 'attached'|'detached'|'visible'|'hidden', strict?: boolean, timeout?: number}) => Promise<any>, waitForFunction: (callback: string|function, arg?: any, options?: {polling?: number|'raf', timeout?: number}) => Promise<void>, waitForLoadState: (state?: 'load'|'domcontentloaded'|'networkidle', options?: {timeout?: number}) => Promise<void>, waitForTimeout: (timeout: number) => Promise<void>, waitForEvent: (event: string, optionsOrPredicate?: {predicate?: function, timeout?: number}|function) => Promise<any>, waitForResponse: (urlOrPredicate: string|RegExp|function, options?: {timeout?: number}) => Promise<any>, waitForRequest: (urlOrPredicate: string|RegExp|function, options?: {timeout?: number}) => Promise<any>, waitForPopup: (options?: {timeout?: number}) => Promise<any>, waitForDownload: (options?: {timeout?: number}) => Promise<any>, waitForConsoleMessage: (options?: {predicate?: function, timeout?: number}) => Promise<any>, waitForWebSocket: (options?: {predicate?: function, timeout?: number}) => Promise<any>, locator: (selector: string, options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, frameLocator: (selector: string) => Object, getByRole: (role: 'alert'|'alertdialog'|'application'|'article'|'banner'|'blockquote'|'button'|'caption'|'cell'|'checkbox'|'code'|'complementary'|'contentinfo'|'definition'|'deletion'|'dialog'|'directory'|'document'|'emphasis'|'feed'|'figure'|'form'|'generic'|'grid'|'gridcell'|'group'|'heading'|'img'|'insertion'|'link'|'list'|'listbox'|'listitem'|'log'|'main'|'marquee'|'math'|'meter'|'menu'|'menubar'|'menuitem'|'menuitemcheckbox'|'menuitemradio'|'navigation'|'none'|'note'|'option'|'paragraph'|'presentation'|'progressbar'|'radio'|'radiogroup'|'region'|'row'|'rowgroup'|'rowheader'|'scrollbar'|'search'|'searchbox'|'separator'|'slider'|'spinbutton'|'status'|'strong'|'subscript'|'superscript'|'switch'|'tab'|'table'|'tablist'|'tabpanel'|'term'|'textbox'|'timer'|'toolbar'|'tooltip'|'tree'|'treegrid'|'treeitem', options?: {checked?: boolean, disabled?: boolean, exact?: boolean, expanded?: boolean, includeHidden?: boolean, level?: number, name?: string|RegExp, pressed?: boolean, selected?: boolean}) => Locator, getByLabel: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByPlaceholder: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByAltText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTitle: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTestId: (testId: string|RegExp) => Locator, $: (selector: string, options?: {strict?: boolean}) => Promise<any>, $$: (selector: string) => Promise<any[]>, $eval: (selector: string, pageFunction: function, arg?: any, options?: {strict?: boolean}) => Promise<any>, $$eval: (selector: string, pageFunction: function, arg?: any) => Promise<any[]>, type: (selector: string, text: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, fill: (selector: string, value: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, click: (selector: string, options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, dblclick: (selector: string, options?: {button?: 'left'|'right'|'middle', delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, check: (selector: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, uncheck: (selector: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, selectOption: (selector: string, values: string|string[]|Object, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, hover: (selector: string, options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, focus: (selector: string, options?: {timeout?: number}) => Promise<void>, tap: (selector: string, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, press: (selector: string, key: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, inputValue: (selector: string, options?: {timeout?: number}) => Promise<string>, isChecked: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isVisible: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isDisabled: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isEditable: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isEnabled: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isHidden: (selector: string, options?: {timeout?: number}) => Promise<boolean>, innerHTML: (selector: string, options?: {timeout?: number}) => Promise<string>, outerHTML: (selector: string, options?: {timeout?: number}) => Promise<string>, textContent: (selector: string, options?: {timeout?: number}) => Promise<string>, getAttribute: (selector: string, name: string, options?: {timeout?: number}) => Promise<any>, boundingBox: (selector: string, options?: {timeout?: number}) => Promise<any>, screenshot: (selector: string, options?: {animations?: 'disabled'|'allow', caret?: 'hide'|'initial', clip?: {x: number, y: number, width: number, height: number}, fullPage?: boolean, mask?: Locator[], maskColor?: string, omitBackground?: boolean, path?: string, quality?: number, scale?: 'css'|'device', style?: string, timeout?: number, type?: 'png'|'jpeg'}) => Promise<any>, content: () => Promise<string>, url: () => Promise<string>, title: () => Promise<string>, evaluate: (pageFunction: string|function, arg?: any) => Promise<any>, evaluateHandle: (pageFunction: string|function, arg?: any) => Promise<any>, setDefaultNavigationTimeout: (timeout: number) => void, setDefaultTimeout: (timeout: number) => void, setContent: (html: string, options?: {timeout?: number, waitUntil?: 'load'|'domcontentloaded'|'networkidle'|'commit'}) => Promise<void>, setCookie: (cookies: any[]) => Promise<void>, deleteCookie: (cookies: any[]) => Promise<void>, cookies: () => Promise<any[]>, addScriptTag: (options: {content?: string, path?: string, type?: string, url?: string}) => Promise<any>, addStyleTag: (options: {content?: string, path?: string, url?: string}) => Promise<any>, addInitScript: (script: string|function, arg?: any) => Promise<void>, addLocatorHandler: (locator: Locator, handler: function, options?: {noWaitAfter?: boolean, times?: number}) => Promise<void>, removeLocatorHandler: (locator: Locator) => Promise<void>, dragAndDrop: (source: string, target: string, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, sourcePosition?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, dispatchEvent: (selector: string, type: string, eventInit?: any, options?: {timeout?: number}) => Promise<void>, setInputFiles: (selector: string, files: string|any[], options?: {noWaitAfter?: boolean, timeout?: number}) => Promise<void>, route: (url: string|RegExp|function, handler: function, options?: {times?: number}) => Promise<void>, routeFromHAR: (har: string, options?: {notFound?: 'abort'|'fallback', update?: boolean, updateContent?: 'attach'|'embed', url?: string|RegExp}) => Promise<void>, routeWebSocket: (url: string|RegExp|function, handler: function) => Promise<void>, unroute: (url: string|RegExp|function, handler?: function) => Promise<void>, unrouteAll: (options?: {behavior?: 'default'|'wait', timeout?: number}) => Promise<void>, pdf: (options?: {displayHeaderFooter?: boolean, footerTemplate?: string, format?: string, headerTemplate?: string, height?: string|number, landscape?: boolean, margin?: {top?: string|number, right?: string|number, bottom?: string|number, left?: string|number}, outline?: boolean, pageRanges?: string, path?: string, preferCSSPageSize?: boolean, printBackground?: boolean, scale?: number, tagged?: boolean, width?: string|number}) => Promise<Buffer>, frames: () => Promise<any[]>, frame: (frameSelector: string|Object) => Promise<any>, mainFrame: () => Promise<any>, opener: () => Promise<any>, context: () => Promise<any>, isClosed: () => Promise<boolean>, emulateMedia: (options?: {colorScheme?: 'light'|'dark'|'no-preference', media?: 'screen'|'print'|'no-preference'}) => Promise<any>, setExtraHTTPHeaders: (headers: Object) => Promise<void>, setViewportSize: (viewportSize: {width: number, height: number}) => Promise<void>, viewportSize: () => Promise<{width: number, height: number}>, bringToFront: () => Promise<void>, close: (options?: {runBeforeUnload?: boolean}) => Promise<void>, pause: () => Promise<void>, consoleMessages: () => Promise<any[]>, pageErrors: () => Promise<any[]>, requests: () => Promise<any[]>, exposeBinding: (name: string, callback: function, options?: {handle?: boolean}) => Promise<void>, exposeFunction: (name: string, callback: function) => Promise<void>, removeAllListeners: (type?: string) => Promise<void>, requestGC: () => Promise<void>, video: () => Promise<any>, keyboard: {press: (key: string, options?: {delay?: number}) => Promise<void>, insertText: (text: string) => Promise<void>, up: (key: string) => Promise<void>, down: (key: string) => Promise<void>}, mouse: {move: (x: number, y: number, options?: {steps?: number}) => Promise<void>, click: (x: number, y: number, options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number}) => Promise<void>, dblclick: (x: number, y: number, options?: {button?: 'left'|'right'|'middle', delay?: number}) => Promise<void>, up: (options?: {button?: 'left'|'right'|'middle', clickCount?: number}) => Promise<void>, down: (options?: {button?: 'left'|'right'|'middle', clickCount?: number}) => Promise<void>, wheel: (deltaX: number, deltaY: number) => Promise<void>}, touchscreen: {tap: (x: number, y: number) => Promise<void>}, request: Object, coverage: Object, clock: Object}, pages: any[], human: {press: (key: string, options?: {delay?: number}) => Promise<void>, type: (text: string, options?: {delay?: number}) => Promise<void>, click: (selector: string, options?: {button?: 'left'|'right'|'middle', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, hover: (selector: string, options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, move: (x: number, y: number, options?: {steps?: number}) => Promise<void>, scrollPageToBottom: (options?: {timeout?: number}) => Promise<void>, waitForSelector: (selector: string, options?: {state?: 'attached'|'detached'|'visible'|'hidden', timeout?: number}) => Promise<any>}, pools: {browserPool: Object, sessionPool: Object}, events: {emit: (event: string, ...args: any[]) => void, listen: (event: string, callback: function) => void}, session: Object, server: {hypertext: Object, interface: {serve: (page: Object) => void}, websocket: {send: (message: string) => string, cast: (message: string) => string}}, state: Object, tools: {debug: (name?: string) => void, matchPattern: (page: Object, patterns: any[]) => Promise<any|undefined>, iteratePatterns: (page: Object, patterns: Object, patternOrder?: string[]) => Promise<string|undefined>, waitForPage: (index: number, timeout?: number) => Promise<any>, expect: any, test: any, login: (username?: string, password?: string) => void}}} context */""",
    "custom": { "example": "input to be used in the script" },
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("cyberfly/apify-agent").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "browser.start": "https://www.wikipedia.org/",
  "browser.engine": "chromium",
  "script": "// ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨\\n// 🚀 LIVE DEMO SCRIPT READY TO LAUNCH WITH DEFAULT SETTINGS 🚀\\n// 🎬 DELETE THIS SCRIPT TO START CODER AND RECORD YOUR OWN! 🎬\\n// ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨\\n\\n/** @param {context} context */\\ncontext => async ({page, tools: {sleep, expect, waitForPage}} = context) => {\\n    // agent.will('\''execute recorded automation'\'')\\n    page.setDefaultNavigationTimeout(90 * 1000);\\n\\n    await page.goto('\''https://www.wikipedia.org/'\'', {waitUntil: '\''domcontentloaded'\''});\\n    await page.getByRole('\''button'\'', { name: '\''Read Wikipedia in your'\'' }).click();\\n    await page.getByRole('\''searchbox'\'', { name: '\''Search Wikipedia'\'' }).click();\\n    await page.getByRole('\''searchbox'\'', { name: '\''Search Wikipedia'\'' }).fill('\''hello world'\'');\\n    await page.getByRole('\''searchbox'\'', { name: '\''Search Wikipedia'\'' }).press('\''ArrowDown'\'');\\n    await page.getByRole('\''searchbox'\'', { name: '\''Search Wikipedia'\'' }).press('\''Enter'\'');\\n    await page.getByRole('\''link'\'', { name: '\''View history'\'' }).click();\\n    await page.getByRole('\''button'\'', { name: '\''Compare selected revisions'\'' }).first().click();\\n    await page.getByRole('\''switch'\'', { name: '\''Inline'\'' }).click();\\n    await page.getByRole('\''button'\'', { name: '\''Visual'\'' }).click();\\n    await page.getByRole('\''button'\'', { name: '\''Tools'\'' }).check();\\n    await page.getByRole('\''link'\'', { name: '\''Edit'\'', exact: true }).click();\\n\\n    await page.goto('\''https://apify.com/store/'\'', {waitUntil: '\''domcontentloaded'\''});\\n    await page.getByRole('\''combobox'\'').click();\\n    await page.locator('\''[data-test=\\"actor-store-search\\"]'\'').click();\\n    await page.locator('\''[data-test=\\"actor-store-search\\"]'\'').fill('\''chrome extensions'\'');\\n    await page.locator('\''[data-test=\\"actor-store-search\\"]'\'').press('\''Enter'\'');\\n    await page.locator('\''[data-test=\\"store-filter-category\\"]'\'').click();\\n    await page.locator('\''[data-test=\\"store-filter-category\\"]'\'').click();\\n    await page.locator('\''[data-test=\\"store-filter-category\\"]'\'').press('\''Tab'\'');\\n    await page.locator('\''[data-test=\\"store-filter-pricing\\"]'\'').press('\''Tab'\'');\\n    await page.locator('\''[data-test=\\"store-filter-managedBy\\"]'\'').press('\''ArrowDown'\'');\\n    await page.getByRole('\''option'\'', { name: '\''All developers'\'' }).press('\''ArrowDown'\'');\\n    await page.getByRole('\''option'\'', { name: '\''Maintained by Apify'\'' }).press('\''ArrowDown'\'');\\n    await page.getByRole('\''option'\'', { name: '\''Maintained by Community'\'' }).press('\''Enter'\'');\\n    await page.getByRole('\''link'\'', { name: '\''Chrome Extensions avatar'\'' }).click();\\n    await page.getByRole('\''tab'\'', { name: '\''Input'\'' }).click();\\n    await page.getByRole('\''tab'\'', { name: '\''API'\'' }).click();\\n    await page.getByRole('\''tab'\'', { name: '\''Reviews'\'' }).click();\\n    await page.getByRole('\''link'\'', { name: '\''Vasek Codey Vlcek Vasek Codey'\'' }).click();\\n    await page.locator('\''div'\'').filter({ hasText: '\''Vasek Codey'\'' }).nth(2).click();\\n\\n    return {\\n        example: true,\\n        success: true,\\n    };\\n};\\n\\n// ⚙️ SETUP FOR CODE HINTS: 💡\\n/** @typedef {{all: () => Promise<Locator[]>, allInnerTexts: () => Promise<string[]>, allTextContents: () => Promise<string[]>, and: (locator: Locator) => Locator, ariaSnapshot: (options?: {timeout?: number}) => Promise<string>, blur: (options?: {timeout?: number}) => Promise<void>, boundingBox: (options?: {timeout?: number}) => Promise<any>, check: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, clear: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, click: (options?: {button?: '\''left'\''|'\''right'\''|'\''middle'\'', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, contentFrame: () => Object, count: () => Promise<number>, dblclick: (options?: {button?: '\''left'\''|'\''right'\''|'\''middle'\'', delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, describe: (description: string) => Locator, description: () => string, dispatchEvent: (type: string, eventInit?: any, options?: {timeout?: number}) => Promise<void>, dragTo: (target: Locator, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, sourcePosition?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, evaluate: (pageFunction: string|function, arg?: any, options?: {timeout?: number}) => Promise<any>, evaluateAll: (pageFunction: string|function, arg?: any) => Promise<any>, evaluateHandle: (pageFunction: string|function, arg?: any, options?: {timeout?: number}) => Promise<any>, fill: (value: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, filter: (options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, first: () => Locator, focus: (options?: {timeout?: number}) => Promise<void>, frameLocator: (selector: string) => Object, getAttribute: (name: string, options?: {timeout?: number}) => Promise<string>, getByAltText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByLabel: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByPlaceholder: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByRole: (role: '\''alert'\''|'\''alertdialog'\''|'\''application'\''|'\''article'\''|'\''banner'\''|'\''blockquote'\''|'\''button'\''|'\''caption'\''|'\''cell'\''|'\''checkbox'\''|'\''code'\''|'\''complementary'\''|'\''contentinfo'\''|'\''definition'\''|'\''deletion'\''|'\''dialog'\''|'\''directory'\''|'\''document'\''|'\''emphasis'\''|'\''feed'\''|'\''figure'\''|'\''form'\''|'\''generic'\''|'\''grid'\''|'\''gridcell'\''|'\''group'\''|'\''heading'\''|'\''img'\''|'\''insertion'\''|'\''link'\''|'\''list'\''|'\''listbox'\''|'\''listitem'\''|'\''log'\''|'\''main'\''|'\''marquee'\''|'\''math'\''|'\''meter'\''|'\''menu'\''|'\''menubar'\''|'\''menuitem'\''|'\''menuitemcheckbox'\''|'\''menuitemradio'\''|'\''navigation'\''|'\''none'\''|'\''note'\''|'\''option'\''|'\''paragraph'\''|'\''presentation'\''|'\''progressbar'\''|'\''radio'\''|'\''radiogroup'\''|'\''region'\''|'\''row'\''|'\''rowgroup'\''|'\''rowheader'\''|'\''scrollbar'\''|'\''search'\''|'\''searchbox'\''|'\''separator'\''|'\''slider'\''|'\''spinbutton'\''|'\''status'\''|'\''strong'\''|'\''subscript'\''|'\''superscript'\''|'\''switch'\''|'\''tab'\''|'\''table'\''|'\''tablist'\''|'\''tabpanel'\''|'\''term'\''|'\''textbox'\''|'\''timer'\''|'\''toolbar'\''|'\''tooltip'\''|'\''tree'\''|'\''treegrid'\''|'\''treeitem'\'', options?: {checked?: boolean, disabled?: boolean, exact?: boolean, expanded?: boolean, includeHidden?: boolean, level?: number, name?: string|RegExp, pressed?: boolean, selected?: boolean}) => Locator, getByTestId: (testId: string|RegExp) => Locator, getByText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTitle: (text: string|RegExp, options?: {exact?: boolean}) => Locator, highlight: () => Promise<void>, hover: (options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, innerHTML: (options?: {timeout?: number}) => Promise<string>, innerText: (options?: {timeout?: number}) => Promise<string>, inputValue: (options?: {timeout?: number}) => Promise<string>, isChecked: (options?: {timeout?: number}) => Promise<boolean>, isDisabled: (options?: {timeout?: number}) => Promise<boolean>, isEditable: (options?: {timeout?: number}) => Promise<boolean>, isEnabled: (options?: {timeout?: number}) => Promise<boolean>, isHidden: (options?: {timeout?: number}) => Promise<boolean>, isVisible: (options?: {timeout?: number}) => Promise<boolean>, last: () => Locator, locator: (selectorOrLocator: string|Locator, options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, nth: (index: number) => Locator, or: (locator: Locator) => Locator, page: () => Object, press: (key: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, pressSequentially: (text: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, screenshot: (options?: {animations?: '\''disabled'\''|'\''allow'\'', caret?: '\''hide'\''|'\''initial'\'', clip?: {x: number, y: number, width: number, height: number}, fullPage?: boolean, mask?: Locator[], maskColor?: string, omitBackground?: boolean, path?: string, quality?: number, scale?: '\''css'\''|'\''device'\'', style?: string, timeout?: number, type?: '\''png'\''|'\''jpeg'\''}) => Promise<Buffer>, scrollIntoViewIfNeeded: (options?: {timeout?: number}) => Promise<void>, selectOption: (values: string|string[]|Object|any, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<string[]>, selectText: (options?: {force?: boolean, timeout?: number}) => Promise<void>, setChecked: (checked: boolean, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, setInputFiles: (files: string|string[]|Object|any[], options?: {noWaitAfter?: boolean, timeout?: number}) => Promise<void>, tap: (options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, textContent: (options?: {timeout?: number}) => Promise<string>, uncheck: (options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, waitFor: (options?: {state?: '\''attached'\''|'\''detached'\''|'\''visible'\''|'\''hidden'\'', timeout?: number}) => Promise<void>}} Locator */\\n/** @typedef {{input: {target: string, tasks: string[], browser: string=, ipAddress: string=, retry: number=, abort: boolean=, block: boolean=, debug: boolean=, human: boolean=, notify: boolean=, silent: boolean=, server: boolean=, session: boolean=, stealth: boolean=, proxyConfig: Object=, options: Object=}, output: Object, task: {name: string, init: (context: Object) => boolean=, done: (context: Object) => boolean=, output: Object=, model: Object}, step: {name: string, attachOutput: (output: Object) => Object, output: Object, done: boolean=, will: (text: string) => void}, page: {goto: (url: string, options?: {referer?: string, timeout?: number, waitUntil?: '\''load'\''|'\''domcontentloaded'\''|'\''networkidle'\''|'\''commit'\''}) => Promise<void>, goBack: (options?: {timeout?: number, waitUntil?: '\''load'\''|'\''domcontentloaded'\''|'\''networkidle'\''|'\''commit'\''}) => Promise<void>, goForward: (options?: {timeout?: number, waitUntil?: '\''load'\''|'\''domcontentloaded'\''|'\''networkidle'\''|'\''commit'\''}) => Promise<void>, reload: (options?: {timeout?: number, waitUntil?: '\''load'\''|'\''domcontentloaded'\''|'\''networkidle'\''|'\''commit'\''}) => Promise<void>, waitForNavigation: (options?: {timeout?: number, url?: string|RegExp|function, waitUntil?: '\''load'\''|'\''domcontentloaded'\''|'\''networkidle'\''|'\''commit'\''}) => Promise<void>, waitForURL: (url: string|RegExp|function, options?: {timeout?: number, waitUntil?: '\''load'\''|'\''domcontentloaded'\''|'\''networkidle'\''|'\''commit'\''}) => Promise<void>, waitForSelector: (selector: string, options?: {state?: '\''attached'\''|'\''detached'\''|'\''visible'\''|'\''hidden'\'', strict?: boolean, timeout?: number}) => Promise<any>, waitForFunction: (callback: string|function, arg?: any, options?: {polling?: number|'\''raf'\'', timeout?: number}) => Promise<void>, waitForLoadState: (state?: '\''load'\''|'\''domcontentloaded'\''|'\''networkidle'\'', options?: {timeout?: number}) => Promise<void>, waitForTimeout: (timeout: number) => Promise<void>, waitForEvent: (event: string, optionsOrPredicate?: {predicate?: function, timeout?: number}|function) => Promise<any>, waitForResponse: (urlOrPredicate: string|RegExp|function, options?: {timeout?: number}) => Promise<any>, waitForRequest: (urlOrPredicate: string|RegExp|function, options?: {timeout?: number}) => Promise<any>, waitForPopup: (options?: {timeout?: number}) => Promise<any>, waitForDownload: (options?: {timeout?: number}) => Promise<any>, waitForConsoleMessage: (options?: {predicate?: function, timeout?: number}) => Promise<any>, waitForWebSocket: (options?: {predicate?: function, timeout?: number}) => Promise<any>, locator: (selector: string, options?: {has?: Locator, hasNot?: Locator, hasNotText?: string|RegExp, hasText?: string|RegExp}) => Locator, frameLocator: (selector: string) => Object, getByRole: (role: '\''alert'\''|'\''alertdialog'\''|'\''application'\''|'\''article'\''|'\''banner'\''|'\''blockquote'\''|'\''button'\''|'\''caption'\''|'\''cell'\''|'\''checkbox'\''|'\''code'\''|'\''complementary'\''|'\''contentinfo'\''|'\''definition'\''|'\''deletion'\''|'\''dialog'\''|'\''directory'\''|'\''document'\''|'\''emphasis'\''|'\''feed'\''|'\''figure'\''|'\''form'\''|'\''generic'\''|'\''grid'\''|'\''gridcell'\''|'\''group'\''|'\''heading'\''|'\''img'\''|'\''insertion'\''|'\''link'\''|'\''list'\''|'\''listbox'\''|'\''listitem'\''|'\''log'\''|'\''main'\''|'\''marquee'\''|'\''math'\''|'\''meter'\''|'\''menu'\''|'\''menubar'\''|'\''menuitem'\''|'\''menuitemcheckbox'\''|'\''menuitemradio'\''|'\''navigation'\''|'\''none'\''|'\''note'\''|'\''option'\''|'\''paragraph'\''|'\''presentation'\''|'\''progressbar'\''|'\''radio'\''|'\''radiogroup'\''|'\''region'\''|'\''row'\''|'\''rowgroup'\''|'\''rowheader'\''|'\''scrollbar'\''|'\''search'\''|'\''searchbox'\''|'\''separator'\''|'\''slider'\''|'\''spinbutton'\''|'\''status'\''|'\''strong'\''|'\''subscript'\''|'\''superscript'\''|'\''switch'\''|'\''tab'\''|'\''table'\''|'\''tablist'\''|'\''tabpanel'\''|'\''term'\''|'\''textbox'\''|'\''timer'\''|'\''toolbar'\''|'\''tooltip'\''|'\''tree'\''|'\''treegrid'\''|'\''treeitem'\'', options?: {checked?: boolean, disabled?: boolean, exact?: boolean, expanded?: boolean, includeHidden?: boolean, level?: number, name?: string|RegExp, pressed?: boolean, selected?: boolean}) => Locator, getByLabel: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByPlaceholder: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByAltText: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTitle: (text: string|RegExp, options?: {exact?: boolean}) => Locator, getByTestId: (testId: string|RegExp) => Locator, $: (selector: string, options?: {strict?: boolean}) => Promise<any>, $$: (selector: string) => Promise<any[]>, $eval: (selector: string, pageFunction: function, arg?: any, options?: {strict?: boolean}) => Promise<any>, $$eval: (selector: string, pageFunction: function, arg?: any) => Promise<any[]>, type: (selector: string, text: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, fill: (selector: string, value: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, click: (selector: string, options?: {button?: '\''left'\''|'\''right'\''|'\''middle'\'', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, dblclick: (selector: string, options?: {button?: '\''left'\''|'\''right'\''|'\''middle'\'', delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, check: (selector: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, uncheck: (selector: string, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number, trial?: boolean}) => Promise<void>, selectOption: (selector: string, values: string|string[]|Object, options?: {force?: boolean, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, hover: (selector: string, options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, focus: (selector: string, options?: {timeout?: number}) => Promise<void>, tap: (selector: string, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, press: (selector: string, key: string, options?: {delay?: number, noWaitAfter?: boolean, timeout?: number}) => Promise<void>, inputValue: (selector: string, options?: {timeout?: number}) => Promise<string>, isChecked: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isVisible: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isDisabled: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isEditable: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isEnabled: (selector: string, options?: {timeout?: number}) => Promise<boolean>, isHidden: (selector: string, options?: {timeout?: number}) => Promise<boolean>, innerHTML: (selector: string, options?: {timeout?: number}) => Promise<string>, outerHTML: (selector: string, options?: {timeout?: number}) => Promise<string>, textContent: (selector: string, options?: {timeout?: number}) => Promise<string>, getAttribute: (selector: string, name: string, options?: {timeout?: number}) => Promise<any>, boundingBox: (selector: string, options?: {timeout?: number}) => Promise<any>, screenshot: (selector: string, options?: {animations?: '\''disabled'\''|'\''allow'\'', caret?: '\''hide'\''|'\''initial'\'', clip?: {x: number, y: number, width: number, height: number}, fullPage?: boolean, mask?: Locator[], maskColor?: string, omitBackground?: boolean, path?: string, quality?: number, scale?: '\''css'\''|'\''device'\'', style?: string, timeout?: number, type?: '\''png'\''|'\''jpeg'\''}) => Promise<any>, content: () => Promise<string>, url: () => Promise<string>, title: () => Promise<string>, evaluate: (pageFunction: string|function, arg?: any) => Promise<any>, evaluateHandle: (pageFunction: string|function, arg?: any) => Promise<any>, setDefaultNavigationTimeout: (timeout: number) => void, setDefaultTimeout: (timeout: number) => void, setContent: (html: string, options?: {timeout?: number, waitUntil?: '\''load'\''|'\''domcontentloaded'\''|'\''networkidle'\''|'\''commit'\''}) => Promise<void>, setCookie: (cookies: any[]) => Promise<void>, deleteCookie: (cookies: any[]) => Promise<void>, cookies: () => Promise<any[]>, addScriptTag: (options: {content?: string, path?: string, type?: string, url?: string}) => Promise<any>, addStyleTag: (options: {content?: string, path?: string, url?: string}) => Promise<any>, addInitScript: (script: string|function, arg?: any) => Promise<void>, addLocatorHandler: (locator: Locator, handler: function, options?: {noWaitAfter?: boolean, times?: number}) => Promise<void>, removeLocatorHandler: (locator: Locator) => Promise<void>, dragAndDrop: (source: string, target: string, options?: {force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, sourcePosition?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, dispatchEvent: (selector: string, type: string, eventInit?: any, options?: {timeout?: number}) => Promise<void>, setInputFiles: (selector: string, files: string|any[], options?: {noWaitAfter?: boolean, timeout?: number}) => Promise<void>, route: (url: string|RegExp|function, handler: function, options?: {times?: number}) => Promise<void>, routeFromHAR: (har: string, options?: {notFound?: '\''abort'\''|'\''fallback'\'', update?: boolean, updateContent?: '\''attach'\''|'\''embed'\'', url?: string|RegExp}) => Promise<void>, routeWebSocket: (url: string|RegExp|function, handler: function) => Promise<void>, unroute: (url: string|RegExp|function, handler?: function) => Promise<void>, unrouteAll: (options?: {behavior?: '\''default'\''|'\''wait'\'', timeout?: number}) => Promise<void>, pdf: (options?: {displayHeaderFooter?: boolean, footerTemplate?: string, format?: string, headerTemplate?: string, height?: string|number, landscape?: boolean, margin?: {top?: string|number, right?: string|number, bottom?: string|number, left?: string|number}, outline?: boolean, pageRanges?: string, path?: string, preferCSSPageSize?: boolean, printBackground?: boolean, scale?: number, tagged?: boolean, width?: string|number}) => Promise<Buffer>, frames: () => Promise<any[]>, frame: (frameSelector: string|Object) => Promise<any>, mainFrame: () => Promise<any>, opener: () => Promise<any>, context: () => Promise<any>, isClosed: () => Promise<boolean>, emulateMedia: (options?: {colorScheme?: '\''light'\''|'\''dark'\''|'\''no-preference'\'', media?: '\''screen'\''|'\''print'\''|'\''no-preference'\''}) => Promise<any>, setExtraHTTPHeaders: (headers: Object) => Promise<void>, setViewportSize: (viewportSize: {width: number, height: number}) => Promise<void>, viewportSize: () => Promise<{width: number, height: number}>, bringToFront: () => Promise<void>, close: (options?: {runBeforeUnload?: boolean}) => Promise<void>, pause: () => Promise<void>, consoleMessages: () => Promise<any[]>, pageErrors: () => Promise<any[]>, requests: () => Promise<any[]>, exposeBinding: (name: string, callback: function, options?: {handle?: boolean}) => Promise<void>, exposeFunction: (name: string, callback: function) => Promise<void>, removeAllListeners: (type?: string) => Promise<void>, requestGC: () => Promise<void>, video: () => Promise<any>, keyboard: {press: (key: string, options?: {delay?: number}) => Promise<void>, insertText: (text: string) => Promise<void>, up: (key: string) => Promise<void>, down: (key: string) => Promise<void>}, mouse: {move: (x: number, y: number, options?: {steps?: number}) => Promise<void>, click: (x: number, y: number, options?: {button?: '\''left'\''|'\''right'\''|'\''middle'\'', clickCount?: number, delay?: number}) => Promise<void>, dblclick: (x: number, y: number, options?: {button?: '\''left'\''|'\''right'\''|'\''middle'\'', delay?: number}) => Promise<void>, up: (options?: {button?: '\''left'\''|'\''right'\''|'\''middle'\'', clickCount?: number}) => Promise<void>, down: (options?: {button?: '\''left'\''|'\''right'\''|'\''middle'\'', clickCount?: number}) => Promise<void>, wheel: (deltaX: number, deltaY: number) => Promise<void>}, touchscreen: {tap: (x: number, y: number) => Promise<void>}, request: Object, coverage: Object, clock: Object}, pages: any[], human: {press: (key: string, options?: {delay?: number}) => Promise<void>, type: (text: string, options?: {delay?: number}) => Promise<void>, click: (selector: string, options?: {button?: '\''left'\''|'\''right'\''|'\''middle'\'', clickCount?: number, delay?: number, force?: boolean, modifiers?: string[], noWaitAfter?: boolean, position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, hover: (selector: string, options?: {force?: boolean, modifiers?: string[], position?: {x: number, y: number}, timeout?: number, trial?: boolean}) => Promise<void>, move: (x: number, y: number, options?: {steps?: number}) => Promise<void>, scrollPageToBottom: (options?: {timeout?: number}) => Promise<void>, waitForSelector: (selector: string, options?: {state?: '\''attached'\''|'\''detached'\''|'\''visible'\''|'\''hidden'\'', timeout?: number}) => Promise<any>}, pools: {browserPool: Object, sessionPool: Object}, events: {emit: (event: string, ...args: any[]) => void, listen: (event: string, callback: function) => void}, session: Object, server: {hypertext: Object, interface: {serve: (page: Object) => void}, websocket: {send: (message: string) => string, cast: (message: string) => string}}, state: Object, tools: {debug: (name?: string) => void, matchPattern: (page: Object, patterns: any[]) => Promise<any|undefined>, iteratePatterns: (page: Object, patterns: Object, patternOrder?: string[]) => Promise<string|undefined>, waitForPage: (index: number, timeout?: number) => Promise<any>, expect: any, test: any, login: (username?: string, password?: string) => void}}} context */",
  "custom": {
    "example": "input to be used in the script"
  },
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call cyberfly/apify-agent --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cyberfly/apify-agent"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ZeuTNQMksxcDNPm0U/builds/JfcXvPe7OTrjhTIY9/openapi.json
