You waste 30 minutes every day checking cv.lv, ss.com, cvmarket.lv, NVA and other job sites manually. Stop. I built a Telegram botvakances_bot.py — that automatically checks all 6 major Latvian job sites, matches new jobs in Riga to your CV and sends only relevant ones to your chat every morning. This article breaks down the code, how it works and why a job search bot does what a personal recruiter does, but for €60 instead of 20% of your salary.

This is a walkthrough of a real, running system — no marketing. A Python bot scrapes job sites in Latvia on schedule, stores in PostgreSQL and serves a simple Telegram interface. One tap means "applied", "favourite" or "interview". Hunting jobs in Riga right now? Check /vakances. Building for your company? Code's inside.

⚡ What You Get:

  • Time saved: From 30 minutes a day to 4 minutes — automatic, every morning
  • Tool: A Telegram bot (vakances_bot.py) that scrapes 6 Latvian job sites
  • Setup: Upload your CV, 60 seconds of config, first matches in 5 minutes
  • Cost: €5–15/month hosting or €60 for a custom build for your company
  • Coverage: cv.lv, ss.com, cvmarket.lv, liepajniekiem.lv, NVA portal, prakse.lv
Work in Riga - Telegram job bot showing vakances from 6 Latvian job sites
The vakances Telegram bot: one chat that watches all of Latvia's job sites for you

Before we dive into the code, one honest disclaimer. This bot is a real project, and the numbers in this article (category counts, salaries, location breakdowns) change every single day as companies post and close vacancies. Where you see example numbers, they're there to show the shape of the Latvian job market.

What You'll Learn in This Article:

  • Why manual job hunting in Riga is a part-time job in itself
  • How vakances_bot.py scrapes 6 Latvian job sites and keeps the database clean
  • How CV-to-vacancy scoring works — transparent keyword matching, no black box
  • Every Telegram command, from /upload_cv to /vakances to /export
  • What the /vakances market overview tells you about professions in Latvia
  • The full tech stack, so you can build your own from scratch

Why Choose a Telegram Job Bot?

  • One chat covers cv.lv, ss.com, cvmarket, NVA and prakse.lv — no tab-hopping
  • Every vacancy is scored against your CV, so you see matches, not noise
  • 6 status lists replace spreadsheets: favourites, to-send, applied, interviews…
  • Location, salary and remote filters tuned to your life
  • Works on your phone, in your pocket, at 9:00 every morning

Quick Navigation:

The Problem: Hunting for Work in Riga Is a Part-Time Job

Let's be honest about what job hunting in Riga actually looks like in 2026. Monday morning you open ss.com, jump straight to your category, scroll through the latest postings — maybe one catches your eye, you apply. Then you open another portal, look through it, and send off two more CVs. Call it a day. Tuesday you open a third site, then a fourth, maybe you wander back to the ones you already visited. A couple of hours later you've sent 3–10 more CVs and scrolled past more than a hundred vacancies — and you're tired.

Wednesday arrives with three rejections and three "we'll get back to you" messages. You open the portals again — and the new vacancies look old, while the old ones look new. You're sure you're wasting time re-reading pages you've already seen. And yet, every now and then, you spot an offer you somehow missed before. It's all a mess, and it all lives in your head.

Here's the uncomfortable math. The six main portals — cv.lv, ss.com, cvmarket.lv, the state NVA portal, liepajniekiem.lv and prakse.lv — together hold more than 15,000 open vacancies right now (15,548 as of 18 August 2026). A thorough manual sweep of all of them takes 30 to 45 minutes a day. Over a month, that's 10 to 15 hours of pure filtering. Reading, comparing, remembering which companies you already wrote to, re-reading the same job that got reposted on a different site. That's not job hunting. That's clerical work.

And the real kicker: the best jobs — the ones with a salary range that actually matches your experience — are often the ones you miss, because they were posted at 14:00 on a Tuesday while you were at work, and by Wednesday evening they have 40 applicants.

