Skip to main content
The Web Crawler is a Python-based microservice that crawls web pages using Playwright and extracts content as Markdown. It also provides AI-driven browser automation for multi-step web interactions.

Dependencies

The Web Crawler connects to standard FlowX infrastructure services that should already be configured in your environment:
  • Kafka — async job processing for crawl requests from Integration Designer
  • Identity provider (Keycloak or Azure AD) — authentication and Kafka OAuth
  • CMS Core — content management integration
  • Document Plugin — file upload for downloaded documents
  • S3-compatible storage (MinIO or AWS S3) — storing crawl results and offloaded Kafka payloads
  • AI provider (OpenAI, Anthropic, Ollama, Azure OpenAI, or GCP) — required only for browser automation features

Capabilities

What it can do

  • Single-page crawling: Extract content from individual web pages as Markdown
  • Deep crawling: Breadth-first crawling with configurable depth, concurrency, and rate limiting
  • PDF processing: Dedicated scraping strategy for linked PDF documents
  • File downloads: Automatic detection and upload of downloadable files (.docx, .xlsx, .pdf) to the Document Plugin
  • AI browser automation: Multi-step browser interactions using Claude or GPT-4o via the browser-use library
  • Session management: Persistent browser sessions for multi-step automation workflows
  • Per-level URL caps: Configurable maximum pages per depth level during deep crawls
  • Multiple URL filters: Configure up to 20 URL filter patterns per crawler from the URL Filters modal on the Web Crawler node to restrict deep crawls to matching URLs

What it cannot do

  • Cannot crawl pages that require JavaScript-based authentication (unless using browser automation)
  • Cannot process audio or video content
  • Cannot bypass CAPTCHAs or bot protection without proxy configuration

API endpoints

All endpoints are prefixed with the URL_PREFIX value (default: /web-crawler).

Configuration

Server configuration

Set GUNICORN_TIMEOUT to at least 600 (10 minutes). Deep crawls with multiple pages can take significant time depending on target site responsiveness and configured depth.

Authentication configuration

Keycloak / OAuth2

Service account

The Web Crawler uses a service account for platform API calls (CMS, Document Plugin).

Kafka configuration

The Web Crawler uses Kafka for async job processing. Integration Designer sends crawl requests, and the Web Crawler returns results through Kafka topics.

Core Kafka settings

Consumer tuning

Increase KAFKA_MAX_POLL_INTERVAL_MS if deep crawls regularly exceed 5 minutes. The consumer will be removed from the group if processing takes longer than this interval.

OAuth authentication

When using KAFKA_SECURITY_ENABLED=1, the Web Crawler authenticates to Kafka using SASL/OAUTHBEARER via Keycloak.

Topic configuration

The Web Crawler uses the FlowX async job-processing library (flx-job-lib). On startup, the service verifies Kafka connectivity and starts a background consumer.

Kafka payload offloading

When crawl results exceed the size limit, payloads are offloaded to S3-compatible storage.

Storage configuration

The Web Crawler stores crawl results in S3-compatible storage. Configure one of the following storage backends.

Platform service URLs


AI model configuration

Required only for the browser automation feature (/interact endpoints). The Web Crawler uses LLM models to drive browser interactions.
All model types support the same providers: OPENAI, AZURE, OLLAMA, ANTHROPIC, GCP, CUSTOM_OPENAI.

Provider-specific variables


PostgreSQL configuration

The Web Crawler uses PostgreSQL for embedding storage, memory, and chat history.

Observability (optional)

FlowX Observatory

Langfuse

LLM Guard


CORS configuration


MCP server configuration


Kafka job processing

The Web Crawler processes crawl requests asynchronously via Kafka. Integration Designer sends requests to the job request topic, and the Web Crawler writes results to S3 and sends a response to the job response topic.

Request payload

Response flow

  1. Integration Designer publishes a crawl request to ai.flowx.web-crawler.job.request
  2. Web Crawler processes the request and stores the result (Markdown content) in S3
  3. Web Crawler publishes a response with the result path to ai.flowx.web-crawler.job.response
  4. Integration Designer retrieves the result from S3

Deployment and sizing

Docker

  • Base image: Python 3.13-slim-bookworm
  • Runs as non-root user (aiservices)
  • Port: 8080
  • Health check: /web-crawler/api/v1/web-crawler/info/health

Kubernetes configuration

The Web Crawler runs headless Chromium browsers for page rendering. Each concurrent crawl consumes significant memory. Monitor memory usage and increase limits if pods are OOM-killed during deep crawls.

Verify your setup

The Web Crawler pod is running: kubectl get pods -l app=web-crawler
The health endpoint returns HTTP 200: curl http://web-crawler:8080/web-crawler/api/v1/web-crawler/info/health
Kafka consumer is connected — check pod logs for Kafka consumer started message at startup
Integration Designer can reach the Web Crawler — verify FLOWX_WEBCRAWLER_BASEURL is set in Integration Designer setup

Troubleshooting

Symptoms: Pod stays in CrashLoopBackOff or never becomes ready.Solutions:
  • Verify Chromium/Playwright dependencies are available (included in Docker image)
  • Check that Kafka broker addresses are reachable
  • Ensure the Keycloak server URL is correct and accessible
  • Review pod logs for specific startup errors
Symptoms: Integration Designer sends crawl requests but no results are returned.Solutions:
  • Verify KAFKA_CONSUMER_ENABLED is set to 1
  • Check that KAFKA_JOB_REQUEST_TOPIC matches the topic Integration Designer publishes to
  • Ensure the Kafka consumer group (KAFKA_CONSUMER_GROUPID) has no conflicting consumers
  • Review pod logs for Kafka connection or authentication errors
Symptoms: Pages return no content or partial Markdown.Solutions:
  • Increase pageTimeout in the crawl request for slow-loading pages
  • Check if the target site blocks headless browsers (try configuring a proxyUrl)
  • Verify network connectivity from the pod to the target URLs
  • Review verbose logs (VERBOSE=1) for page-level errors
Symptoms: acceptDownloads is enabled but files are not appearing in the Document Plugin.Solutions:
  • Verify DOCUMENT_PLUGIN_URL is set and reachable
  • Ensure applicationId is provided in the crawl request payload
  • Check service account credentials (SERVICE_OAUTH_CLIENT_ID / SERVICE_OAUTH_CLIENT_SECRET)
  • Review pod logs for upload errors or authentication failures
Symptoms: Pods restart with OOMKilled status during multi-page crawls.Solutions:
  • Increase memory limits (try 4 Gi)
  • Reduce maxPages and maxPagesPerLevel in crawl requests
  • Reduce GUNICORN_WORKERS to limit concurrent browser instances
  • Scale horizontally with more pods instead of larger pods

Integration Designer setup

Configure Integration Designer, which orchestrates Web Crawler jobs

Integration Designer

Learn about building integration workflows

Kafka Authentication

Configure Kafka security and authentication

Document Plugin setup

Configure the Document Plugin for file storage
Last modified on July 16, 2026