Your rtc_test_ key points at a demo operator that belongs to you alone. It calls the same /channel/v1/* endpoints, returns the same payloads and the same error codes, and books against real availability logic — the difference is that no live calendar is touched, no operator is billed, and no guest exists.
mode is "test" here and "live" on a real key — that one field is the only thing your code needs to branch on, if it branches at all.
Get a key
Sign in at partners.rentaltide.com → Reseller & OTA API → Create my sandbox. The key is shown once; rotate it from the same panel if you lose it.
You do not need to register a channel first, and you do not need an operator. That is the point: on day one a live key returns an empty /products (nobody has connected to you yet), so there is nothing to build against. The sandbox is what makes day one productive.
What's in it
A seeded marina with the sample listings a RentalTide operator gets in their own sandbox — enough to hit every branch of the catalog payload:
| Listing | Exercises |
|---|---|
| Hourly rental | hourlyPrices rule objects, minimumHours |
| Daily rental | dailyPrices, multi-day windows |
| Fixed-duration | A product whose window you cannot choose freely |
| Combo / bundle | Multi-item pricing |
| Scheduled tour | Seat-based capacity (unitsFree: null) + per-person priceTiers — Adult $65 / Child $35 |
| Private tour | A charter: isPrivate, privatePricing base + per-extra-guest rate |
| Rental with add-ons | A listing that carries add-ons |
The demo location is on America/Vancouver with two tax rates (GST 5%, PST 7%), so taxes and totalTaxRate are real values you can compute against rather than an all-zero payload that hides a bug until go-live.
The full loop
Reset
Deletes every test booking you created and leaves the sample catalog standing. It also clears your Idempotency-Key records, so you can re-run the quickstart verbatim instead of inventing a new key each time. There is also a Reset data button in the portal.
The endpoint is refused on a live key with 403 not_sandbox — it deletes bookings, and there is no version of that which is safe on a real operator's account.
What to test here that you cannot test live
- Idempotency. Fire the same
Idempotency-Keytwice and confirm you handle200 + "idempotentReplay": true; change the price and confirm you handle422 idempotency_key_reuse. Both are cheap here and expensive to discover in production. - Sold out. Book the same window until
409 unavailablecomes back, and confirm your checkout recovers rather than showing the guest a 500. - Tours. Seat-based products return
unitsFree: null— trustavailable. A client that readsunitsFreeas a number breaks on the first tour it sells. Tours also price fromtourPricing, never fromseasons(which is empty, or present with every rate at0). The sandbox has one of each shape — a tiered tour and a private charter — so you can build both paths before you meet either in production. - Tax. Charge
price × (1 + totalTaxRate / 100)and send that tax-inclusive figure astotalPrice. - A key that stops working. Rotate the test key mid-run and confirm you surface
invalid_api_keyas an operational alert, not a retry loop.
What is deliberately different
| Sandbox | Live | |
|---|---|---|
| Tenant | Your own demo operator | Real operators who connected to you |
| Calendar | A demo calendar nobody reads | The operator's real calendar and manifests |
| Money | Ledger entries on a demo account | Real ledger, real payout obligation |
| Platform fee | None | $5 per booking, charged to the operator |
| Guest messaging | Nothing is sent | Nothing is sent either — you own guest comms |
| Rate limit | 300 req/min | 300 req/min |
GET /me → mode | "test" | "live" |
Everything else — payload shapes, error codes, locking, idempotency, cancel semantics — is the same code. When you switch the key, nothing else changes.
Going live
- Register your channel (partner portal → Reseller & OTA API → Register) if you have not already. You get your
rtc_live_key. - Declare your payout terms on the same page — operators see them on your card before they decide to connect.
- Swap
RT_KEY. Your first/productswill be empty until an operator opts in; that is expected, not a bug. - Keep the sandbox. It stays live alongside your production key, which makes it the place to reproduce a partner-reported bug without touching an operator's account.
Full endpoint reference: Reseller & OTA API. Building an app that lives inside RentalTide instead? That is a different surface — see the App Sandbox.