The alternative I want to show you: a Telegram job bot that does the checking for you. It wakes up before you do, visits all six sites, pulls every new vacancy, scores each one against your CV, and leaves you a tidy summary in your chat. You surf through matches and skip the ones you don't like — for good, so you never see them again. Everything interesting, applied or rejected is tracked automatically among those 15,000+ vacancies. Search, filters, category-only mode, exclusion lists — it's all a few taps away instead of a few hours of tab-hopping.

What Is vakances_bot.py? Meet the Telegram Job Bot

vakances_bot.py is a Python Telegram bot — a separate process from the admin scraping bot, sharing the same PostgreSQL database. In plain language: it's the job-seeker side of a vacancy-scraping system. The scraping side (six site-specific scrapers plus a pipeline runner) fills the database with vacancies; the vakances bot turns that raw data into a personal job search assistant inside Telegram.

Telegram job bot /start welcome message with commands to find work in Riga
The /start message: upload a CV, review matches, browse /vakances, search with find

Here's what the bot does, in one breath:

  • Scrapes 6 job sites on a schedulecv.lv, ss.com, cvmarket.lv, liepajniekiem.lv, cvvp.nva.gov.lv (the state NVA portal) and prakse.lv (internships).
  • Reads your CVPDF or DOCX. Extracts text, tags it with a profession category and skill keywords.
  • Matches every new vacancy to your CVa transparent 0–100 score based on keyword overlap and category match. You see the reason, not a mysterious percentage.
  • Tracks your job huntfavourites, to-send, applied, interviews, rejected — eight lists, one tap each.
  • Shows the market/vakances gives you every active vacancy grouped by profession with counts, so you can see where the demand actually is.
  • Filters like a recruitercity, minimum salary, remote-only, excluded keywords, minimum match score.

If you're an employer or a startup, the same architecture is what I package as a custom Telegram bot development service starting at €60 — scraping, matching, notifications, whatever your workflow needs.

How It Works: From CV Upload to Daily Match List

Step 1: Upload your CV once

Send /upload_cv and attach your CV as a PDF or DOCX. The bot downloads the file, extracts the text with pdfplumber (PDF) or python-docx (Word), and saves your profile to the database. If the PDF turns out to be a scanned image with no text layer, the bot tells you exactly that and suggests a text-based export — no silent failures.

Step 2: Automatic tagging

As soon as the text is extracted, the bot tags your CV with two things: a category (your profession, e.g. "Programmēšana" or "Finanses un grāmatvedība") and a list of keywords (your skills, e.g. Python, Django, PostgreSQL). The same job runs in the background every 30 minutes for new vacancies, so every listing in the database carries a category and keywords too. Matching needs both sides tagged — and when the tags don't look right, you can edit them in two lines via /cv_list → Edit.

Step 3: Immediate matching + daily rerun

The moment your CV is tagged, the bot scores it against every vacancy you haven't seen yet, and tells you how many matches it found. Then, every morning at 09:00 Riga time, the scheduler re-runs matching against everything new, and at 09:30 sends a digest to everyone with notifications on:

📬 Daily digest message:

"Daily digest: You have 7 new matching vacancies! Use /review to go through them."

Step 4: The pipeline keeps the database honest

Scraping isn't just "download a page". Each scrape run compares what the site currently lists against what's in the database. Vacancies that disappeared from the site get marked as deleted; vacancies that come back get restored. Every run logs its per-site counts into a scrape_results table, which is what /status displays — so you can see at a glance whether the bot is keeping up with each of the six sites.

The 6 Job Sites the Bot Scrapes — and Why Each One Matters

Latvia's job market is spread across several portals, and each has its own character. This is the part that makes a scraper genuinely useful: you get all of them in one place, deduplicated by design (the database keys vacancies by their unique link).

Job Sites Scraped by vakances_bot.py — 15,548 active vacancies (snapshot 18 Aug 2026)
Site What It Is Active Vacancies Share
ss.com Massive classifieds platform with a large "Darbi" section 6,412 41%
cvvp.nva.gov.lv The State Employment Agency (NVA) public vacancy portal 4,442 29%
cv.lv The biggest Latvian job portal; nearly every employer posts here 2,228 14%
cvmarket.lv Smaller portal focused on specific industries 2,017 13%
liepajniekiem.lv Regional site, strongest in Kurzeme / Liepāja 274 2%
prakse.lv Internships and student placements 175 1%

