Repull Python SDK
Status: v0.2.0 — beta. API surface stable; minor renames possible before 1.0.
Typed Python client for api.repull.dev — the unified API for vacation-rental tech (50+ PMS platforms, Airbnb / Booking.com / VRBO / Plumguide channels, AI ops, white-label OAuth Connect).
Async by default. Generated from OpenAPI. Fully typed (attrs + httpx).
Install
The PyPI package name repull is reserved but not yet published. For now, install from git:
pip install git+https://github.com/ivannikolovbg/repull-python.git
Once published:
pip install repull
Requires Python 3.10+.
Quick start
import asyncio
import os
from repull import AuthenticatedClient
from repull.api.reservations import list_reservations
async def main():
client = AuthenticatedClient(
base_url="https://api.repull.dev",
token=os.environ["REPULL_API_KEY"],
)
async with client as c:
page = await list_reservations.asyncio(client=c, limit=10)
for r in page.data:
print(r.id, r.check_in, r.check_out, r.platform)
asyncio.run(main())
There is also a sync flavour for every endpoint — drop the async with and call list_reservations.sync(...) instead.
Authentication
Every call goes through AuthenticatedClient(token=...). The token is your Repull API key — it looks like sk_live_....
Get one at repull.dev/dashboard → API keys.
What's in the SDK
The client is generated tag-by-tag from the OpenAPI spec. The modules mirror the API surface:
| Module | Endpoints |
|---|---|
repull.api.system |
GET /v1/health |
repull.api.properties |
list / get properties |
repull.api.reservations |
list / get / create / patch / delete reservations |
repull.api.availability |
per-property calendar read + bulk write |
repull.api.guests |
guest CRM list + detail |
repull.api.conversations |
list threads, read & post messages |
repull.api.connect |
white-label OAuth Connect — list, status, create, disconnect |
repull.api.webhooks |
manage subscriptions + fire test events |
repull.api.airbnb |
listings, pricing, availability, photos, messaging, reservations, reviews, sync |
repull.api.booking_com |
properties, availability, content, messaging, sync |
repull.api.vrbo |
listings, reservations |
repull.api.plumguide |
listings, availability, pricing |
repull.api.ai |
run AI operations (autorespond, smart pricing, etc.) |
repull.api.billing |
view & change plan |
Everything is fully typed — your editor will autocomplete every parameter and every response field.
Examples
examples/quickstart.py— list 10 reservations.examples/connect_airbnb.py— mint a Connect session and poll for the linked Airbnb account.
Run them with a real API key:
REPULL_API_KEY=sk_live_... python examples/quickstart.py
Connect (OAuth)
Repull Connect lets you link a property manager's Airbnb / Booking.com account in a few lines:
from repull.api.connect import create_connect_session
from repull.models.create_connect_session_body import CreateConnectSessionBody
session = await create_connect_session.asyncio(
client=c,
body=CreateConnectSessionBody(
redirect_url="https://yourapp.example.com/airbnb/return",
allowed_providers=["airbnb"],
),
)
# Send the user to session.url
After the user comes back, poll get_connect_status.asyncio(provider="airbnb", client=c) to confirm.
Pagination
Every list endpoint returns the same canonical envelope:
page = await list_reservations.asyncio(client=c, limit=50)
page.data # list[Reservation]
page.pagination.next_cursor # str | None — pass back as `cursor=`
page.pagination.has_more # bool — stop when False
page.pagination.total # int | UNSET — present when ?include_total=true
Loop until pagination.has_more is False, threading pagination.next_cursor
back as the next call's cursor arg. Cursors are opaque base64 — never parse
or construct them by hand.
Error handling
By default, unexpected HTTP statuses return None from the high-level .asyncio() / .sync() calls. To raise instead:
client = AuthenticatedClient(
base_url="https://api.repull.dev",
token=os.environ["REPULL_API_KEY"],
raise_on_unexpected_status=True,
)
You can also call .asyncio_detailed() / .sync_detailed() to get the full Response (status code, headers, raw bytes, parsed body).
Regenerating the client
The repo snapshots the current spec at openapi/v1.json so codegen is fully reproducible.
# Pull a fresh spec from api.repull.dev and regenerate
./scripts/regen.sh
# Use the snapshot in openapi/v1.json without hitting the network
./scripts/regen.sh --offline
You'll need openapi-python-client on your PATH:
uv tool install openapi-python-client
# or
pipx install openapi-python-client
Reference
- API base: https://api.repull.dev
- OpenAPI spec: https://api.repull.dev/openapi.json
- Product docs: https://repull.dev/docs
- Other SDKs:
repull-sdk(TypeScript),repull-php,repull-go,repull-ruby,repull-dotnet
License
MIT — see LICENSE. The Python client is a thin auto-generated wrapper, free to use anywhere.
(Note: the TypeScript SDK is licensed differently because it ships a hand-written facade plus the demo + channel-manager template. See repull-sdk if you need that.)
Release files for repull-sdk 0.2.14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| repull_sdk-0.2.14.tar.gz | 369.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| repull_sdk-0.2.14-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.2 MB
Release files / repull_sdk-0.2.14.tar.gz
| Download URL | repull_sdk-0.2.14.tar.gz |
|---|---|
| Size | 369.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6281a2ebca5984e241bb4bb2f1322b6abb4e1b66ea2d238e7f5258a54f0814b3
|
|
BLAKE2b-256 checksum How to use checksums |
aed42adc54de29674c2c9c1f19b410ebe03797c846d937191e2c05c4072e1c02
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / repull_sdk-0.2.14-py3-none-any.whl
| Download URL | repull_sdk-0.2.14-py3-none-any.whl |
|---|---|
| Size | 854.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
05dd0c8f13ea89499e28f7093338bcfc667d986fd8804c5f98f1b130ad551c6d
|
|
BLAKE2b-256 checksum How to use checksums |
4620990382522213b345cac50b87a452ed14e4651d7a94fe93d16e2022e4e08e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|