writing-skills
writing-skills
Use when creating new skills, editing existing skills, or verifying skills work before deployment
apify-prod-checklistProduction readiness checklist for Apify Actor deployments. Use when deploying an Actor to production, preparing for launch, or validating Actor configuration, scheduling, monitoring, and rollback before going live. Trigger with "apify production", "deploy actor to prod", "apify go-live", "apify launch checklist", "actor production ready".
Independent GitHub snapshot · Automated classification · Original documentation governs
name: apify-prod-checklist description: | Production readiness checklist for Apify Actor deployments. Use when deploying an Actor to production, preparing for launch, or validating Actor configuration, scheduling, monitoring, and rollback before going live. Trigger with "apify production", "deploy actor to prod", "apify go-live", "apify launch checklist", "actor production ready". allowed-tools: Read, Bash(apify:), Bash(curl:), Bash(npm:*) version: 1.5.0 license: MIT author: Jeremy Longshore jeremy@intentsolutions.io tags:
Complete checklist for deploying Actors to the Apify platform and integrating them into production applications. Covers Actor configuration, scheduling, monitoring, alerting, and rollback. Work top to bottom: clear the pre-deployment gates, then run the six deploy steps, then wire the alert conditions.
apify runapify login configured with production tokenapify-core-workflow-a and apify-deploy-integration.actor/actor.json has correct name, title, descriptionINPUT_SCHEMA.json validates all required inputsDockerfile uses pinned base image version (apify/actor-node:20, not latest)package-lock.json committed (deterministic installs)Actor.main() wraps entry point (handles init/exit/errors)failedRequestHandler logs failures without crashing Actorif (!input?.startUrls) throw ...)maxRequestsPerCrawl set to prevent runaway costsSUMMARY key-value store record saved with run statsRead the Actor's .actor/actor.json, INPUT_SCHEMA.json, and Dockerfile first to confirm the pre-deployment gates above, then run the six deploy steps. Each step's full command and code block lives in references/implementation.md; the skeleton is below.
apify push, then apify builds ls to confirm the build, then apify actors call with a small production-like input to smoke-test on-platform.client.schedules().create({...}) (or Apify Console: Actors > Your Actor > Schedules). Set cronExpression, runInput, and runOptions (memory/timeout).client.webhooks().create({...}) on ACTOR.RUN.SUCCEEDED/FAILED/TIMED_OUT with a payloadTemplate posting runId, status, and datasetId to your server.checkActorHealth(actorId, lookbackHours) helper lists recent runs and reports success rate, failures, timeouts, and total cost.apify builds ls, then repoint the Actor at a prior build via the POST /v2/acts/ACTOR_ID?build=N API, or redeploy from a git tag.runWithCostGuard(actorId, input, maxCostUsd) polls usageTotalUsd every 30s and aborts the run if it exceeds budget.The first deploy step in full:
# Build and push to Apify platform
apify push
# Verify the build succeeded
apify builds ls
Working through this skill produces a production-ready Actor with:
apify builds ls shows a SUCCEEDED build).Health-check output looks like:
Actor: username/product-scraper
Last 24h: 3 runs, 66.7% success
Failed: 1, Timed out: 0
Total cost: $0.4213
| Alert | Condition | Severity |
|---|---|---|
| Run failed | status === 'FAILED' | P1 |
| Run timed out | status === 'TIMED-OUT' | P2 |
| Low yield | Dataset items < expected threshold | P2 |
| High cost | usageTotalUsd > budget | P2 |
| Consecutive failures | 3+ failures in a row | P1 |
| No runs in window | Schedule didn't trigger | P1 |
| Issue | Cause | Solution |
|---|---|---|
| Build fails on platform | Local deps differ | Commit package-lock.json |
| Schedule not firing | Cron syntax error | Validate at crontab.guru |
| Webhook not received | URL not reachable | Use ngrok for testing; check HTTPS |
| Memory exceeded | Workload too large | Increase memory or reduce concurrency |
| Unexpected cost spike | No maxRequestsPerCrawl | Always set an upper bound |
Four worked examples — a first production deploy, health-check output, a cost guard aborting a runaway run, and a build rollback — are in references/examples.md. A first production deploy in brief:
# Smoke-test on-platform with a tiny input before scheduling
apify actors call username/product-scraper \
--input='{"startUrls":[{"url":"https://target.com"}],"maxItems":10}'
Then create the daily schedule and completion webhook (implementation.md Steps 2–3).
Once production is stable, plan version upgrades with the apify-upgrade-migration skill: it covers bumping the Actor base image, migrating INPUT_SCHEMA.json fields without breaking existing schedules, and re-running this checklist against the new build before repointing traffic.