A few observations from the real export. ss.com alone carries 41% of the market, and it's full of listings that never reach cv.lv — that's why scraping only the "big" portal means missing almost half of the vacancies. The state NVA portal (cvvp.nva.gov.lv) is the second-largest source at 29%: it's read through the site's own JSON API, and it's where registered and state-sector offers live. cv.lv and cvmarket.lv together add another 27%. Only about 3% comes from the regional and internship sites — but for someone in Liepāja or a student, that 3% is the whole point.

The scrapers are deliberately polite: random delays of 2–5 seconds between requests, a real browser User-Agent, and a hard cap on pages. The NVA portal and prakse.lv are scraped through their own public JSON endpoints — the same requests their websites make — which is both faster and more reliable than parsing HTML.

Full Command Reference: Your Job Search Control Room

Here's the complete command map of the vakances bot. You don't need all of them daily — most people live in /review, /vakances and find — but knowing the full set is what turns the bot from a toy into a system.

All vakances_bot.py Commands
Command What It Does
/start Welcome menu with the main flow: upload CV, review, vakances, search, recent
/upload_cv Upload a PDF/DOCX CV — it gets auto-tagged and matched immediately
/cv_list List your CVs; activate, deactivate, edit tags, download, delete
/review Pick a category, then scan matches one vacancy at a time
find <query> Search vacancies by title across all sites (e.g. find Python, find Rimi)
/recent The last 50 vacancies posted in the past 24 hours
/vakances All active vacancies grouped by profession with counts — the market overview
/status Per-site scrape status: counts per portal, totals, next matching time
/stats Your personal pipeline: favourites, to-send, applied, interviews, rejected
/saved All your saved vacancies across every list
/pending Matches you haven't reviewed yet, best score first
/wishlist, /to_send, /applied, /to_interview, /rejected, /skipped One-tap access to each status list
/location Set one or more cities: /location Rīga, Liepāja, Jelgava
/locations Top 40 locations with vacancy counts — see where the jobs actually are
/settings Sort order, notifications, min match score, seen toggle, remote-only, salary
/export Download your tracked vacancies as an Excel file, grouped by CV
/xls Download the whole vacancy database + companies as Excel
/log, /logs Download today's / recent bot log files (great for debugging)
/help The full command guide, always one message away

And one hidden gem: any message that starts with show N (for example show 25) opens the vacancies of the category with that number from the /vakances list. The bot hints at it after every market overview — it's the fastest way to go from "how many jobs are there?" to "show me the actual jobs".

Vakances Latvia by profession - Telegram bot market overview with category counts
/vakances output: every active vacancy in Latvia grouped by profession, with counts

How Matching Works: Transparent Scoring, No Black Box

Let's talk about the heart of the bot — and kill a myth while we're at it. A lot of "job matching" products sell you a mysterious algorithm. This bot does the opposite: its scoring is a short, readable Python function that you can copy into a notebook and verify by hand.

The score for a vacancy is built from two parts:

  • Keyword overlap (up to 80 points)how many of the vacancy's keywords appear in your CV's keywords, measured with Jaccard-style overlap: intersection ÷ vacancy keywords.
  • Category bonus (20 points)if your CV category exactly matches the vacancy category (case-insensitive), you get the full 20.
  • Fallback title searchif keyword scoring finds nothing, the bot still catches vacancies whose title contains your keywords (e.g. "Python" in "Python Developer").

Let's walk through three real-world examples so the scoring stops being abstract:

How Match Scores Are Computed (CV: Python Developer, keywords: python, django, postgresql)
Vacancy Vacancy Keywords Overlap Category? Score
Backend Developer (Python) python, django, postgresql, git 3/4 → 75 ✅ +20 95
Full-stack JS Developer javascript, react, node.js 0/3 → 0 ❌ +0 0 (ignored)
Python Data Analyst python, sql, excel 1/3 → 33 ❌ +0 33
Django Developer (title fallback) untagged yet title contains "django" 30 (fallback)

