Partner API

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:

  1. 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.
  2. 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:

KeyLooks likeUsed for
Secret keysk_live_... / sk_test_...Every server-to-server call. Never expose in client-side code.
Publishable keypk_live_... / pk_test_...Safe to embed client-side. Only usable with the hosted checkout widget.
Test-mode keys behave identically to live keys but are tagged separately, so integration testing never touches real bookings.

2. Authentication

Send your secret key as a bearer token on every server-to-server call:

Authorization: Bearer sk_live_51a2b3c4d5e6...

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.

Idempotency-Key: order-8842-attempt-1

4. Rate Limits

300 requests per 60 seconds, per API key. Exceeding it returns HTTP 429.

Quickstart: Create a Property

curl -X POST "https://renteaze.xyz/api/partner/properties.php?action=create" \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "external_ref": "HTL-2201", "title": "Deluxe King Room \u2013 Zenith Suites Lagos", "description": "25sqm room, king bed, city view.", "category": "hotel", "booking_mode": "date_range", "price": 45000, "price_unit": "night", "currency": "NGN", "location": "12 Adeola Odeku St", "city": "Lagos", "state": "Lagos", "country": "Nigeria", "max_guests": 2, "bedrooms": 1, "bathrooms": 1, "amenities": ["wifi", "ac", "breakfast"], "images": ["https://cdn.yourhotel.com/room1.jpg"] }' # \u2192 200 OK { "success": true, "data": { "id": 981 } }

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

curl "https://renteaze.xyz/api/partner/availability.php?action=check&listing_id=981&check_in=2026-10-12&check_out=2026-10-14" \ -H "Authorization: Bearer sk_live_..."

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

curl -X POST "https://renteaze.xyz/api/partner/bookings.php?action=create" \ -H "Authorization: Bearer sk_live_..." \ -H "Idempotency-Key: order-8842" \ -H "Content-Type: application/json" \ -d '{ "listing_id": 981, "check_in": "2026-10-12", "check_out": "2026-10-14", "guests_count": 2, "customer": { "name": "Ada Obi", "email": "ada@example.com", "phone": "+2348012345678" }, "payment_mode": "renteaze_gateway", "external_ref": "order-8842" }' # \u2192 200 OK { "success": true, "data": { "booking_id": 5510, "status": "pending", "total": 94500, "currency": "NGN", "gateway": "myropay", "hosted_checkout_url": "https://renteaze.xyz/pages/widget-booking.html?..." } }

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.

{ ... "payment_mode": "partner_collected" }
Renteaze never touches funds for a partner_collected booking — you settle any platform fee with Renteaze separately.

Embeddable Checkout Widget

For partners with no payment UI of their own:

<script src="https://renteaze.xyz/assets/js/widget.js"></script> <script> RenteazeWidget.open({ publicKey: 'pk_live_...', bookingId: 5510, onConfirmed: (data) => console.log('Paid!', data), onCancelled: () => console.log('Customer closed checkout'), }); </script>

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:

curl -X POST "https://renteaze.xyz/api/partner/webhooks.php?action=create" \ -H "Authorization: Bearer sk_live_..." -H "Content-Type: application/json" \ -d '{ "url": "https://yoursite.com/hooks/renteaze", "events": ["booking.confirmed","booking.cancelled","booking.refunded"] }'

The response includes a secret (whsec_...) — shown once, store it.

Every delivery is signed:

X-Renteaze-Signature: sha256=<hmac_sha256(raw_body, secret)>
EventFires when
booking.createdA new booking is created (pending payment)
booking.confirmedPayment succeeds, or a partner_collected booking is created
booking.cancelledA booking is cancelled
booking.refundedA cancellation results in a refund
booking.updatedAny 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

MethodActionNotes
GETlist?limit=&offset=
GETsingle?id= or ?external_ref=
POSTcreatetitle, description, category, price, location, city, state required
PUTupdate?id=/?external_ref=, partial body
DELETEdeletesoft-deactivates
GETunitsroom/unit list for a property
POSTcreate-unitproperty_id or property_external_ref, name
PUTupdate-unit?id=

Reference: Availability

/api/partner/availability.php

MethodAction
GETcheck?listing_id=&check_in=&check_out=
GETcalendar?listing_id=&year=&month=
POSTblock — body: listing_id, dates[]
DELETEunblock — body: listing_id, date

Reference: Bookings

/api/partner/bookings.php

MethodAction
POSTcreate
GETsingle?id=/?external_ref=
GETlist?status=&listing_id=&limit=&offset=
POSTcancel?id=/?external_ref=, body: reason
GETpayment-info (public key)
POSTconfirm-payment (public key)

Reference: Webhooks

/api/partner/webhooks.php

MethodAction
GETlist
POSTcreate — body: url, events[]
PUTtoggle?id=, body: is_active
DELETEdelete?id=
GETdeliveries

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