Module 11 · ai · intermediate
Solutions 11 · AI Job Scout
Exercise 1
Replace the No Operation node with:
IF "Any Fits?" ({{ $json.count }} Number > 0) ─true→ Telegram (Send Message)
Telegram node: credential with your bot token, Chat ID = your ID, Text = 🎯 {{ $json.count }} new job fits\n\n{{ $json.message }}. Options → Disable Web Page Preview on, to keep the message compact. Telegram messages max out at 4096 characters; keep limit ≤ 10 or truncate with .slice(0, 4000).
Exercise 2
Insert Remove Duplicates between Dry Run? (false output) and Score Job:
- Operation: Remove Items Processed in Previous Executions
- Keep Items Where: Value Is New
- Value to Dedupe On:
{{ $json.url }}
Only put it on the scoring path; dry runs should always show everything. Manual test executions keep their own history, separate from production runs, so test the dedupe with production calls. To reset, use the same node with operation Clear Deduplication History.
Exercise 3
- HTTP Request
Fetch Remotivefrom Settings: GEThttps://remotive.com/api/remote-jobs?category=software-dev&limit=50. - Code
Normalize Remotive:
const strip = (h) => String(h ?? '').replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
return $input.first().json.jobs.map(j => ({ json: {
source: 'remotive', title: j.title, company: j.company_name, url: j.url,
tags: (j.tags ?? []).map(t => t.toLowerCase()), location: j.candidate_required_location ?? '',
salary: j.salary ?? '', posted_at: j.publication_date, description: strip(j.description).slice(0, 1500),
}}));
- All Jobs → Number of Inputs: 3, and connect Normalize Remotive to input 3.
Check each board's API terms before using it, especially commercially: some ask for attribution or limit how often you can poll.