Nigerian shortlet supply, as an API.
Search verified apartments, quote a stay with tax, hold real inventory, and confirm against a prefunded wallet. Hotel rooms sit behind the same key.
- Bookable shortlets in the API
- 1,337
- Cities · neighbourhoods
- 23 · 133
- Amounts
- Kobo, integer, NGN
- Auth
- x-api-key · sandbox + live
curl "https://api.rayprop.io/functions/v1/complete-api/listings\
?city=Lagos&bedrooms=2&limit=1" \
-H "x-api-key: rp_sandbox_••••••••"{
"success": true,
"data": [
{
"id": "11F350DA",
"unique_listing_id": "11F350DA",
"title": "2 Bedroom Shortlet in Surulere",
"city": "Lagos",
"state": "Lagos",
"neighborhood": "Surulere",
"property_category": "shortlet",
"bedrooms": 2,
"bathrooms": 2,
"max_guests": 4,
"price_per_night": 9500000,
"currency": "NGN",
"minimum_stay": 1,
"check_in_time": "14:00:00",
"check_out_time": "12:00:00",
"amenities": ["wifi", "backup_generator",
"security_cameras", "housekeeping"],
"listing_images": [{ "image_url": "…", "is_primary": true }]
}
],
"meta": { "page": 1, "limit": 1, "returned": 1, "hasMore": true }
}price_per_night is the all-in RayProp price in kobo. Host identity, address and phone numbers are never in this payload.
Booking runbook
Five calls from search to confirmed stay.
Every constraint below is enforced by the API, not by convention.
- 01
GET /listingsFind inventory
Filter by city, neighbourhood, bedrooms and price. Flat allowance for every key: 20,000 requests/hour, 25,000 unique listings/day. Wildcards are stripped from text filters.
GET /listings?city=Lagos&neighborhood=Lekki&bedrooms=2 - 02
GET /availabilityCheck the dates
Availability merges host calendars and connected iCal feeds. Conflicting date ranges are rejected before a hold is ever created.
GET /availability?listing_id=11F350DA &check_in=2026-10-02&check_out=2026-10-05 - 03
POST /quotesPrice it, including your markup
One quote returns nights, subtotal, 7.5% VAT and the total your guest pays. Add developer_markup_per_night and it lands inside the same total. Quotes are valid for 30 minutes.
{ "quote_id": "…", "dates": { "check_in": "2026-10-02", "nights": 3 }, "pricing": { "price_per_night": 10500000, "subtotal": 31500000, "vat_rate": "7.5%", "vat_amount": 2362500, "total_amount": 33862500, "currency": "NGN" }, "valid_for_seconds": 1800 } - 04
POST /holdsHold the real calendar
A hold blocks the actual dates for 15 minutes on a live key. If it lapses, a 30-minute cooldown stops the same key from re-holding the same listing on repeat.
{ "hold_id": "…", "status": "active", "expires_at": "2026-10-01T09:15:00Z" } - 05
POST /reservationsConfirm and settle
Confirmation debits your prefunded wallet under a row-level lock, so the same hold can never be charged twice. Guest and host contact details are released only once payment is verified.
reservation.created → reservation.booked → reservation.checked_in → reservation.completed
Data contract
What each field means, and what we deliberately withhold.
1,337
Active shortlets bookable through the API
23
Cities with live inventory
133
Distinct neighbourhoods
Sept 2026
Snapshot date for the figures on this page
| Field | Rule |
|---|---|
| id / unique_listing_id | Short opaque code (e.g. 11F350DA). Internal UUIDs are never returned. |
| city / state / neighborhood | Separate fields. Neighbourhoods are never merged — Wuse and Maitama stay distinct. |
| price_per_night | Integer kobo, all-in. Host cost and RayProp margin are not split out. |
| currency | NGN for shortlets. Hotel offers carry their own currency field. |
| address / latitude / longitude | Withheld from search. Released on the reservation once payment is verified. |
| host name / phone / email | Never exposed to API consumers, at any stage. |
| amenities, house_rules | Structured arrays. Empty when the host has not supplied them — never invented. |
| check_in_time / check_out_time | Local time, 24-hour. Defaults are 14:00 and 12:00. |
| minimum_stay / advance_notice_hours | Enforced at quote and hold time, not just documented. |
Failure behaviour
The unhappy paths, written down.
Errors return a stable code, a message you can show a user, and no stack traces. Rate limits degrade softly: you get overage headers and a warning before anything is cut off.
{
"success": false,
"error": {
"code": "MISSING_AUTHENTICATION",
"message": "Authentication required. Use x-api-key header or access via RapidAPI.",
"suggestions": [
"Include x-api-key header with your RayProp API key",
"Obtain an API key from the RayProp developer portal"
]
}
}{
"success": false,
"error": {
"code": "VAL_004",
"message": "check_in_date must be before check_out_date"
}
}{
"success": false,
"error": {
"code": "HOLD_COOLDOWN",
"message": "Cooldown active — you recently had a hold on this listing. Wait 30 minutes after expiry before re-holding."
}
}{
"success": true,
"data": [ /* listings you already accessed today */ ],
"warnings": [{
"code": "DAILY_LIMIT_APPROACHING",
"message": "Daily unique listing access limit reached"
}],
"dataAccess": { "accessedToday": 25000, "dailyLimit": 25000 }
}Already running on it
Haap Living sells RayProp inventory under its own brand.
The product on the right is live. Search, pricing, availability and booking all come from the same endpoints on this page — the same catalogue, a different brand and a different markup.
Endpoint surface
/listings/availability/quotes/holds/reservations/payments/wallet/hotels/reviews/webhooks/usage/analytics
Commercial terms
Subscription for access, flat fee per night booked.
No percentage commission on stay value. Wallet balances do not expire, and booking fees are already inside the price the API returns.
Sandbox
Test the API with sample data
- 5,000 search requests/mo
- Sandbox API keys
- Full documentation access
- Community support
Starter
For early-stage products
- 50,000 search requests/mo
- 200 bookings/mo
- Production API keys
- 20 req/sec rate limit
- Email support
Growth
For scaling platforms
- 200,000 search requests/mo
- 900 bookings/mo
- Priority support
- 60 req/sec rate limit
- Dedicated account manager
Enterprise
For large-scale deployments
- Unlimited searches
- Custom booking limits
- SLA guarantee
- Custom rate limits
- On-call engineering support
Integrate in sandbox before you spend anything.
Live keys unlock real holds and wallet debits. Everything else behaves the same in sandbox, including errors and webhooks.
- 01Sign up and a sandbox key is issued immediately.
- 02Call /listings against seeded sandbox inventory.
- 03Run quote → hold → reservation end to end without moving money.
- 04Fund a wallet, swap the key, go live.