API

API Tayara.tn : petites annonces tunisiennes en JSON, des voitures à l'immobilier, prix en TND

Sur Tayara.tn, on vend un peu de tout : voitures, appartements, téléphones, électroménager, meubles, et on y publie aussi des offres d'emploi. Cette API lit les annonces publiques et les renvoie en JSON, prix en dinars (TND), avec les filtres du site : catégorie, gouvernorat et délégation (La Marsa à Tunis, Route El Afrane à Sfax, Sousse…), fourchette de prix, et pour une voiture la marque, le modèle, l'année, le kilométrage, le carburant, la boîte et la puissance fiscale. Sans aucun paramètre, `search` parcourt tout le site, des annonces les plus récentes aux plus anciennes. Elle ne publie rien et n'a rien d'un outil pour gérer une boutique Tayara : elle sert à suivre des prix ou à mesurer l'offre d'une région, du point de vue de l'acheteur.

Endpoints

endpointCe qui est renvoyéObligatoires
searchRecherche libre (en français, en arabe ou en translittération) et filtres du site : catégorie et sous-catégorie, gouvernorat et délégations, prix minimum et maximum en dinars, attributs voiture (Marque, Modèle, année, kilométrage, carburant, boîte, carrosserie, couleur, puissance fiscale) et immobilier (vente ou location, chambres, salles de bains, superficie). Tris : plus récentes, plus anciennes, prix croissant ou décroissant. Jusqu'à 100 lignes par page.tous optionnels
listingL'annonce complète par `id` (24 caractères hexadécimaux) ou par `url` : description, prix (avec le prix des données structurées de la page et `price_mismatch`), toutes les photos, attributs (Kilométrage, Boite, Cylindrée, Puissance fiscale…), indicateurs vendu ou supprimé, et le bloc vendeur.tous optionnels
seller_listingsToutes les annonces en ligne d'un vendeur ou d'une boutique, paginées et triables, à partir du `seller.id` que donne `listing` (les lignes de `search` ne le contiennent pas).seller_id
categoriesL'arbre des catégories : 10 catégories principales et leurs sous-catégories, avec les identifiants et les noms français que `search` accepte.tous optionnels
locationsLes 24 gouvernorats et leurs délégations, écrits comme Tayara les filtre.tous optionnels

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

Exemple qui fonctionne

Les Volkswagen Polo à vendre dans le gouvernorat de Sfax, le 28 octobre 2026 : 16 annonces. Six n'avaient pas de prix (`price_tnd` à null, `price_raw` à 0, « Sans prix » sur le site), et une affichait 32 DT, montant qui ne peut pas être celui d'une voiture : certains vendeurs l'écrivent en milliers. Les autres allaient de 13 000 DT pour une Polo 3 à 139 500 DT pour une Polo GTI. La Polo 7 à 32 800 DT, ouverte ensuite avec `listing`, indiquait une année 2012, 180 000 km, une boîte manuelle, un moteur 1.2L et une puissance fiscale de 4 CV. `brand` et `model` s'écrivent exactement comme sur Tayara : « Volkswagen », « Polo ».

Requête
curl -X POST https://api.reefapi.com/tayara/v1/search \
  -H "x-api-key: VOTRE_CLE" \
  -H "content-type: application/json" \
  -d '{"subcategory": "Voitures", "brand": "Volkswagen", "model": "Polo", "governorate": "Sfax", "limit": 30}'
Réponse (abrégée)
{
  "ok": true,
  "data": {
    "query": null,
    "total": 16,
    "page": 1,
    "limit": 30,
    "last_page": 1,
    "has_more": false,
    "sort": "newest",
    "listings": [
      {
        "id": "6ae1cfd728cf9f77de8432b7",
        "url": "https://www.tayara.tn/item/6ae1cfd728cf9f77de8432b7/",
        "title": "polo 6🇩🇪",
        "price_tnd": null,
        "price_raw": 0,
        "currency": "TND",
        "category_name": "Véhicules",
        "subcategory_name": "Voitures",
        "governorate": "Sfax",
        "delegation": "Sfax",
        "published_at": "2026-10-28T10:35:03.000Z",
        "images_count": 10,
        "seller_is_shop": false,
        "is_premium": false
      },
      ...
      {
        "id": "6addfb5428cf9f77de82a9c2",
        "title": "Polo 7 à vendre",
        "price_tnd": 32800,
        "price_raw": 32800,
        "currency": "TND",
        "governorate": "Sfax",
        "delegation": "Route El Afrane",
        "published_at": "2026-10-25T12:51:32.000Z"
      },
      ...
      {
        "id": "6acce94723043fa1d8d70c77",
        "title": "Polo gti",
        "price_tnd": 139500,
        "currency": "TND",
        "delegation": "Sfax Ville",
        "published_at": "2026-10-12T14:05:59.000Z"
      },
      {
        "id": "6ac03775cdf7e8adb5ecafcc",
        "title": "voiture",
        "price_tnd": 32,
        "price_raw": 32,
        "currency": "TND",
        "delegation": "Route El Afrane",
        "published_at": "2026-10-02T23:00:05.000Z"
      },
      ...
    ],
    "filters_applied": {
      "categoryId": "60be84bc50ab95b45b08a094",
      "subCategoryId": "60be84be50ab95b45b08a0a4",
      "adParamsMap": { "Marque": "Volkswagen", "Modèle": "Polo" },
      "governorate": "Sfax"
    }
  },
  "meta": { "record_count": 16, "upstream_requests": 1, "cache_hit": false, "mode": "live" }
}

