# Repull > Repull is one API for Airbnb, Booking.com and Vrbo — use it as the channel manager, or alongside the PMS or channel manager a host already has (guest messaging, reservations and reviews without touching that connection). Plum Guide and 12 PMSes connect through the same API. Publish listings with AI-generated content, set prices and availability on every channel, and stream events through signed webhooks — one REST API and five published SDKs. > Base URL: https://api.repull.dev > Hosted Connect: https://connect.repull.dev/{sessionId} > Docs: https://repull.dev/docs > OpenAPI: https://api.repull.dev/openapi.json > Full LLM docs: https://repull.dev/llms-full.txt > Agent discovery: https://repull.dev/agents.txt + https://repull.dev/.well-known/agents.json > Updated: 2026-09-30 Authentication is a Bearer API key (`sk_live_*`) — the key alone identifies and scopes your workspace, so no separate workspace header is needed. CORS is permissive (`Access-Control-Allow-Origin: *`) so browser SDKs work out of the box. ## Quickstart - [Get an API key](https://repull.dev/dashboard/keys): sign up and copy your key — that key is all you need to authenticate. - [Quickstart guide](https://repull.dev/docs/introduction): one-page tour of authentication, your first call, and the core capability surfaces (Connect, Listings, Messaging). - [Authentication](https://repull.dev/docs/api-keys): headers, key format, idempotency keys, schema adapters. - [Errors](https://repull.dev/docs/errors) and [Rate Limits](https://repull.dev/docs/rate-limits): tier-based limits, 429 / 402 / 401 semantics. ## Connect (multi-channel onboarding) Repull ships a hosted, white-label picker that walks a host through connecting Airbnb, Booking.com, Vrbo, Plum Guide or one of 12 PMSes. Mint a session server-side, hand the URL to your user, get a postMessage / webhook when they finish. - [Connect overview](https://repull.dev/docs/connect): the channels and PMSes, the picker session model, and the SDK one-liner `repull.connect.createSession({ redirectUrl })`. - [Alongside your PMS](https://repull.dev/docs/alongside-your-pms): connect next to the host's existing PMS or channel manager on Airbnb (`accessType: "messaging"`), Booking.com (Extranet login) and Vrbo (`accessType: "messaging"`). The existing connection keeps listings, rates and availability; Repull reads reservations, guest messages and reviews and sends replies. - [OAuth Connect (Airbnb)](https://repull.dev/docs/oauth-connect): `accessType` (`full_access`, `messaging` to coexist with another PMS, `read_only`), branding, redirect handling. - [Connect dashboard](https://repull.dev/dashboard/connect): launch the picker yourself; useful for testing. - [Connections dashboard](https://repull.dev/dashboard/connections): manage every active connection across channels. - Channels supported today: Airbnb (OAuth), Booking.com (connectivity-partner claim → room mapping, or the Extranet login (beta) next to an existing channel manager — [guide](https://repull.dev/docs/channels/booking/extranet)), Vrbo (beta: the host signs in with their Vrbo account — [guide](https://repull.dev/docs/channels/vrbo)), Plumguide (credentials), and the PMSes Hostaway, Guesty, OwnerRez, Smoobu, Beds24, iGMS, Hospitable, Lodgify, BookingSync, Cloudbeds, Mews, Track. - What each channel can do: Airbnb and Booking.com (connectivity partner) are read + write (listings, availability, pricing, messaging, reviews). Booking.com Extranet login: reservations, messages and reviews, with message and review replies. Vrbo: reservations, inquiries (pre-approve, quote), messages and reviews, with replies; with `accessType: "full_access"` calendar writes are also pushed to Vrbo (availability, prices, minimum stay); with `messaging` nothing is pushed. Plumguide is read + availability/pricing/webhook writes. Full matrix: [capability matrix](https://repull.dev/docs/channels/capabilities). - Booking.com claim flow: `POST /v1/connect/booking/verify` → `POST /v1/connect/booking/rooms` → `POST /v1/connect/booking/map-rooms` → CNS callback at `/v1/connect/booking/callback`. ## Listings (create, generate content, publish) - [Listings dashboard](https://repull.dev/dashboard/listings): full listings table with filters and pagination. - [Create a listing](https://repull.dev/dashboard/listings/new): visual create + AI content gen + multi-channel publish. - `POST /v1/listings`: create a Repull-native listing. - `GET /v1/listings`: cursor-paginated catalog with filters. - `POST /v1/listings/{id}/generate-content`: Kimi-powered title, summary, description, and amenities copy. - `POST /v1/listings/{id}/publish/airbnb` and `POST /v1/listings/{id}/publish/booking`: push to channels. - `GET /v1/listings/{id}/publish-status`: per-channel publish state. - `POST /v1/listings/status`: activate or deactivate up to 500 listings at once, all or nothing. Inactive listings are not billed and keep syncing, but the API answers `403 listing_inactive` for them and sends no webhooks about them until they are activated. [Active & inactive listings](https://repull.dev/docs/manage-listings). ## Prices and availability - Your own prices: `PUT /v1/availability/{propertyId}` (or `PATCH /v1/availability/batch`) writes the calendar and pushes to Airbnb, Booking.com and Vrbo (full access) — the default for calendar values. For Plumguide use `PUT /v1/channels/plumguide/pricing`. - Channel-only settings: `PUT /v1/channels/airbnb/listings/{id}/pricing` and `/availability` (`{id}` is the Repull listing id), `PUT /v1/channels/booking/availability` (rate + availability), `PUT /v1/channels/plumguide/pricing`. ## Creating reservations in a PMS - [Creating reservations](https://repull.dev/docs/reservations/create): `POST /v1/reservations` books a listing managed in a connected PMS IN that PMS (otherwise a direct booking). Check `GET /v1/listings/{id}` → `capabilities.reservations` first; price with `POST /v1/reservations/quote`. `PATCH /v1/reservations/{id}` and `POST /v1/reservations/{id}/cancel` route to the PMS too. Channel bookings (Airbnb, Booking.com, Vrbo) are refused: `409 reservation_owned_by_channel`. - Idempotency: send `Idempotency-Key` (also the PMS booking reference). `502 pms_error` → retry, same key. `502 reservation_created_in_pms_only` → do NOT retry; it arrives with the next sync. `201` with `pms.partial: true` → booked; `pms.failedSections` did not apply. - [PMS reservation support](https://repull.dev/docs/reservations/pms-support): per-PMS create/change/cancel/quote/custom price and the access each PMS needs (OwnerRez no cancel; Smoobu no date changes; iGMS price required; Hospitable manual reservations only). - [Writing through a PMS](https://repull.dev/docs/pms-writes): beyond bookings, writes to records a connected PMS owns go to the PMS first — review replies (`POST /v1/reviews/{id}/reply`, reviews carry `pms`), accept/decline and pre-approval, listing content (`PUT /v1/listings/{id}/content`, per-section `pms` outcome), guests (`POST /v1/guests` with `provider`, `PATCH /v1/guests/{id}`), messages (`channel` takes the PMS's own names), calendar (`PUT /v1/availability/{propertyId}`, opt-in per connection write policy for Guesty and Hostaway). Check `capabilities.pms` on `GET /v1/connect/{provider}` or `GET /v1/listings/{id}`; a false flag is `422 pms_write_unsupported`, do not retry. Hostaway: no review reply, no request answers or pre-approval, no guest records; Guesty and Hostaway: no attachments. Per PMS: [Guesty](https://repull.dev/docs/pms/guesty), [Hostaway](https://repull.dev/docs/pms/hostaway). ## Messaging, inquiries and booking requests - [Send a message](https://repull.dev/docs/send-message): `POST /v1/conversations/{id}/messages` with `message`, `attachments` (1 to 5 public https URLs, 10 MB each; Airbnb and Booking.com), or both. Check `contentRewritten`; a partial send is `422 message_partially_sent`. - [Inquiries & booking requests](https://repull.dev/docs/channels/airbnb/inquiries-and-requests): `GET /v1/inquiries`, `POST /v1/conversations/{id}/pre-approval`, `POST /v1/conversations/{id}/special-offers` (plus `GET`/`DELETE .../special-offers/{offerId}`), `POST /v1/reservations/{id}/accept` and `/decline`. Pre-approvals and special offers work on Airbnb and Vrbo; accept and decline are Airbnb only. `GET /v1/reservations?status=pending` lists only requests that can still be answered, each with `respondBy`. - Webhooks: `inquiry.created`, `inquiry.updated`, `reservation.request.created`, `reservation.request.updated`. A request or inquiry that lapses silently fires no event; the GET endpoints still report it expired. - Retries: send `Idempotency-Key`. `5xx`, `408`, `425`, `429` and refusals that did nothing are not stored, so retry them with the same key. `500 service_misconfigured` has `retryable: false`: nothing was sent, do not loop. ## Webhooks (signed delivery + replay) - [Webhooks intro](https://repull.dev/docs/webhooks-introduction): subscription model and delivery guarantees. - [Event types](https://repull.dev/docs/webhook-event-types): the full catalog, 26 events live: reservations (created/updated/cancelled, message received, alterations), booking requests (`reservation.request.created`/`updated`), inquiries (`inquiry.created`/`updated`), listings, calendar, accounts, reviews, AI operations, payments, and system events. Canonical list: `GET /v1/webhooks/event-types`. - [Verify signatures](https://repull.dev/docs/verify-webhook-signatures): HMAC-SHA256 over the raw body with the per-endpoint secret. - [Retries & replay](https://repull.dev/docs/webhook-retries): exponential backoff and one-click replay from the dashboard. A delivery can be replayed 3 times per rolling hour (`409 replay_limit_reached` over it); one the endpoint already accepted is refused with `409 delivery_already_succeeded` unless you pass `{"force": true}`. - [Manage webhooks](https://repull.dev/docs/manage-webhooks): full CRUD lifecycle, secret rotation, test fires. - [Webhooks dashboard](https://repull.dev/dashboard/webhooks): add endpoint, pick events, inspect delivery history, replay, rotate secrets. - API: `POST /v1/webhooks`, `GET /v1/webhooks`, `PATCH /v1/webhooks/{id}`, `DELETE /v1/webhooks/{id}`, `GET /v1/webhooks/{id}/deliveries`, `POST /v1/webhooks/{id}/test/{event_type}`, `POST /v1/webhooks/{id}/ping`, `POST /v1/webhooks/{id}/rotate-secret`, `GET /v1/webhooks/event-types`. ## Integration guides (per channel and per PMS) Long-form, vendor-specific pages written from running these integrations in production. They cover how access is granted, what each API refuses, and where it differs from every other one — the detail that decides whether an integration works, and which is usually absent from vendor documentation. Channels: - [Airbnb API guide](https://repull.dev/airbnb-api): how partner access and OAuth scopes work, why property management is exclusive per host account, per-listing sync categories (`sync_all` / `sync_rates_and_availability` / `none`) that make a connected account refuse every write, `busy_subtype` being required on a blocked date, host-managed fields that return 200 and apply nothing, and 19-digit listing ids that must stay strings. - [Booking.com API guide](https://repull.dev/booking-com-api): connectivity-partner designation, one machine account plus a per-property Extranet connect step, the property/room/rate-plan model, rate amounts keyed to occupancy, the `{"ok": ""}` acknowledgement that proves nothing, and the exclusive `to` date bound that silently drops the last night. - [Vrbo channel docs](https://repull.dev/docs/channels/vrbo): connect with the host's Vrbo account; reservations, inquiries and quotes, messages, reviews, and calendar with full access. - [For platforms](https://repull.dev/for-platforms): one agreement covering many end customers, workspace isolation, white-label Connect, and an explicit list of what is not supported. Property management systems — each guide covers credentials, limits, field mapping to the unified schema, and when to use that vendor's API directly instead of Repull: - [Guesty API](https://repull.dev/docs/pms/guesty): OAuth2 client credentials, a cap of five tokens per API key per 24 hours, the calendar on a separate base path, messages as "posts" inside conversations, `source: "airbnb2"` rather than `"airbnb"`, offset pagination with stringified-JSON filters, Mongo ObjectId ids. - [Hostaway API](https://repull.dev/docs/pms/hostaway) · [Hospitable](https://repull.dev/docs/pms/hospitable) · [Lodgify](https://repull.dev/docs/pms/lodgify) (messaging is read-only) · [OwnerRez](https://repull.dev/docs/pms/ownerrez) (no guest messaging API) · [Smoobu](https://repull.dev/docs/pms/smoobu) · [Beds24](https://repull.dev/docs/pms/beds24) · [iGMS](https://repull.dev/docs/pms/igms) · [BookingSync](https://repull.dev/docs/pms/bookingsync) · [Track](https://repull.dev/docs/pms/track) (no webhooks: polled about every minute) - [PMS coverage matrix](https://repull.dev/docs/pms-coverage): which operations each system supports, side by side. A PMS connection and a direct channel connection are different things and can run together under one key: a PMS returns its own view of a reservation, not the channel API. Airbnb partner approval and Booking.com connectivity designation are not self-serve; Repull already holds them. ## SDKs - [SDKs overview](https://repull.dev/docs/sdks): the family, language coverage, install paths. - [TypeScript SDK](https://www.npmjs.com/package/@repull/sdk) — `npm install @repull/sdk` (v0.2.6). - [Python SDK](https://pypi.org/project/repull-sdk/) — `pip install repull-sdk` (v0.2.16). - [PHP SDK](https://packagist.org/packages/repull/sdk) — `composer require repull/sdk`. - [Go SDK](https://github.com/ivannikolovbg/repull-go) — `go get github.com/ivannikolovbg/repull-go`. - [Ruby SDK](https://rubygems.org/gems/repull) — `gem install repull`. - [.NET SDK](https://github.com/ivannikolovbg/repull-dotnet) — source only, not published to NuGet yet. - [SDK dashboard](https://repull.dev/dashboard/sdks): copy install snippets per language with your workspace pre-filled. - [MCP server (Claude / Cursor)](https://repull.dev/docs/mcp-server): `npx @repull/mcp` — exposes Repull tools to any MCP client. - [Connect Widget docs](https://repull.dev/docs/connect-widget): the hosted picker — one API call mints a session URL, the user connects there, nothing to install. - [Vercel AI SDK provider](https://www.npmjs.com/package/@repull/ai-sdk) — `npm install @repull/ai-sdk` for `streamText` / `generateText` tool bindings. ## Open source - [Open Source overview](https://repull.dev/open-source): the whole ecosystem, why it's MIT, no lock-in. - [repull-channel-manager](https://github.com/ivannikolovbg/repull-channel-manager): full open-source channel manager template — listings, calendar, messaging inbox, reviews. Fork it, brand it, ship it. - [repull-mcp](https://github.com/ivannikolovbg/repull-mcp): MCP server (`@repull/mcp`) for Claude Desktop, Cursor, and any MCP client. - [repull-ai-sdk](https://github.com/ivannikolovbg/repull-ai-sdk): Vercel AI SDK tool bindings — drop Repull into any LLM agent. - [repull-sdk](https://github.com/ivannikolovbg/repull-sdk): the TypeScript SDK + live demo (`apps/demo`) + channel-manager skeleton (`apps/channel-manager`). ## API reference - [API introduction](https://repull.dev/docs/api/introduction): the full REST surface organised by resource. - [OpenAPI 3.0 spec](https://api.repull.dev/openapi.json): generated, versioned, with `operationId` on every route — feed it to any code generator. - [Schema adapters](https://repull.dev/docs/calry-schema): Calry-compatible responses via `X-Schema: calry`; native via `X-Schema: native`. - [Migrate from Calry](https://repull.dev/docs/migrate-from-calry): swap base URL, set the header, done. - [Changelog](https://repull.dev/changelog): all shipped changes with an [RSS feed](https://repull.dev/changelog/feed.xml). ## Optional - [Best practices](https://repull.dev/docs/best-practices): production checklist (idempotency, retries, webhook verification, rate-limit handling). - [Troubleshooting](https://repull.dev/docs/troubleshooting): common errors and how to diagnose them. - [Rate limits](https://repull.dev/docs/rate-limits): per-tier ceilings and 429 behavior. - [Usage dashboard](https://repull.dev/dashboard/usage) and [Logs](https://repull.dev/dashboard/logs): live request volume, per-endpoint breakdown, and request log tailing. - [PMS coverage](https://repull.dev/docs/pms-coverage): per-PMS feature matrix. - [Use cases](https://repull.dev/docs/use-cases): patterns for channel managers, guest messaging, AI assistants, and analytics.