Pasul 1 · Problema
Vânzătorul nu știe ce anunț pierde bani
999.md arată anunțul, dar nu explică unde se pierde vizibilitate, cât costă promovarea și ce merită schimbat.
analiză inversă complet al conectare tehnică-ului GraphQL 999.md: 90 queries publice, 23 mutations, schema introspection, exemple curl + Node + Python. Fără auth pentru read.
Pe 999.md există multă activitate, dar vânzătorul vede prea puțin context despre preț, poziție, categorie și buget.
Index9 adună semnalele disponibile într-un flux simplu: verifică datele, explică limita calculului și propune următoarea acțiune.
Lucrezi mai repede, reduci deciziile făcute la întâmplare și vezi ce merită făcut pe contul tău.
analiză inversă complet al conectare tehnică-ului GraphQL 999.md: 90 queries publice, 23 mutations, schema introspection, exemple curl + Node + Python. Fără auth pentru read.
Pasul 1 · Problema
999.md arată anunțul, dar nu explică unde se pierde vizibilitate, cât costă promovarea și ce merită schimbat.
Pasul 2 · Soluția
Preț, poziție, categorie, locație, cost și reacții sunt puse împreună ca să vezi următoarea decizie.
Pasul 3 · Date reale
Dacă o sursă nu răspunde, pagina spune clar că datele lipsesc. Nu umplem graficele cu valori demonstrative.
Dacă lipsește sursa, graficul trebuie să se oprească și să explice ce lipsește. Nu completăm zona cu bare albastre doar ca să arate plin.
Pasul 4 · Recomandare
Nu primești doar un scor. Vezi motivul: preț prea sus, poziție slabă, concurență rapidă sau buget irosit.
Pasul 5 · Acțiune
După analiză poți corecta anunțul, schimba prețul, republica sau opri bugetul fără pași inutili.
Fiecare vizitator trebuie să înțeleagă ce se întâmplă în piață, ce merită făcut acum și cum platforma reduce munca manuală.
analiză inversă complet al conectare tehnică-ului 999.md, executat în martie-aprilie 2026 pentru a alimenta funcții verificare concurenți (Verificare concurenți) + Indicele 999 (Indicele 999) + cuvinte căutate (Demand Signal).
Ideea principală: 999.md folosește GraphQL ca partea de server pentru partea vizibilă-ul SPA. punct de conectare-ul
https://999.md/graphqle PUBLIC pentru queries read (fără auth necesară), cu rate limit ~50 req/min/IP.
999.md nu publică conectare tehnică documentat oficial pentru terți. Există conectarea oficială 999.md privat (folosit de TopAuto, AUTOPLAZA, Imona), dar accesul cere contract enterprise + revenue distribuire. Pentru instrumente de productivity ca Bravin, alternativa era:
Deschis 999.md, calculator promovare → Network → filtrare XHR/Fetch. Observat că toate operațiile (căutare, anunț detail, conectare) merg prin POST /graphql cu body JSON:
{
"operationName": "SearchListings",
"variables": { "category": "transport", "limit": 30 },
"căutare": "căutare SearchListings($category: String!, $limit: Int!) { ... }"
}
Pornit mitmproxy pe MacBook, navigat 999.md timp de 2 ore (toate categorii, căutare, conectare, mesaje). Capturat 147 cereri unice către /graphql.
mitmproxy --mode regular --listen-port 8080 --save-stream-file 999md.dump
Din 147 cereri → 90 queries unice (după deduplication pe câmp operationName). Restul = repetiții cu parametri diferiți.
cat 999md.dump | jq '.operationName' | sort -u | wc -l
# → 90
curl -X POST https://999.md/graphql \
-H "Content-Type: application/json" \
-d '{"căutare":"{ __schema { queryType { fields { name args { name type { name kind } } type { name kind } } } } }"}' \
> schema.json
Schema completă: 1.247 type-uri, 150 queries declarate, 40 mutations. Din 150 queries, 60 sunt internal/admin, 90 sunt utile public.
Toate cele 90 queries categorizate:
căutare SearchListings(
$category: String!,
$subcategory: String,
$minPrice: Float,
$maxPrice: Float,
$location: String,
$limit: Int = 30,
$offset: Int = 0,
$orderBy: String = "reseted_desc"
) {
anunțuri(
category: $category,
subcategory: $subcategory,
minPrice: $minPrice,
maxPrice: $maxPrice,
location: $location,
limit: $limit,
offset: $offset,
orderBy: $orderBy
) {
id
title
titleRu
price
currency
photos { url thumbnail }
utilizator { id name isCompany }
publishedAt
resetedAt
boosterUntil
topPlacement
location
}
}
Observație utilă: parametrul orderBy: "reseted_desc" confirmă că ordinea de afișare-ul e literalmente sortare după reseted_at (timpul ultimei republicări). Vezi blog /blog/algoritm-999md-explicat.
căutare ListingById($id: ID!) {
anunț(id: $id) {
id
title
titleRu
description
descriptionRu
price
currency
photos { url width height }
utilizator {
id name phone email
registeredAt totalListings averageRating
}
location { city street latitude longitude }
attributes {
key value valueRu
}
viewsCount
contactsCount
favoritesCount
publishedAt
resetedAt
expiresAt
}
}
Folosit pentru: verificare cont audit propriu (vezi viewsCount/contactsCount = rentabilitate per anunț).
căutare CategoryStats($category: String!, $period: String = "30d") {
categoryStats(category: $category, period: $period) {
totalListings
activeListings
newPerHour
velocityPerCategory
avgPrice
avgPriceTrend
topUsers { id name listingCount }
}
}
Folosit pentru: Indicele 999 Indicele 999 (calculul viteză 224/h Auto, 223/h Real-estate, etc).
căutare UserPublicProfile($userId: ID!) {
utilizator(id: $userId) {
id
name
avatar
isCompany
companyName
registeredAt
totalListings
activeListings
averageRating
reviewsCount
anunțuri(limit: 50) {
id title price photos { url } resetedAt
}
}
}
Folosit pentru: verificare concurenți verificare concurenți — vezi câte anunțuri are AUTOPLAZA, când le republică, ce categorii.
căutare TrendingKeywords($period: String = "7d", $limit: Int = 50) {
trendingKeywords(period: $period, limit: $limit) {
keyword
keywordRu
searchCount
growthPercent
relatedCategories
}
}
Folosit pentru: cuvinte căutate Demand Signal — "Ce caută moldovenii AZI pe 999.md".
BoosterPrices — costul promovare plătită per categorie (variabil!)TopPlacementOptions — opțiuni top placement + prețCategoryHierarchy — arbore complet 23 categorii + 310 subcategoriiLocationsList — toate orașele/raioanele MD cu anunțuriRecentReviews — verificare-uri publice utilizatori (pentru încredere scor)Vezi documentația tehnică pentru parteneri →
Simpals nu publică limite explicit, dar empiric:
regulă practică bună Bravin:
p-throttle la 30 req/min ca safety marginBravin-io/1.0 (https://index9.site; contact@index9.site) ca să poată Simpals contacta dacă există problemecurl -X POST https://999.md/graphql \
-H "Content-Type: application/json" \
-H "utilizator-Agent: Bravin-io/1.0 (contact@index9.site)" \
-d '{
"operationName": "SearchListings",
"variables": {
"category": "transport",
"limit": 10,
"orderBy": "reseted_desc"
},
"căutare": "căutare SearchListings($category: String!, $limit: Int!, $orderBy: String!) { anunțuri(category: $category, limit: $limit, orderBy: $orderBy) { id title price resetedAt } }"
}'
const client = new GraphQLClient('https://999.md/graphql', {
headers: { 'utilizator-Agent': 'Bravin-io/1.0' }
})
const căutare = gql`
căutare SearchListings($category: String!) {
anunțuri(category: $category, limit: 30, orderBy: "reseted_desc") {
id title price resetedAt
}
}
`
const data = await client.request(căutare, { category: 'transport' })
console.log(data.anunțuri)
import requests
r = requests.post(
'https://999.md/graphql',
headers={'utilizator-Agent': 'Bravin-io/1.0'},
json={
'căutare': '''
căutare SearchListings($category: String!) {
anunțuri(category: $category, limit: 30, orderBy: "reseted_desc") {
id title price resetedAt
}
}
''',
'variables': {'category': 'transport'}
}
)
print(r.json()['data']['anunțuri'])
captură de date lunar la https://api.index9.site/999md/schema.graphql (public, free).
Diff față de luna trecută la https://api.index9.site/999md/schema.diff (public).
Pentru parteneriat tehnic cu Simpals direct: contactează partners@simpals.com. Pentru integrare cu Bravin: scrie la contact@index9.site.
index9 | Chișinău, Republica Moldova | contact@index9.site | +373 22 000 999
Da pentru date publice (anunțuri, categorii, prețuri afișate pe site). Aceleași date pe care orice utilizator le vede în browser. NU e legal să: 1) trimiți volume mari care suprasolicită serverele Simpals (DoS), 2) extragi date personale (telefoane utilizatori non-publice), 3) re-publici masiv conținutul ca propriu (copyright). Bravin folosește cu rate limit auto-throttle 50 req/min/IP, cache agresiv, și avem comunicare deschisă cu echipa Simpals.
Probabil conectare tehnică-ul GraphQL e folosit de propriul lor frontend (999.md SPA + aplicație mobil) și e mai ușor să-l lași public read decât să gestionezi tokens. E tipar comun (Hacker News, Reddit aveau conectare tehnică public similar). Pentru mutations (create anunț, edit, delete) AUTH e cerut — necesită session cookie sau JWT.
Da via GraphQL introspection: `căutare { __schema { types { name fields { name type { name } } } } }`. Returnează ~1.200 typuri. Atenție: introspection poate fi dezactivată oricând fără warning. Bravin păstrează captură de date lunar al schemei.
Bravin monitorizează diff zilnic. Când Simpals adaugă field nou: îl integrăm în 24-48h. Când șterg field (rar): SDK-ul nostru fallback la valori implicit + log warning. Nu am avut breaking change major în ultimele 12 luni — Simpals foarte conservatori cu conectare tehnică-ul lor.
90 sunt queries unice cu utilitate practică pentru integrare clasă enterprise. Total schema are ~150 queries dar multe sunt internal-use (admin Simpals) sau duplicate. Lista 90 acoperă 99% exemplu de folosire-urile reale: căutare anunțuri, citire detalii, categorii/subcategorii, utilizatori publici, reviews, prețuri promoții, statistici.
Scraping HTML = parsezi pagini HTML, fragil (orice schimbare CSS sparge totul), lent, ineficient (transfer 500KB pentru 5KB date). GraphQL = cer exact câmpurile dorite, primesc JSON curat, schema versioned. Bravin a renunțat 100% la scraping HTML din martie 2026 — toate date prin GraphQL.
Da pentru date publice agregate (Index999, statistici de piață, comparații de preț). NU pentru: re-anunț 1:1 al anunțurilor altora pe propria platformă (copyright), revânzare de date personale (GDPR + Lege 133 MD), competiție directă cu 999.md folosind datele lor (concurență neloială). Bravin operează în zona 'instrumente complementare', nu 'platformă alternativă'.
Audit inițial fără card. Abonamentul se activează doar după confirmarea plății.