Skip to content
megapromotingLet's talk
Products Index9

Market and listings analysis Platform

Your listings, in market context.

Index9 is a tool for those who sell on 999.md: category analysis, listing assessment and preparation of posting or reposting actions. The available data and recommendations should be considered together with their source and period.

Index9: the dashboard with the number of observed listings, tracked categories and the signal map by category
index9.site · aggregated across public listings, with the last read time shown on each block

Index9

From information to work done.

01

You choose the context

The category, the listing and the account you are entitled to use.

02

Analizezi

You compare the available information about market and visibility.

03

Decizi

You review the proposed changes before publication or automation.

Where it becomes useful.

Real estate

Exploring the market and improving the presentation of an offer.

Active sellers

Organising analysis and posting activity.

Echipe

A starting point for assessing a listings portfolio.

Index9 is a distinct MEGA product from 999.md. The availability of each function is confirmed on the platform; recommendations do not guarantee a sale.

Index9 in detail

What you can do with this project.

Index9 is built on top of 999.md, the largest classifieds marketplace in Moldova, and answers two different questions. First: how much an apartment is worth, compared with what is actually being sold now in the same sector. Second: which direction the market is moving in for each category, day by day.

The data comes from two places, under different regimes. Public listings and statistics are read through the public GraphQL API of 999.md, without authentication, with an identified user agent and 1.5 seconds between requests. Operations on a user's own listings go through the platform's official partner API, with the account key.

The core rule of the valuation engine is written in code as a principle: never a fabricated figure. Below three comparables, it does not return an estimate, but the status "unavailable". Between three and eight, it returns with the label "thin data" and low confidence. An evaluator that always gives a number is more convenient and less useful.

01

Daily index by category and overall

An index with base 100 and limits 0–200, calculated from four normalised components in the interval [-1, +1]: ad volume speed, median price change, demand signal and a macro layer. The formula is explicit in code: 100 + 50 × the average of the four. The overall index is the weighted average by active listing volume of each category.

02

Market statistics by clean segment

For real estate, the €/m² median is calculated by segment — category × sector × offer type (sale or rent) — not by a category average that would mix apartments with commercial spaces and sales with rentals. Each figure comes with the number of observations, the 25th and 75th quartiles, dispersion as a percentage of the median, freshness in days and a confidence level.

03

Weighted comparables by similarity

An ad to be valued is compared with up to 200 comparables from the last 365 days, filtered by category, subcategory, offer type and, optionally, sector. Similarity is calculated on each available variable — area, floor, rooms, condition, location — without invented coefficients per variable: a missing variable on one side does not penalise, it simply does not contribute.

04

Outlier cleaning

The €/m² series of a segment is Tukey-trimmed: values more than 1.5 × the interquartile range outside the quartiles are removed. A flat listed by mistake at ten times the market price does not move the median.

05

Implied yield

From the two medians of the same segment — rent €/m²/month and sale price €/m² — the gross annual yield is derived. It is returned only if both medians exist and the result falls within a plausible range; otherwise, null.

06

Actual position in the list, hour by hour

The crawler saves not only which ads exist, but which position they appear in in the official listing — the first 100 per category, in two pages of 50. This makes the platform's ordering algorithm visible, and the effect of a republish or a booster, measured, not assumed.

07

Local macro layers

The BNM official rate (public XML, daily at 08:00), Open-Meteo weather for Chisinau (hourly), and ANRE prices for 95 petrol and diesel (weekly, on Mondays). These are inputs to the macro component of the index, not decoration.

Data and operation

What enters the system. What needs to be checked.

Where the listings come from
From the public GraphQL API of 999.md, at `https://999.md/graphql`. For listing, `infiniteScrollAds` is used; for enriching comparables, `searchAds`. No protection is bypassed: these are public queries, with an agent that identifies itself by name and a contact address, with 1.5 seconds between requests and abandonment after 20 seconds.
What is taken directly from the platform and what is derived
999.md exposes for real estate the price (field 2), price per square metre (field 1385), condition (593) and images (14). Price per square metre is the differentiator: we do not estimate it, we read it. Area is derived honestly, as price divided by price per square metre, only when both values exist.
How fresh they are
Five priority categories — including real estate — are reread every hour, at minute zero. The other 18 categories, every 4 hours. The category index is recalculated at minute 5 of each hour, and the daily index at 06:00. Segment statistics for real estate implicitly cover the last 120 days; comparables for an appraisal, the last 365.
How deduplication works
Enrichment writes a single row per ad identifier: when the same ad reappears, the row is updated and the capture date becomes now, instead of creating a duplicate. This solves the common case — the ad republished dozens of times by the same seller. What it does not solve: the same apartment posted under two different identifiers remains two rows. That is why the series is also trimmed statistically, and the segment dispersion is published alongside the median: a segment with high dispersion is a signal, not a figure to be used blindly.
Honesty thresholds, written as thresholds
Eight comparables or more → normal result. Between three and eight → “thin data”, wide interval, low confidence. Under three → “unavailable”, the estimate is null. Confidence is not a feeling: it is a score from four signals — the number of comparables, how tight the segment is (dispersion under 15% and under 30%), recency (under 30 and under 90 days) and agreement between methods. An unknown signal brings no points.
What is public context and what is account data
The daily index and market statistics are calculated from public information. Operations on own listings — republication, promotion, messaging — go through the official partner API, with the client account key, and are separated by access: at today’s check, the appraisal and trends endpoints respond 401 without authentication.
Sectoare
Chișinău’s sectors are assigned by the nearest centroid from a list of coordinates in the code, starting from the listing’s geo. It is an approximate classification at the boundary between sectors, not an administrative delineation.

