Valutazione tecnica
Le domande di integrazione che le piattaforme SaaS ci mandano prima di una prima call, ognuna con la risposta su ciò che esiste oggi e il link alla documentazione relativa. Parti dal Quickstart e dal riferimento API se vuoi prima smanettare con l’API. La parte commerciale è in Repull per le piattaforme.
D1 – D7
Sì. È esattamente ciò per cui è fatto il flusso Connect ospitato: ognuno dei tuoi utenti finali autorizza il proprio account di canale (per esempio il proprio account host Airbnb) nel tuo workspace Repull. Ogni account collegato ha il suo tracciamento, i suoi token e il suo monitoraggio dello stato.
Non c’è un limite tecnico agli account collegati. I piani si pagano per annuncio: Free copre fino a 3 annunci, Starter costa 99 $/mese con 10 annunci inclusi e 5 $ per annuncio dall’11° fino a 100, e oltre i 100 annunci (dove finisce una piattaforma che serve molti host) c’è un piano Custom con prezzi a volume e un unico workspace partner per tutti i tuoi clienti.
Docs: Prezzi, Repull per le piattaforme.
Sì. I token di accesso e di refresh sono salvati per account collegato, completamente isolati. Se un utente revoca l’accesso, la revoca riguarda solo il suo account: ricevi un webhook account.disconnected per quell’account con un motivo leggibile da macchina, e tutti gli altri continuano a sincronizzarsi.
Sì. Passa il tuo id utente interno come state quando crei la sessione Connect. Quando l’utente ha finito, il webhook connect.session.completed ti restituisce quello state insieme all’account collegato, così li associ una volta sola. Da lì in poi ogni consegna webhook contiene un blocco account (provider e externalAccountId, l’id del provider stesso) più gli header X-Repull-Account e X-Repull-Account-Id, e prenotazioni, conversazioni e recensioni riportano lo stesso account su ogni record.
Docs: OAuth Connect, Webhook.
Sì. GET /v1/connect elenca tutte le connessioni del tuo workspace (id, provider, stato, id dell’account esterno). C’è anche un endpoint di stato dedicato per canale, per esempio GET /v1/channels/airbnb/connection, che restituisce ogni account Airbnb collegato con il suo stato e il motivo dell’ultima disconnessione, pensato per essere interrogato da una pagina di stato.
Docs: Riferimento API, Connect.
Sì, esattamente così:
POST /v1/connect restituisce l’URL di una sessione ospitata (valida 30 minuti)redirectUrl con status=connected&accountId=… e il tuo stateaccount.created e connect.session.completedDocs: Connect, Quickstart.
Sì, dall’inizio alla fine: login Airbnb, gestione di permessi e scope (sola lettura, messaggistica o accesso completo), scambio dei token, token di refresh e scadenze li gestisce Repull. Quando un refresh viene rifiutato o l’accesso viene revocato a monte, l’account viene segnalato e ricevi account.disconnected con un motivo (refresh_token_rejected, auth_expired, revoked_upstream, manual_disconnect), così puoi rimandare l’utente nello stesso flusso ospitato per autenticarsi di nuovo.
Docs: Canale Airbnb.
D8 – D9
Sì. Non c’è una sandbox separata: ogni account riceve una chiave sk_live_* alla registrazione (piano gratuito, senza carta), quindi fai i test direttamente sull’API reale: crei proprietà, prenotazioni e sottoscrizioni webhook vere e le elimini quando hai finito. Il sistema di webhook ha strumenti di test propri: POST /v1/webhooks/{id}/test/{event_type} invia payload di esempio realistici per ogni tipo di evento, più endpoint di ping e reinvio e log completi delle consegne.
Una precisazione onesta: Airbnb non offre account host di sandbox, quindi un test OAuth completo richiede un vero login Airbnb in qualsiasi ambiente. Tutto quello che viene dopo (webhook, formati dei dati, gestione degli errori) si testa per intero con eventi di esempio, senza una connessione Airbnb reale.
Docs: Gestire i webhook.
Sì.Le pagine Connect ospitate sono in white label per workspace: nome dell’app, logo (versione chiara e scura), colori primario e d’accento per entrambi i temi, email di supporto nel footer, i tuoi URL di termini e privacy, un URL di redirect predefinito e una lingua predefinita. L’URL resta su connect.repull.dev e la pagina ha un link “Powered by Repull”.
Docs: Connect Widget.
D10 – D14
Sì. Un utente può avere più connessioni insieme (Airbnb, Booking.com, Vrbo e un PMS), e un workspace può avere molti account per canale: molti host Airbnb, molte strutture Booking.com, molti account Vrbo. L’unico limite oggi è una connessione per gestionale (PMS) per workspace. La sessione ospitata può mostrare un selettore multicanale o essere limitata a provider specifici con allowedProviders.
Docs: Connect (multicanale), Copertura PMS.
Sì. DELETE /v1/connect/{provider} revoca il token OAuth dove il canale lo consente, cancella le credenziali salvate e ferma tutti i job di sincronizzazione di quella connessione. Passa un accountId per scollegare un account senza toccare gli altri sullo stesso canale.
Sì. GET /v1/listings ha paginazione a cursore e si filtra con ?channel=airbnb|booking|vrbo. Ogni annuncio ha un array channels[] con la piattaforma, l’id originale della proprietà sul canale (externalId) e lo stato di attivazione e sincronizzazione, così sai sempre a quale canale appartiene ogni proprietà e qual è il suo id nativo. Espansioni opzionali con ?include=content,details,amenities.
Docs: Elencare le proprietà, Dettagli della proprietà, Contenuti e dettagli dell’annuncio.
Airbnb: sì, con POST /v1/reviews/{id}/reply, se l’host si è collegato con accesso completo. Airbnb consente di scrivere sulle recensioni solo con il suo permesso di gestione delle proprietà, quindi le connessioni in sola lettura e di messaggistica leggono le recensioni ma non possono rispondere. Booking.com e Vrbo: in test. Le risposte passano dallo stesso endpoint, ma non sono ancora state provate su una recensione reale.
Docs: Recensioni, OAuth Connect.
Sì. GET /v1/reviews è un flusso unificato di recensioni da tutti i canali (Airbnb, Booking.com, Vrbo) con filtri per piattaforma, annuncio, intervallo di voto, con o senza risposta, e recensioni dell’ospite o dell’host. Gli aggiornamenti, risposte dell’host comprese, finiscono sugli stessi record.
I webhook review.created e review.responded ti avvisano quando arriva una recensione o riceve una risposta. L’endpoint è servito dal nostro database, mai da una chiamata live al canale, quindi interrogarlo costa poco.
Docs: Elencare le recensioni.
D15
Il catalogo aggiornato è su Tipi di eventi webhook e in formato leggibile da macchina su GET /v1/webhooks/event-types (con payload di esempio). Eventi attuali:
reservation.createdreservation.updatedreservation.cancelledreservation.message.receivedreservation.message.sentreservation.message.updatedreservation.alteration.createdreservation.alteration.respondedreservation.request.createdreservation.request.updatedinquiry.createdinquiry.updatedlisting.createdlisting.updatedlisting.deletedlisting.suspendedlisting.reactivatedcalendar.updatedaccount.createdconnect.session.completedaccount.disconnectedreview.createdreview.respondedai.operation.completedai.operation.failedpayment.completedpayment.refundedpayout.completedmigration.completedmigration.failedrepull.pingusage.quota.warningLe consegne sono firmate HMAC-SHA256 (in stile Stripe), con tentativi automatici, reinvio e log completi: Verificare le firme, Tentativi, Gestire i webhook.
D16 – D17
Le sincronizzazioni sono job in background. Collegare un account avvia in parallelo più pipeline (annunci, calendario e prezzi, messaggi, recensioni, transazioni) sulla nostra infrastruttura di code; tu non devi gestire niente. La durata della sincronizzazione iniziale dipende soprattutto dai limiti del canale stesso, quindi cresce con la dimensione dell’account: i portafogli grandi finiscono in background mentre la connessione è già utilizzabile.
Le letture hanno paginazione a cursore fino a 100 elementi per pagina (stabile a qualsiasi profondità), quindi 100.000 recensioni sono circa 1.000 chiamate, niente rispetto al limite predefinito di 600 richieste al minuto. Le modifiche arrivano via webhook, così non devi mai ripassare tutto.
Docs: Limiti di richieste, Idempotenza.
Sono sincronizzati. Repull sincronizza i dati dei canali nel nostro database e serve l’API da lì. È una scelta di progetto centrale: letture veloci e coerenti che non si bloccano mai sull’API di Airbnb né ne subiscono i limiti, e la tua app continua a funzionare anche quando la fonte ha problemi. Le risposte includono un blocco data_freshness (last_synced_at, indicatore di dati non aggiornati) così sai sempre quanto sono freschi i dati.
D18 – D20
Per annuncio, con una quota di chiamate API per piano, non per prenotazione, recensione, webhook o account collegato. Free: 0 $, fino a 3 annunci, 1.000 chiamate/mese. Starter: 99 $/mese, 10 annunci inclusi, 5 $ per annuncio dall’11° fino a 100, 100.000 chiamate/mese, webhook inclusi. Custom: oltre 100 annunci con prezzi a volume e limiti API su misura per la tua integrazione.
Docs: Prezzi, Crediti e utilizzo.
È territorio del piano Custom. Il prezzo a quella scala dipende dagli annunci per utente e dal volume API, e lo impostiamo come una partnership di piattaforma, non come una tariffa per postazione. Mandaci i tuoi numeri e ricevi una proposta concreta: come funzionano i prezzi per le piattaforme.
Starter include supporto via email; Custom include supporto prioritario via email e, per un’integrazione di piattaforma grande, possiamo aprire un canale condiviso con il nostro team di ingegneria.
Nel quotidiano l’API è pensata per cavarsela da sola: ogni risposta di errore contiene un request_id, un codice leggibile da macchina, un campo fix con il passo successivo esatto e un link diretto alla documentazione degli errori.
Domande? hello@repull.dev