Partner API Documentation
Everything you need to integrate bookings, availability, payments and webhooks.
Overview
The Renteaze Partner API turns Renteaze's booking engine into a drop-in for your own product. There are two ways to use it, and both use the exact same endpoints:
- Bring your own inventory — push your hotel rooms, apartments or bookable services into Renteaze and let us run availability, pricing, payments and payouts for you.
- Sell Renteaze inventory — pull listings already on the Renteaze marketplace into your own app or site.
Every property you create through the API is also a normal Renteaze listing — simultaneously bookable on renteaze.xyz itself, not only through your integration.
1. Get Credentials
Request partner access and you'll be onboarded with two keys:
| Key | Looks like | Used for |
|---|---|---|
| Secret key | sk_live_... / sk_test_... | Every server-to-server call. Never expose in client-side code. |
| Publishable key | pk_live_... / pk_test_... | Safe to embed client-side. Only usable with the hosted checkout widget. |
2. Authentication
Send your secret key as a bearer token on every server-to-server call:
The two widget-facing endpoints (payment-info, confirm-payment) instead take ?pk=pk_live_... — deliberately limited to reading and paying for one booking, nothing else.
3. Idempotency
Send an Idempotency-Key header (any unique string) on POST bookings.php?action=create. Retrying the same request with the same key replays the original response instead of creating a second booking — safe to retry on timeouts or network errors.
4. Rate Limits
300 requests per 60 seconds, per API key. Exceeding it returns HTTP 429.
Quickstart: Create a Property
external_ref is your own ID for the property — use it in every later call instead of Renteaze's internal id if you'd rather not store ours.
Quickstart: Check Availability
Uses the exact same slot/overlap engine as the public site and the booking-creation check — a date shown as available here is guaranteed bookable.
Quickstart: Create a Booking
Redirect (or embed via widget.js) your customer to hosted_checkout_url to collect payment. Once paid, the booking flips to confirmed and a booking.confirmed webhook fires.
Using Your Own Payment Provider
Already collecting payment in your own checkout? Set payment_mode to partner_collected instead — the booking is created confirmed/paid immediately, with no Renteaze gateway involved.
partner_collected booking — you settle any platform fee with Renteaze separately.Embeddable Checkout Widget
For partners with no payment UI of their own:
Or embed inline instead of a modal: RenteazeWidget.embed('#booking-slot', { publicKey, bookingId }).
Supported gateways today: MyroPay, Flutterwave, Paystack, Monnify. Stripe/PayPal (redirect-based) aren't yet wired into the widget.
Webhooks
Subscribe your endpoint:
The response includes a secret (whsec_...) — shown once, store it.
Every delivery is signed:
| Event | Fires when |
|---|---|
booking.created | A new booking is created (pending payment) |
booking.confirmed | Payment succeeds, or a partner_collected booking is created |
booking.cancelled | A booking is cancelled |
booking.refunded | A cancellation results in a refund |
booking.updated | Any other status change |
These fire for a partner's listing whether the booking came through this API or the regular Renteaze marketplace — a booking on your hotel room is a booking on your hotel room, however the guest found it.
Undelivered webhooks retry automatically (5 min → 30 min → 2 hr → every 6 hr, up to 10 attempts). Check delivery history with GET webhooks.php?action=deliveries.
Reference: Properties
/api/partner/properties.php
| Method | Action | Notes |
|---|---|---|
| GET | list | ?limit=&offset= |
| GET | single | ?id= or ?external_ref= |
| POST | create | title, description, category, price, location, city, state required |
| PUT | update | ?id=/?external_ref=, partial body |
| DELETE | delete | soft-deactivates |
| GET | units | room/unit list for a property |
| POST | create-unit | property_id or property_external_ref, name |
| PUT | update-unit | ?id= |
Reference: Availability
/api/partner/availability.php
| Method | Action |
|---|---|
| GET | check — ?listing_id=&check_in=&check_out= |
| GET | calendar — ?listing_id=&year=&month= |
| POST | block — body: listing_id, dates[] |
| DELETE | unblock — body: listing_id, date |
Reference: Bookings
/api/partner/bookings.php
| Method | Action |
|---|---|
| POST | create |
| GET | single — ?id=/?external_ref= |
| GET | list — ?status=&listing_id=&limit=&offset= |
| POST | cancel — ?id=/?external_ref=, body: reason |
| GET | payment-info (public key) |
| POST | confirm-payment (public key) |
Reference: Webhooks
/api/partner/webhooks.php
| Method | Action |
|---|---|
| GET | list |
| POST | create — body: url, events[] |
| PUT | toggle — ?id=, body: is_active |
| DELETE | delete — ?id= |
| GET | deliveries |
Scopes
Keys are issued with scopes limiting what they can do: properties:read, properties:write, availability:read, availability:write, bookings:read, bookings:write, webhooks:manage. Ask for a read-only key if that's all your integration needs.
Roadmap
- OAuth2 client-credentials as an alternative to static API keys
- Stripe/PayPal support inside the hosted checkout widget
- Official SDKs (Node, PHP)
Questions or feedback? partnerships@renteaze.xyz