An Apify Actor is a scraper packaged as a cloud product: it runs on Apify's infrastructure, takes typed input from a form, writes to a managed dataset, and can be scheduled, monetized, and monitored. After publishing 300+ of them, here's the anatomy that works.
Four files make a Python Actor:
my-actor/
├── main.py # your scraper, wrapped in the Actor lifecycle
├── requirements.txt # dependencies
├── Dockerfile # usually 3 lines on Apify's Python base image
└── .actor/
├── actor.json # name, version, metadata
└── input_schema.json # typed inputs → auto-generated UI form
from apify import Actor
async def main():
async with Actor:
inp = await Actor.get_input() or {}
query = inp.get("query", "default")
for item in scrape(query): # your existing logic
await Actor.push_data(item) # → managed dataset
That's the whole integration: read input, push records. Your existing scraping logic stays untouched.
Apify renders input_schema.json as the form every user sees. This file decides whether people can use your Actor without reading anything:
title, description, and sensible defaultUsers export your dataset straight to CSV or Excel, so flat, consistently-named fields beat nested cleverness. Push one record per logical item, keep field order stable across versions, and include the source URL on every row — users trust data they can spot-check.
No — Apify has a first-class Python SDK. Wrap your existing Python scraper in the Actor lifecycle, add an input schema and Dockerfile, and it runs on the platform.
Yes — Actors can be monetized with monthly rental or pay-per-result pricing on the Apify Store. Reliability and a clear README matter as much as the scraping logic.
Usually with minimal changes: the scraping logic stays, and Actor.get_input() / Actor.push_data() replace argument parsing and file writing. I offer this migration as a service.
I build scrapers, Actors, and data pipelines as a service — fixed quote, fast turnaround.
Start a project →