Why build scoring this way instead of something fancier? Three reasons. It's fast — matching hundreds of vacancies takes seconds in pure Python, no external calls. It's explainable — every score has a visible reason you can read and trust. And it's controllable — you can set your own minimum threshold in /settings (30, 50, 70 or 90), so "only show me strong matches" is one tap away.

/vakances: The Latvian Job Market at a Glance (by Profession)

Now the fun one. /vakances turns the whole database into a market report: every active vacancy in Latvia, grouped by profession, sorted by demand. The bot maintains a dictionary of 41 profession categories — from Pārdošana (sales) and Ražošana (manufacturing) to Programmēšana (programming), Medicīna, Loģistika and Noliktavas (warehouse) — and every vacancy is tagged with one or more of them.

Here's what a typical output looks like — real numbers from the 18 August 2026 export of 15,548 vacancies. The SQL below the table will get you live ones any day:

Vakances in Latvia by Profession — 15,548 active vacancies (18 Aug 2026)
ID Category (Profession) Vacancies Share of Market
04 Vadība un menedžments (Management) 2,430 15.6%
01 Pārdošana (Sales) 2,168 13.9%
41 Other (uncategorised / mixed) 2,023 13.0%
05 Būvniecība (Construction) 1,723 11.1%
02 Ražošana (Manufacturing) 1,651 10.6%
03 Auto un serviss (Auto & Service) 1,258 8.1%
37 Speciālisti (Specialists) 1,003 6.5%
11 Virtuve un ēdināšana (Kitchen & Catering) 903 5.8%
07 Māksla un dizains (Art & Design) 815 5.2%
08 Noliktavas (Warehouse) 778 5.0%
22 Izglītība (Education) 718 4.6%
26 IT atbalsts un tīkli (IT Support & Networks) 689 4.4%
+ 29 more (Santehnika un remonts 490, Medmāsas un farmācija 117, Programmēšana 157, Mediji 62, Juridiskie 74, Tūrisms un valodas 31…) rest rest

Note: one vacancy can carry several category tags (e.g. "project manager in construction"), so the percentages add up to more than 100% — they show how often a profession appears across the whole database, not a strict division of the market.

What does this tell you, practically? Two things. First, where the volume is: management (2,430), sales (2,168), construction (1,723) and manufacturing (1,651) dominate the market — if you're in any of these, Latvia has plenty of openings right now. Second, where competition is lower: a niche like Programmēšana (157 tagged vacancies) or Medmāsas un farmācija (117) is thin compared to the 2,430-strong management pile — sometimes the friendliest market is the one with fewer listings, not more. And in the future, when there will be enough data in the parsed database - you could see /trends - what's growing: shows which professions are climbing, where there is demand and what professions are slowly dying.

Type show 25 in the chat to open the programming category directly — the bot turns any category ID from /vakances into a browsable list of vacancies.

/locations: Where the Jobs Are (and Why "Riga" = "Rīga")

/vakances tells you what professions the market wants; /locations tells you where they are. The bot groups every active vacancy by location and ranks the places by vacancy count — 589 distinct locations had open vacancies in the August 2026 snapshot. By default you get the top 40; /locations 100 prints the full market map.

Telegram job bot /locations command - top Latvian cities with vacancy counts
/locations: every location ranked by open vacancies, street-level mess cleaned up
Top Latvian Locations for Jobs — 15,548 vacancies (18 Aug 2026)
# Location Vacancies Share
1 Rīga 4,382 28.2%
2 Rīga, centrs 932 6.0%
3 Liepāja 498 3.2%
4 Rīga / Hibrīddarbs 481 3.1%
5 Jelgava 286 1.8%
6 Rīgas rajons, Mārupes pag. 245 1.6%
7 Rīga, Pļavnieki 224 1.4%
8 Mārupe 214 1.4%
9 Daugavpils 203 1.3%
10 Jelgava un raj., Jelgava 182 1.2%
11 Rīga, Ziepniekkalns 177 1.1%
12 Rīga, Purvciems 163 1.0%
+ 577 more locations (Rēzekne 105, Sigulda 99, Bauska 103, Ventspils 87, Olaine 83…) rest rest

