Apify SDK Patterns
SkillDev tools'Production-ready patterns for Apify SDK and apify-client in TypeScript.
Use Apify SDK Patterns in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add Apify SDK Patterns and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the Apify SDK Patterns skill
Details
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; Ahel provides instructions and does not run this skill.
No other account needed.
Add Ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
What this skill tells your AI
The instructions your AI receives, as published by jeremylongshore/tons-of-skills-marketplace in skills/.curated/apify-sdk-patterns/SKILL.md and read by Ahel’s review.
Overview
Production patterns for both the apify SDK (building Actors) and apify-client (calling Actors remotely). Covers Crawlee crawler selection, data storage, proxy configuration, and typed client wrappers. This skill gives you the essential skeletons inline; the full eight-pattern catalog and two worked scenarios live in references/ for progressive drill-down.
Prerequisites
- Install what you need:
apify-clientfor calling Actors remotely, orapify+crawleefor building Actors. Both can coexist in one project. - Set
APIFY_TOKENin the environment — read it viaprocess.env.APIFY_TOKEN, never hard-code it. This is the only credential these patterns require (Apify uses a personal API token, not OAuth). - TypeScript is recommended; every snippet here is typed and runs under
ts-nodeor a compiled build.
Instructions
Use the two skeletons below to start, then reach into the reference catalog for the pattern that matches your task.
Pattern 1: Typed Client Singleton
Create one lazily-initialized, token-validated ApifyClient and reuse it everywhere. A resetClient() hook keeps it testable.
// src/apify/client.ts
import { ApifyClient } from 'apify-client';
let instance: ApifyClient | null = null;
export function getApifyClient(): ApifyClient {
if (!instance) {
const token = process.env.APIFY_TOKEN;
if (!token) throw new Error('APIFY_TOKEN is required');
instance = new ApifyClient({ token });
}
return instance;
}
// Reset for testing
export function resetClient(): void {
instance = null;
}
Pattern 2: Crawlee Crawler Selection
Choose the crawler that matches the page, not the other way around:
import { CheerioCrawler, PlaywrightCrawler, PuppeteerCrawler } from 'crawlee';
// CHEERIO — Fast, lightweight, no JavaScript rendering
// Use for: static HTML, server-rendered pages, APIs
// PLAYWRIGHT — Full browser, all engines, modern API
// Use for: SPAs, JavaScript-heavy pages, complex interactions
// PUPPETEER — Chromium-only browser automation
// Use for: when you need Chromium specifically or legacy Puppeteer code
Patterns 3–8: Full catalog
The remaining six patterns are moved verbatim into patterns.md so this file stays scannable. Pick the one you need:
- Pattern 3 — Actor lifecycle with error handling:
Actor.main()wrapping input validation, conditional proxy, and afailedRequestHandler. - Pattern 4 — Dataset operations: push from inside an Actor; list/create/download from an external app.
- Pattern 5 — Key-value store operations: JSON config and binary artifacts by content type.
- Pattern 6 — Proxy configuration: datacenter vs residential vs SERP tiers.
- Pattern 7 — Router for multi-page Actors: labeled listing/detail handlers.
- Pattern 8 — Safe result wrapper: discriminated-union
Result<T>around remote calls.
See patterns.md for the complete code of all six.
Output
Applying these patterns yields:
- A single reusable
ApifyClientinstance with fail-fast token validation. - Actors that store structured records in the default dataset (downloadable as CSV/JSON) and named config/artifacts in key-value stores.
- Remote Actor calls that resolve to a typed
Result<T>— callers branch onerrorinstead of catching exceptions. - Failed requests captured as
{ url, error, '#isFailed': true }rows rather than aborting the crawl.
Error Handling
| Pattern | Use Case | Benefit |
|---|---|---|
Actor.main() | Actor entry point | Auto init/exit + error reporting |
failedRequestHandler | Per-request failures | Log failures without stopping crawl |
| Safe wrapper | External calls | Prevents uncaught exceptions |
| Router | Multi-page scrapes | Clean separation of page types |
| Proxy rotation | Anti-bot sites | Higher success rate |
Examples
Two runnable end-to-end scenarios live in examples.md:
- Example A — Call a remote Actor safely from an app: composes the client singleton (Pattern 1) with the safe result wrapper (Pattern 8) to run
apify/web-scraperand read its dataset without ever throwing. - Example B — A two-tier product scraper Actor: composes crawler selection (Pattern 2), the router (Pattern 7), and dataset writes (Pattern 4) into a listing → detail → structured-record flow.
Resources
- Full pattern catalog — Patterns 3–8 with complete code
- Worked examples — two end-to-end scenarios
- Apify SDK Reference
- Crawlee Documentation
- Apify JS Client Reference
- Proxy Management Guide
Next Steps
Apply these patterns in apify-core-workflow-a for a complete build-and-deploy web scraping workflow, or pair them with apify-common-errors when hardening an Actor for production.
Signals
- GitHub stars
- 3k
- Forks
- 415
- Last commit
- Oct 2026
Advanced
- Item type
- skill
- Key
apify-sdk-patterns- Source
- github.com/jeremylongshore/tons-of-skills-marketplace
github.com/jeremylongshore/tons-of-skills-marketplace
Related picks
Skill · thedaviddias
The pick for JavaScriptmodern-javascript-patterns
Skill · wshobson
The pick for JavaScriptsetup-ts-deep-modules
Skill · mattpocock
The pick for TypeScripttypescript-pro
Skill · jeffallan
The pick for TypeScripthandsontable-playwright-e2e
Skill · handsontable
The pick for End-to-end testingmstar-e2e
Skill · btspoony
The pick for End-to-end testing