Ajouter un établissement
Créez un établissement avec les champs requis des plateformes de publication, gérez les erreurs de validation et vérifiez sa soumission en file d’attente.
Les fiches, les avis, les publications et les données analytiques sont tous associés à un identifiant d'établissement. POST /api/v4/locations crée l'établissement et met en file d'attente une fiche par plateforme de publication incluse dans votre forfait.
1. Rassembler les champs obligatoires
Dix champs sont obligatoires. Une entreprise desservant une zone géographique doit également envoyer son adresse complète : avec hideAddress: true, ListingsAPI conserve l'adresse, mais ne la transmet pas aux plateformes de publication. Les plateformes de publication affichent les champs facultatifs omis comme vides ; envoyez donc toutes les informations dont vous disposez.
2. Créer l'établissement
POST /api/v4/locations accepte les champs dans un objet input du corps JSON de la requête. La méthode locations.add() du Python SDK accepte les mêmes champs sous forme d'arguments nommés et valide les champs obligatoires avant d'envoyer la requête. La méthode createLocation() du Node SDK accepte directement l'objet camelCase.
curl -X POST https://listingsapi.com/api/v4/locations \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "name": "Acme Kitchen", "storeId": "ACME-NYC-001", "description": "Acme Kitchen is a family-owned neighborhood restaurant in downtown New York serving wood-fired pizza, hand-rolled pasta, and a short seasonal menu built around produce from nearby farms. Open for lunch and dinner seven days a week, with takeout and delivery available.", "street": "123 Jump Street", "city": "New York", "stateIso": "NY", "postalCode": "10013", "countryIso": "US", "phone": "6443859313", "bizUrl": "https://acmekitchen.example.com", "subCategoryId": 1432, "businessHours": [ { "day": "MONDAY", "type": "OPEN", "slots": [{ "start": "11:00am", "end": "10:00pm" }] }, { "day": "TUESDAY", "type": "OPEN", "slots": [{ "start": "11:00am", "end": "10:00pm" }] }, { "day": "WEDNESDAY", "type": "OPEN", "slots": [{ "start": "11:00am", "end": "10:00pm" }] }, { "day": "THURSDAY", "type": "OPEN", "slots": [{ "start": "11:00am", "end": "10:00pm" }] }, { "day": "FRIDAY", "type": "OPEN", "slots": [{ "start": "11:00am", "end": "11:00pm" }] }, { "day": "SATURDAY", "type": "OPEN", "slots": [{ "start": "12:00pm", "end": "11:00pm" }] }, { "day": "SUNDAY", "type": "CLOSED", "slots": [] } ] }}'3. Lire la réponse
Une création réussie renvoie success: true et le nouvel établissement dans data.createLocation.location. Conservez les deux identifiants : id est la valeur en base64 utilisée par toutes les opérations d'écriture ultérieures, et databaseId est la valeur numérique affichée dans les tableaux de bord et les charges utiles des webhooks.
{ "data": { "createLocation": { "success": true, "errors": null, "location": { "id": "TG9jYXRpb246MTgwMDI5MA==", "databaseId": 1800290, "storeId": "ACME-NYC-001", "name": "Acme Kitchen", "city": "New York", "stateIso": "NY", "countryIso": "US", "status": "PENDING" } } }}status vaut PENDING pendant la validation et la mise en file d'attente de l'établissement. Ce statut évolue sans appel API supplémentaire.
4. Gérer les erreurs de validation
Une création peut échouer à deux niveaux. Une requête mal formée ou une clé incorrecte entraîne le renvoi de 4xx avec un tableau errors au premier niveau. Une requête bien formée contenant un champ rejeté par l'API entraîne le renvoi de 200 avec success: false et le problème dans data.createLocation.errors ; vérifiez donc le corps de la réponse à chaque opération d'écriture, et pas seulement le code de statut.
{ "data": { "createLocation": { "success": false, "errors": [ { "code": "SY10005", "message": "SY10005: description must be at least 200 characters", "path": ["input", "description"] } ], "location": null } }}Les deux SDK lèvent une exception en cas d'échec. En Python, locations.add() vérifie les champs obligatoires localement et lève ValidationError avant d'envoyer la requête. En Node, createLocation() lève ValidationError lorsque l'API rejette les données d'entrée, ce qui explique pourquoi l'exemple ci-dessus ne teste aucun indicateur de réussite.
Les codes que vous rencontrerez le plus souvent :
5. Confirmez que la soumission a commencé
La création de l'établissement met en file d'attente une fiche par plateforme de publication incluse dans votre forfait. Chaque fiche commence à AVAILABLE ou IN_PROGRESS et passe à SYNCED avec un listingUrl une fois que la plateforme de publication l'accepte.
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI5MA==/listings/premium \-H "Authorization: API $LISTINGSAPI_KEY"Lorsque les webhooks sont configurés, aucune interrogation périodique n'est nécessaire. Un événement profile.created est déclenché lorsque l'enregistrement existe, et un événement listing.submission est déclenché pour chaque plateforme de publication à chaque changement de statut.
Étapes suivantes
- Mettre à jour un établissement : modifiez les horaires, indiquez une fermeture temporaire, ajoutez des catégories Google.
- Importer des photos de l'établissement : logo, photo de couverture et images de la galerie.
- Connecter Google et importer des établissements : associez le profil Google Business Profile pour lancer la synchronisation des fiches, des avis et des publications Google.
- Connecter Apple Business Connect : publiez sur Apple Maps via le compte Apple Business vérifié du propriétaire, ou via le compte ListingsAPI si le propriétaire n'en possède pas.
- Vérifier le statut des fiches et les liens vers les fiches en ligne : suivez les soumissions que vous venez de mettre en file d'attente.