For SaaS platforms embedding Repull

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.

The four units a platform integration is built from
UnitWhat it isWhat it bounds
WorkspaceThe tenant. One per end customer in a platform integration.Data isolation, billing identity, webhook subscriptions.
ConnectionOne connected account of one channel inside a workspace.One per channel per workspace. Airbnb can carry several host accounts inside it.
ListingA connected property.What is active and syncing.
API keyBearer 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

Workspaces are created by signing up, not by an API call — there is no public workspace-provisioning endpoint today. For a platform onboarding customers one at a time that is a small operational step; for a platform onboarding them in bulk it is a conversation to have before you build the flow, not after.

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 an accountId so 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.dev

Question 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-held keys compared with customer-held keys
Platform holds the keysCustomer owns the workspace
Who signs upYou, once per customerYour customer
Who is billedYouYour customer
Who holds the keyYouYour customer, who shares it with you
Onboarding UXFully inside your product, with your branding on ConnectYour customer leaves to sign up, then returns with a key
If they churn from youYou disable the workspaceThey keep the workspace and the connections
Support surfaceYoursSplit 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.

What white-labelling covers today and what it does not
Today
Brand name on the hosted Connect pagesYes
Your logo, light and dark variantsYes
Your primary and accent colours, both themesYes
Your support email in the footerYes
Your terms and privacy linksYes
Default redirect back into your productYes
Default language for the hosted pagesYes
Connect served from your own domainNo — the URL stays on connect.repull.dev
Attribution removedNo — a "Powered by Repull" link is present
Email sent from your domainNo

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/batch for calendar values across many properties, POST /v1/listings/pricing/bulk for pricing decisions, and POST /v1/listings/status for 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/webhooks per 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.dev

Question 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.dev

Question 8

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.

  1. 1Create a workspace for the end customer and keep its key in your own secret store, mapped to your internal customer id.
  2. 2Mint a Connect session with POST /v1/connect, passing your own correlation token as state and restricting allowedProviders to the channels your product supports.
  3. 3Store the account id that comes back on the redirect against your user. That id is what connection-lifecycle events refer to.
  4. 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.
  5. 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

A platform that discovers a missing primitive in month three has already built around it. Everything above is what the product does; this is what it does not, written down so the conversation starts from the same facts. If one of them is a blocker, it is a far better first email than a general enquiry.

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