Quatre outils d'évaluation. Les appartements, maisons et terrains sont pris en charge ; l'estimation express et le rapport refusent l'immobilier commercial et les ensembles résidentiels avec 422 business_rule ; l'estimation du loyer fonctionne aussi pour l'immobilier commercial.
Estimation express
POST /valuation/express - scope tools:valuation, immédiat. Un appel API plus le prix de l'estimation express.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
propertyCategory | string | non | apartment (par défaut), house, land ; commercial est refusé avec 422, toute autre valeur (il n'existe pas de complex) avec 400 |
totalArea | number | l'un des trois | surface, m² |
areaM2 | number | l'un des trois | identique à totalArea |
landPlotArea | number | l'un des trois | surface du terrain, m² ; compte comme surface uniquement pour land |
addressText | string | recommandé | adresse sur une seule ligne |
country, city, postalCode | string | non | adresse en parties |
lat, lon | number | non | coordonnées |
rooms | number | non | pièces |
yearBuilt | number | non | année de construction |
floor, floorsTotal | number | non | étage et nombre d'étages |
houseLevels | number | non | niveaux de la maison |
heatingType | string | non | chauffage |
price | number | non | votre prix - comparé à l'estimation |
currency | string | non | devise du résultat |
language | string | non | non utilisé : la réponse express ne contient pas de texte explicatif |
targetId | string | non | l'identifiant de votre annonce : les estimations répétées d'une même annonce sont servies depuis le cache pendant 7 jours |
curl -X POST https://developers.grem.capital/api/v1/valuation/express \
-H "Authorization: Bearer gsk_live_xxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5b8c3f7e-2a71-4c55-8d0e-9f1a6b2c4d10" \
-d '{"propertyCategory":"apartment","addressText":"Torstraße 12, Berlin","totalArea":64,"rooms":2,"currency":"EUR"}'
Réponse :
| Champ | Description |
|---|---|
estimate.pricePoint | valeur estimée |
estimate.rangeLow, estimate.rangeHigh | fourchette |
estimate.confidence | niveau de confiance : low, medium ou high |
estimate.confidenceScore | confiance sous forme de nombre de 0 à 1 |
estimate.currency | devise |
estimate.analogs | annonces comparables trouvées pour l'estimation : title, address, area, rooms, pricePerM2, originalPrice, adjustedPrice, adjustments, weight, provenance, source, sourceUrl |
degraded | true pour une estimation approximative sans données de marché ; une telle estimation n'est pas facturée |
Pas de surface ou un propertyCategory inconnu - 400 validation ; immobilier commercial - 422 business_rule avec code: commercial_unsupported.
Une évaluation prend 30 à 150 secondes, et le réseau en amont de l'API coupe une réponse non commencée dans les ~100 secondes avec 524. Envoyez donc une Idempotency-Key et l'en-tête Prefer: respond-async : 202 arrive immédiatement avec { "jobId", "status", "state", "links": { "self" } } et les en-têtes Location et Retry-After. Interrogez GET /valuation/express/jobs/{id} (gratuit) jusqu'à ce que state vaille completed (result contient le même corps que le 200 synchrone) ou failed (error contient le même problème). Au lieu d'interroger, vous pouvez vous abonner à express.completed / express.failed (Webhooks). La facturation a lieu une seule fois, comme pour l'appel synchrone ; la tâche est conservée 7 jours. Sans l'en-tête, la réponse reste synchrone.
Rapport d'évaluation complet
POST /valuation/report - scope tools:valuation, tâche. Un rapport avec analyse de marché et un PDF. Les champs obligatoires dépendent de propertyCategory. N'envoyez que les champs de votre catégorie : un champ d'une autre catégorie (par exemple houseLevels pour un appartement, parking pour une maison) est refusé avec 400. Appartement uniquement : livingArea, kitchenArea, bathrooms, ceilingHeight, floor, storeys, balcony, elevator, parking, houseType, apartmentType. Maison uniquement : houseLevels. Terrain uniquement : zoning. Maison et terrain : utilities.
| Champ | Type | Description |
|---|---|---|
propertyCategory | string | apartment, house ou land - obligatoire |
address | object | obligatoire : country, city, street (peut être vide), streetNumber, location (lat, lng) |
totalArea | number | m² ; obligatoire pour les appartements et les maisons |
landPlotArea | number | m² ; obligatoire pour les maisons ; un terrain nécessite ce champ ou totalArea |
condition | string | état ; obligatoire pour les appartements et les maisons |
apartmentType | string | appartement : Residential, Commercial, Industrial, Land plot ou Complex - obligatoire |
houseType | string | appartement : type de bâtiment - obligatoire |
floor, storeys | number | appartement : étage et nombre d'étages du bâtiment - obligatoire |
balcony, elevator | oui/non | appartement : obligatoire |
houseLevels | number | maison : niveaux, de 1 à 10 - obligatoire |
rooms | number | appartement, maison : pièces |
livingArea, kitchenArea, bathrooms, ceilingHeight | number | appartement uniquement : détails facultatifs |
yearConstruction | number | appartement, maison : année de construction |
wallMaterial, heatingType | string | appartement, maison : matériau des murs, chauffage ; pour une maison, heatingType est l'une des valeurs central, autonomous, boiler, fireplace, mixed, gas, electric, heat_pump, solid_fuel, underfloor, none |
furnished | oui/non | appartement, maison : mobilier |
parking | oui/non | appartement uniquement : parking |
zoning | string | terrain uniquement : zonage |
utilities | object | maison et terrain : gas, water, sewage, electricity (oui/non) |
price | number | votre prix - comparé à l'estimation |
currency | string | UAH, USD, EUR, AZN, GBP, AED, CNY, TRY, GEL |
language | string | langue du rapport : eng, rus, ukr, deu, spa, aze, arb, fra, zho, tur |
objectId | string | l'identifiant de votre annonce, si c'est elle que vous évaluez |
comments | string | un commentaire pour l'évaluation |
curl -X POST https://developers.grem.capital/api/v1/valuation/report \
-H "Authorization: Bearer gsk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"propertyCategory": "apartment",
"address": { "country": "Germany", "city": "Berlin", "street": "Torstraße", "streetNumber": "12" },
"currency": "EUR", "language": "eng",
"apartmentType": "Residential", "houseType": "panel",
"totalArea": 64, "rooms": 2, "floor": 3, "storeys": 5,
"balcony": true, "elevator": false, "condition": "good"
}'
Réponse 202 : { "jobId": "...", "status": "processing", "state": "running" }. La tâche terminée (GET /valuation/report/jobs/{id}) contient :
| Champ | Description |
|---|---|
metrics | chiffres : potPrice, priceRangeLow, priceRangeHigh, avgPrice, analogCount, growth - valeur de marché, sa fourchette, prix au m², nombre de comparables, croissance en % |
confidence, priceMethod, estimateType | fiabilité de la valeur (high…very_low), méthode de calcul, valeur ponctuelle ou fourchette |
currency | devise de tous les chiffres |
justification | pourquoi la valeur est celle-ci |
recommendations | recommandations de prix et de vente |
pdfMeta | données du rapport PDF |
analogs | annonces comparables sur lesquelles repose la valeur (le même tableau que dans le PDF) : title, address, area, rooms, pricePerM2, originalPrice, adjustedPrice, adjustments, weight, provenance, source, sourceUrl. provenance: model_estimate - une référence sans annonce réelle derrière |
L'immobilier commercial (y compris apartmentType Commercial ou Industrial) est refusé avec 422 business_rule et code: commercial_unsupported - estimez plutôt son loyer avec POST /valuation/rent. Un ensemble résidentiel (apartmentType: Complex) - 422 avec code: complex_unsupported : évaluez un appartement ou une maison de cet ensemble.
PDF : GET /artifacts/v1/ai/appraisal/reports/{id}/pdf. Événements - valuation.completed / valuation.failed.
Estimation du loyer
POST /valuation/rent - scope tools:rent, immédiat. Décrivez le bien avec des champs ou passez l'objectId de votre annonce ou d'une annonce publique.
| Champ | Type | Description |
|---|---|---|
objectId | string | une annonce au lieu d'une description |
city | string | obligatoire sans objectId |
totalArea | number | m² ; obligatoire sans objectId |
country, district, street | string | adresse |
propertyCategory | string | type de bien |
rooms, floor | number | pièces, étage |
furnished | oui/non | meublé |
condition | string | état |
rentTerm | string | long - loyer mensuel (par défaut), short - location à la journée. Deux marchés différents |
occupancyPct | number | location à la journée : taux d'occupation attendu, de 10 à 100 % |
monthRentalRate | number | votre loyer mensuel - la réponse montre comment il se situe par rapport au marché |
declaredDayRate | number | votre tarif à la nuitée |
currency | string | devise du résultat |
curl -X POST https://developers.grem.capital/api/v1/valuation/rent \
-H "Authorization: Bearer gsk_live_xxx" \
-H "Content-Type: application/json" \
-d '{"propertyCategory":"apartment","country":"Germany","city":"Berlin","totalArea":50,"rooms":2,"currency":"EUR"}'
Réponse :
| Champ | Description |
|---|---|
id | identifiant de l'estimation ; PDF - GET /artifacts/v1/ai/appraisal/rent/{id}/pdf |
currency | devise |
rent.monthlyRent | loyer de marché par mois |
rent.low, rent.high | fourchette |
rent.annualRent | par an |
rent.pricePerM2 | par m² et par mois |
rent.grossYieldPct | rendement brut par rapport au prix du bien, en %, lorsque le prix est connu |
rent.confidence | confiance |
rent.basedOn | nombre d'annonces comparables sur lesquelles repose l'estimation |
rent.termBasis | long ou short |
comps | chaque annonce examinée et son sort dans l'estimation : address, area, rooms, monthlyRent/dayRent, effectiveMonthly, term, status, usedInEstimate, source, url |
Sans surface ou sans ville - 400 avec un detail du type "Missing or invalid: totalArea".
Une estimation du loyer peut aussi prendre plus d'une minute. Avec Prefer: respond-async, elle répond immédiatement 202 avec une tâche ; statut : GET /valuation/rent/jobs/{id} (gratuit), événements : rent.completed / rent.failed. Tout le reste fonctionne comme pour l'estimation express ci-dessus.
Vérification de rapport
POST /valuation/review - scope tools:review. Téléversez un rapport d'évaluation (PDF, DOCX, DOC, RTF ; jusqu'à 40 MB) - GREM le lit et vérifie la valeur au regard des données du marché.
Corps - multipart/form-data :
| Partie | Description |
|---|---|
file | le document du rapport (ou une partie document) |
language | langue du résultat, rus par défaut |
currency | devise, USD par défaut |
curl -X POST https://developers.grem.capital/api/v1/valuation/review \
-H "Authorization: Bearer gsk_live_xxx" \
-F "file=@report.pdf" \
-F "language=eng" -F "currency=EUR"
Le document est lu immédiatement. La réponse 202 contient jobId, status et state :
action_required(status: need_confirm) -extractedcontient les données lues dans le document. Vérifiez-les et confirmez :POST /valuation/review/jobs/{id}/confirm(Tâches et résultats). Après confirmation, la tâche passe àrunning.failed(status: rejected) - le document n'est pas un rapport d'évaluation immobilière.
Le résultat final - GET /valuation/review/jobs/{id} ; le rapport de vérification - GET /artifacts/v1/ai/appraisal/reviews/{id}/report.pdf ou report.docx. Événements - review.completed / review.failed ; le suivi par webhook commence après la confirmation. Quand le document est lu et doit être confirmé, l’événement review.action_required arrive avec l’id de la vérification.
La lecture d'un gros document peut prendre plusieurs minutes, et une réponse non commencée dans les ~100 secondes est coupée avec 524. Avec une Idempotency-Key et l'en-tête Prefer: respond-async, le 202 arrive dès que le fichier est téléversé, avec une tâche de requête (jobId du type areq_…, Preference-Applied: respond-async, Location, Retry-After). Interrogez GET /valuation/review/jobs/{id} avec cet identifiant (gratuit) jusqu'à ce que state vaille completed : result contient exactement le 202 décrit ci-dessus - utilisez son result.jobId pour récupérer la vérification et la confirmer (POST /valuation/review/jobs/{id}/confirm). Pour une tâche de requête, review.completed signifie que le document est lu et attend une confirmation. Une tâche échouée avec code: interrupted n'est pas facturée et libère la clé : renvoyez la même requête avec la même clé. Sans l'en-tête, la réponse reste la même qu'avant.