Utiliser l'API REST publique Nowistay

Tous les articles d'aide
>
Utiliser l'API REST publique Nowistay

L'API REST publique Nowistay permet à vos propres outils, scripts et partenaires de lire et de mettre à jour les données de votre compte Nowistay de façon sécurisée. Vous pouvez lister vos propriétés, récupérer vos réservations, modifier vos réservations directes, créer des missions de ménage ou de check-in, gérer des champs personnalisés sur les réservations et lire un fil d'activité. Tout est documenté, explorable et testable depuis une seule page à l'adresse /public/docs.

Ce guide vous montre deux chemins : la façon la plus rapide d'essayer l'API (le playground interactif des docs) et le flux OAuth standard que vous utiliserez pour votre propre intégration.

Ce que vous pouvez faire avec l'API

  • Propriétés : listez les propriétés de votre compte, avec adresse, capacité, heures de check-in et check-out.
  • Réservations : listez et filtrez les réservations par propriété, canal, statut et dates. Lisez le détail complet d'une réservation. Mettez à jour les réservations directes (dates, infos voyageur, montants, champs personnalisés).
  • Paramètres de réservation : créez vos propres champs personnalisés sur les réservations (par exemple external_status) et fixez leurs valeurs réservation par réservation.
  • Missions : listez les missions de ménage, check-in, check-out et autres. Créez ou modifiez une mission, assignez-la à un membre d'équipe.
  • Équipe : listez vos membres d'équipe, leurs rôles, contacts et propriétés couvertes.
  • Activité : consultez un fil chronologique des événements d'une propriété (mises à jour de réservation, automatisations, événements de serrure connectée).