The geography is brutally concentrated: add up every Rīga-form entry from the top 40 — the city itself, the centre, each district, the hybrid listings — and you're at 8,662 of the 15,548 vacancies, nearly half the entire market inside one city, before the Rīgas rajons ring (Mārupes pag. 245, Ķekavas pag. 95, Ādažu nov. 94) joins in. The second city, Liepāja, counts 498 (591 with its district), then Jelgava 286, Daugavpils 203. The practical takeaway for anyone hunting for work in Riga: filtering by city isn't a nice-to-have, it's the difference between 28.2% of the market and 100% of the noise.

Remote, hybrid and part-time: the honest numbers

Latvians like to joke that every job is hybrid these days — the data says otherwise. In the August 2026 snapshot, only 587 of 15,548 postings (3.8%) mention remote work in any form, and 581 of them come from cv.lv alone. Part-time is even rarer. Here's the full picture from the export:

Remote & Part-Time Work in Latvia — 15,548 vacancies (18 Aug 2026)
Type Latvian term(s) Vacancies Share
Hybrid Hibrīddarbs 547 3.5%
Fully remote Attālināti / Darbs no mājām 40 0.3%
Part-time Nepilna slodze / Pusslodze / Part-time 51 0.3%

Fully remote is a rare bird: just 40 postings (35 "Attālināti" plus 5 "Darbs no mājām") — that's the whole country. If remote-only is a hard requirement, your shortlist is short — better to know that in week one than after a month of scrolling. Part-time (nepilna slodze, pusslodze) clusters exactly where you'd guess: retail chains (Douglas, Jysk, New Yorker, Maxima), Lido, and Rīga's shop counters. Of the 51 part-time jobs, ss.com carries 23, cvmarket.lv 18, cv.lv just 9 — another argument for scraping beyond the "big" portals. The bot's /settings remote-only toggle matches every synonym — Hibrīddarbs, Attālināti, Darbs no mājām, remote, hybrid — so a filter actually finds all of them.

"Riga" and "Rīga" are the same place

The raw data from six scrapers is messy in a very human way. ss.com and cv.lv write addresses ("Meistaru iela 10, Rīga"), some sites add the country ("Rīga, Latvija" or "Rīga, Latvia"), and you as a user will type Riga on an English keyboard without the macron half the time. The bot's location layer handles all of it:

  • Street addresses are merged into their city"Meistaru iela 10, Rīga", "Hipokrāta iela 2, Rīga" and "Bruņinieku iela 5 k-2, Rīga" all count into Rīga, not into three phantom locations.
  • Country suffixes are dropped"Rīga, Latvija" and "Rīga, Latvia" are the same Rīga.
  • Diacritics don't matterRiga, Rīga, Liepaja and Liepāja are treated as identical everywhere — in /locations grouping and in your /location filters.

Before this normalization, the database contained 2,451 location strings that matched nothing on the canonical list. After it, 589 canonical locations cover the whole market, and only a handful of village-address oddities remain outside it. The same translate-based trick powers your filters, so setting /location Riga silently matches every Rīga-form posting — around 9,500 vacancies in the August snapshot.

Set your cities once with /location Riga, Liepaja, Jelgava — no macrons needed — and every list, digest and review in the bot respects them.

The Review Flow: 8 Buttons, 6 Lists, Zero Spreadsheets

The daily loop is /review. The bot groups your unreviewed matches by category, you pick one, and then it shows you vacancies one card at a time. Each card carries the job title, company, salary, location, the match score with its breakdown, and six action buttons:

