API

API Avito.ma : les annonces du Maroc et leurs prix en dirhams, en JSON

Avito.ma, le site d'annonces marocain, n'a rien à voir avec avito.ru : autre société, autre pays, et une « Avito API » écrite pour le site russe ne vous servira à rien ici. Cette API n'est pas fournie par Avito.ma : elle lit les pages publiques du site et renvoie chaque annonce en JSON : titre, prix en dirhams sous forme de nombre et tel qu'il est affiché (« 115000 DH »), ville et quartier, date de publication, type de vendeur, et les caractéristiques propres à la rubrique — année-modèle et kilométrage pour une voiture, chambres, surface et étage pour un appartement. On ne publie rien par ici, et ce n'est pas l'espace où une boutique professionnelle gère ses annonces : c'est la vue d'un acheteur sur ce qui est en ligne au moment de l'appel, du smartphone à la voiture d'occasion en passant par l'immobilier.

Endpoints

endpointCe qui est renvoyéObligatoires
searchRecherche par mot-clé (`q`) et/ou par catégorie, avec ville et quartier, prix minimum et maximum en DH, particulier ou professionnel, vente ou location (`ad_type`, pour une recherche par mot-clé), et les options d'Avito (avec prix, avec photo, bonnes affaires, urgent). Environ 35 à 38 annonces par page, dans l'ordre du site, avec le total annoncé. Il faut au moins `q` ou `category` ; `area` ne fonctionne qu'avec `city`.tous optionnels
detailAvec un `list_id` ou l'adresse de l'annonce, tout son contenu : texte complet, toutes les photos, chemin de catégorie, quartier, date, profil public du vendeur et toutes les lignes de caractéristiques (pour une voiture : marque, modèle, origine, première main, puissance fiscale, état…). Une annonce retirée revient en NOT_FOUND.tous optionnels
categoriesL'arborescence des catégories avec leurs identifiants et le type d'annonce de chaque branche (vente, location, colocation, location de vacances) : 140 nœuds le 27 octobre 2026. Un même identifiant peut figurer sous plusieurs branches : 1010 (appartements) apparaît en vente, en location, en colocation et en location de vacances, et `category: 1010` seul nous a renvoyé des appartements à vendre.tous optionnels
locationsToutes les villes qu'Avito publie, avec le slug que `search` attend, le nombre d'annonces en ligne et la liste de leurs quartiers.tous optionnels

Chaque appel est facturé en crédits. Les appels en échec ou bloqués sont gratuits.

Exemple qui fonctionne

Clio 4 à Casablanca, 150 000 DH au plus : 455 annonces, 35 sur la première page. Avant de calculer une cote, trois lignes sont à écarter. Une location à 299 DH est remontée parmi les ventes : sa catégorie est « Voitures de location » et `ad_type` vaut `LET`. Une Clio 2016 est affichée à 112 DH pour 130 km, visiblement 112 000 DH et 130 000 km saisis sans les zéros. Et l'annonce mise en avant en tête de liste porte un `old_price` de 78 000 DH, plus bas que son prix de 107 000 DH : ce n'est pas une remise, et nous n'en calculons aucune. Pour ne garder que les ventes, ajoutez `category: 2010` (voitures d'occasion) : le même jour, la recherche est alors passée à 407 annonces, toutes en vente, mais la Clio à 112 DH y figurait toujours.

Requête
curl -X POST https://api.reefapi.com/avito-ma/v1/search \
  -H "x-api-key: VOTRE_CLE" \
  -H "content-type: application/json" \
  -d '{"q": "clio 4", "city": "casablanca", "price_max": 150000}'
Réponse (abrégée)
{
  "ok": true,
  "data": {
    "listings": [
      {
        "list_id": "56153271",
        "url": "https://www.avito.ma/fr/2_mars/voitures_d_occasion/Clio_4_manuelle_56153271.htm",
        "title": "Clio 4 manuelle",
        "price": 107000,
        "price_display": "107000 DH",
        "currency": "DH",
        "price_matches_display": true,
        "old_price": 78000,
        "monthly_payment": 2219,
        "ad_type": "SELL",
        "category_name": "Voitures d'occasion",
        "city": "Casablanca",
        "area": "2 Mars",
        "posted_at": "2026-10-27T10:58:35Z",
        "seller_type": "STORE",
        "is_promoted": true,
        "attributes": [
          { "id": "regdate", "label": "Année-Modèle", "value": "2019" },
          { "id": "mileage_exact", "label": "Kilométrage", "value": 150000, "unit": "km" },
          { "id": "bv", "label": "Boite de vitesses", "value": "Manuelle" },
          { "id": "fuel", "label": "Type de carburant", "value": "Diesel" },
          ...
        ]
      },
      {
        "list_id": "52205853",
        "title": "Location de voiture Renault Clio 4 diesel",
        "price": 299,
        "price_display": "299 DH",
        "currency": "DH",
        "ad_type": "LET",
        "ad_type_label": "à louer",
        "category_name": "Voitures de location",
        "area": "Centre Ville",
        "seller_type": "STORE",
        "attributes": []
      },
      ...
      {
        "list_id": "58910175",
        "title": "Renault Clio4",
        "price": 112,
        "price_display": "112 DH",
        "currency": "DH",
        "monthly_payment": 2,
        "ad_type": "SELL",
        "category_name": "Voitures d'occasion",
        "area": "2 Mars",
        "posted_at": "2026-10-20T23:25:08Z",
        "seller_type": "PRIVATE",
        "attributes": [
          { "id": "regdate", "label": "Année-Modèle", "value": "2016" },
          { "id": "mileage_exact", "label": "Kilométrage", "value": 130, "unit": "km" },
          ...
        ]
      },
      ...
    ]
  },
  "meta": {
    "record_count": 35,
    "total": 455,
    "page": 1,
    "has_more": true,
    "next_page": 2,
    "promoted_count": 5,
    "filters_applied": ["city", "q", "price"],
    "resolved": { "city": "casablanca", "area": null, "category_id": "0", "keyword": "clio 4" },
    "site": "avito.ma",
    "cache_hit": false,
    "mode": "live"
  }
}

