Classifieds market
Categories
GET/v1/market/categories
Every classifieds category on the latest day: how many ads are for sale, how many have a price, and the median asking price in lei. Aggregate numbers only: no ad, no seller, no contact. Costs 2 credits.
Parameters
No parameters.
Possible errors
curl "https://api.satelit.md/v1/market/categories" \
-H "Authorization: Bearer $SATELIT_KEY" const res = await fetch("https://api.satelit.md/v1/market/categories", {
headers: { Authorization: `Bearer ${process.env.SATELIT_KEY}` },
});
const { data, meta } = await res.json();
console.log(data, meta.credits); import json, os, urllib.request
req = urllib.request.Request(
"https://api.satelit.md/v1/market/categories",
headers={"Authorization": f"Bearer {os.environ['SATELIT_KEY']}"},
)
with urllib.request.urlopen(req) as res:
body = json.load(res)
print(body["data"], body["meta"]["credits"]) <?php
$ch = curl_init("https://api.satelit.md/v1/market/categories");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("SATELIT_KEY")],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($body["data"]); {
"data": [
{
"category": {
"id": 659,
"name": "Cars",
"url": null,
"group": {
"id": 657,
"name": "Transport",
"url": null
}
},
"volume": 18450,
"priced": 17230,
"median_mdl": 185000
},
{
"category": {
"id": 1404,
"name": "Apartments",
"url": null,
"group": {
"id": 1399,
"name": "Real estate",
"url": null
}
},
"volume": 12900,
"priced": 12010,
"median_mdl": 1650000
},
{
"category": {
"id": 40,
"name": "Phones",
"url": null,
"group": {
"id": 646,
"name": "Electronics",
"url": null
}
},
"volume": 9600,
"priced": 9100,
"median_mdl": 9900
}
],
"meta": {
"credits": 2,
"updated_at": "2026-11-02T13:05:00+02:00",
"sources": [
{
"name": "two classifieds sites",
"license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
}
],
"attribution": "Date: Satelit (satelit.md)"
}
}Prices and volume
GET/v1/market/prices
The price distribution and market volume of the latest day, from the live ads. Without category, one row per category, biggest first. With category, one row for the whole country and one per city with enough ads. Prices are in lei; currency is the currency most ads use. Costs 2 credits per 50 rows.
Parameters
-
categoryintegeroptionalA subcategory id, from
/v1/market/categories. -
citystringoptionalThe city, as the ads write it: Chișinău.
-
pageintegeroptionaldefault 1The page, from 1 to 200.
Possible errors
curl "https://api.satelit.md/v1/market/prices?category=659" \
-H "Authorization: Bearer $SATELIT_KEY" const res = await fetch("https://api.satelit.md/v1/market/prices?category=659", {
headers: { Authorization: `Bearer ${process.env.SATELIT_KEY}` },
});
const { data, meta } = await res.json();
console.log(data, meta.credits); import json, os, urllib.request
req = urllib.request.Request(
"https://api.satelit.md/v1/market/prices?category=659",
headers={"Authorization": f"Bearer {os.environ['SATELIT_KEY']}"},
)
with urllib.request.urlopen(req) as res:
body = json.load(res)
print(body["data"], body["meta"]["credits"]) <?php
$ch = curl_init("https://api.satelit.md/v1/market/prices?category=659");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("SATELIT_KEY")],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($body["data"]); {
"data": [
{
"category": {
"id": 659,
"name": "Cars",
"url": null,
"group": {
"id": 657,
"name": "Transport",
"url": null
}
},
"city": null,
"day": "2026-11-04",
"volume": 18450,
"priced": 17230,
"currency": "EUR",
"prices": {
"median": 185000,
"p10": 62000,
"p25": 110000,
"p75": 315000,
"p90": 520000,
"min": 25000,
"max": 1450000
}
},
{
"category": {
"id": 659,
"name": "Cars",
"url": null,
"group": {
"id": 657,
"name": "Transport",
"url": null
}
},
"city": "Chișinău",
"day": "2026-11-04",
"volume": 9200,
"priced": 8700,
"currency": "EUR",
"prices": {
"median": 195000,
"p10": 70000,
"p25": 120000,
"p75": 330000,
"p90": 540000,
"min": 28000,
"max": 1450000
}
},
{
"category": {
"id": 659,
"name": "Cars",
"url": null,
"group": {
"id": 657,
"name": "Transport",
"url": null
}
},
"city": "Bălți",
"day": "2026-11-04",
"volume": 2100,
"priced": 1980,
"currency": "EUR",
"prices": {
"median": 165000,
"p10": 55000,
"p25": 98000,
"p75": 280000,
"p90": 470000,
"min": 22000,
"max": 980000
}
}
],
"meta": {
"credits": 2,
"updated_at": "2026-11-02T13:05:00+02:00",
"sources": [
{
"name": "two classifieds sites",
"license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
}
],
"attribution": "Date: Satelit (satelit.md)",
"page": {
"page": 1,
"per": 50,
"total": 3,
"pages": 1
}
}
}The market over time
GET/v1/market/history
One category, day by day: the market volume, how many ads were listed (new) and how many left (removed), and the price distribution where enough ads have a price. The whole market by default (category 0). A city has volume and prices, without the daily flow. Past the plan's history it is cut, and meta.history_cut says so. Costs 3 credits per started 30 days.
Parameters
-
categoryintegeroptionaldefault 0A subcategory id, or 0 for the whole market.
-
citystringoptionalThe city, as the ads write it.
-
daysintegeroptionaldefault 90How many days back. Cut at the plan's limit.
Possible errors
curl "https://api.satelit.md/v1/market/history?category=659&days=90" \
-H "Authorization: Bearer $SATELIT_KEY" const res = await fetch("https://api.satelit.md/v1/market/history?category=659&days=90", {
headers: { Authorization: `Bearer ${process.env.SATELIT_KEY}` },
});
const { data, meta } = await res.json();
console.log(data, meta.credits); import json, os, urllib.request
req = urllib.request.Request(
"https://api.satelit.md/v1/market/history?category=659&days=90",
headers={"Authorization": f"Bearer {os.environ['SATELIT_KEY']}"},
)
with urllib.request.urlopen(req) as res:
body = json.load(res)
print(body["data"], body["meta"]["credits"]) <?php
$ch = curl_init("https://api.satelit.md/v1/market/history?category=659&days=90");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("SATELIT_KEY")],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($body["data"]); {
"data": {
"category": {
"id": 659,
"name": "Cars",
"url": null,
"group": {
"id": 657,
"name": "Transport",
"url": null
}
},
"city": null,
"points": [
{
"date": "2026-10-29",
"volume": 18100,
"new": 610,
"removed": 540,
"priced": 17014,
"prices": {
"median": 182000,
"p10": 62000,
"p25": 110000,
"p75": 315000,
"p90": 520000,
"min": 25000,
"max": 1450000
}
},
{
"date": "2026-10-30",
"volume": 18220,
"new": 590,
"removed": 560,
"priced": 17127,
"prices": {
"median": 183000,
"p10": 62000,
"p25": 110000,
"p75": 315000,
"p90": 520000,
"min": 25000,
"max": 1450000
}
},
{
"date": "2026-10-31",
"volume": 18260,
"new": 640,
"removed": 600,
"priced": 17164,
"prices": {
"median": 184000,
"p10": 62000,
"p25": 110000,
"p75": 315000,
"p90": 520000,
"min": 25000,
"max": 1450000
}
},
{
"date": "2026-11-01",
"volume": 18340,
"new": 700,
"removed": 620,
"priced": 17240,
"prices": {
"median": 184500,
"p10": 62000,
"p25": 110000,
"p75": 315000,
"p90": 520000,
"min": 25000,
"max": 1450000
}
},
{
"date": "2026-11-02",
"volume": 18390,
"new": 560,
"removed": 520,
"priced": 17287,
"prices": {
"median": 185000,
"p10": 62000,
"p25": 110000,
"p75": 315000,
"p90": 520000,
"min": 25000,
"max": 1450000
}
},
{
"date": "2026-11-03",
"volume": 18420,
"new": 620,
"removed": 560,
"priced": 17315,
"prices": {
"median": 185000,
"p10": 62000,
"p25": 110000,
"p75": 315000,
"p90": 520000,
"min": 25000,
"max": 1450000
}
},
{
"date": "2026-11-04",
"volume": 18450,
"new": 640,
"removed": 580,
"priced": 17343,
"prices": {
"median": 185000,
"p10": 62000,
"p25": 110000,
"p75": 315000,
"p90": 520000,
"min": 25000,
"max": 1450000
}
}
]
},
"meta": {
"credits": 3,
"updated_at": "2026-11-02T13:05:00+02:00",
"sources": [
{
"name": "two classifieds sites",
"license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
}
],
"attribution": "Date: Satelit (satelit.md)"
}
}Sellers
GET/v1/market/sellers
Recurring sellers, most active first, 50 to a page. With category, ranked within it, with their live ads and median price there. With new=true, only sellers new on the site. A seller is an opaque id that folds one seller's ads together and names no one: never a phone, an e-mail or any contact. tenure_days, new, sold and sold_recent appear only when those fields are on. Sellers come from one classifieds site only. Costs 3 credits per 50 rows.
Parameters
-
categoryintegeroptionalA subcategory id to rank within, from
/v1/market/categories. -
newbooleanoptionalOnly sellers new on the site.
-
pageintegeroptionaldefault 1The page, from 1 to 200.
Possible errors
curl "https://api.satelit.md/v1/market/sellers?category=659" \
-H "Authorization: Bearer $SATELIT_KEY" const res = await fetch("https://api.satelit.md/v1/market/sellers?category=659", {
headers: { Authorization: `Bearer ${process.env.SATELIT_KEY}` },
});
const { data, meta } = await res.json();
console.log(data, meta.credits); import json, os, urllib.request
req = urllib.request.Request(
"https://api.satelit.md/v1/market/sellers?category=659",
headers={"Authorization": f"Bearer {os.environ['SATELIT_KEY']}"},
)
with urllib.request.urlopen(req) as res:
body = json.load(res)
print(body["data"], body["meta"]["credits"]) <?php
$ch = curl_init("https://api.satelit.md/v1/market/sellers?category=659");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("SATELIT_KEY")],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($body["data"]); {
"data": [
{
"id": "3f9a1c7e2b4d",
"source": "m999",
"active": 42,
"total": 120,
"categories": 2,
"top_category": {
"id": 659,
"name": "Cars",
"url": null,
"group": {
"id": 657,
"name": "Transport",
"url": null
}
},
"activity": "high",
"first_seen": "2026-03-01T09:00:00+02:00",
"last_active": "2026-11-02T13:05:00+02:00",
"tenure_days": 248,
"new": false,
"sold": 78,
"sold_recent": 12,
"in_category": {
"active": 38,
"total": 95,
"median_mdl": 210000
}
},
{
"id": "a1b2c3d4e5f6",
"source": "m999",
"active": 17,
"total": 40,
"categories": 1,
"top_category": {
"id": 659,
"name": "Cars",
"url": null,
"group": {
"id": 657,
"name": "Transport",
"url": null
}
},
"activity": "regular",
"first_seen": "2026-06-10T12:00:00+02:00",
"last_active": "2026-11-02T13:05:00+02:00",
"tenure_days": 147,
"new": false,
"sold": 23,
"sold_recent": 5,
"in_category": {
"active": 17,
"total": 40,
"median_mdl": 150000
}
},
{
"id": "9988776655aa",
"source": "m999",
"active": 6,
"total": 9,
"categories": 1,
"top_category": {
"id": 659,
"name": "Cars",
"url": null,
"group": {
"id": 657,
"name": "Transport",
"url": null
}
},
"activity": "regular",
"first_seen": "2026-10-20T08:00:00+02:00",
"last_active": "2026-11-02T13:05:00+02:00",
"tenure_days": 15,
"new": true,
"sold": 3,
"sold_recent": 3,
"in_category": {
"active": 6,
"total": 9,
"median_mdl": 120000
}
}
],
"meta": {
"credits": 3,
"updated_at": "2026-11-02T13:05:00+02:00",
"sources": [
{
"name": "one classifieds site",
"license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
}
],
"attribution": "Date: Satelit (satelit.md)",
"page": {
"page": 1,
"per": 50,
"total": 1200,
"pages": 24
}
}
}One seller
GET/v1/market/sellers/{id}
A seller by its opaque id: the categories it lists in, how many ads are live and in total, and its median asking price per category. Numbers only, no contact. Costs 2 credits.
Parameters
-
idstringrequiredThe seller's opaque id, from
/v1/market/sellers.
Possible errors
curl "https://api.satelit.md/v1/market/sellers/3f9a1c7e2b4d" \
-H "Authorization: Bearer $SATELIT_KEY" const res = await fetch("https://api.satelit.md/v1/market/sellers/3f9a1c7e2b4d", {
headers: { Authorization: `Bearer ${process.env.SATELIT_KEY}` },
});
const { data, meta } = await res.json();
console.log(data, meta.credits); import json, os, urllib.request
req = urllib.request.Request(
"https://api.satelit.md/v1/market/sellers/3f9a1c7e2b4d",
headers={"Authorization": f"Bearer {os.environ['SATELIT_KEY']}"},
)
with urllib.request.urlopen(req) as res:
body = json.load(res)
print(body["data"], body["meta"]["credits"]) <?php
$ch = curl_init("https://api.satelit.md/v1/market/sellers/3f9a1c7e2b4d");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("SATELIT_KEY")],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($body["data"]); {
"data": {
"id": "3f9a1c7e2b4d",
"source": "m999",
"active": 42,
"total": 120,
"categories": 2,
"top_category": {
"id": 659,
"name": "Cars",
"url": null,
"group": {
"id": 657,
"name": "Transport",
"url": null
}
},
"activity": "high",
"first_seen": "2026-03-01T09:00:00+02:00",
"last_active": "2026-11-02T13:05:00+02:00",
"tenure_days": 248,
"new": false,
"sold": 78,
"sold_recent": 12,
"in_category": {
"active": 38,
"total": 95,
"median_mdl": 210000
},
"category_breakdown": [
{
"category": {
"id": 659,
"name": "Cars",
"url": null,
"group": {
"id": 657,
"name": "Transport",
"url": null
}
},
"active": 38,
"total": 95,
"median_mdl": 210000,
"last_active": "2026-11-02T13:05:00+02:00"
},
{
"category": {
"id": 40,
"name": "Phones",
"url": null,
"group": {
"id": 646,
"name": "Electronics",
"url": null
}
},
"active": 4,
"total": 25,
"median_mdl": 12000,
"last_active": "2026-11-02T13:05:00+02:00"
}
]
},
"meta": {
"credits": 2,
"updated_at": "2026-11-02T13:05:00+02:00",
"sources": [
{
"name": "one classifieds site",
"license": "none: read from the source's public pages; no agreement with the source and no licence over its data is granted"
}
],
"attribution": "Date: Satelit (satelit.md)"
}
}