POST /api/v1/search returns ranked web pages, images, or news. Set type: "web" (the default) for titles, URLs, and snippets, type: "images" for images and their source pages, or type: "news" for news articles. Every accepted search creates a search run that saves the query, options, and ranked results. Set crawl: true to fetch the unique source pages within that same run. Search results and the run ID return immediately; page content arrives through the run results API.
Use /api/v1/index/search to search content already indexed in your workspace.
Search the web
query is required (1–500 characters). limit defaults to 10 and supports 1–10 results. country defaults to us, language to en; location can optionally narrow the search, for example Stockholm, Sweden. Results are ranked and may contain fewer entries than requested. Duplicate URLs and URLs without a valid HTTP(S) address are omitted.
Search images
url is the source page; imageUrl is the image itself. Dimensions are in pixels. imageWidth, imageHeight, and thumbnailUrl are null when unavailable. Image results are deduplicated by image URL, so multiple images from the same source page can appear. The response type identifies the result shape, including when results is empty.
For image searches, crawl: true crawls each unique source page once. It does not download the image files.
Search news
source is the article publisher. date preserves the reported publication date text, which may be relative (for example, "2 hours ago") rather than an ISO timestamp. source, date, and imageUrl are null when unavailable. Articles are deduplicated by URL, and crawl: true fetches their pages in the same Search run.
Crawl the results
run always contains { "id": "<run-id>", "status": "pending" } when pages are queued, or completed for search-only and empty searches. Use GET /api/v1/runs/{runId} to reopen the saved query and results in its typed search field. Use GET /api/v1/runs/{runId}/results for crawled pages and their outcomes. Each page’s url matches a search result’s source page URL, so multiple images can share one page result. See Runs and results.
In the dashboard, the Search run shows each result as a card with its title, URL, and search details. Crawl status updates automatically. Select View on a card to inspect its crawled content or error details as they become available.
The crawler fetches each returned URL without following page links. Crawling is subject to normal concurrency and processed page limits. Empty searches save results: [] and complete without crawling. Search results remain available even if crawling fails; individual page failures appear alongside their results. If crawling cannot be queued, the response still contains the saved search results and a failed run; its last_error explains the failure.
Retry a failed or cancelled run with POST /api/v1/runs/{runId}/retry. This creates a new Search run and reuses saved search results without another retrieval request. If the original search never produced results, retry performs and charges a new search. Retrying a Search run requires runs:retry and search:query.
crawlOptions accepts normal crawl options except custom headers and includeDocumentLinks. These are rejected to prevent sending credentials to discovered sites or expanding the crawl beyond the search results. useLlmsTxt defaults to false so the crawler fetches the result pages themselves. crawlOptions requires crawl: true.
SDKs
Permissions and usage
Search requiressearch:query. Enabling crawling also requires runs:write; reading the run and its results requires runs:read and results:read respectively.
Each accepted web search consumes one retrieval request before searching, including empty results and search service failures. Search service errors and timeouts return 502 with the failed run reference in details.run. Invalid input, missing configuration, and denied requests fail before creating a run. Bulkgrid does not automatically retry upstream search requests.