How Prayk works
Prayk shows listings from Azerbaijani sites in one place, separates duplicates and compares prices. This page describes how the main parts of the system are built.
Where listings come from
Listings on the site have two sources.
- Listings that users and stores post on Prayk themselves.
- Listings that PraykBot reads from public Azerbaijani classifieds and online store sites. Such a listing is always shown with a “Listing source” block and a link to the original page.
- The bot rechecks listings regularly: a listing removed at the source is deactivated on Prayk too.
How duplicates are found
The same listing is often published on several sites or under several sellers’ names. The system compares the image and text “fingerprints” of every new listing with existing ones — from cheap checks to expensive ones.
- Same file: the image bytes match exactly.
- Similar image: resized or re-compressed (perceptual hash).
- Similar text: a slightly edited title and description (SimHash).
- Image content: a cropped image or one with added text — by the closeness of vectors extracted by a neural network.
- A listing is automatically marked a “copy” only on strong evidence; weak similarity alone is not enough. The listing published first is treated as the original, and cards show “Original” and “Copy” badges.
- A seller who updates or reposts their own listing is not treated as a copier.
Search
Search is built around the specifics of the Azerbaijani language.
- Typing “menzil” finds “mənzil” and “masin” finds “maşın”: the letters ə, ı, ş, ç, ö, ü, ğ are treated as their Latin counterparts.
- Small typos are tolerated, and section, store and listing suggestions appear as you type.
- Image search: listings visually similar to an uploaded picture are found.
- Licence plates in car photos are read, so a car can be searched by its plate number.
Market price
Every night a median price and a “usual” price range are computed for each segment from the last 90 days of listings. Extremely cheap and extremely expensive listings are excluded, and a segment with fewer than 8 listings is not shown. The “below / above market” verdict on a listing page is derived from these figures.
Full methodology and accuracy table →Recommendations
The “Recommended” feed on the home page is built from the listings you have viewed.
- Which sections, cities and price ranges you look at.
- “People who viewed this also viewed” links.
- Listings visually similar to the ones you viewed.
- In profile settings you can pick your interests yourself or switch off sections you do not want.
VIN check
A VIN is decoded in parallel from several open sources and the results are merged: a manufacturer code table (brand and country), the NHTSA registry for the US market, and the Swiss type-approval registry for the European market. Listings with the same VIN seen on Prayk are shown too, with their price and mileage history.
Check a VIN →Protecting phone numbers
A seller’s number arrives masked on the page and in the API response. The full number is given only after pressing “Show number”, with a short-lived key — this makes bulk harvesting of numbers harder.
Technical foundation
- Server
- Written in Go; the whole API is documented with an open OpenAPI description.
- Data
- Listings are stored in a MySQL cluster, the search index in Elasticsearch, and image vectors in Qdrant.
- Image model
- The image similarity model (CLIP) runs on our own servers.
- Site and app
- The site runs on Next.js and the mobile app on React Native; both read the same API.