/api/v4/listings/scansCréer un listings scan
Lance un audit des fiches de toute entreprise sur le réseau d’annuaires et renvoie aussitôt le scan pour attendre le webhook de fin.
Paramètres
Corps
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
| input | object | obligatoire | Wrapper object. The entire request body must be nested under `input`. |
| input.name | string | obligatoire | Business name, up to 150 characters. |
| input.street | string | obligatoire | Street address, up to 200 characters. |
| input.city | string | obligatoire | City, up to 100 characters. |
| input.stateIso | string | facultatif | State or province code, up to 50 characters. Required for every country except `GB`. |
| input.postalCode | string | facultatif | Postal code, up to 20 characters. Required for every country except `NG` and `AE`. |
| input.countryIso | string | obligatoire | Two-letter ISO 3166-1 country code, for example `US`. |
| input.phone | string | obligatoire | Business phone number with 6 to 15 digits. Local formats are read in the context of `countryIso`, and an international format with a leading `+` works too. |
Exemple de requête
Corps prêt à coller. Remplacez les identifiants et valeurs d’exemple par les vôtres.
{ "input": { "name": "Franklin Barbecue", "street": "900 E 11th St", "city": "Austin", "stateIso": "TX", "postalCode": "78702", "countryIso": "US", "phone": "+15126531187" }}Réponses
200The scan was accepted and is `QUEUED`. `reused` is `false` and `results` is empty until directories are checked. Wait for the `listing_scan.completed` webhook, or poll the scan.
{ "data": { "createListingScan": { "reused": false, "scan": { "id": "TGlzdGluZ1NjYW46N2MxZTRmNTItOWEzYi00ZDY4LWIwZTEtNWYyYThjOWQzZTQ3", "status": "QUEUED", "source": "DIRECTORY_SEARCH", "locationId": null, "resultsAsOf": null, "createdAt": "2026-11-05T07:00:41Z", "startedAt": null, "completedAt": null, "business": { "name": "Franklin Barbecue", "street": "900 E 11th St", "city": "Austin", "stateIso": "TX", "postalCode": "78702", "countryIso": "US", "phone": "+15126531187" }, "summary": { "total": 0, "found": 0, "accurate": 0, "inaccurate": 0, "notFound": 0, "pending": 0, "unavailable": 0 }, "failure": null, "results": [] }, "quota": { "limit": 50, "used": 6, "remaining": 44, "resetsAt": "2026-11-23T12:38:03Z" }, "errors": [] } }}200The request was rejected, so **no scan was created**. The error is reported in `errors[]` on an `HTTP 200`, `scan` is `null`, and `quota` still returns the current allowance. This example is a phone number with too few digits.
{ "data": { "createListingScan": { "reused": false, "scan": null, "quota": { "limit": 50, "used": 5, "remaining": 45, "resetsAt": "2026-11-23T12:38:03Z" }, "errors": [ { "code": "SY83003", "message": "SY83003: Invalid value for phone", "contextInfo": [ { "key": "field", "value": "phone" } ] } ] } }}400A read-only key was used on this write (`SY90016`). Use a Write key.
401Unauthenticated, missing or invalid API key.
429Rate limit exceeded. Retry after the `Retry-After` header value.
Lance une analyse d’une entreprise. L’analyse vérifie si l’entreprise figure dans le réseau d’annuaires et si ses informations y sont exactes : services cartographiques et moteurs de recherche tels que Google, Bing, Apple Maps, Yelp, Facebook et MapQuest, agrégateurs de données et annuaires locaux, ainsi qu’assistants d’IA tels que ChatGPT et Gemini. Selon le pays, une analyse vérifie jusqu’à environ 60 annuaires. L’entreprise n’a pas besoin d’être un établissement de votre compte : vous pouvez donc auditer un prospect ou un client avant son intégration.
L’appel renvoie immédiatement l’analyse avec le statut QUEUED. Les vérifications des annuaires s’exécutent en arrière-plan, et le résultat se consulte avec GET /listings/scans/{scanId}.
Cas d’utilisation : audit des fiches d’un prospect. Votre outil commercial recueille le nom, l’adresse et le numéro de téléphone d’une entreprise. Créez une analyse, enregistrez le scan.id renvoyé et consultez l’analyse terminée via data.scan à la réception de l’événement listing_scan.completed. Le champ summary fournit la synthèse (le nombre d’annuaires dans lesquels l’entreprise a été trouvée et le nombre de ceux dont les informations sont exactes), et results[] fournit les détails par annuaire à afficher dans le rapport.
Cas d’utilisation : vérification de l’état des fiches d’une entreprise que vous gérez déjà. Lancez une analyse à partir des coordonnées de l’un de vos établissements. L’analyse le reconnaît et produit ses résultats à partir des fiches réelles de cet établissement au lieu de lancer une nouvelle recherche (voir Réutilisation et analyses gratuites).
Déroulement d’une analyse jusqu’à sa fin
Une analyse passe par les statuts QUEUED et IN_PROGRESS, puis se termine avec le statut COMPLETED ou FAILED. La plupart des analyses se terminent en 1 à 7 minutes. Si un annuaire n’a pas répondu après environ 15 minutes, son résultat est défini sur UNAVAILABLE et l’analyse se termine avec les autres résultats.
- Privilégiez le webhook. Les événements
listing_scan.completedetlisting_scan.failedsont transmis une fois par analyse, avec le même objet d’analyse que celui renvoyé parGET /listings/scans/{scanId}, résultats inclus. Ils sont envoyés aux comptes pour lesquels les webhooks sont activés et dont l’URL de webhook est vérifiée, et sont signés comme tous les autres événements. Voirlisting_scan.completed. - Utilisez l’interrogation périodique comme solution de repli. Si vous ne pouvez pas recevoir de webhooks, consultez l’analyse toutes les 15 secondes jusqu’à ce que
statussoit égal àCOMPLETEDouFAILED. Une interrogation plus fréquente n’apporte rien et consomme votre quota de requêtes.
Champs obligatoires
name, street, city, countryIso et phone sont toujours obligatoires. Le caractère obligatoire de 2 champs dépend du pays :
Une valeur manquante ou mal formée est rejetée avec SY83003, et l’erreur indique le nom du champ. phone doit comporter entre 6 et 15 chiffres, et countryIso doit comporter 2 lettres.
Réutilisation et analyses gratuites
Une analyse ne correspond pas toujours à une nouvelle recherche. Le champ source de l’analyse renvoyée indique la provenance de ses résultats :
Si vous analysez de nouveau la même entreprise dans les 7 jours, l’analyse existante de votre compte est renvoyée à la place d’une nouvelle analyse, avec reused: true dans la réponse. Aucune nouvelle analyse n’est lancée et aucun nouveau webhook n’est envoyé : consultez donc l’analyse renvoyée (elle peut encore être en cours) au lieu d’attendre un autre événement. Le comportement est identique si vous analysez de nouveau l’un de vos établissements pendant la période de réutilisation.
Quota mensuel
Les Listings scans sont inclus dans les forfaits payants, avec un quota mensuel qui dépend de votre forfait. Ils ne sont pas disponibles avec un accès à la journée gratuit à l'environnement de test. Seul un nouveau scan DIRECTORY_SEARCH est décompté du quota. Les éléments suivants sont gratuits :
- un nouveau scan de la même entreprise dans un délai de 7 jours (
reused: true), - une copie
RECENT_SCAN, - un scan
LOCATION_LISTINGS, - un scan qui échoue, qui n'est pas comptabilisé.
Le quota est réinitialisé à chaque période de facturation de votre compte. Chaque réponse à une demande de création inclut quota avec limit, used, remaining et resetsAt, y compris lorsque la requête est rejetée. Consultez Forfaits et options.
Erreurs
Une demande de création rejetée renvoie une réponse HTTP 200 avec scan: null et le motif dans errors[] ; vérifiez donc errors et pas seulement le code de statut. Les clés en lecture seule ne peuvent pas créer de scans : c'est le seul échec au niveau de la requête, qui renvoie une réponse HTTP 400 avec SY90016.
La liste complète des codes se trouve dans Codes d'erreur.
Remarques.
- Le corps de la requête doit être encapsulé dans un objet
input. - Vérifiez
errors, pas le statut HTTP. Une demande de création rejetée renvoie une réponseHTTP 200. - Les numéros de téléphone sont normalisés avant l'exécution du scan, et deux requêtes qui ne diffèrent que par le format, la casse ou les espaces sont considérées comme portant sur la même entreprise.
- Une demande de création compte pour une requête dans votre limite de débit, quel que soit le nombre d'annuaires vérifiés par le scan.
- Un scan est conservé pendant 90 jours. Passé ce délai, sa lecture renvoie
404avecSY83005. - Cet appel nécessite une clé Write (écriture).
curl -X POST 'https://listingsapi.com/api/v4/listings/scans' \ -H "Authorization: API $LISTINGSAPI_KEY" \ -H 'Content-Type: application/json' \ -d '{ "input": { "name": "Franklin Barbecue", "street": "900 E 11th St", "city": "Austin", "stateIso": "TX", "postalCode": "78702", "countryIso": "US", "phone": "+15126531187" } }'