Dev.to WebDev πŸ›  Dev πŸ‘ 0 πŸ“– 7 min read

How to Pull Structured Public Data into n8n Without Community Nodes (2 Free Templates)

When automating workflows in n8n, bringing in public web data is often where setups become fragile. Custom Puppeteer or Playwright scripts break on site updates, headless browsers consume heavy system memory on self-host

When automating workflows in n8n, bringing in public web data is often where setups become fragile. Custom Puppeteer or Playwright scripts break on site updates, headless browsers consume heavy system memory on self-hosted instances, and custom community nodes can create dependency issues or fail security reviews in production.

A cleaner architectural pattern is to decouple data collection from workflow orchestration: let specialized, serverless cloud extractors handle the fetching, parsing, and schema normalization, while n8n handles what it does best: conditional logic, deduplication, and routing data into Google Sheets, Slack, databases, or AI vector pipelines.

In this tutorial, we will look at how to connect n8n directly to public Apify Actors using only native core n8n nodes (Schedule Trigger, Edit Fields / Set, HTTP Request, Code, Google Sheets, and Slack). Zero custom community nodes required. Everything runs seamlessly on both self-hosted n8n and n8n Cloud.

We have open-sourced two production-ready workflow templates on GitHub that you can import with a single click:

  1. Podcast Transcripts to Google Sheets: Automatically aggregates verified transcripts attached to podcast RSS feeds (Podcasting 2.0 <podcast:transcript> tag) for RAG pipelines and content researchβ€”without paying for audio speech-to-text models.
  2. Lever Salary Watch to Google Sheets & Slack: Monitors public Lever job boards, extracts listings publishing numeric salary ranges, updates a deduplicated register in Google Sheets, and posts daily digests to Slack.

Full Transparency & Disclosure: I am the author of these free, open-source n8n templates (GitHub Repository) and the maintainer of the two Apify Actors they invoke on the Apify Store. Every run's first 25 saved items are 100% free with $0 in Actor run charges. The default template configurations stay within this free tier. Beyond 25 items per run, usage is pay-per-result ($2.00 per 1,000 items; the Actor's Pricing tab on Apify is the authoritative source). Both workflows include hard cost caps to guarantee no unexpected charges occur.

Architecture: Why Call Apify via Core HTTP Request Nodes?

Many developers assume integrating a scraping platform into n8n requires installing a community node package. While community nodes exist, relying on them introduces several tradeoffs:

  • Maintenance Drift: Community packages can lag behind n8n core releases or platform API changes.
  • Cloud Compatibility: Certain managed or enterprise n8n environments restrict arbitrary npm package installations.
  • Opacity: Pre-packaged nodes often hide underlying request parameters, timeouts, and error payloads.

By using n8n's native HTTP Request node calling the synchronous Apify API endpoint, your workflow remains completely lightweight and portable:

https://api.apify.com/v2/acts/{actorId}/run-sync-get-dataset-items

Why the Synchronous Run Endpoint?

Typically, running an asynchronous cloud task requires a webhook receiver or polling loop. However, for batch extractions that complete within standard timeout windows (under 60-120 seconds), Apify's run-sync-get-dataset-items API runs the Actor, waits for completion, and returns the final JSON dataset array directly in the HTTP response body.

Furthermore, by appending ?maxTotalChargeUsd={{ $json.maxCostPerRunUsd }}, Apify's execution engine enforces a hard spending ceiling at the API gateway level. Even if you accidentally configure a scrape over thousands of pages, the run automatically stops when reaching your specified limit (defaulting to $0.10).

Workflow 1: Podcast Transcripts to Google Sheets (For RAG & Content Research)

The Problem

Feeding podcast knowledge into LLMs or RAG systems usually requires downloading audio files and running them through Whisper or another speech-to-text API. At typical API pricing ($0.36 to $1.50+ per hour of audio), transcribing daily podcasts across several shows quickly becomes expensive and computationally heavy.

However, a large and growing number of podcast publishers (hosted on Buzzsprout, Omny Studio, Podbean, etc.) already attach human-verified or pre-generated transcripts directly to their RSS feeds using the standardized Podcasting 2.0 <podcast:transcript> tag (in VTT, SRT, JSON, HTML, or plain text formats).

How the Workflow Operates

[Schedule Trigger (Daily 07:00)]
       β”‚
       β–Ό
[Podcast Settings (Edit Fields)]
       β”‚
       β–Ό
[Validate Settings (Code)]
       β”‚
       β–Ό
[Fetch Transcripts (HTTP Request -> Apify)]
       β”‚
       β–Ό
[Read Saved GUIDs (Google Sheets)]
       β”‚
       β–Ό
[Filter New Episodes & Format (Code)]
       β”‚
       β–Ό
[Append New Transcripts (Google Sheets)]
  1. Schedule Trigger: Fires daily at 07:00 AM (or manual execution on demand).
  2. Podcast Settings: Groups target RSS URLs (feedUrls), backfill episode limits (maxEpisodesPerFeed, default 3), and maximum items per run (maxTranscriptsPerRun, default 25).
  3. Apify Call: Invokes ahmed.fouaad82/podcast-published-transcripts. It parses the feeds, resolves the linked transcript files, converts VTT/SRT timestamps into clean clean text paragraphs with speaker labels, and returns structured episode objects.
  4. Idempotency & Deduplication: The workflow queries the target Google Sheet's guid column. A Code node compares incoming episode GUIDs against existing entries, ensuring only brand-new episodes are processed.
  5. Cell Safety Guard: Google Sheets limits individual cell content to 50,000 characters. The Code node safely truncates episode text exceeding 45,000 characters (textTruncated = true), while always preserving the permanent transcriptUrl link to the full raw file.