Avant de commencer

  • Il vous faut un abonnement AI Channel Manager actif sur les propriétés que vous voulez exposer. L'API ne renvoie que les propriétés où cet abonnement est actif.
  • Vous vous connectez en tant qu'hôte ou gestionnaire. L'API n'expose jamais de propriétés qui ne vous appartiennent pas.
  • L'URL de base est https://api.nowistay.com en production et https://api.nowistay.dev en préproduction.
  • Tous les endpoints sous /public/v1/* exigent un token OAuth2, envoyé sous la forme Authorization: Bearer ....

La façon la plus rapide : tester depuis le playground des docs

Ouvrez https://api.nowistay.com/public/docs dans votre navigateur. La page est un Swagger UI complet de l'API, avec un playground OAuth intégré qui enregistre automatiquement un client pour vous. Pas besoin de coder pour tester.

  1. Rafraîchissez la page en mode dur (Cmd+Maj+R sur Mac, Ctrl+F5 sur Windows).
  2. Attendez que la petite bannière en haut affiche OAuth playground ready.
  3. Cliquez sur le bouton vert Authorize en haut à droite.
  4. Dans la fenêtre, à la section OAuth2, cliquez sur Authorize.
  5. Vous êtes redirigé vers la page de connexion et de consentement Nowistay.
  6. Connectez-vous avec un compte hôte ou gestionnaire qui dispose de l'abonnement AI Channel Manager.
  7. Vérifiez les autorisations demandées par le playground et approuvez-les.
  8. Vous revenez sur /public/docs, déjà authentifié.
  9. Ouvrez GET /public/v1/properties, cliquez sur Try it out puis sur Execute.
  10. Vos propriétés apparaissent dans la réponse.

[Capture d'ecran necessaire : la page /public/docs avec la banniere verte "OAuth playground ready" en haut et le bouton Authorize a droite]

À partir de là, vous pouvez essayer chaque endpoint en un clic, voir le JSON exact que Nowistay renvoie et copier la commande cURL correspondante. C'est la façon recommandée d'explorer l'API avant d'écrire du code.

Important. Le client du playground vit uniquement dans votre navigateur. C'est très bien pour tester, mais pour une vraie intégration il faut enregistrer votre propre client OAuth (voir plus bas).

OAuth, en clair

L'API utilise OAuth 2.1 standard avec le flux authorization code et PKCE. En une phrase : l'utilisateur ouvre une page Nowistay, donne son accord, vous recevez un code court, vous l'échangez contre un token d'accès, puis vous appelez l'API avec ce token. Les tokens expirent et peuvent être renouvelés sans redéranger l'utilisateur.

Les trois endpoints OAuth que vous allez utiliser :

  • Enregistrer votre app (une seule fois): /public/oauth/register — POST
  • Envoyer l'utilisateur donner son accord: /public/oauth/authorize — GET (redirection navigateur)
  • Échanger le code contre des tokens: /public/oauth/token — POST

Vous pouvez aussi récupérer les métadonnées OAuth à /.well-known/oauth-authorization-server/public-api, qui liste chaque endpoint et toutes les options supportées.

Les scopes disponibles

Demandez uniquement les scopes dont votre app a vraiment besoin. Moins vous demandez de scopes, plus l'écran de consentement reste lisible.

  • properties.read: Lister les propriétés et leurs infos de base.
  • bookings.read: Lister les réservations et lire le détail d'une réservation (sans les contacts voyageur).
  • bookings.sensitive.read: Ajoute l'email, le téléphone, l'adresse du voyageur et le code de serrure dans le détail.
  • bookings.write: Modifier les réservations directes (dates, montants, infos voyageur).
  • booking_parameters.read: Lister vos champs personnalisés de réservation.
  • booking_parameters.write: Créer des champs personnalisés et fixer leurs valeurs sur les réservations.
  • missions.read: Lister les missions de vos propriétés.
  • missions.write: Créer ou modifier des missions, assigner des membres d'équipe.
  • activity.read: Lire le fil d'activité d'une propriété.
  • team_members.read: Lister les membres d'équipe et leurs propriétés assignées.
  • webhooks.read: Lister vos abonnements webhook et lire leur configuration.
  • webhooks.write: Créer, modifier, mettre en pause et supprimer des abonnements webhook.

Pas à pas : votre propre intégration

Étape 1. Enregistrez votre client OAuth

Appelez POST /public/oauth/register une seule fois. Stockez le client_id (et le client_secret si vous choisissez un token_endpoint_auth_method autre que none).

curl -X POST https://api.nowistay.com/public/oauth/register \
  -H "Content-Type: application/json" \
  -d '{
    "clientName": "Mon integration PMS",
    "redirectUris": ["https://mon-app.exemple.com/oauth/callback"],
    "grantTypes": ["authorization_code", "refresh_token"],
    "responseTypes": ["code"],
    "tokenEndpointAuthMethod": "client_secret_post",
    "scope": "properties.read bookings.read missions.read"
  }'

Réponse (extrait) :

{
  "client_id": "client_2Yw4Rk9pQp",
  "client_secret": "client_secret_example",
  "redirect_uris": ["https://mon-app.exemple.com/oauth/callback"],
  "scope": "properties.read bookings.read missions.read"
}

Astuce : si vous construisez une application monopage ou un outil en ligne de commande sans backend, choisissez "tokenEndpointAuthMethod": "none" et appuyez-vous uniquement sur PKCE (pas de secret client). Le playground des docs Nowistay fait exactement ça.

Étape 2. Envoyez l'utilisateur sur l'URL d'autorisation

Générez une paire PKCE (code verifier et code challenge S256) ainsi qu'une valeur aléatoire state. Puis redirigez l'utilisateur vers :

https://api.nowistay.com/public/oauth/authorize
  ?response_type=code
  &client_id=client_2Yw4Rk9pQp
  &redirect_uri=https://mon-app.exemple.com/oauth/callback
  &scope=properties.read%20bookings.read%20missions.read
  &state=STATE_ALEATOIRE
  &code_challenge=HASH_S256_BASE64URL
  &code_challenge_method=S256

L'utilisateur arrive sur la page de consentement Nowistay, se connecte si besoin, voit les scopes demandés et approuve ou refuse. En cas d'approbation, Nowistay le renvoie sur votre redirect_uri avec un code à usage unique et la même valeur state.

https://mon-app.exemple.com/oauth/callback?code=auth_code_123&state=STATE_ALEATOIRE

Vérifiez toujours que la valeur state reçue correspond à celle que vous avez envoyée. Si elle ne correspond pas, interrompez le flux.

Étape 3. Échangez le code contre des tokens

curl -X POST https://api.nowistay.com/public/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code" \
  -d "code=auth_code_123" \
  -d "redirect_uri=https://mon-app.exemple.com/oauth/callback" \
  -d "client_id=client_2Yw4Rk9pQp" \
  -d "client_secret=client_secret_example" \
  -d "code_verifier=PKCE_VERIFIER_ORIGINAL"

Réponse :

{
  "access_token": "nis_access_token_example",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "nis_refresh_token_example",
  "scope": "properties.read bookings.read missions.read",
  "resource": "https://api.nowistay.com/public/v1"
}

Stockez access_token et refresh_token de façon sécurisée chez vous (côté serveur, chiffrés au repos). Le token d'accès est valable pendant expires_in secondes (1 heure par défaut).

Étape 4. Appelez l'API

Envoyez le token d'accès dans l'en-tête Authorization.

curl https://api.nowistay.com/public/v1/properties \
  -H "Authorization: Bearer nis_access_token_example"

Exemple de réponse :

{
  "data": [
    {
      "id": 101,
      "name": "Appartement Lilas",
      "propertyType": "apartment",
      "capacity": 4,
      "checkInTime": "16:00:00",
      "checkOutTime": "11:00:00",
      "address": {
        "city": "Paris",
        "country": "France",
        "countryCode": "FR",
        "timezone": "Europe/Paris"
      }
    }
  ],
  "pagination": { "page": 1, "limit": 50, "totalItems": 1, "totalPages": 1 }
}

Étape 5. Renouvelez le token quand il expire

Quand l'API renvoie 401 token_expired, rappelez le endpoint de token avec le refresh token. Pas besoin de renvoyer l'utilisateur sur la page de consentement.

curl -X POST https://api.nowistay.com/public/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=refresh_token" \
  -d "refresh_token=nis_refresh_token_example" \
  -d "client_id=client_2Yw4Rk9pQp" \
  -d "client_secret=client_secret_example"

Exemples par endpoint

Lister les réservations d'une propriété sur une plage de dates

curl "https://api.nowistay.com/public/v1/bookings?propertyId=101&fromDate=2026-07-01&toDate=2026-07-31&status=confirmed" \
  -H "Authorization: Bearer nis_access_token_example"

Filtres supportés : propertyId, status, channel, fromDate, toDate. Pagination avec limit (max 100) et offset.

Lire le détail d'une réservation avec les contacts voyageur

Nécessite le scope supplémentaire bookings.sensitive.read. Sans lui, email, phone et le code de serrure ne sont pas inclus.

curl https://api.nowistay.com/public/v1/bookings/9001 \
  -H "Authorization: Bearer nis_access_token_example"

Mettre à jour une réservation directe

Seules les réservations directes (canal direct) créées dans Nowistay peuvent être modifiées. Les réservations qui viennent d'Airbnb, Booking.com, VRBO ou Expedia sont en lecture seule ici, parce que c'est l'OTA qui les détient.

curl -X PATCH https://api.nowistay.com/public/v1/bookings/9001 \
  -H "Authorization: Bearer nis_access_token_example" \
  -H "Content-Type: application/json" \
  -d '{
    "arrival": "2026-07-14",
    "departure": "2026-07-18",
    "adults": 2,
    "children": 1,
    "amount": "620.00",
    "currency": "EUR",
    "notes": "Le voyageur a demande un lit bebe.",
    "silent": true
  }'

Mettez "silent": false si vous voulez que Nowistay envoie les notifications habituelles (messages voyageur, mise à jour des calendriers) suite à la modification. Par défaut c'est silencieux.

Ajouter un champ personnalisé à vos réservations

Les paramètres personnalisés de réservation sont utiles pour refléter sur chaque réservation Nowistay une donnée qui vient de votre propre système.

# Crée le champ une seule fois
curl -X POST https://api.nowistay.com/public/v1/booking-parameters \
  -H "Authorization: Bearer nis_access_token_example" \
  -H "Content-Type: application/json" \
  -d '{"key": "external_status", "name": "Statut externe"}'

# Fixe sa valeur sur une reservation
curl -X PATCH https://api.nowistay.com/public/v1/bookings/9001 \
  -H "Authorization: Bearer nis_access_token_example" \
  -H "Content-Type: application/json" \
  -d '{"customParameters": {"external_status": "ready"}}'

Envoyez null comme valeur pour effacer un champ personnalisé sur une réservation.

Créer une mission de ménage et l'assigner à un membre d'équipe

curl -X POST https://api.nowistay.com/public/v1/missions \
  -H "Authorization: Bearer nis_access_token_example" \
  -H "Content-Type: application/json" \
  -d '{
    "propertyId": 101,
    "bookingId": 9001,
    "missionType": "cleaning",
    "title": "Menage de sortie",
    "scheduledAt": "2026-07-18T11:30:00Z",
    "timezone": "Europe/Paris",
    "assignedTeamMemberId": 301
  }'

Lire le fil d'activité d'une propriété

curl https://api.nowistay.com/public/v1/properties/101/activity?limit=20 \
  -H "Authorization: Bearer nis_access_token_example"

Les événements sont regroupés en trois catégories : booking, mission et automation (messages voyageur, événements de serrure).

Webhooks (événements en temps réel)

Si vous ne voulez pas interroger l'API en boucle pour détecter les changements, vous pouvez vous abonner à des webhooks. Nowistay appellera alors une URL que vous fournissez chaque fois qu'une réservation est créée ou modifiée sur la propriété, en envoyant les mêmes données que GET /public/v1/bookings/{id}.

Deux événements sont supportés aujourd'hui :

  • booking.created : une nouvelle réservation a été enregistrée sur la propriété.
  • booking.updated : une réservation existante a changé (dates, statut, infos voyageur, code de serrure, etc.).

Chaque webhook est lié à une seule propriété et vous pouvez en enregistrer jusqu'à trois par propriété. Les livraisons sont signées (HMAC-SHA256) pour que vous puissiez vérifier qu'elles viennent bien de Nowistay, réessayées avec un délai croissant en cas d'échec, et le endpoint est désactivé automatiquement s'il continue d'échouer pendant plus de 72 heures. Les payloads webhook ne contiennent pas les champs voyageur sensibles (email, téléphone, adresse, code de serrure). Si vous en avez besoin, appelez l'API avec le scope bookings.sensitive.read.

La procédure complète et la vérification de signature sont dans l'article dédié : API publique : recevoir les webhooks de réservation en temps réel.

Limites d'appel

  • Endpoints de lecture : 120 requêtes par minute par client et par route.
  • Endpoints d'écriture (POST, PATCH) : 30 requêtes par minute par client et par route.
  • Endpoints OAuth : 20 requêtes par minute par IP ou par client.

Quand vous atteignez la limite, l'API renvoie 429 Rate limit exceeded. Attendez quelques secondes avant de réessayer.

Format des erreurs

Toutes les erreurs suivent le même format, avec un code stable, un message lisible et un requestId à inclure dans vos demandes au support.

{
  "error": {
    "code": "validation_error",
    "message": "Parameter key must be lowercase snake_case, start with a letter, and be at most 40 characters",
    "requestId": "req_01HYZV5R8G3W9Y2M7K4P6Q1N2A"
  }
}
  • 400: Requête mal formée (corps invalide, champ manquant).
  • 401: Token absent ou invalide.
  • 403: Token valide mais sans le scope requis, ou abonnement AI Channel Manager manquant.
  • 404: Ressource introuvable ou non accessible.
  • 409: Conflit (par exemple, clé de paramètre déjà existante).
  • 422: Validation en échec.
  • 429: Limite d'appel atteinte.

Bonnes pratiques

  • Demandez le plus petit jeu de scopes possible. Ajoutez des scopes plus tard, à mesure que votre intégration grandit.
  • Stockez vos tokens côté serveur. Ne déployez jamais un token longue durée dans un client public et ne le commitez pas dans un dépôt.
  • Traitez les 401 par un refresh. Si le refresh échoue aussi, renvoyez l'utilisateur dans le flux d'autorisation.
  • Utilisez le flag silent en écriture. Mettez-le à true quand vous synchronisez en masse et que vous ne voulez pas déclencher les notifications voyageur.
  • Testez d'abord en préproduction. Pointez votre intégration sur https://api.nowistay.dev pour valider vos flux avant de passer en production.
  • Conservez le requestId dans vos logs. Ça accélère beaucoup la résolution côté support.

Pour aller plus loin

  • Ouvrez la documentation interactive et explorez chaque endpoint : api.nowistay.com/public/docs.
  • Récupérez le schéma complet et le fichier OpenAPI à l'adresse /public/openapi.json.
  • Vous avez besoin d'un scope ou d'un endpoint qui n'existe pas encore ? Écrivez au support en décrivant votre cas d'usage.

Prêt à Mettre Votre Airbnb en Pilote Automatique ?

Rejoignez 300+ professionnels qui automatisent les échanges avec les voyageurs et gagnent un temps précieux.