Apify is a library of ready-made scrapers. When the data sits on a page and no vendor offers it, your agent picks the right scraper, runs it, and gets structured rows back. Everyone who engaged with a LinkedIn post is the common one.
Apify starts a list from somewhere unusual. What it returns goes through enrichment like any other list.
turn scraped names into contactable people
score hundreds of scraped rows against the brief
a lighter option when you only need the page text
resolve a scraped name to a full profile
Ask for the outcome and your agent composes the run itself. Or start from a skill, a whole pipeline it already knows end to end.
browse all skills →Every tool ships with a written playbook, and the agent loads it before the first call. Auth, rate limits, what each call costs, which actions need your approval, and the mistakes worth avoiding. It is the difference between an agent that knows the tool and one that guesses at it.
Read the Apify docs →HOW in lib/apify.py. Docs: docs.apify.com (OpenAPI). Actor model — discover → run → read dataset.
no_key. Hyreflow charges 0 credits; Apify bills you directly.https://api.apify.com/v2 · Auth: Authorization: Bearer <token> (env APIFY_API_KEY; never hardcode).actorId is username/name; the client converts it to username~name for paths.list_store_actors(search=...) — find an actor when you don't know its id (pick high rating/usage; for LinkedIn posts prefer supreme_coder/linkedin-post).get_actor_input_schema(actor_id) — required/optional inputs before running.run_actor_sync(actor_id, run_input) — run + return dataset items in one call (default).run_actor(...) → get_run(run_id) (poll status + defaultDatasetId) → get_dataset_items(dataset_id).maxItems) before scaling. Read-only sourcing tool (no outreach side-effects).Sourcing/scraping layer: e.g. scrape LinkedIn posts/engagers or profiles → structured rows → enrichment (emails/phones) → ATS/sequencer.
Field-shape note: these are vendor-native operational notes. The client returns the raw vendor JSON and uses the method names in this file — read field shapes accordingly (no normalized-wrapper /
result.data.prefix).
successRate30d >= 95% actors. For LinkedIn posts -> supreme_coder/linkedin-post; for post reactions/engagers -> harvestapi/linkedin-post-reactions.actorId = username/name (note: our adapter also accepts the username~name form per Apify's API).maxItems) before scaling.lib/apify.pyImport: from lib.apify import Apify → instantiate Apify() (reads key from env). Base: https://api.apify.com/v2. Generic passthrough: request(method, path, *, params, json).
get_actor_input_schema(actor_id: str) -> Any — GET /acts/{actor}/input-schema — inspect required/optional input fields before running.get_dataset_items(dataset_id: str, *, limit: int | None = None, offset: int | None = None, **params) -> Any — GET /datasets/{datasetId}/items — fetch an actor run's output.get_run(run_id: str) -> Any — GET /actor-runs/{runId} — run status (look at data.status + data.defaultDatasetId).list_store_actors(*, search: str | None = None, limit: int = 25, **params) -> Any — GET /store — search the Apify actor store. Use first when you don't know the actorId.run_actor(actor_id: str, run_input: dict, **params) -> Any — POST /acts/{actor}/runs — start an async run. Poll get_run, then get_dataset_items.run_actor_sync(actor_id: str, run_input: dict, **params) -> Any — POST /acts/{actor}/run-sync-get-dataset-items — run an actor and return dataset items