Scraper Tayara.tn en Python : la barre oblique, la casse et le plafond des 10 000

Les résultats de Tayara viennent d'une interface JSON que le site interroge lui-même, et son adresse se termine par une barre oblique. Sans elle, le serveur répond par une redirection 308. Notre moteur s'y est heurté : lors du premier essai complet, le 7 octobre 2026, il ne suivait pas les redirections et aucune recherche de la batterie de 49 cas n'a abouti. Il appelle désormais directement l'adresse avec la barre oblique.

Les filtres d'attributs respectent la casse, sans prévenir. Lors de nos mesures, « Volkswagen » donnait 753 voitures et « volkswagen » zéro, sans le moindre message d'erreur ; revérifié le 28 octobre, la minuscule renvoie toujours un total nul. Le moteur transmet la valeur telle quelle, mais ajoute un avertissement dans `meta.warnings` dès qu'un filtre d'attribut ne ramène rien.

Le site ne sert que les 10 000 premiers résultats d'une recherche. Au-delà, il répond par une erreur HTTP 500 de 13 octets, alors que le total annonce près de 46 000 annonces sans filtre. `last_page` s'arrête donc à la dernière page réellement accessible (334 à 30 lignes par page) et une page plus lointaine est refusée avant d'être demandée. Pour tout couvrir, découpez par gouvernorat ou par catégorie.

Quand un vendeur change son prix, l'index de recherche et la page de l'annonce ne se mettent pas forcément à jour ensemble : sur une annonce suivie pendant nos tests, la recherche est passée à 600 alors que la page affichait toujours 650. Les lignes de `search` portent le montant de l'index ; pour celui de la page, ouvrez l'annonce avec `listing` et comparez vous-même. Son champ `price_mismatch` ne compare que deux valeurs de la page (prix affiché et données structurées), pas la page et l'index.

Écrire un premier script pour Tayara va vite. Ce qui décide de la justesse des chiffres, ce sont ces quatre détails.

Limites et remarques honnêtes

  • Tayara.tn n'a ni conçu ni approuvé cette interface, et ReefAPI n'a aucun lien commercial avec le site : c'est un accès non officiel.
  • Tayara ne vérifie pas les montants, et nous ne les retouchons pas : 32 DT pour une Polo à Sfax et, lors de nos mesures, un tri des voitures par prix décroissant qui s'ouvrait sur 1 380 000 000 000 DT. « Sans prix » correspond à un montant de 0 ou de 1 : `price_tnd` vaut alors null et `price_raw` garde le chiffre.
  • La recherche libre ne se limite pas aux voitures : « polo 6 » dans le gouvernorat de Tunis a renvoyé 18 annonces, dont 7 de pièces et accessoires (moteurs, amortisseur, autoradio). Ajoutez `"subcategory": "Voitures"` pour ne garder que les véhicules.
  • Les lignes de `search` ne contiennent pas l'identifiant du vendeur. Pour lister toutes les annonces d'un vendeur, passez d'abord par `listing`, qui donne `seller.id`, puis par `seller_listings`.
  • Champs absents parce que Tayara ne les publie pas : position GPS (l'objet est vide sur les annonces), nombre de vues, évaluation du vendeur, date de modification distincte de la date de publication.
  • Les coordonnées sont renvoyées telles que Tayara les affiche : nom du vendeur dans `search`, et dans `listing` deux numéros distincts, celui de l'annonce et celui du compte. Le texte libre en contient aussi : 2 des 4 annonces de l'exemple avaient un numéro dans `description`, champ retiré de l'extrait. Ces numéros sont pour la plupart ceux de particuliers, et un relevé de prix n'en a aucun besoin.
  • Les annonces payantes affichées en tête du site ne sont pas incluses par défaut ; avec `include_premium: true`, elles arrivent à part dans `premium_listings` et ne comptent pas dans `total`.
  • Coût : 2 crédits pour `search`, `listing` et `seller_listings`, 1 crédit pour `categories` et `locations`.