SS.com Scraper - Latvia Classifieds & Marketplace
Pricing
from $1.20 / 1,000 result scrapeds
SS.com Scraper - Latvia Classifieds & Marketplace
Scrape classified listings from SS.com (SS.lv) - Latvia's largest marketplace. Extract cars, real estate, electronics, jobs, and more. Search by category, keyword, and location. No login or cookies required.
Pricing
from $1.20 / 1,000 result scrapeds
Rating
0.0
(0)
Developer
Studio Amba
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
0.72 hours
Issues response
22 days ago
Last modified
Categories
Share
SS.com Scraper
Scrape classified listings from SS.com (also known as SS.lv) -- Latvia's largest and most popular classifieds platform. Extract cars, real estate, electronics, jobs, and more across 12 categories. No login or cookies required.
Why use this actor?
SS.com is the dominant classifieds marketplace in Latvia with hundreds of thousands of active listings. It covers every major category from vehicles and real estate to jobs, electronics, and agriculture. This actor navigates the site using a headless browser, handles pagination, and extracts structured data from both listing pages and individual detail pages.
Use cases:
- Car market analysis -- monitor used car prices across all brands in Latvia's largest vehicle marketplace
- Real estate monitoring -- track apartment and house listings in Riga, Jurmala, and across Latvia
- Price intelligence -- compare prices for electronics, furniture, and household goods in the Baltic market
- Job market research -- extract vacancy listings and salary data from Latvia's top jobs board
- Lead generation -- identify active sellers, dealers, and businesses advertising on SS.com
- Market research -- analyze listing volumes, pricing trends, and supply across the Latvian market
- Cross-border sourcing -- find deals on vehicles, electronics, and goods in Latvia for Baltic region buyers
No cookies, no login, no session management -- configure your category and get back structured JSON.
Input
| Field | Type | Required | Description |
|---|---|---|---|
searchQuery | String | No | Search term (e.g. "BMW", "iPhone", "dzivoklis"), run through SS.com's own search inside the chosen category. Results include sale and wanted ads; adType says which. |
category | String | No | Main category: transport, real-estate, electronics, work, construction, clothes-footwear, home-stuff, production-work, for-children, animals, agriculture, entertainment |
subcategory | String | No | Subcategory path (e.g. "cars", "flats/riga", "phones/apple-iphone") |
transactionType | String | No | Filter: "sell" (default), "buy", "hand_over", "all" |
startUrls | Array | No | Direct SS.com URLs to scrape (overrides category settings) |
maxResults | Integer | No | Maximum listings to return (default: 100, max: 10,000) |
scrapeDetails | Boolean | No | Visit detail pages for full data (default: true) |
proxyConfiguration | Object | No | Proxy settings for reliable access |
Output
Each result contains:
| Field | Type | Example |
|---|---|---|
listingTitle | String | "BMW 530d 258zs. , automātiskā ātrumkārba" |
price | Number | 6990 |
currency | String | "EUR" |
location | String | "Riga" |
category | String | "transport" |
attributes | Object | {"Year of issue": "2012", "Engine": "3.0 diesel", "Run, km": "335 000"} |
sellerType | String | "private" or "company" |
imageUrl | String | Image URL |
url | String | Full listing URL |
listingDescription | String | Full description text from the detail page |
postedDate | String | "09.06.2026" |
scrapedAt | String | ISO 8601 timestamp |
Example output
{"listingTitle": "BMW 530d 258zs., automātiskā ātrumkārba","price": 6990,"currency": "EUR","location": "Tukums and reg.","category": "transport","attributes": {"Year of issue": "2012 june","Engine": "3.0 diesel","Gearbox": "Automatic","Run, km": "335 000","Color": "Grey metalic","Body type": "Sedan","Checkup": "07.2027"},"sellerType": "company","imageUrl": "https://i.ss.com/gallery/8/1508/376885/75376881.800.jpg","url": "https://www.ss.com/msg/en/transport/cars/bmw/530/cdofkd.html","listingDescription": "Tikko no Vācijas, pilna servisa vēsture...","postedDate": "09.06.2026","scrapedAt": "2026-06-09T12:00:00.000Z"}
Vehicle fields (cars and other transport)
For vehicle ads the detail page gives structured fields next to the raw attributes:
| Field | Example | Notes |
|---|---|---|
listingId | "58116873" | SS.com's own ad id |
listingTitle | "Ford Ranger, 2022, 2.0 diesel" | Built from make/model, year and engine. SS.com ads have no title of their own. |
issueDate / yearOfIssue / monthOfIssue | "04/2022" / 2022 / 4 | From "Year of issue: 2022 april". yearOfIssueRaw keeps the original. |
firstRegistrationDate | "18.06.2020" | Only when the seller writes it in the description, with firstRegistrationEvidence |
mileageKm, color, engine, gearbox, bodyType, technicalInspectionUntil | 74200, "Grey" | |
boughtNewInLatvia | true | From SS.com's "New car was bought in Latvia" note; null when the note is absent |
equipment | ["Climate control", "Seats: With heating"] | Only the items SS.com marks as fitted |
VAT and net price
vatIncludedistrueonly for an explicit VAT-included claim (the "*PVN included" price note, or text like "Cena ar PVN"),falseonly for an explicit VAT-excluded claim ("+ PVN", "bez PVN"), andnullwhen nothing is stated. A missing note is not read as a margin-scheme sale, and seller type is never used to guess it.vatSourceandvatEvidencehold the source text.netPriceis filled only when the seller states a net price ("Netto cena 30 000 EUR"), withnetPriceEvidence.vatRateStatedis a rate the seller wrote.vatRateCalculatedis our own calculation frompriceandnetPrice.
VIN and registration plate
SS.com shows the VIN and the plate only after a Google reCAPTCHA check, per ad. The actor does not solve CAPTCHAs, so:
vinis filled only when the seller wrote a valid 17-character VIN in the description (vinSource: "sellerDescription",vinEvidenceholds the sentence).- Otherwise
vinisnullandvinStatussays why:captchaProtected(the ad has a VIN behind the check) ornotListed. plateandplateStatuswork the same way.
Sold, removed and redirected ads
SS.com answers a removed ad's URL with HTTP 200 and a different ad from the same model. It also does not always serve the same ad at the same URL: on 29 Sep 2026 one Land Cruiser URL returned an expired Sell ad on about 1 in 10 requests from fresh IPs and a Buy ad on the rest, with no redirect. The actor checks every detail page:
listingStatus: "identityMismatch"when the page shows a different ad than thelistingIdyou passed. No data from the other ad is attached;servedListingIdsays which ad SS.com showed.listingStatus: "notForSale"when a single ad URL without alistingIdshows a Buy ad. No data from that ad is attached.listingStatus: "possiblyUnavailable"when the phone and e-mail contacts are gone. SS.com removes them when an ad is closed, but this alone does not prove a sale.servedListingIdslists every ad id SS.com returned for the URL. When the first page is not the ad the actor can accept (a Buy ad, or not thelistingIdyou passed), it requests the URL up to 8 more times through fresh proxy sessions and uses the matching ad if one comes back. Those extra requests are not charged as results.identityVerified: trueonly when SS.com's ad id was compared with a known id and matched (identityCheck: "listingId"). Ads found through a list page always get this check.identityCheck: "categoryPath"withidentityVerified: falsemeans only the category path was compared, which does not catch a replacement ad of the same model.
To verify single ad URLs by id, pass the listingId from an earlier run in userData:
{"startUrls": [{"url": "https://www.ss.com/msg/en/transport/cars/ford/ranger/cegeph.html","userData": { "listingId": "58116873" }}],"scrapeDetails": true}
Old ad URLs and the car that used to be there
An SS.com URL does not stay tied to one car. When an ad is removed, the same URL can serve a different ad, and SS.com keeps no archive of the original. The actor cannot recover or verify the original listing from the URL alone. What it can do is compare every ad served at the URL today with an earlier snapshot of the car that you already have.
Pass the snapshot in userData.expectedVehicle. Every field is optional:
{"startUrls": [{"url": "https://www.ss.com/msg/en/transport/cars/toyota/land-cruiser/dkffd.html","userData": {"expectedVehicle": {"make": "Toyota", "model": "Land Cruiser", "year": 2020, "issueDate": "03/2020","engine": "2.8 diesel", "bodyType": "Jeep", "gearbox": "Automatic", "color": "Blue","mileageKm": 146000, "price": 38000, "sellerName": null, "sellerType": "company","location": "Riga", "adType": "Sell", "listingId": null, "vin": null,"observedAt": "2024-05-10","tolerances": { "minMaterialConflicts": 2, "decisiveYearGap": 2 }}}}],"scrapeDetails": true}
engine is parsed into a volume and a fuel type ("2.8 diesel", "4.5D"). You can also pass engineVolumeL and fuel directly. observedAt is the date of your snapshot and sets how much mileage growth is plausible.
How each field is compared with a served ad:
| Field | Class | Rule |
|---|---|---|
vin | Decisive | Compared only when the ad shows the VIN in its text. On most ads the VIN is behind a Google reCAPTCHA, which the actor does not solve, so the check is notComparable. A different visible VIN means another car. |
make, model | Decisive | A different make or model means another car. The same make and model identify nothing. |
year | Decisive above decisiveYearGap (default 2), material otherwise | A 2010 car is never a 2020 car. A one-year difference can be a typo or a registration year, so it only counts as one material conflict. Set decisiveYearGap to null to make year material only. |
issueDate / monthOfIssue, engineVolumeL (tolerance 0.15 L), fuel, bodyType, gearbox, color | Material | These do not change on a real car. Colours are grouped, so silver and grey count as the same colour. |
mileageKm | Material when it goes down by more than mileageDecreaseKm (1,000) or grows faster than maxKmPerYear (60,000) since observedAt (without observedAt: more than maxMileageGrowthKmWithoutDate, 100,000 km). A signal otherwise. | Ordinary use of the car is not a conflict. |
price, sellerName, sellerType, location, listingId, adType | Signal | A car can be repriced, sold on to a dealer, moved or relisted under a new id. These are reported in identitySignals and never decide the result. |
A field that is missing on either side, or hidden behind a CAPTCHA, is notComparable. It is never counted as a match.
The result is in vehicleIdentity:
mismatch: one decisive conflict, or at leastminMaterialConflicts(default 2) material conflicts. The row getslistingStatus: "identityMismatch"and carries no price, VAT, VIN, mileage or availability from the served car:contactsPresentisnull, and whether the served ad showed contacts is inservedContactsPresent.vinMatch: the VIN shown on the ad equals yours. The only verified match.consistent: at least one material field agrees and nothing conflicts. Consistent, but not verified.inconclusive: one material conflict, below the threshold. Check the listed conflict yourself.notComparable: nothing beyond make and model could be compared, or the served ad is a Buy ad.notChecked: noexpectedVehiclewas given.
Identity and sale outcome are kept apart. expectedVehicleOutcome is servedAtThisUrl (VIN match), possiblyServedAtThisUrl (consistent or inconclusive), noLongerAtThisUrl (every sale ad served conflicts) or unknown. A replacement only proves your car is not the one served at the URL now. It does not prove your car was sold, so saleOutcome stays unknown.
SS.com does not always serve the same ad at the same URL. With expectedVehicle and no userData.listingId, the actor requests the URL 8 more times through fresh proxy sessions and compares each distinct ad separately, Buy ads included. servedCandidates lists every ad seen, with how often it was served, when it was first seen, its own values, where each value came from on the page, and its own comparison. The served values stay in servedCandidates and never replace the values of your snapshot, which is echoed back unchanged in expectedVehicle. vehicleIdentityRule repeats the rule and tolerances used for the row.
userData.listingId pins the ad itself: a different ad id at the URL is identityMismatch. expectedVehicle.listingId is only a signal, because the same car can come back under a new ad.
Without a listingId, identityVerified stays false and statusReason says the row describes the ad SS.com serves at the URL now. possiblyUnavailable (no contacts) is about that served ad only. It says nothing about what happened to an earlier ad at the same URL.
At the dkffd URL above SS.com mostly serves a Buy ad (38072784). When every request returns that Buy ad, the row is listingStatus: "notForSale" with vehicleIdentity: "notComparable", and it carries no data from the served ad.
Tips for best results
Browse by category (default): Set category to "transport" and subcategory to "cars" to get all car listings. Works well for broad market scans.
Use start URLs for specific pages: If you know the exact SS.com page you want (e.g. BMW listings in Riga), paste the URL into startUrls for precise targeting.
Disable detail scraping for speed: Set scrapeDetails to false to only extract data from list pages. Much faster but returns less data per listing.
Transaction types matter: SS.com separates "sell", "buy", and "hand_over" (rent) listings. Default is "sell" which shows items for sale.
Categories available
| Category | Description | Example subcategories |
|---|---|---|
transport | Cars, trucks, motorcycles, bicycles | cars, cargo, motorcycles, bicycles |
real-estate | Apartments, houses, land, offices | flats, houses, land, offices |
electronics | Phones, computers, audio, TV | phones, computers, audio-video |
work | Jobs, vacancies, courses, services | vacancies, job-search, courses |
construction | Building materials, tools, plumbing | building-materials, tools |
clothes-footwear | Men's, women's, children's clothing | womens-clothes, mens-clothes |
home-stuff | Furniture, health, antiques, gifts | furniture, health-beauty |
for-children | Toys, baby items, school supplies | toys, clothing, carriages |
animals | Dogs, cats, birds, exotic animals | dogs, cats, fish, birds |
agriculture | Machinery, livestock, seeds, gardening | machinery, animal-husbandry |
entertainment | Sports, music, books, tourism | sports, music, books |
Cost estimate
It costs $0.02 per run plus $0.002 per result — about $0.22 per 100 results — regardless of whether detail page scraping is on.
Limitations
- SS.com content is primarily in Latvian. The English version (
/en/) has translated navigation but listing content remains in Latvian. - Some attribute names may vary between categories (cars have "Engine", real estate has "Rooms").
- The
attributesfield is a flexible key-value object that adapts to whatever data the listing contains. - Data is scraped from the public website and structure may change without notice.
- Respect the website's terms of service and use responsibly.
How to scrape SS.com data
- Go to this actor's page on the Apify Store.
- Click Try for free to open it in Apify Console.
- Choose a category (transport, real-estate, electronics, etc.) and optionally enter a search query.
- Set the maximum number of results and adjust proxy settings if needed.
- Click Start and wait for the run to finish.
- Download your data in JSON, CSV, Excel, or connect it to your workflow via API.
You can also schedule regular runs, set up webhooks for real-time notifications, or integrate the results directly into your application using the Apify API.