Skip to content

docs(skills): replace "Scrape single URL" guidance with Web Fetch Standby - #91

Merged
FilipMasar merged 3 commits into
mainfrom
docs/integration-skill-web-fetch
Oct 8, 2026
Merged

FilipMasar merged 3 commits into
mainfrom
docs/integration-skill-web-fetch

Conversation

@FilipMasar

@FilipMasar FilipMasar commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Closes apify/integrations-team#144

The integration skill told agents to build "Scrape single URL" as a crawler run. It now tells them to build a Web Fetch action that calls apify/web-fetch in Standby mode, as agreed in apify/integrations-team#114.

Changes

  • SKILL.md: the convenience action is now Web Fetch. The cost and HTTP rules say that a Standby call is not a run.
  • workflow-automation.md: section 13 is rewritten for Web Fetch, with a note on how to migrate an old "Scrape single URL" action. Also fixes a wrong section reference.
  • ai-framework-package.md: the "scrape URL" tool becomes "web fetch", with rules for LLM use. Also fixes a broken table.
  • ai-harness-plugin.md: two small exceptions for the Web Fetch host.

FilipMasar and others added 2 commits October 1, 2026 15:17
…ndby

The integration development skill told agents to build the single-URL
action as a content-crawler run. Point it at the apify/web-fetch Actor
in Standby mode instead, and state where the run rules (cost cap,
polling, retry) do not apply.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Keep the shared contract once in SKILL.md, link the Actor docs for the
rest, and leave only category-specific points in the references.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@FilipMasar
FilipMasar marked this pull request as ready for review October 1, 2026 13:26
@FilipMasar FilipMasar self-assigned this Oct 1, 2026

@drobnikj drobnikj left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

two notes, but pre aprroving

- API key resolution order: plugin config field -> `APIFY_API_KEY` (or `APIFY_TOKEN`) env var. Normalize pasted input - strip line/paragraph separators and trim whitespace (defends against copy-paste artifacts).
- The key is **never** included in tool output, **never** logged, only passed to the client constructor.
- Validate `baseUrl` against an allowlist prefix (`https://api.apify.com`) to prevent SSRF - a misconfigured plugin must not point at an arbitrary host.
- Validate `baseUrl` against an allowlist prefix (`https://api.apify.com`, plus `https://web-fetch.apify.actor` if the plugin ships a Web Fetch tool) to prevent SSRF - a misconfigured plugin must not point at an arbitrary host.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: ai-framework-package.md gains the rule that headers must never be exposed to the model (a fetched page can talk the agent into sending credentials to a host of its choosing), but a harness plugin is just as LLM-driven and only gets the baseUrl allowlist. That rule belongs in this file's security bullets too.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@drobnikj I added a new bullet point. Could you please check if thats what you meant?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM


When extracting page content from crawling Actors, prefer `markdown` over `text`, with a trailing `or ''` to guarantee a string even when a key is present but null. Follow a fixed fallback order for the source URL: nested `metadata.url` -> `crawledUrl` -> top-level `url`. Tolerate a `metadata` field that is missing or not a dict (some Actor responses surface `null`). Actor output shapes are inconsistent across versions and configurations; centralize one canonical fallback order so the retriever, loaders, and tools all agree on what "the content", "the source URL", and "the title" mean.

**Single known URL -> Web Fetch.** For the "fetch this URL" tool, do not run a crawler with a page limit of 1 - call the Web Fetch Standby endpoint described in `SKILL.md`. It is the one client method that is a plain HTTPS request instead of `client.actor(id).call(...)`, so add the Bearer token and the attribution header by hand, and set `run` to `null` in the envelope. Take the content from `markdown`, the source URL from `fetch.loadedUrl`, and the title from `metadata.title`. For the LLM-facing tool: pin `formats` to `["markdown"]`, do not expose `headers` to the model (a fetched page could talk the agent into sending credentials to a host of its choosing), and fetch one URL per call with the content truncated to a developer-controlled cap.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: The naming will change soon, from Stanby Actor to Server Actor. Maybe use Server Actor instead of Stanby right away to be future proof 😄 see more in #product-server-actors slack channel.

… in harness plugins

Address review: say "Server Actor" instead of "Standby", noting the API
and docs may still use the old name, and add the rule that a harness
plugin's Web Fetch tool must not expose headers to the model.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@FilipMasar
FilipMasar merged commit d522584 into main Oct 8, 2026
1 check passed
@FilipMasar
FilipMasar deleted the docs/integration-skill-web-fetch branch October 8, 2026 17:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants