Using crawl, search, and paginate-api steps
Use these three Context steps to bring outside data into a Flow. Crawl Website collects content from many pages of one site. AI Search searches the web. Paginate API requests every page of a paginated JSON API and combines the results into one array.
Before you begin
Open a flow in the Flow editor. To add any of these steps, click Add step and select the step from the Context group. If an API needs credentials, create a secret in Managing secrets first.
Crawl a website
Crawl Website starts a crawl job with Cloudflare Browser Rendering, waits for the job to finish, and stores the crawled pages in its output variable. The default output variable is crawl_result.
Configure the following fields:
- Start crawl from URL: the first page to crawl. You can include flow variables. If the URL has no scheme, Runtype adds
https://. - crawl up to and pages with depth: the maximum number of pages to collect and how many links deep to follow from the start page.
- using source: All, Sitemaps, or Links. This setting controls how the crawler finds pages.
- render pages: turn this on for sites that build their content with JavaScript. It’s off for a step that you add in the Flow editor.
- Formats: one or more of Markdown, HTML, Links, and JSON. The default is Markdown.
The Advanced settings add Include patterns and Exclude patterns (for example, /docs/**), Follow external links, Follow subdomains, wait for selector, max age (seconds) for cached pages, and Reject resource types.
Crawl credentials
By default, the step uses Runtype’s Cloudflare account, and Runtype counts each crawled page as platform-key spend. To use your own Cloudflare account, go to Settings > Integrations. In Web Scraping, find Cloudflare Browser Rendering, and enter your Cloudflare Account ID and API Token. For how platform-key spend is billed, see Platform keys vs. BYOK.
Crawl output
The output variable holds an object with these fields:
crawlId: the ID of the crawl job.status:completedfor a successful crawl.result: the first page of results.resultPages: every page of results, including the first.
Each results page has a records array. Each record has the page’s url and status, plus the content for the formats that you chose, such as markdown. Runtype stops collecting results when it reaches the crawl up to limit.
Crawl timing
A crawl waits up to 2 minutes for the job to finish, checking its status every 2 seconds. To change these values, set completionTimeoutMs and pollIntervalMs in the flow definition. A crawl that runs longer than completionTimeoutMs fails with Cloudflare crawl timed out.
Batch runs, evals, and Schedules can’t run a Flow that contains a Crawl Website step. For details, see Timeouts and long-running work.
Search the web
AI Search sends a query to a search provider and stores the results. The default output variable is search_results.
Configure the following fields:
- Search for: the query. You can include flow variables, such as
{{topic}}. - using: the search provider. The list shows the search-capable models that you enabled in Managing AI models. If Exa is available for your account, Exa Search API also appears. If the list is empty, the step shows No search models configured.
- returning: the number of results. The default is 10.
- with sources: ask the provider to include citations.
The Advanced settings add a Date Range, domain filters (Only search these domains and Exclude these domains), and Model Parameters such as temperature, max tokens, user country, and user region.
The output variable holds an object with query, results, citations, and metadata. What results contains depends on the provider:
- Exa Search API returns one result per web page, with
title,url,content, and other fields. For Exa options and output fields, see Exa (web search). - A model returns one result whose
contentis the model’s full written answer. The step fillscitationswith the URLs that appear in that answer.
A later Prompt step can read the results with {{search_results.results}}.
In a flow definition, an AI Search step has "type": "search". Set provider to exa, or to a model in the form PROVIDER:MODEL_ID, the same value that the Flow editor saves when you select a model.
Collect every page from an API
Paginate API requests one page of a JSON API at a time, extracts the items from each page, and stores all of them as one array. The default output variable is fetched_entities.
Configure the following fields:
- Fetch paginated data from: the endpoint URL. The same URL rules as Fetch URL apply: the URL must use HTTPS and point to a public host.
- using:
GETorPOST. ForPOST, enter a Request body. Runtype sends the same body for every page. - Headers: add key-value pairs, such as
Authorization: Bearer {{secret:API_KEY}}. - Pagination: the pagination type, with the page size and the maximum number of pages to request.
- extract entities from: a JSONPath to the array of items in each response, such as
$.data[*]. Use$[*]when the response body is the array.
The JSONPath supports dot-separated keys, [*] for every item in an array, and a numeric index such as [0]. It doesn’t support filter expressions.
Pagination types
The following table lists what Runtype sends for each pagination type and when it stops requesting pages:
You can rename each query parameter in the step. For Page Number, you can also change the start page. totalPath and totalPagesPath are JSONPaths that you set in the flow definition, inside paginationConfig.
For Cursor-based pagination, always set cursor path in response. Without it, Runtype never sends a cursor, so it requests the first page again until it reaches the maximum number of pages.
Limits and retries
A step that you add in the Flow editor requests up to 10 pages. A step in a flow definition with no maxPages requests up to 100. Each request times out after 30 seconds.
The following flow-definition fields control the rest of the step’s behavior:
maxEntities: stop after collecting this many items.requestDelayMs: wait this many milliseconds between pages.maxRetries: retry a failed request this many times. The default is 3. Runtype retries only a network error, a timeout, or a408,429, or5xxresponse. Other4xxresponses fail the step at once. Between retries, Runtype waits for theRetry-Afterheader when the response has one, or else 1, 2, 4 seconds and so on. Either wait is at most 30 seconds, except for a429(seeretryOnRateLimit).retryOnRateLimit: when the API returns429, wait for the time in itsRetry-Afterheader (a number of seconds or an HTTP date, at most 10 minutes; 5 seconds if the header is missing), then retry. The default istrue.retryPost: whentrue, aPOSTstep retries failed requests like aGETstep does: network errors, timeouts, and408,429, and5xxresponses. The default isfalse, because the API may already have acted on the failed request, so aPOSTstep fails on the first error.includeMetadata: whentrue, also writeOUTPUT_metadatawithtotalEntities,pagesProcessed, andpaginationType, whereOUTPUTis the output variable name.
Define a paginate-api step in code
This step collects every order from a cursor-paginated API, 50 items per page:
Replace ORDERS_API_KEY with the name of your managed secret. The step writes the orders to orders and the counts to orders_metadata. For how to create and update flows from code, see Manage flows as code.
Handle errors
A step that you add in the Flow editor starts with Stop on error. To keep the Flow running when a step fails, open the step’s error handling control and choose Continue on error. The step then writes its default value to the output variable, or one of the following values if no default is set:
- Crawl Website:
null. - AI Search:
{ "error": "...", "results": [] }. - Paginate API: an empty array.
In a flow definition with no errorHandling field, Crawl Website and AI Search continue on error, and Paginate API stops the Flow. For more information, see When a step fails.
Troubleshoot these steps
These errors are the most common:
Cloudflare crawl timed out after: the crawl didn’t finish withincompletionTimeoutMs. Lower crawl up to, or raisecompletionTimeoutMs.Cloudflare crawl ended with status: Cloudflare stopped the crawl, for example because of a limit on your Cloudflare account. Check the status in the message.Exa API key required but not provided: Exa isn’t available for your account. Add an Exa API key in Settings > Integrations.API key required for: the search model’s provider has no API key. The message says Settings > AI Models, but the section is Settings > Models. Add the key there.HTTPfollowed by a status code from Paginate API: the API rejected a page request after every retry. The message includes the API’s error text.- An empty array from Paginate API: extract entities from doesn’t match the response. Run a Fetch URL step against the same URL and check where the items are.
Next steps
Continue with these guides:
- Using fetch-url and api-call steps: fetch a single page or call a JSON API once.
- Using transform-data steps: filter or reshape the collected results.
- Firecrawl (web scraping): scrape pages that block direct requests.
- Flow step types overview: compare every step type.