# Apify Hello World

> | Run your first Apify Actor and retrieve results via apify-client. Use when starting a new Apify integration, testing connectivity, or learning the Actor call/dataset retrieval pattern. Trigger with "apify hello world", "apify example", "run an apify actor", "apify quick start", "first apify scrape".

- Skill: `thedixitjain/apify-hello-world` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds add thedixitjain/apify-hello-world`
- Raw SKILL.md: https://api.skillmd.com/api/skills/thedixitjain/apify-hello-world/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: thedixitjain (https://skillmd.com/u/thedixitjain)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/thedixitjain/apify-hello-world

---


# Apify Hello World

## Overview

Run a public Actor from the Apify Store, wait for it to finish, and retrieve the scraped data. This demonstrates the fundamental call-wait-collect pattern used in every Apify integration.

## Prerequisites

- `npm install apify-client` completed
- `APIFY_TOKEN` environment variable set
- See `apify-install-auth` if not ready

## Authentication

Every call authenticates with a personal API token passed to the client
constructor: `new ApifyClient({ token: process.env.APIFY_TOKEN })`. Keep the
token in the `APIFY_TOKEN` environment variable — never hard-code it in the
script. Full setup (where to generate the token, how to export it) lives in the
`apify-install-auth` skill.

## Core Pattern: Call Actor, Get Data

```typescript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

// 1. Run an Actor and wait for it to finish
const run = await client.actor('apify/website-content-crawler').call({
  startUrls: [{ url: 'https://docs.apify.com/academy' }],
  maxCrawlPages: 5,
});

// 2. Retrieve results from the default dataset
const { items } = await client.dataset(run.defaultDatasetId).listItems();

console.log(`Crawled ${items.length} pages:`);
items.forEach(item => {
  console.log(`  - ${item.url}: ${item.text?.substring(0, 80)}...`);
});
```

This is the whole workflow at a high level: authenticate, `.call()` an Actor,
then read its default dataset. For sync-vs-async execution, pagination,
downloads, key-value store retrieval, run-configuration options, and a table of
popular starter Actors, see [run & retrieval patterns](references/patterns.md).

## Instructions

### Step 1: Create the Script

Use Write (or Edit an existing file) to create `hello-apify.ts` (or `.js`) with
the Core Pattern code above. Use Read to confirm the file contents before running.

### Step 2: Run It

```bash
# With tsx (recommended)
npx tsx hello-apify.ts

# Or with Node.js (plain JS)
node hello-apify.js
```

### Step 3: Understand the Output

The Actor runs on Apify's cloud infrastructure. See the Output section below for
the run-object fields returned when it finishes.

## Output

A successful run returns a run object plus a populated dataset. The fields you
read most:

| Field | Meaning |
|-------|---------|
| `run.id` | Unique run identifier |
| `run.status` | `SUCCEEDED`, `FAILED`, `TIMED-OUT`, or `ABORTED` |
| `run.defaultDatasetId` | ID of the dataset containing scrape results |
| `run.defaultKeyValueStoreId` | ID of the KV store with metadata/artifacts |
| `run.statusMessage` | Human-readable detail (essential when status is not `SUCCEEDED`) |

`client.dataset(run.defaultDatasetId).listItems()` returns `{ items }`, where
each item is one scraped record (shape depends on the Actor). Always branch on
`run.status` before reading the dataset — a `FAILED` run can leave an empty or
partial dataset. See [worked examples](references/examples.md) for the full
run-object breakdown.

## Error Handling

| Error | Cause | Solution |
|-------|-------|----------|
| `Actor not found` | Wrong Actor ID | Check ID at apify.com/store |
| `run.status === 'FAILED'` | Actor crashed | Check `run.statusMessage` for details |
| `run.status === 'TIMED-OUT'` | Exceeded timeout | Increase `timeout` or reduce workload |
| `Dataset is empty` | Actor produced no output | Verify input parameters; check Actor logs |
| `402 Payment Required` | Insufficient compute units — Apify returns HTTP 402 when your account is out of prepaid units | Top up at console.apify.com/billing |

## Examples

Minimal happy-path collection — call an Actor and count the results:

```typescript
const run = await client.actor('apify/website-content-crawler').call({
  startUrls: [{ url: 'https://example.com' }],
  maxCrawlPages: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Scraped ${items.length} pages`);
```

For the complete status-guarded "scrape and save to JSON" script and a full
breakdown of the run object, see [worked examples](references/examples.md).

## Resources

- [Apify Store — Browse Actors](https://apify.com/store)
- [Run Actor via API](https://docs.apify.com/academy/api/run-actor-and-retrieve-data-via-api)
- [JS Client Examples](https://docs.apify.com/api/client/js/docs/guides/examples)
- [Run & retrieval patterns](references/patterns.md) — sync/async, pagination, run config, starter Actors
- [Worked examples](references/examples.md) — full scrape-and-save script

## Next Steps

Once your first Actor run succeeds, proceed to the `apify-local-dev-loop` skill
to build and iterate on your own Actor locally, then deploy it back to the Apify
platform. That skill covers the develop-run-debug cycle in depth.

---

**Source:** [`jeremylongshore/claude-code-plugins-plus-skills`](https://github.com/jeremylongshore/claude-code-plugins-plus-skills) → `plugins/saas-packs/apify-pack/skills/apify-hello-world/SKILL.md`