Target Google Sheet Schema

Create a tab named Transcripts with the following 15-column header row:

guid, publishedAt, podcastTitle, episodeTitle, episodeNumber, durationMinutes, wordCount, speakers, language, transcriptUrl, audioUrl, feedUrl, textTruncated, text, savedAt

Workflow 2: Lever Salary Watch to Google Sheets & Slack (Compensation Benchmarking)

The Problem

Keeping tabs on competitive hiring markets and compensation trends requires monitoring dozens of company career pages. Most modern job boards are JavaScript Single Page Applications (SPAs) where raw HTML scraping fails. Furthermore, only a subset of postings include explicit numeric pay ranges.

How the Workflow Operates

[Schedule Trigger (Weekdays 08:00)]
       β”‚
       β–Ό
[Job Watch Settings (Edit Fields)]
       β”‚
       β–Ό
[Validate Board Slugs (Code)]
       β”‚
       β–Ό
[Fetch Lever Jobs (HTTP Request -> Apify)]
       β”‚
       β–Ό
[Read Known Job IDs (Google Sheets)]
       β”‚
       β–Ό
[Filter New Postings & Format (Code)]
       β”‚
       β–Ό
[Append Postings (Google Sheets)]
       β”‚
       β–Ό
[Send Digest (Slack)]
  1. Schedule Trigger: Executes Monday through Friday at 08:00 AM.
  2. Job Watch Settings: Configures target company board slugs (e.g. leverdemo, or direct URLs https://jobs.lever.co/company), minimum salary threshold (minSalary), and remote filters (remoteOnly).
  3. Apify Call: Invokes ahmed.fouaad82/lever-salary-jobs. The Actor interfaces with Lever's public career APIs, extracts structured compensation objects (currency, minimum, maximum, interval), and returns only qualifying postings.
  4. Deduplication: Reads the existing jobId column from Google Sheets. The first run populates the sheet; subsequent runs filter strictly for newly discovered postings.
  5. Slack Notification: If new jobs are found, it sorts them by maximum compensation and delivers a formatted summary block to #jobs (up to 15 highlighted roles with direct application links).

Target Google Sheet Schema

Create a tab named Salary watch with the following header row:

jobId, board, title, team, department, location, workplaceType, commitment, salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryRange, postedAt, jobUrl, firstSeenAt

Step-by-Step Setup Guide

Setting up either template takes approximately 5 minutes. Here is the complete checklist:

1. Configure Your Apify API Token

  1. Create a free account at apify.com if you do not already have one.
  2. Go to Console -> Settings -> API & Integrations and copy your personal API token.
  3. In n8n, navigate to Credentials -> New Credential.
  4. Select Header Auth and configure:
    • Name: Authorization
    • Value: Bearer YOUR_APIFY_API_TOKEN
  5. Save it as Apify Header Auth.

2. Connect Google Sheets & Slack

  • In n8n, connect your standard Google Sheets OAuth2 credential.
  • For the Lever template, connect your Slack App / Bot Token credential with permissions to post to your target channel (e.g., #jobs).

3. Import the Workflow into n8n

  1. Visit the open-source repository: github.com/AHMEDFOUAAD/n8n-apify-data-templates.
  2. Open either folder:
    • podcast-transcripts-to-google-sheets/workflow.json
    • lever-salary-watch-sheets-slack/workflow.json
  3. Click Raw, copy the JSON text (or download the file).
  4. In your n8n canvas, click the three dots in the top right -> Import from File (or simply paste the JSON directly onto the canvas with Ctrl+V / Cmd+V).

4. Set Your Parameters and Test

  1. Open the yellow Settings node (e.g. Podcast settings or Job watch settings).
  2. Paste your Google Sheet's Spreadsheet ID (the long hash found in the Google Sheets URL between /d/ and /edit).
  3. Select your Apify Header Auth credential in the HTTP Request node.
  4. Click Test Step on each node or click Test workflow at the bottom of the canvas.
  5. Verify that your Google Sheet populates with clean rows.
  6. Toggle the workflow to Active to let the schedule run automatically.

Cost Management & Budget Protection

When automating scraping, safeguarding against accidental runaway costs is critical. These templates implement a two-layer defense:

  1. Free Tier Slice: Both underlying Apify Actors offer the first 25 saved items on every run completely free. If your daily schedule extracts 10-20 items per day, your total Apify Actor cost remains $0.00.
  2. Hard Cost Cap Enforcement: In the HTTP Request node, query parameter maxTotalChargeUsd is dynamically bound to {{ $json.maxCostPerRunUsd }} (defaulting to $0.10). If a run attempts to backfill hundreds of episodes or thousands of postings beyond your budget, Apify terminates the job automatically before the charge can exceed 10 cents.

Summary & Resources

By combining n8n's visual orchestration engine with Apify's serverless scraping actors through standard HTTP requests, you get the reliability of a managed scraping platform without the operational overhead of maintaining custom headless browsers or third-party community nodes.

All resources are free and open source under the MIT license:

If you build on top of these templatesβ€”such as connecting the transcript output directly to a LangChain / Pinecone vector node for interactive Q&Aβ€”feel free to share your fork or open an issue on the GitHub repository!

πŸ“° Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes β€” full credit and traffic to the original publisher.