How to find job listings and analyze them with AI A new tutorial demonstrates how to build a pipeline that extracts job listings from LinkedIn, Indeed, and Glassdoor using Apify scrapers, then analyzes them with OpenAI to uncover competitor intelligence signals such as hiring trends and technology shifts. The system, orchestrated by n8n and stored in Supabase, enables users to query the data via Claude through MCP connectors, providing real-time business insights from job postings. Job boards offer a rare window into a company's internal strategy. A competitor posting 10 new data engineer roles in a single quarter exposes which cloud platforms they are standardizing on, the software vendors they are evaluating, and the technical bets they are placing well before they issue a public announcement. The challenge is getting your hands on that data in real time and at scale. Platforms like LinkedIn Jobs, Indeed, and Glassdoor offer only limited API access to their data, which is often insufficient. In this tutorial, you’ll build a pipeline that extracts job listings at scale with Apify and uses OpenAI to distill them into clear intelligence signals. n8n orchestrates the entire process, storing the cleaned data in Supabase while enabling you to chat with that data via Claude through Model Context Protocol MCP connectors https://apify.com/store/collections/mcp-connectors . What job postings reveal about your competitors For sales teams, open roles can act as buying signals. If a company suddenly starts hiring for Snowflake and dbt, they are actively building a modern data platform and will soon need the tools to support it. Competitive intelligence analysts can treat these listings as an early-warning system. A sudden wave of requests for Rust or Kubernetes exposes internal infrastructure shifts that a competitor’s public PR announcement simply won’t reveal. A team might take a broader, strategy-focused view by tracking these roles to see exactly where their competitors are deploying capital, perhaps to spot regional expansions or new initiatives. Even investors rely on hiring velocity as a proxy for growth. But a single job posting alone is not a sufficient indicator of these signals. The real signal appears across volume and historical trends, which is exactly why this system is built to continuously scrape, store, and filter records rather than running a single one-off scrape. By now, you can tell this guide treats job listings as business signals. If you’re looking to just source candidates or map a hiring market, this Talent Market Intelligence Guide https://blog.apify.com/talent-market-intelligence/ provides the exact blueprint for doing so. Do Indeed, LinkedIn, and Glassdoor have job board APIs? LinkedIn doesn’t have a public jobs search API. The LinkedIn jobs API that does exist is a partner program built for applicant tracking systems to publish listings on LinkedIn, not for anyone to search or pull listings from it. There’s no open, self-serve endpoint for retrieving job posting data. Indeed used to have one. The old Publisher Jobs API supported job search, but that’s been deprecated. The APIs Indeed still offers, like Sponsored Jobs and Job Sync APIs , are built for the hiring and advertising side of the platform, not for searching listings; only paying advertisers can access them. Glassdoor closed its public API years ago. Access is now limited to enterprise partners. There’s no public signup or free tier. Your best alternative for accessing these platforms’ data is to use scrapers. And Apify runs the largest marketplace for scrapers called Actors https://apify.com/store that can extract job listings at scale and return them as clean, structured job-posting data ready for analysis. This build uses three: an Indeed job scraper https://apify.com/misceres/indeed-scraper , a LinkedIn jobs scraper https://apify.com/api/linkedin-jobs-api , and a Glassdoor jobs scraper https://apify.com/crawlerbros/glassdoor-jobs-scraper/ that supports company-level searches. You can browse them all in Apify Console https://console.apify.com/ . Summary of the build This workflow is scheduled to run weekly. It scrapes target companies, filters postings by meaning, classifies them using AI, stores the records, and emails a briefing to its target audience. Supabase anchors this workflow by serving as both a relational database for structured queries and a vector store for semantic filtering. Outside this automated loop, your Claude assistant uses MCP connectors to query the stored data in Supabase or to trigger on-demand scrapes via Apify. Prerequisites You’ll need these accounts to proceed with the build. The first four have free tiers that don’t require a credit card to start. - An Apify account https://console.apify.com/sign-up . - An n8n cloud account https://app.n8n.cloud/register n8n also offers a free self-hosting option . - A Supabase account https://supabase.com/ . - A Stackby account https://help.stackby.com/en/articles/13-signing-up-and-login . - An OpenAI account https://platform.openai.com/signup/ with an API key used for both the embeddings and the analysis . Claude Desktop https://claude.ai/ Pro or Max plans . Phase 1: Accounts setup A few setup tasks before you open n8n. Step 1: Grab your Apify API token - Sign up at apify.com https://apify.com/ if you don’t have an account. - Open Apify Console https://console.apify.com/ . - In the left sidebar, click Settings , then open the API & Integrations tab. - Under "Personal API tokens," copy your default token, or click Add new token to create one and name it. - Paste it somewhere safe for a moment. This token lets n8n run the scrapers on your behalf. Keep it private, and revoke and regenerate it from this same screen if it ever leaks. Get web data https://console.apify.com/sign-up Step 2: Get your OpenAI API key - Go to platform.openai.com https://platform.openai.com/ and sign in or create an account. - Open the API keys section, click Create new secret key , name it, and copy the key the moment it appears. - Paste it somewhere safe. - Open Billing under Settings , add a payment method, and buy a small amount of credit; $5 is plenty for testing. This key enables you to generate embeddings and run the model that converts each posting into structured signals. Usage is pay-as-you-go and separate from any ChatGPT subscription, but costs stay low because you only embed and analyze posts you haven’t seen before. Step 3: Set up your Supabase schema - Go to supabase.com https://supabase.com/ and sign up, using GitHub or your email. - Create an Organization, give it a name, and keep it on the Free plan. - Inside your organization, click New project . - Give the project a name, click Generate a password for the database password, and copy it somewhere safe. - Open the SQL Editor and run the script below. It enables vector support, creates your taxonomy predefined categories and signal tables, builds the similarity index, and creates a rollups view. -- Enable vector support create extension if not exists vector; -- Your competitive rules live here as editable config, not in code create table signal taxonomy id bigserial primary key, trigger text not null, signal text not null, relevant to text, suggested action text ; -- One row per unique posting, with its embedding create table job signals id bigserial primary key, company text, job title text, location text, seniority text, department text, technologies text, signal type text, signal summary text, posted date date, source text, url text unique, embedding vector 1536 , first seen timestamptz default now , last seen timestamptz default now ; -- Fast nearest-neighbor lookups for deduplication create index on job signals using ivfflat embedding vector cosine ops with lists = 100 ; -- Company-level rollups, computed whenever you read them create view company rollups as select company, count as open roles, count filter where first seen = now - interval '30 days' as roles last 30d, count distinct department as departments, array agg distinct department as department mix, max last seen as last activity from job signals group by company; - Then input a few taxonomy rows so the analysis has something to classify against, edit these ones here to match what your team actually sells or tracks: insert into signal taxonomy trigger, signal, relevant to, suggested action values 'data or analytics engineer roles naming Snowflake, dbt, or Fivetran', 'building or modernizing the data stack', 'data tooling and reverse-ETL vendors', 'AE outreach within the hiring window' , 'a cluster of ML or MLOps roles at a company with no prior ML hiring', 'standing up an AI capability', 'ML infra and vector database vendors', 'flag for CI as a possible product pivot' , 'a first Head of or founding role for a function', 'a new function or business line', 'strategy and CI teams', 'note as a strategic signal' , 'a surge in sales or GTM roles in a new geography', 'market or geographic expansion', 'CI and investor watchlists', 'note as an expansion signal' ; - Click the Connect button at the top of your project to open the connection panel. - Open the Session pooler tab and copy its host it looks like aws-0-