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.)
Powered by Repull.
Metadata
Release files for repull-sdk 0.2.39
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| repull_sdk-0.2.39.tar.gz | 885.2 kB | Without provenance | Details for repull_sdk-0.2.39.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| repull_sdk-0.2.39-py3-none-any.whl | Python 3 | none | any | Details for repull_sdk-0.2.39-py3-none-any.whl |
Total release size: 2.7 MB
Release files / repull_sdk-0.2.39.tar.gz
| Download URL | repull_sdk-0.2.39.tar.gz |
|---|---|
| Size | 885.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6332eec61de662adbe9805b838dd2859def8e47b8ee751dfc6a810856ca86fec
|
|
BLAKE2b-256 checksum How to use checksums |
8e23358164d74b2f9acef7653f30b43e87aecc3bbb28e6d4a01190a9f275aaed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / repull_sdk-0.2.39-py3-none-any.whl
| Download URL | repull_sdk-0.2.39-py3-none-any.whl |
|---|---|
| Size | 1.8 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a3a9f27877cecfc8eac9335202df72a5f4d83298f99c8932f460854807c5ab6f
|
|
BLAKE2b-256 checksum How to use checksums |
1a3d7ed5689bfb44162717452ddf54a3ce9cf8276931b5b753b1bb2093175ba8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Security for repull-sdk 0.2.39
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.