You waste 30 minutes every day checking cv.lv, ss.com, cvmarket.lv, NVA and other job sites manually. Stop. I built a Telegram bot — vakances_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
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
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.
Here's what the bot does, in one breath:
- Scrapes 6 job sites on a schedule — cv.lv, ss.com, cvmarket.lv, liepajniekiem.lv, cvvp.nva.gov.lv (the state NVA portal) and prakse.lv (internships).
- Reads your CV — PDF or DOCX. Extracts text, tags it with a profession category and skill keywords.
- Matches every new vacancy to your CV — a transparent 0–100 score based on keyword overlap and category match. You see the reason, not a mysterious percentage.
- Tracks your job hunt — favourites, 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 recruiter — city, 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).
| 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.
| 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".
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 search — if 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:
| 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:
| 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 25in 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.
| # | 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:
| 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 matter —
Riga,Rīga,LiepajaandLiepājaare 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.
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:
| 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.
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.
| 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:
[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 you — The 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 area — Job 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 HTML — When 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-reading —
A 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 disappear — Companies 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.
| 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.