Développeurs
L'API AutoRadar
Intégrez la recherche en direct d'AutoRadar à vos outils : annonces de voitures et de pièces des sites suisses, statistiques de marché, alertes et webhooks. API REST en JSON, authentification par clé, spécification OpenAPI 3.1.
Démarrer en 3 étapes
- Créez une clé dans votre espace développeur, avec seulement les droits nécessaires. Elle n'est affichée qu'une fois.
- Rangez-la côté serveur, par exemple dans la variable d'environnement
AUTORADAR_API_KEY. - Appelez l'API avec l'en-tête
Authorization: Bearer <clé>:
curl -s "$AUTORADAR_URL/api/v1/listings/search?make=Volkswagen&model=Golf&fuel=diesel&price_max=20000" \
-H "Authorization: Bearer $AUTORADAR_API_KEY"Authentification
- Uniquement par l'en-tête
Authorization: Bearer ar_live_…. Une clé passée dans l'URL (?api_key=) est refusée : elle finirait dans les journaux et l'historique. Révoquez-la si cela arrive. - Les cookies ne sont jamais utilisés par l'API : appelez-la depuis votre serveur.
- Restrictions possibles par clé : adresses IP (ou blocs CIDR) et origines navigateur. Sans origine déclarée, un appel venant d'un navigateur est refusé (
cors_denied). - Une clé peut expirer, être révoquée ou être remplacée (rotation) à tout moment depuis votre espace.
Droits (scopes)
search:read— Rechercher des voitures (synchrone et asynchrone)parts:read— Rechercher des pièceslistings:read— Lire le détail d'une offremarket:read— Lire les statistiques de marchéalerts:write— Créer et supprimer des alerteswebhooks:write— Gérer les webhooks
Un endpoint sans droit suffisant répond 403 insufficient_scope. Les endpoints /me et /sources sont accessibles à toute clé valide.
Limites de débit et quotas
Chaque clé a une limite par minute (fenêtre glissante) et un quota mensuel, selon votre offre au moment de sa création :
| Offre | Requêtes par minute | Requêtes par mois et par clé | Clés actives |
|---|---|---|---|
| Gratuit | 30 | 2'000 | 2 |
| Pro | 60 | 20'000 | 5 |
| Garage | 120 | 100'000 | 10 |
Chaque réponse porte X-RateLimit-Limit et X-RateLimit-Remaining. Au-delà : 429 avec Retry-After (secondes). Respectez-le avant de réessayer, avec un délai croissant.
Crédits
Certains endpoints consomment des crédits, débités à l'appel et rendus automatiquement si la réponse est une erreur :
- API · recherche d'annonces : 1 crédit(s) · Chaque appel GET /api/v1/listings/search
- API · recherche de pièces : 1 crédit(s) · Chaque appel GET /api/v1/parts/search
- API · statistiques de marché : 1 crédit(s) · Chaque appel GET /api/v1/market/models/…
- API · positionnement de prix : 2 crédit(s) · Chaque appel GET /api/v1/market/price-position
- Alerte supplémentaire : 3 crédit(s) · Chaque alerte au-delà du quota inclus dans votre offre
Solde insuffisant : 402 insufficient_credits. Les crédits s'achètent sur la page Crédits. GET /me renvoie votre solde et l'usage du mois.
Pagination
Les recherches synchrones renvoient data, total et next_cursor. Pour la page suivante, repassez exactement les mêmes paramètres avec ?cursor=<next_cursor> (20 résultats par défaut, limit jusqu'à 50). Un curseur est lié à sa requête : avec d'autres paramètres, il est refusé (invalid_cursor). Les recherches asynchrones se paginent avec page et per_page.
Recherches synchrones et asynchrones
GET /listings/search et GET /parts/search répondent en 8 secondes au plus avec les sites déjà disponibles. Si complete vaut false, lancez une recherche complète avec POST /searches (réponse 202), puis suivez-la par GET /searches/{id} ou recevez le webhook search.completed.
Crédits d'une recherche asynchrone : débités au lancement (même tarif que la recherche synchrone). Ils sont rendus automatiquement si la recherche échoue avant d'avoir interrogé un site (demande inexploitable unusable_query, erreur interne au départ) ou si vous l'annulez (DELETE /searches/{id}) tant qu'elle est encore en attente (queued). Une recherche déjà lancée reste due, même annulée.
# 1. Lancer la recherche complète (202 Accepted)
curl -s -X POST "$AUTORADAR_URL/api/v1/searches" \
-H "Authorization: Bearer $AUTORADAR_API_KEY" -H "Content-Type: application/json" \
-d '{"mode":"achat","ask":"skoda octavia combi diesel","criteria":{"priceMax":"25000"}}'
# → {"id":"srch_…","status":"queued","url":"/api/v1/searches/srch_…", …}
# 2. Suivre la progression (ou recevoir le webhook « search.completed »)
curl -s "$AUTORADAR_URL/api/v1/searches/srch_…?page=1&per_page=50" -H "Authorization: Bearer $AUTORADAR_API_KEY"Webhooks
Événements disponibles : search.completed, alert.match, price.drop. Chaque envoi est signé (AutoRadar-Signature, HMAC-SHA256) : vérifiez-le avant tout traitement. Exemples en Node, Python et PHP : vérifier un webhook.
Erreurs
Format : { "error": { "code", "message", "request_id" } }. Indiquez le request_id (aussi dans l'en-tête X-Request-Id) si vous nous contactez.
| HTTP | Code | Signification |
|---|---|---|
| 400 | invalid_request | Paramètre inconnu, répété ou invalide (le message précise lequel). |
| 400 | key_in_url | Clé passée dans l'URL : refusée. Révoquez-la, elle a pu être exposée. |
| 400 | invalid_cursor | Curseur expiré ou provenant d'une autre requête. |
| 400 | invalid_json | Corps de requête qui n'est pas du JSON valide. |
| 413 | payload_too_large | Corps de requête trop volumineux. |
| 415 | unsupported_media_type | Envoyez « Content-Type: application/json ». |
| 422 | invalid_request | Corps JSON valide mais refusé (critère inconnu, valeur hors limites…). |
| 401 | invalid_key | Clé absente, mal formée ou inconnue. |
| 401 | key_revoked / key_expired | Clé révoquée ou expirée : créez-en une nouvelle. |
| 402 | insufficient_credits | Solde de crédits insuffisant pour cet endpoint. |
| 403 | insufficient_scope | La clé n'a pas le droit requis par l'endpoint. |
| 403 | ip_not_allowed / cors_denied | Adresse IP ou origine navigateur non autorisées pour cette clé. |
| 404 | not_found | Ressource inconnue ou appartenant à un autre compte. |
| 429 | rate_limited / quota_exceeded | Trop de requêtes par minute, ou quota mensuel atteint : respectez Retry-After. |
| 500 | internal_error | Erreur de notre côté : réessayez plus tard avec le request_id si vous nous contactez. |
| 503 | api_unavailable / api_disabled / busy | API momentanément indisponible, désactivée ou surchargée : réessayez plus tard. |
Sources et redistribution
L'API ne renvoie que les offres des sites dont l'accord autorise la redistribution (liste : GET /sources). Chaque offre indique sa source, la date de lecture et le lien vers l'annonce d'origine, à afficher. Les coordonnées des vendeurs particuliers ne sont jamais renvoyées. Voir les conditions d'utilisation de l'API.