L'endpoint /v1/places/autocomplete est le moteur du champ d'adresse d'un tunnel de commande, d'un formulaire d'inscription ou d'un calculateur de frais de port. Vous envoyez ce que l'utilisateur a saisi jusqu'à présent et vous recevez des suggestions classées par pertinence, chacune avec sa hiérarchie complète déjà résolue pour que vous puissiez afficher Madrid, Communauté de Madrid, Espagne sans un second appel.
Il couvre les niveaux pays, état et ville. Il ne couvre pas les adresses au niveau de la rue ni les points d'intérêt tels que les commerces, les horaires d'ouverture ou les avis.
GET https://api.countrydataapi.com/v1/places/autocomplete
| Paramètre | Type | Requis | Description |
|---|---|---|---|
apikey |
string | Oui | Votre clé d'authentification API |
q |
string | Oui | Ce que l'utilisateur a tapé. Minimum 2 caractères |
country |
string | Non | Restreint les résultats à un pays : id interne, ISO-2, ISO-3 ou nom |
types |
string | Non | Niveaux à chercher, séparés par des virgules : country, state, city. Par défaut les trois |
limit |
number | Non | Nombre de suggestions, 1-20. Par défaut 5 |
lang |
string | Non | Langue des noms retournés. Par défaut en |
sessiontoken |
string | Non | Regroupe toutes les frappes d'un champ en une seule session facturable |
La requête est normalisée avant la recherche, pour que l'utilisateur n'ait pas à se battre avec son clavier :
avila trouve Ávila, munchen trouve München.hospitalet trouve L'Hospitalet de Llobregat.york trouve New York, et pas seulement les noms commençant par York.Les résultats sont classés selon la qualité de la correspondance (nom exact, puis début du nom, puis début d'un mot interne), ensuite du niveau administratif le plus large au plus précis, et enfin par longueur du nom. Le champ match de chaque suggestion indique quelle règle s'est appliquée, ce qui est pratique pour mettre le texte en surbrillance.
curl "https://api.countrydataapi.com/v1/places/autocomplete?apikey=votre-cle-api&q=mad&country=ES&limit=5&lang=fr"
const API_KEY = 'votre-cle-api';
async function search(query, sessionToken) {
const params = new URLSearchParams({
apikey: API_KEY,
q: query,
limit: '5',
lang: 'fr',
sessiontoken: sessionToken,
});
const response = await fetch(
`https://api.countrydataapi.com/v1/places/autocomplete?${params}`
);
return response.json();
}
import requests
response = requests.get(
'https://api.countrydataapi.com/v1/places/autocomplete',
params={
'apikey': 'votre-cle-api',
'q': 'mad',
'country': 'ES',
'limit': 5,
'lang': 'fr',
},
)
data = response.json()
import { CountryDataApi, Places } from '@countrydataapi/sdk';
const api = new CountryDataApi({ apiKey: 'votre-cle-api' });
const session = Places.createSession();
const { suggestions } = await api.places.autocomplete({
q: 'mad',
country: 'ES',
lang: 'fr',
sessiontoken: session,
});
{
"success": true,
"query": "mad",
"suggestions": [
{
"id": "66c7a6c9e4bda21f4ab1a0f1",
"type": "city",
"name": "Madrid",
"description": "Madrid, Communauté de Madrid, Espagne",
"match": "prefix",
"components": {
"city": { "id": "66c7a6c9e4bda21f4ab1a0f1", "name": "Madrid" },
"state": { "id": "66c7a6c9e4bda21f4ab10a22", "name": "Communauté de Madrid" },
"country": {
"id": "66c7a6c9e4bda21f4ab10ef2",
"name": "Espagne",
"iso2": "ES",
"iso3": "ESP",
"phone_code": "+34",
"flag": "🇪🇸"
}
}
}
],
"count": 1,
"session": { "token": "6f9e...", "billed": true, "ttl_seconds": 180 },
"tokens_used": 1,
"remaining_tokens": 4871
}
| Champ | Type | Description |
|---|---|---|
suggestions[].id |
string | À passer à /v1/places/details |
suggestions[].type |
string | country, state ou city |
suggestions[].name |
string | Nom dans la langue demandée |
suggestions[].description |
string | Prêt à afficher : "Madrid, Communauté de Madrid, Espagne" |
suggestions[].match |
string | exact, prefix ou word |
suggestions[].components |
object | Hiérarchie résolue : city, state, country |
session |
object | Présent uniquement si vous avez envoyé un sessiontoken. billed indique si cet appel a été facturé |
Une autocomplétion déclenche une requête à chaque touche. Facturer à la requête ferait qu'un seul champ d'adresse coûterait 8 à 10 jetons et transformerait votre facture en une fonction de la vitesse de frappe de vos utilisateurs.
Envoyez un sessiontoken — n'importe quel UUID, généré au moment où le champ prend le focus — et la session entière coûte 1 jeton, quel que soit le nombre de requêtes nécessaires :
/autocomplete. Seul le premier est facturé./details pour la suggestion choisie par l'utilisateur. Cet appel est gratuit et clôt la session.Les sessions expirent au bout de 3 minutes. Sans sessiontoken, chaque requête coûte 1 jeton.
// Une session par champ d'adresse
let session = crypto.randomUUID();
input.addEventListener('focus', () => { session = crypto.randomUUID(); });
// ...chaque frappe réutilise `session`, donc le champ entier coûte 1 jeton
{
"success": false,
"error": {
"code": "INVALID_PARAMETER",
"message": "Parameter \"q\" is required and must be at least 2 characters long.",
"status": 400
},
"message": "Parameter \"q\" is required and must be at least 2 characters long."
}
Contrairement aux endpoints plus anciens, /v1/places/* retourne un vrai code HTTP (400, 401, 402, 404) accompagné d'un error.code stable. Consultez la documentation des codes d'erreur.
/v1/* envoie Access-Control-Allow-Origin: *, vous pouvez donc appeler l'autocomplétion directement depuis votre frontend sans proxy. Gardez à l'esprit que la clé API est alors visible pour quiconque ouvre les outils de développement : utilisez une clé dont le budget vous convient d'exposer, ou passez par votre propre backend si cela compte pour vous.
country quand vous le connaissez déjà. Moins de suggestions, et meilleures.types=city si le champ concerne spécifiquement une ville.