Connect (multi-channel)
One hosted entry point that lets your users connect any of 13 channels — Airbnb, Booking.com, Vrbo, Plum Guide, plus 9 property management systems. We render a branded picker, walk the user through the per-channel handoff, and redirect them back to your app when they're done.
How it works
From your server, you create a Connect session. We give you a one-time URL on connect.repull.dev. Send your user there. We render a branded channel picker, the user clicks the channel they manage their listings on, and we take them through the rest of the flow. When everything's done, we redirect them back to your app with status query params on the URL.
- Your server calls
POST /v1/connectwith aredirectUrl. - We return a
urlonconnect.repull.dev. - Redirect your user there.
- The picker shows a card for every channel they can connect (or just the ones in your
allowed_providerslist, if you set one). - The user picks a channel; we walk them through that channel's connection pattern.
- The user lands on your
redirectUrlwhen the connection is live.
Already know which channel you want?
The four connection patterns
Every channel falls into one of four patterns. The picker handles the differences for you — but if you build your own picker against GET /v1/connect/providers, you'll see these in the response.
- OAuth— the user is redirected to the channel's consent screen, approves access in one click, and we exchange the resulting code for tokens. Used by Airbnb today; coming for Hostaway, Guesty, BookingSync.
- Credentials— we render a hosted form that collects API keys (or a client ID / secret pair). On submit we validate against the channel's API and persist on success. Used by Plum Guide and most PMSes.
- Activation— push-only channels (Vrbo). We generate a Basic-Auth credential pair, show the user a 3-step checklist for enabling Repull on the channel's side, and mark the connection live when the channel sends its first inbound request.
- Claim— connectivity-provider designation (Booking.com). We hold the platform-level secret; the user designates Repull as their connectivity provider in the channel's Extranet, then hands us a Hotel ID to claim.
Start a Connect session
Server-to-server. Authenticate with your live API key. The session expires after 30 minutes if the user doesn't finish.
curl -X POST 'https://api.repull.dev/v1/connect' \
-H 'Authorization: Bearer sk_live_...' \
-H 'Content-Type: application/json' \
-d '{
"redirectUrl": "https://yourapp.com/connect/done",
"allowed_providers": ["airbnb", "hostaway", "guesty"]
}'Body parameters
redirectUrlstringRequiredWhere we send the user when they finish (or cancel). We append status query params to this URL.
statestringOpaque correlation token. Echoed back in the response so you can match the session to a user without storing the session ID server-side.
allowed_providersstring[]Optional whitelist of channel IDs the picker should show. Omit to show every channel.
localestringOptional language for the hosted Connect pages. Any supported code — currently 'en' or 'fr'. See Localizing your Connect pages for the full resolution order.
Show the pages in your user's language
locale here, append ?locale=fr to the returned URL, or set a workspace default — see Localizing your Connect pages.Response
{
"sessionId": "cs_8gQrT2v9k3M4nLp7wJxYzAbCdEfGhIjKlMnOp",
"url": "https://connect.repull.dev/cs_8gQrT2v9k3M4nLp7wJxYzAbCdEfGhIjKlMnOp",
"expiresAt": "2026-04-29T18:25:14.000Z",
"state": null
}List supported channels
The full registry is public. Use it to build your own picker or to validate which IDs you can pass to allowed_providers. No API key required.
curl https://api.repull.dev/v1/connect/providers
Each entry includes the channel ID, display name, category (ota or pms), connection pattern, status (live, beta, or coming-soon), logo URL, and a one-line description. The picker sorts OTAs first, then PMSes alphabetically.
Handle the redirect back
When the connection completes (or fails), we redirect the user to your redirectUrl with these query params appended:
?status=connected&provider=hostaway&accountId=42 # or ?status=cancelled ?status=expired
On connected, query GET /v1/connect/{provider} to confirm the connection is live and pull host metadata. For activation-pattern channels (Vrbo) the connection is pending until the channel pushes its first request — you'll get an account.created webhook event when that happens.
Prefer a popup? Listen for postMessage
The redirect above is one of two completion paths. If you open the Connect URL in a popup rather than navigating the whole page, the hosted page posts a message back to window.opener and closes itself — your app never leaves the screen. It emits one of three messages, each carrying the sessionId correlation value and the provider:
repull:connect:completed { sessionId, provider, connectionId } // live
repull:connect:error { sessionId, provider, error } // failed
repull:connect:close { sessionId, provider } // cancelled / expiredFull listener example
event.origin to https://connect.repull.dev and correlate on sessionId. See the complete round-trip — popup open, origin check, the three message types, and the redirect fallback when there's no opener — on OAuth Connect → Popup completion.