{
  "schemaVersion": "1.0",
  "item": {
    "slug": "apify",
    "name": "Apify",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/bmestanov/apify",
    "canonicalUrl": "https://clawhub.ai/bmestanov/apify",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/apify",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=apify",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "openapi.json"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/apify"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/apify",
    "agentPageUrl": "https://openagent3.xyz/skills/apify/agent",
    "manifestUrl": "https://openagent3.xyz/skills/apify/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/apify/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Apify",
        "body": "Run any of the 17,000+ Actors on Apify Store and retrieve structured results via the REST API.\n\nFull OpenAPI spec: openapi.json"
      },
      {
        "title": "Authentication",
        "body": "All requests need the APIFY_TOKEN env var. Use it as a Bearer token:\n\n-H \"Authorization: Bearer $APIFY_TOKEN\"\n\nBase URL: https://api.apify.com"
      },
      {
        "title": "1. Find the right Actor",
        "body": "Search the Apify Store by keyword:\n\ncurl -s \"https://api.apify.com/v2/store?search=web+scraper&limit=5\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" | jq '.data.items[] | {name: (.username + \"/\" + .name), title, description}'\n\nActors are identified by username~name (tilde) in API paths, e.g. apify~web-scraper."
      },
      {
        "title": "2. Get Actor README and input schema",
        "body": "Before running an Actor, fetch its default build to get the README (usage docs) and input schema (expected JSON fields):\n\ncurl -s \"https://api.apify.com/v2/acts/apify~web-scraper/builds/default\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" | jq '.data | {readme, inputSchema}'\n\ninputSchema is a JSON-stringified object — parse it to see required/optional fields, types, defaults, and descriptions. Use this to construct valid input for the run.\n\nYou can also get the Actor's per-build OpenAPI spec (no auth required):\n\ncurl -s \"https://api.apify.com/v2/acts/apify~web-scraper/builds/default/openapi.json\""
      },
      {
        "title": "3. Run an Actor (async — recommended for most cases)",
        "body": "Start the Actor and get the run object back immediately:\n\ncurl -s -X POST \"https://api.apify.com/v2/acts/apify~web-scraper/runs\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"startUrls\":[{\"url\":\"https://example.com\"}],\"maxPagesPerCrawl\":10}'\n\nResponse includes data.id (run ID), data.defaultDatasetId, data.status.\n\nOptional query params: ?timeout=300&memory=4096&maxItems=100&waitForFinish=60\n\nwaitForFinish (0-60): seconds the API waits before returning. Useful to avoid polling for short runs."
      },
      {
        "title": "4. Poll run status",
        "body": "curl -s \"https://api.apify.com/v2/actor-runs/RUN_ID?waitForFinish=60\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" | jq '.data | {status, defaultDatasetId}'\n\nTerminal statuses: SUCCEEDED, FAILED, ABORTED, TIMED-OUT."
      },
      {
        "title": "5. Get results",
        "body": "Dataset items (most common — structured scraped data):\n\ncurl -s \"https://api.apify.com/v2/datasets/DATASET_ID/items?clean=true&limit=100\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\"\n\nOr directly from the run (shortcut — same parameters):\n\ncurl -s \"https://api.apify.com/v2/actor-runs/RUN_ID/dataset/items?clean=true&limit=100\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\"\n\nParams: format (json|csv|jsonl|xml|xlsx|rss), fields, omit, limit, offset, clean, desc.\n\nKey-value store record (screenshots, HTML, OUTPUT):\n\ncurl -s \"https://api.apify.com/v2/key-value-stores/STORE_ID/records/OUTPUT\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\"\n\nRun log:\n\ncurl -s \"https://api.apify.com/v2/logs/RUN_ID\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\""
      },
      {
        "title": "6. Run Actor synchronously (short-running Actors only)",
        "body": "For Actors that finish within 300 seconds, get dataset items in one call:\n\ncurl -s -X POST \"https://api.apify.com/v2/acts/apify~web-scraper/run-sync-get-dataset-items?timeout=120\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"startUrls\":[{\"url\":\"https://example.com\"}],\"maxPagesPerCrawl\":5}'\n\nReturns the dataset items array directly (not wrapped in data). Returns 408 if the run exceeds 300s.\n\nAlternative: /run-sync returns the KVS OUTPUT record instead of dataset items."
      },
      {
        "title": "Scrape a website",
        "body": "curl -s -X POST \"https://api.apify.com/v2/acts/apify~web-scraper/run-sync-get-dataset-items?timeout=120\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"startUrls\":[{\"url\":\"https://example.com\"}],\"maxPagesPerCrawl\":20}'"
      },
      {
        "title": "Google search",
        "body": "curl -s -X POST \"https://api.apify.com/v2/acts/apify~google-search-scraper/run-sync-get-dataset-items?timeout=120\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"queries\":\"site:example.com openai\",\"maxPagesPerQuery\":1}'"
      },
      {
        "title": "Long-running Actor (async with polling)",
        "body": "# 1. Start\nRUN=$(curl -s -X POST \"https://api.apify.com/v2/acts/apify~web-scraper/runs?waitForFinish=60\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"startUrls\":[{\"url\":\"https://example.com\"}],\"maxPagesPerCrawl\":500}')\nRUN_ID=$(echo \"$RUN\" | jq -r '.data.id')\n\n# 2. Poll until done\nwhile true; do\n  STATUS=$(curl -s \"https://api.apify.com/v2/actor-runs/$RUN_ID?waitForFinish=60\" \\\n    -H \"Authorization: Bearer $APIFY_TOKEN\" | jq -r '.data.status')\n  echo \"Status: $STATUS\"\n  case \"$STATUS\" in SUCCEEDED|FAILED|ABORTED|TIMED-OUT) break;; esac\ndone\n\n# 3. Fetch results\ncurl -s \"https://api.apify.com/v2/actor-runs/$RUN_ID/dataset/items?clean=true\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\""
      },
      {
        "title": "Abort a run",
        "body": "curl -s -X POST \"https://api.apify.com/v2/actor-runs/RUN_ID/abort\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\""
      },
      {
        "title": "Paid / rental Actors",
        "body": "Some Actors require a monthly subscription before they can be run. If the API returns a permissions or payment error for an Actor, ask the user to manually subscribe via the Apify Console:\n\nhttps://console.apify.com/actors/ACTOR_ID\n\nReplace ACTOR_ID with the Actor's ID (e.g. AhEsMsQyLfHyMLaxz). The user needs to click Start on that page to activate the subscription. Most rental Actors offer a free trial period set by the developer.\n\nYou can get the Actor ID from the store search response (data.items[].id) or from GET /v2/acts/username~name (data.id)."
      },
      {
        "title": "Error handling",
        "body": "401: APIFY_TOKEN missing or invalid.\n404 Actor not found: check username~name format (tilde, not slash). Browse https://apify.com/store.\n400 run-failed: check GET /v2/logs/RUN_ID for details.\n402/403 payment required: the Actor likely requires a subscription. See \"Paid / rental Actors\" above.\n408 run-timeout-exceeded: sync endpoints have a 300s limit. Use async workflow instead.\n429 rate-limit-exceeded: retry with exponential backoff (start at 500ms, double each time)."
      },
      {
        "title": "Additional resources",
        "body": "API docs (LLM-friendly): https://docs.apify.com/api/v2.md\nOpenAPI spec: openapi.json\nApify Store (browse Actors): https://apify.com/store"
      }
    ],
    "body": "Apify\n\nRun any of the 17,000+ Actors on Apify Store and retrieve structured results via the REST API.\n\nFull OpenAPI spec: openapi.json\n\nAuthentication\n\nAll requests need the APIFY_TOKEN env var. Use it as a Bearer token:\n\n-H \"Authorization: Bearer $APIFY_TOKEN\"\n\n\nBase URL: https://api.apify.com\n\nCore workflow\n1. Find the right Actor\n\nSearch the Apify Store by keyword:\n\ncurl -s \"https://api.apify.com/v2/store?search=web+scraper&limit=5\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" | jq '.data.items[] | {name: (.username + \"/\" + .name), title, description}'\n\n\nActors are identified by username~name (tilde) in API paths, e.g. apify~web-scraper.\n\n2. Get Actor README and input schema\n\nBefore running an Actor, fetch its default build to get the README (usage docs) and input schema (expected JSON fields):\n\ncurl -s \"https://api.apify.com/v2/acts/apify~web-scraper/builds/default\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" | jq '.data | {readme, inputSchema}'\n\n\ninputSchema is a JSON-stringified object — parse it to see required/optional fields, types, defaults, and descriptions. Use this to construct valid input for the run.\n\nYou can also get the Actor's per-build OpenAPI spec (no auth required):\n\ncurl -s \"https://api.apify.com/v2/acts/apify~web-scraper/builds/default/openapi.json\"\n\n3. Run an Actor (async — recommended for most cases)\n\nStart the Actor and get the run object back immediately:\n\ncurl -s -X POST \"https://api.apify.com/v2/acts/apify~web-scraper/runs\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"startUrls\":[{\"url\":\"https://example.com\"}],\"maxPagesPerCrawl\":10}'\n\n\nResponse includes data.id (run ID), data.defaultDatasetId, data.status.\n\nOptional query params: ?timeout=300&memory=4096&maxItems=100&waitForFinish=60\n\nwaitForFinish (0-60): seconds the API waits before returning. Useful to avoid polling for short runs.\n4. Poll run status\ncurl -s \"https://api.apify.com/v2/actor-runs/RUN_ID?waitForFinish=60\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" | jq '.data | {status, defaultDatasetId}'\n\n\nTerminal statuses: SUCCEEDED, FAILED, ABORTED, TIMED-OUT.\n\n5. Get results\n\nDataset items (most common — structured scraped data):\n\ncurl -s \"https://api.apify.com/v2/datasets/DATASET_ID/items?clean=true&limit=100\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\"\n\n\nOr directly from the run (shortcut — same parameters):\n\ncurl -s \"https://api.apify.com/v2/actor-runs/RUN_ID/dataset/items?clean=true&limit=100\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\"\n\n\nParams: format (json|csv|jsonl|xml|xlsx|rss), fields, omit, limit, offset, clean, desc.\n\nKey-value store record (screenshots, HTML, OUTPUT):\n\ncurl -s \"https://api.apify.com/v2/key-value-stores/STORE_ID/records/OUTPUT\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\"\n\n\nRun log:\n\ncurl -s \"https://api.apify.com/v2/logs/RUN_ID\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\"\n\n6. Run Actor synchronously (short-running Actors only)\n\nFor Actors that finish within 300 seconds, get dataset items in one call:\n\ncurl -s -X POST \"https://api.apify.com/v2/acts/apify~web-scraper/run-sync-get-dataset-items?timeout=120\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"startUrls\":[{\"url\":\"https://example.com\"}],\"maxPagesPerCrawl\":5}'\n\n\nReturns the dataset items array directly (not wrapped in data). Returns 408 if the run exceeds 300s.\n\nAlternative: /run-sync returns the KVS OUTPUT record instead of dataset items.\n\nQuick recipes\nScrape a website\ncurl -s -X POST \"https://api.apify.com/v2/acts/apify~web-scraper/run-sync-get-dataset-items?timeout=120\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"startUrls\":[{\"url\":\"https://example.com\"}],\"maxPagesPerCrawl\":20}'\n\nGoogle search\ncurl -s -X POST \"https://api.apify.com/v2/acts/apify~google-search-scraper/run-sync-get-dataset-items?timeout=120\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"queries\":\"site:example.com openai\",\"maxPagesPerQuery\":1}'\n\nLong-running Actor (async with polling)\n# 1. Start\nRUN=$(curl -s -X POST \"https://api.apify.com/v2/acts/apify~web-scraper/runs?waitForFinish=60\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"startUrls\":[{\"url\":\"https://example.com\"}],\"maxPagesPerCrawl\":500}')\nRUN_ID=$(echo \"$RUN\" | jq -r '.data.id')\n\n# 2. Poll until done\nwhile true; do\n  STATUS=$(curl -s \"https://api.apify.com/v2/actor-runs/$RUN_ID?waitForFinish=60\" \\\n    -H \"Authorization: Bearer $APIFY_TOKEN\" | jq -r '.data.status')\n  echo \"Status: $STATUS\"\n  case \"$STATUS\" in SUCCEEDED|FAILED|ABORTED|TIMED-OUT) break;; esac\ndone\n\n# 3. Fetch results\ncurl -s \"https://api.apify.com/v2/actor-runs/$RUN_ID/dataset/items?clean=true\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\"\n\nAbort a run\ncurl -s -X POST \"https://api.apify.com/v2/actor-runs/RUN_ID/abort\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\"\n\nPaid / rental Actors\n\nSome Actors require a monthly subscription before they can be run. If the API returns a permissions or payment error for an Actor, ask the user to manually subscribe via the Apify Console:\n\nhttps://console.apify.com/actors/ACTOR_ID\n\n\nReplace ACTOR_ID with the Actor's ID (e.g. AhEsMsQyLfHyMLaxz). The user needs to click Start on that page to activate the subscription. Most rental Actors offer a free trial period set by the developer.\n\nYou can get the Actor ID from the store search response (data.items[].id) or from GET /v2/acts/username~name (data.id).\n\nError handling\n401: APIFY_TOKEN missing or invalid.\n404 Actor not found: check username~name format (tilde, not slash). Browse https://apify.com/store.\n400 run-failed: check GET /v2/logs/RUN_ID for details.\n402/403 payment required: the Actor likely requires a subscription. See \"Paid / rental Actors\" above.\n408 run-timeout-exceeded: sync endpoints have a 300s limit. Use async workflow instead.\n429 rate-limit-exceeded: retry with exponential backoff (start at 500ms, double each time).\nAdditional resources\nAPI docs (LLM-friendly): https://docs.apify.com/api/v2.md\nOpenAPI spec: openapi.json\nApify Store (browse Actors): https://apify.com/store"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/bmestanov/apify",
    "publisherUrl": "https://clawhub.ai/bmestanov/apify",
    "owner": "bmestanov",
    "version": "1.0.3",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/apify",
    "downloadUrl": "https://openagent3.xyz/downloads/apify",
    "agentUrl": "https://openagent3.xyz/skills/apify/agent",
    "manifestUrl": "https://openagent3.xyz/skills/apify/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/apify/agent.md"
  }
}