Skip to main content

What are Apify Actors?

Apify Actors are serverless cloud programs that can perform anything from a simple action, like filling out a web form, to a complex operation, like crawling an entire website. They are programs packaged as Docker images, which accept a well-defined JSON input, perform an action, and optionally produce a well-defined JSON output.

Key Features

  • Serverless Execution: No infrastructure management required - just deploy and run
  • Stateful Operations: Actors can maintain state across executions, enabling runs from seconds to hours, or even indefinitely
  • Flexible I/O: Accept JSON input and produce JSON output with well-defined schemas
  • Built-in Storage: Access to datasets, key-value stores, and request queues
  • Composable: Actors can call and interact with each other to build complex systems

Actor Structure

Each Apify Actor consists of:
  1. Dockerfile - Manages code location, build process, and execution instructions
  2. Source Code - Your application logic (Python, Node.js, or other languages)
  3. Input/Output Schemas - Define required inputs and produced results
  4. README Documentation - Explains functionality for users
  5. Metadata - Actor name, description, author, and version
Actors can be run via the web console, API, CLI, or scheduled triggers. They can be private for personal use or published to the Apify Store for monetization. Learn more: Apify Actors Development

Getting Started

Add Agnost analytics to your Apify Actor in four simple steps:

1. Get Your Organization ID

Get your organization ID from app.agnost.ai

2. Install Agnost

pip install agnost

3. Add One Line of Code

from apify import Actor
from agnost import track
from modelcontextprotocol.server import Server

async def main():
    async with Actor:
        # Create MCP server
        server = Server("your-mcp-server")

        # Enable analytics
        track(server, "your-org-id")

        # Your actor logic here
        actor_input = await Actor.get_input() or {}
        # ... rest of your code
That’s it! Your Apify Actor is now tracked with default settings.

4. View Metrics

Visit app.agnost.ai to view your analytics:
  • Monitor Actor runs in real-time
  • Track performance and latency
  • Analyze success and failure rates
  • Identify optimization opportunities

Configuration

Customize tracking behavior with configuration options:
from agnost import track, config
from modelcontextprotocol.server import Server

server = Server("your-mcp-server")

track(server, "your-org-id", config(
    endpoint="https://api.agnost.ai",
    disable_input=False,
    disable_output=False
))

Configuration Options

OptionTypeDefaultDescription
endpointstring"https://api.agnost.ai"API endpoint URL
disable_input / disableInputbooleanfalseDisable tracking of input parameters
disable_output / disableOutputbooleanfalseDisable tracking of output responses
identifyfunctionNone / undefinedFunction to identify users from request context

User Identification

Track analytics per user to understand usage patterns across different customers or organizations running your Actor.
from agnost import track
from modelcontextprotocol.server import Server

async def main():
    async with Actor:
        server = Server("your-mcp-server")

        # With user identification
        track(server, "your-org-id", {
            'identify': lambda req, env: {
                'userId': env.get('APIFY_USER_ID') or 'anonymous',
                'actorId': env.get('APIFY_ACT_ID'),
                'runId': env.get('APIFY_ACT_RUN_ID')
            }
        })

        # Your actor logic here
Using Actor input for identification:
from agnost import track
from modelcontextprotocol.server import Server

async def main():
    async with Actor:
        actor_input = await Actor.get_input() or {}
        server = Server("your-mcp-server")

        track(server, "your-org-id", {
            'identify': lambda req, env: {
                'userId': actor_input.get('customer_id', 'anonymous'),
                'email': actor_input.get('customer_email'),
                'organization': actor_input.get('organization_name')
            }
        })

        # Your actor logic here

Common Use Cases

  • Multi-tenant Actors: Track which customer or organization is using the Actor
  • Subscription Tiers: Segment analytics by free, pro, or enterprise users
  • Cost Attribution: Understand usage and costs per customer
  • Customer Success: Monitor individual customer health and engagement
See the full Configuration guide for more advanced identification patterns.

Complete Example

from apify import Actor
from agnost import track
from modelcontextprotocol.server import Server

async def main():
    async with Actor:
        actor_input = await Actor.get_input() or {}

        # Create MCP server
        server = Server("your-mcp-server")

        # Enable analytics with user identification
        track(server, "your-org-id", {
            'identify': lambda req, env: {
                'userId': actor_input.get('customer_id', 'anonymous'),
                'organization': actor_input.get('org_name'),
                'subscriptionTier': actor_input.get('tier', 'free')
            }
        })

        # Your actor logic
        url = actor_input.get('url')
        Actor.log.info(f'Scraping URL: {url}')

        # Scraping logic
        data = []  # ... scrape data

        # Save results
        await Actor.push_data(data)

        Actor.log.info(f'Successfully scraped {len(data)} items')

Why Add Analytics to Your Actor?

Performance Optimization

  • Identify slow operations and bottlenecks
  • Track execution time trends over versions
  • Optimize resource usage and costs

Usage Insights

  • Monitor how customers use your Actor
  • Understand which features are most popular
  • Identify usage patterns and trends

Error Tracking

  • Track failure rates and error patterns
  • Debug issues faster with detailed context
  • Monitor service reliability

Business Intelligence

  • Segment users by subscription tier
  • Track adoption and retention
  • Make data-driven decisions for features and pricing

Resources

Need Help?