Repull for platforms: how it works when your customers are the hosts
These are the questions platforms actually ask before they commit — one agreement or many, what the unit is, who gets billed, what white-label really covers, and what happens at a few thousand properties. Answered with what exists today, including the parts that do not exist yet. Nothing here quotes a price: the commercial half is a conversation, and this page is the honest technical half you need before having it.
The shape, in one paragraph
A workspace is the tenant. It holds the channel connections, the listings, the reservations, the webhooks and the API keys, and nothing crosses between workspaces. A key resolves to exactly one workspace. There is no object above a workspace, so a platform serving many customers runs one workspace per customer and holds the keys. That is the whole model — everything below is a consequence of it.
| Unit | What it is | What it bounds |
|---|---|---|
| Workspace | The tenant. One per end customer in a platform integration. | Data isolation, billing identity, webhook subscriptions. |
| Connection | One connected account of one channel inside a workspace. | One per channel per workspace. Airbnb can carry several host accounts inside it. |
| Listing | A connected property. | What is active and syncing. |
| API key | Bearer credential resolving to one workspace. | Scopes limit operations, never a subset of listings. |
Question 1
Can one platform hold a single agreement with Repull while providing the integration to many of its own users?
Yes, and that is the normal shape: the agreement sits with the platform, and the platform provides channel connectivity to its own customers as a feature of its product. In the product today that looks like one Repull workspace per end customer, with the platform holding the API keys. A workspace is the isolation boundary — its connected channel accounts, listings, reservations, webhooks and keys are its own and are never visible to another workspace. There is no sub-account or parent-child object above a workspace, so "one platform, many customers" is a set of workspaces the platform administers rather than a nested hierarchy. How the agreement itself is papered is a conversation, not a published plan.
In practice the platform never asks its customers to sign anything with us, never shows them our brand except for one attribution link on the Connect page, and never hands them a credential. Your user clicks “connect Airbnb” inside your product, completes a hosted flow wearing your branding, and comes back. What you hold is the key to their workspace.
Onboarding one end customer
// One workspace per end customer; your product holds the key.
// 1. Mint a hosted Connect session for that customer's workspace.
const res = await fetch('https://api.repull.dev/v1/connect', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + customerWorkspaceKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
redirectUrl: 'https://your-product.com/channels/done',
state: yourInternalUserId, // echoed back to you
allowedProviders: ['airbnb', 'booking', 'vrbo'],
locale: 'en',
}),
})
// 2. Redirect the user. They land on your branded Connect page,
// pick a channel, authorise, and come back to your redirectUrl
// with the status and your state.
const { url } = await res.json()The honest caveat
Question 2
How is it structured — per property, per user, or per connection?
The technical units are workspace, connection, listing and API key. A workspace is the tenant boundary and the identity a key resolves to. A connection is one connected account of one channel inside a workspace: a workspace holds one Airbnb connection, one Booking.com connection and so on, and Airbnb is the one channel that can carry several host accounts inside that single connection, each disconnectable on its own. A listing is a connected property. An API key is scoped to a whole workspace — scopes narrow which operations a key may call, never which listings it may see, so a key that can read reservations can read all of that workspace’s reservations. What gets counted commercially is a separate question from how it is modelled, and it is one worth answering against a real shape rather than guessing at in public.
- One connection per channel per workspace. This is enforced in the data model, not a convention. If two of your end customers each have an Airbnb account, they need two workspaces — that is the single most important consequence of the model to design around.
- Airbnb is the exception, partly. A workspace's Airbnb connection can carry more than one host account, and
DELETE /v1/connect/{provider}takes anaccountIdso you can disconnect one without touching the others. - Keys are workspace-wide. You cannot issue a key that sees only some listings. Scopes narrow what a key may do, never what it may see. If per-listing isolation matters to your product, the boundary you want is a workspace.
- Listings are the thing that scales. Properties can be deactivated and reactivated in bulk with
POST /v1/listings/status; a deactivated listing keeps syncing and keeps its data, it just stops being readable and writable through the API.
Question 3
Can the end customer be billed directly rather than the platform?
Not as a platform feature today. Billing attaches to a workspace, so the party that owns the workspace is the party that is billed. There is no reseller billing object, and no mechanism for Repull to invoice a platform’s end customers on the platform’s behalf while the platform keeps administrative control. What does work is the other direction: an end customer can own and pay for their own workspace and give the platform a key to it. If billing your customers through us is a requirement rather than a preference, say so — it is the kind of thing worth building for the right partner, and it is not something to pretend already exists.
Is customer-direct billing a requirement for you?
If your model depends on us invoicing your customers while you keep administrative control, tell us the shape you need. It does not exist today, and it is a concrete thing to build with a partner behind it rather than a maybe.
Email hello@repull.devQuestion 4
If the end customer pays directly, can the platform still use the API inside its product?
Yes. Access follows the API key, and a key belongs to a workspace rather than to a person, so a customer who owns their own workspace can issue a key and hand it to the platform. The platform’s product then calls the API against that workspace exactly as if it were its own. The one constraint is that a key never reaches across workspaces: one key reads and writes one workspace, so a customer-pays model means holding one key per customer and storing them securely. Which model to pick usually comes down to who should own the relationship, the onboarding flow and the support burden — not to what the API allows, because it allows both.
| Platform holds the keys | Customer owns the workspace | |
|---|---|---|
| Who signs up | You, once per customer | Your customer |
| Who is billed | You | Your customer |
| Who holds the key | You | Your customer, who shares it with you |
| Onboarding UX | Fully inside your product, with your branding on Connect | Your customer leaves to sign up, then returns with a key |
| If they churn from you | You disable the workspace | They keep the workspace and the connections |
| Support surface | Yours | Split between you and us |
Both work technically. The second is genuinely better in one case: a customer large enough to want their own relationship, their own invoice and their own continuity if they ever leave your product. For everyone else the first is less friction and fewer credentials in your database.
Question 5
Are there partner, reseller, white-label or volume arrangements for SaaS platforms?
Commercially, yes — platform arrangements are exactly the conversation we want to have, and the terms are set per partner rather than published. Technically, white-labelling today means the hosted Connect pages a platform’s users land on carry the platform’s brand: app name, light and dark logos, primary and accent colours for both themes, support email, terms and privacy links, a default redirect back into the product, and a default language. What it does not mean: the Connect URL stays on connect.repull.dev, the page carries a "Powered by Repull" link, and there is no custom domain and no email sent from a partner domain. Everything past that — reseller terms, volume arrangements, co-marketing — is a conversation.
| Today | |
|---|---|
| Brand name on the hosted Connect pages | Yes |
| Your logo, light and dark variants | Yes |
| Your primary and accent colours, both themes | Yes |
| Your support email in the footer | Yes |
| Your terms and privacy links | Yes |
| Default redirect back into your product | Yes |
| Default language for the hosted pages | Yes |
| Connect served from your own domain | No — the URL stays on connect.repull.dev |
| Attribution removed | No — a "Powered by Repull" link is present |
| Email sent from your domain | No |
Set it once at /dashboard/settings/connect and it applies to every channel your users connect. The flow itself is the same shape as Stripe Connect or Plaid Link: your server mints a session and reads a status, and never touches a channel credential.
Question 6
What happens at several hundred or several thousand connected properties?
The API is built for that size: heavy list endpoints are keyset-cursor paginated with an offset alias for shallow paging, batch surfaces exist so you are not making one call per property (PATCH /v1/availability/batch, POST /v1/listings/pricing/bulk, POST /v1/listings/status), writes take an Idempotency-Key so a network timeout cannot double-book, and webhooks with delivery logs and replay mean you do not poll. The part that needs a conversation at that size is not throughput, it is shape: thousands of properties spread across many end customers means many workspaces and many keys, and provisioning and key custody are worth designing with us before they are built.
- Paginate with cursors. The heavy list endpoints are keyset-paginated, so page cost stays constant however deep you go.
?offset=exists as an alias for shallow paging and is the wrong tool for a full sweep. - Write in batches.
PATCH /v1/availability/batchfor calendar values across many properties,POST /v1/listings/pricing/bulkfor pricing decisions, andPOST /v1/listings/statusfor activation. One call, many properties, partial failures reported per item rather than failing the batch. - Send an idempotency key. Every write that creates something takes
Idempotency-Key. At platform volume a timeout is not an edge case, it is Tuesday. - Subscribe, do not poll.
POST /v1/webhooksper workspace, with delivery logs, replay and a test-fire endpoint per event type so you can build the handler before the first real event.
The two reads a platform support screen needs
# What is connected, for a support screen. curl https://api.repull.dev/v1/connect \ -H 'Authorization: Bearer sk_live_...' # What this workspace has consumed, for your own metering. curl https://api.repull.dev/v1/usage/summary \ -H 'Authorization: Bearer sk_live_...'
Planning for a few thousand properties?
Bring the number of end customers, the channel mix and how fast you expect to onboard them. Provisioning and key custody at that size are worth designing together before you build them.
Email hello@repull.devQuestion 7
Are there setup, transaction or usage fees to plan for?
Usage is metered per workspace and is visible to you in the API before it is ever a surprise: GET /v1/usage/summary, GET /v1/usage/logs and GET /v1/usage/tier report what a workspace has consumed and what it is entitled to, so a platform can watch its own customers’ consumption programmatically. There is also no separate paid sandbox to budget for — you build against the real API from the first key. What any of it costs for a platform is deliberately not published, because a number that is right for a ten-customer integration is wrong for a thousand-customer one. Bring your shape and your volume and you will get a straight answer.
The reason there is no number on this page is not coyness. Platform arrangements differ by an order of magnitude depending on how many end customers sit behind them, which channels they use and who carries first-line support — and a figure published for one of those shapes is actively misleading for the others. What you can verify yourself before any conversation is the consumption: the usage endpoints report what a workspace has used and what it is entitled to, so you can model your own economics from real numbers rather than from ours.
Get the commercial answer for your actual shape
Send the number of end customers, the channels they need and roughly how many properties each one runs. You will get a concrete proposal back rather than a pricing table that does not fit.
Email hello@repull.devQuestion 8
What is the recommended commercial model for a platform embedding Repull?
One workspace per end customer, keys held by the platform, one agreement with us. The reasoning is structural rather than commercial: the workspace is the only isolation boundary that exists, and API keys are workspace-wide, so putting several customers in one workspace would hand every key holder every customer’s data. Holding the keys yourself keeps the onboarding flow, the Connect branding and the support surface inside your product, which is usually what a platform wants. Move to customer-owned workspaces only when a customer specifically wants their own billing relationship with us. Either way, mint a Connect session per customer with your own correlation token, store the account id it returns against your user, and subscribe one webhook endpoint per workspace.
- 1Create a workspace for the end customer and keep its key in your own secret store, mapped to your internal customer id.
- 2Mint a Connect session with
POST /v1/connect, passing your own correlation token asstateand restrictingallowedProvidersto the channels your product supports. - 3Store the account id that comes back on the redirect against your user. That id is what connection-lifecycle events refer to.
- 4Subscribe one webhook endpoint per workspace with
POST /v1/webhooks, and use the test-fire and replay endpoints to build the handler before a real event arrives. - 5Read through the cross-channel endpoints rather than the per-channel ones wherever you can, so adding a channel later is a configuration change rather than a rewrite.
The deeper technical version of this — auth handling, webhook event types, sandboxing, per-channel coverage — is in the SaaS platform Q&A. Channel-by-channel detail lives in the Airbnb, Booking.com and Vrbo guides, and the full reference is in the docs.
The honest list
What does Repull not do for platforms yet?
Six things, stated plainly so nobody builds against them. There is no sub-account or parent-child object above a workspace. There is no public workspace-provisioning endpoint — workspaces are created by signing up, not by an API call, so onboarding a customer is not yet a single POST. API keys cannot be scoped to a subset of listings; scopes limit operations, not inventory. There is no per-end-customer or reseller billing. White-labelling does not extend to a custom Connect domain or to email sent from a partner domain, and the hosted pages carry a "Powered by Repull" link. And a workspace holds one connected account per channel, with Airbnb the only channel that reports several host accounts inside that one connection. If one of these is load-bearing for your build, it is worth saying so early — several of them are small pieces of work with a partner behind them.
Why this section exists
Tell us which of these is in your way
Name the missing piece, what you would build on it and when you need it. A specific requirement from a real integration is what gets built next.
Email hello@repull.dev