Scraper Avito.ma soi-même : les filtres que le site ignore sans prévenir

Le premier réflexe, `?q=iphone` dans l'adresse, ne filtre rien. Pendant la construction du moteur, cette requête a répondu HTTP 200 avec un total de 1 080 633 annonces et une première page d'annonces de femmes de ménage : sur Avito.ma, le mot-clé se place dans le chemin de l'adresse, pas dans un paramètre.

Les villes ont le même travers. Avito retire les accents de ses adresses : `/fr/fes/` donnait 425 annonces, `/fr/fès/` le même total de 30 707 que sans filtre de ville ; même chose pour Béni Mellal, 78 annonces sous `beni_mellal`. Le paramètre `?cities=5`, que le site publie pourtant dans son propre bloc de filtres, ramenait lui aussi les 30 707 annonces, venues de 11 villes différentes. Rien, dans la réponse, ne signale que le filtre a sauté.

C'est pourquoi chaque recherche relit ici la façon dont Avito a compris la demande — ville, quartier, catégorie, mot-clé — et la renvoie dans `meta.resolved`. Un filtre qu'Avito n'a pas appliqué revient en INVALID_PARAM au lieu de livrer tout le Maroc. Même vigilance pour les annonces retirées : le site les redirige vers une page de recherche avec un statut 200, et c'est ce détour que le moteur repère pour répondre NOT_FOUND.

Nous avons nous-mêmes trébuché sur l'adresse courte des annonces : la première version de `detail` ajoutait un segment de langue que cette adresse n'a pas, et répondait NOT_FOUND pour des annonces bien en ligne. Notre propre test de bout en bout l'a relevé avant la mise en service. Si vous écrivez votre outil, testez-le d'abord sur une annonce dont vous savez qu'elle existe.

Limites et remarques honnêtes

  • Cette API vient de ReefAPI, pas d'Avito.ma, qui ne l'a jamais approuvée ; elle est non officielle, hors de tout accord commercial.
  • Dans l'immobilier, la page de résultats intercale des programmes neufs qui ne sont pas des annonces. Pour les appartements de l'Agdal à Rabat (`category: 1010`), 9 lignes sur 44 n'avaient ni `list_id`, ni adresse, ni catégorie, et 8 d'entre elles se situaient hors de Rabat (Témara, Salé, Kénitra, Mehdya). Écartez les lignes sans `list_id`.
  • La rubrique et le prix sont ceux que le vendeur a choisis : parmi ces appartements « à vendre » de l'Agdal figuraient une location à 13 000 DH, une location à la journée à 800 DH et un studio à 95 DH. Nous ne corrigeons ni la rubrique ni le montant.
  • `currency` reprend l'écriture d'Avito, « DH », et non le code ISO MAD.
  • La casse change d'un endpoint à l'autre pour la même annonce : `seller_type` vaut `PRIVATE` dans `search` et `private` dans `detail`, `ad_type` vaut `SELL` d'un côté et `s` de l'autre. Normalisez avant de croiser les deux.
  • Aucun tri n'est proposé, parce qu'Avito n'en publie pas : les annonces arrivent dans l'ordre du site, emplacements payants compris (5 sur 35 dans l'exemple, repérables par `is_promoted` et comptés dans `meta.promoted_count`). Deux pages consécutives peuvent partager une ou deux annonces, le flux bougeant pendant la lecture.
  • Le numéro de téléphone et l'adresse du vendeur ne sont jamais renvoyés, même quand la page les affiche ; `has_hidden_phone` indique seulement si Avito masque le numéro. Un numéro recopié par le vendeur dans son texte reste, lui, dans `description`.
  • Tarif : 1 crédit par appel, pour `search`, `detail`, `categories` comme `locations`.