From exploration to implementation

How we prepare a project with Index9.

01

1. We choose the category and the segment

It starts from a category and, for real estate, from a specific segment: district, type of offer. An answer on “real estate” in general mixes things that cannot be compared.

02

2. We start the collection and wait for it to fill

The crawler gathers listings every hour, and enrichment populates comparable attributes. Until the segment has at least eight comparables in the recency window, the platform will say “thin data” or “unavailable” — and it is right to say so.

03

3. We connect the account for operations on own listings

Reposting, promotion and portfolio analysis require the client’s 999.md account API key. Without it, only the market analysis part remains, which does not need an account.

04

4. We define what is automated and what requires approval

Publishing, deleting, changing the price and spending budget are actions that move money or reputation. What runs on its own and what goes through human approval is decided explicitly at installation, not implicitly.

Questions worth clarifying.

Where do you get the adverts from? Do you do scraping?

From the public 999.md GraphQL API — the same queries their site uses, without authentication and without bypassing any protection. Our agent identifies itself by name with a contact address, waits 1.5 seconds between requests and gives up after 20 seconds. For operations on a client’s adverts we use the official partner API, with their key.

How fresh is the data?

Real estate is one of the five categories read every hour; the other 18 categories, every 4 hours. The category index is recalculated at minute 5 of each hour, the daily one at 06:00. Market statistics refer by default to the last 120 days, and comparables for an evaluation to the last 365 — and each result comes with its freshness in days, so it is clear whether the most recent comparable is from a week ago or four months ago.

How do you avoid the same flat reposted ten times from skewing the average?

A single row is written per advert identifier: the reappearance of the same advert updates the row and capture date, rather than creating a duplicate. What remains outside this is the case where the same flat is posted under two distinct identifiers — there we do not deduplicate by content. That is why the €/m² series is Tukey-trimmed (values beyond 1.5 × the interquartile range are cut off) and why the segment dispersion is published next to the median: if dispersion is high, the figure must be read with reserve, and we say that first.

What happens when you do not have enough data for a segment?

You do not get a number. Below three comparables, the result is “unavailable” with a null estimate. Between three and eight, you get the result marked “thin data”, with a wide interval and low confidence. Above eight, it is a normal result. The thresholds are constant in code, not a communication policy.

What does the 100 index mean and how is it calculated?

100 is neutral. The formula is 100 + 50 × the average of four components, each normalised to [-1, +1], with the result limited to the 0–200 interval. The components are: volume speed (the z-score of adverts per hour versus the 30-day average), median price change, the demand signal and a macro layer. The overall index is the category average, weighted by the volume of active adverts.

What is included in the macro layer?

Three Moldovan public sources: the official BNM exchange rate taken from their daily XML, weather from Open-Meteo for Chișinău coordinates, every hour, and ANRE prices for 95 petrol and diesel, read weekly on Mondays. It is not decoration: these are numerical inputs into one of the four components of the index.

Is it a 999.md product?

No. Index9 is a Mega Promoting product built on public APIs and the 999.md partner API. We are not affiliated with the platform and do not speak on its behalf.

Does it guarantee the apartment will sell?

No, and no one can. What it does is show where the offer stands relative to its real segment — median €/m² by sector and offer type, with quartiles and dispersion — and how the listing position moves. The pricing and presentation decision remains with the seller.

Illustrative example

How much is a 62 m² apartment in Botanica worth

A use case, without client data or attributed commercial results.

Initial situation

A seller is requesting an appraisal for a 62 m² apartment, 4th floor, in Botanica sector, for sale.

How it works

The latest EUR/MDL rate is read from BNM. From the comparable database, all listings in the same category and subcategory, sale type, Botanica sector, captured in the last 365 days are selected — up to 200, ordered by recency. Each comparable is assigned a similarity score calculated across all common variables: area, floor, rooms, condition. Separately, the segment median €/m² from the last 120 days is read, with the Tukey-trimmed series.

Rezultatul

If the segment has at least eight comparables: median €/m², the 25th and 75th quartiles, dispersion as a percentage of the median, the age of the most recent comparable in days and a confidence level derived from these four signals — plus the list of comparables with notable differences marked (area differing by more than 20%, floor differing by more than one, different number of rooms). If it has between three and eight: the same result, marked “thin data”, low confidence. Fewer than three: “unavailable”, no figure.

What is required:The enrichment job must have run on the relevant category, otherwise the comparables base is empty and the response is "unavailable". The valuation reflects the asking prices in adverts, not the transaction prices in contracts — they are two different things, and the latter is not public in Moldova.

Collaboration possibilities

Index9, in the context of your organisation.

Internal flows and information

Connecting authorised sources, organising information and reviewing actions by the team, with separate access by role.

Private companies

We define a pilot around a real process: users, data, integrations, costs and acceptance criteria. Expansion follows after evaluating the result.

State institutions and companies

We establish the requirements for accessibility, hosting, data protection and interoperability. Any connection to AGE or STISC services requires validation of eligibility, access and approvals.

These are adaptation scenarios, not statements about existing contracts or partnerships. The proposed functions are confirmed within the project scope.

Discuss a pilot

Part of an ecosystem.

What would you want to work better?

Tell us about your process. Together we decide what is worth building, what we can connect, and how we check the result.

Let's talk