🔘 The 6-button action grid:

  • Favourite — "keep this, I'll come back to it"
  • Skip — "not for me" (also: /skipped later)
  • 📤 To-send — "CV prepared, will send today"
  • Applied — "sent it"
  • 🎤 Interview — "they want to meet me"
  • Rejected — "they said no"

Plus a prev/next row for browsing, and auto-advance: tap a status and the next card loads instantly. One session, forty vacancies, six minutes.

Telegram job bot review card - vacancy with match score and 8 action buttons
The review card: score with reason, salary, location, and one-tap status tracking

Each status becomes a list you can reopen anytime: /wishlist, /to_send, /applied, /to_interview, /rejected, /skipped. And because every action is logged to a user_actions table, you can always answer the question every job seeker dreads: "where am I in the process?" — /stats answers it in one message.

Settings: City, Salary, Remote, Keywords — Make the Bot Yours

A job bot that ignores where you live and what you earn is a billboard, not a filter. That's why the vakances bot has a real settings system, all reachable from /settings and /location:

Vakances Bot Settings
Setting What It Does Example
📍 Preferred locations Show only vacancies in your cities (multiple supported) /location Rīga, Liepāja, Jelgava
💰 Minimum salary Hide anything below your number in EUR 1500
🏠 Remote only Only listings that mention Hibrīddarbs, Attālināti, Darbs no mājām, remote or hybrid On / Off
🎯 Min match score Threshold for matches: 30, 50, 70 or 90 70 = strong matches only
🔎 Search words Keywords you care about (used by find / search) Python, Django, Backend
🚫 Excluded words Never show these — e.g. Junior, Internship Junior, Internship
👁 Show seen Hide vacancies you already viewed to keep lists fresh Hide
📂 Default sort Newest first or best match first Best match
🔔 Notifications Daily 09:30 digest with new matches On

Notice the excluded keywords trick — it's the single most underrated feature. If you're a mid-level developer, adding Junior, Internship, Prakse to exclusions removes the most annoying category of noise from both matching and search in one move.

Telegram job bot settings - location, salary, remote, match score filters
/settings: every filter a job seeker needs, tunable in seconds

The Tech Stack (For Nerds): How vakances_bot.py Is Built

If you're a developer thinking "I want this for my company" — or just "I want to build my own" — here's exactly what's under the hood. Everything below is open source and free.

Tech Stack of the Vakances Bot
Layer Technology Why
Language Python 3 The ecosystem for scraping + Telegram is unbeatable
Telegram interface python-telegram-bot Clean async API for commands, inline keyboards, callbacks
Scheduling APScheduler (AsyncIOScheduler) Tagging every 30 min, matching 09:00, digest 09:30, Riga timezone
Database PostgreSQL + psycopg2 One shared DB for the admin bot and the vakances bot
Scraping requests + BeautifulSoup HTML parsing with polite 2–5s delays; JSON APIs for NVA and prakse.lv
CV parsing pdfplumber + python-docx Text extraction from PDF and DOCX
Exports openpyxl XLSX exports of tracked vacancies and the whole database
Timezone pytz Europe/Riga All schedules and timestamps live in Riga time

To keep the bot running 24/7 I run it as a service so it survives reboots and crashes:

/etc/systemd/system/vakances-bot.service
[Unit]
Description=Vakances Telegram Job Bot
After=network.target postgresql.service

[Service]
WorkingDirectory=/root/bot-folder
ExecStart=/root/bot-folder/venv/bin/python vakances_bot.py
Restart=always

[Install]
WantedBy=multi-user.target

Running costs are genuinely small: a €5–15/month VPS (see my nginx configuration guide for the server side) handles the whole system, and PostgreSQL is free. If you'd rather not build it yourself, this exact architecture is what I ship as a custom job scraper bot service — starting at €60.

Honest Limitations: What the Bot Won't Do

Every good tool deserves an honest limitations section. Here's what the vakances bot does not do — because you should know before you trust it with your job hunt.

  • It won't apply for youThe bot tracks applications; you send them. Most Latvian employers expect a real message anyway — blind auto-apply hurts more than it helps.
  • Scraping is a gray areaJob portals' terms of service technically forbid automated scraping. In practice, polite low-frequency scraping is tolerated because it drives traffic. Keep delays sane and never hammer a site.
  • Sites change their HTMLWhen a portal redesigns, a scraper breaks. The pipeline reports it clearly, and fixing a parser is usually 15–30 minutes of work.
  • Matching is keyword-based, not mind-readingA vacancy that describes your role with completely different words can score low. That's why the breakdown is visible, thresholds are adjustable, and search (find) exists as a safety net.
  • Vacancies disappearCompanies close listings; the bot marks them deleted and removes them from your lists. If an interview invite vanishes from your history, that's the cleanup doing its job.

Bot vs Manual Search vs Recruiters: The Honest Comparison

Is a job bot actually better than the alternatives? Let's put them side by side, with real numbers for the Latvian market.

Ways to Find Work in Riga Compared
Method Time per Day Coverage Tracking Cost
Manual site checking 30–45 min Only the sites you remember Notebook / memory Free (your time)
Site email alerts ~10 min (reading noise) One site per subscription None Free
LinkedIn / networking 20–30 min Companies that post there Manual Free / Premium
Recruiter ~5 min Only their client list They do it 10–20% of first salary
Telegram job bot 2–4 min 6 sites, deduplicated 6 automatic lists €5–15/mo hosting (or €300 to build)

The math is simple: the bot doesn't replace recruiters or networking — it replaces the boring 30 minutes. Networking stays important (the human part of hiring never goes away), but nobody ever got an interview by re-reading the same cv.lv search results five times a day.

Frequently Asked Questions About Job Search in Latvia

How long does it take to find work in Riga without manual searching?
Combine the big portals (cv.lv, ss.com, cvmarket.lv) with the state NVA portal and an automated check — a Telegram job bot does all of that in one chat. Upload your CV once, set your city and salary in /settings, and review daily matches. Speed comes from coverage + early application, which is exactly what automation gives you.
What is /vakances?
A market overview command: every active vacancy in the database grouped by profession with counts, sorted by demand. Type show N (the number from the list) to open that category's vacancies. It's the fastest way to see where jobs in Latvia actually are right now.
Can the bot apply to jobs for me?
No. It shows the vacancy with a direct link and tracks your status (to-send → applied → interview → rejected), but you send the CV. Auto-apply systems usually backfire with employers — a personal message still wins.
How accurate is the match score?
The score is keyword overlap (up to 80 points) plus a category bonus (20 points), with a title-search fallback. It's transparent — every card shows the matched keywords and category — and you control the threshold (30/50/70/90). It filters noise reliably; it never replaces reading the job description yourself.
Which job sites are covered?
Six: cv.lv, ss.com, cvmarket.lv, liepajniekiem.lv, cvvp.nva.gov.lv (the state NVA portal with 4,442 active postings) and prakse.lv for internships. New scrapers can be added — that's typically how custom versions start.
How much does a custom job bot cost?
A custom build starts at €60 (scraping + Telegram interface + matching). Hosting runs €5–15/month. The vakances bot described here is the reference implementation — tell me which sites and filters you need and I'll ship yours.
Is scraping job sites legal?
It technically violates most sites' terms of service, but polite, low-frequency scraping with request delays is widely tolerated in practice because it drives traffic back to the portals. Don't hammer servers, don't resell the data, and you're in the same gray zone as thousands of analytics tools.

Still Searching Manually?

If you're actively looking for work in Riga or anywhere in Latvia and check job sites more than twice a week, stop. 30 minutes every day switching between cv.lv, ss.com, cvmarket.lv and the NVA portal is exactly the work a computer should do.

Your morning now: open Telegram, read your digest, tap through matches, mark "applied" or "skip" — all 4 minutes. The market overview shows where real demand is. The export drops everything into Excel. Your lists track where you stand in each process.

Companies and agencies can do the same. A custom Telegram bot build starts at €60, with this article's code as your foundation.

Simple math: the Latvian job market is scattered across 6 sites. A job bot gathers it all into one chat. First to see the jobs is whoever starts today.