RentalTideRentalTideDocs
Dashboard

Reseller & OTA API

Connect to a RentalTide operator as a reseller, OTA, or agent — pull their catalog and live availability, and push confirmed bookings with one API key.

Sell a RentalTide operator's rentals and tours from your own platform — an OTA, a hotel concierge desk, a travel agency, or any booking site. The Channel API is a small, purpose-built surface: one key, four calls, and you're selling.

HTTP
GET https://v3.api.rentaltide.com/channel/v1/products
Authorization: Bearer rtc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Start in the sandbox

Sign in at partners.rentaltide.com Reseller & OTA APICreate my sandbox. You get a rtc_test_ key and a private demo operator seeded with sample rentals and tours, instantly. It calls the same endpoints as production, so you can finish the whole integration before a single operator has connected to you — which matters, because a fresh live key returns an empty /products until one does. See Channel API sandbox.

How you get a LIVE key — two ways

You're an OTA / marketplace (Viator, GetYourGuide, a tourism board…): sign in at partners.rentaltide.com Reseller & OTA APIRegister. You get one API key instantly, and your channel appears in every RentalTide operator's Settings → OTAs & Resellers. Operators click Connect and set their commission and offer set — no key exchange. Your one key sees all of them.

You're a single operator's partner (hotel desk, local agency): the operator creates a connection for you in Settings → OTAs & Resellers and sends you the generated key. Same API, one merchant.

Three ways to resell

RTDN (no code)Channel API — platformChannel API — direct partner
Best forBlogs, tourism sites, conciergesOTAs & marketplaces with their own checkoutA hotel desk / agency working with one operator
IntegrationLink or embed with your referral codeREST, four callsREST, four calls
Guest paysThe operatorYouYou
Commission set byRentalTide (network rate)YouThe operator
You get paidBy RentalTide with your partner payoutsYou keep it and remit to the operatorYou keep it and remit to the operator
Feenone$5/booking to the operator$5/booking to the operator

No code? Read RTDN — you'll be live in five minutes. The rest of this page is the Channel API, for platforms that run their own checkout and need live availability plus programmatic bookings.

Five-minute quickstart

Run this with your sandbox key first — it is the same three commands, against your own demo operator, with a reset button:

Bash

Then DELETE $BASE/bookings/<bookingId> to clean up, or POST $BASE/sandbox/reset to wipe every test booking at once. That's the whole API — everything below is detail.

A live key books a real calendar

There is no dry-run flag on a live key. A booking you create with rtc_live_ appears on the operator's calendar and manifests, posts to their ledger, and charges them the $5 platform fee. Test with rtc_test_; if you must test against a live connection, tell the operator first and cancel afterwards.

The model in one paragraph

You are the merchant of record: you take the guest's payment on your side, then push a confirmed booking to RentalTide with the price you charged. The booking lands on the operator's calendar as fully paid, appears on tour manifests, and counts toward capacity like any direct sale. Your commission rate is stamped on every booking you create, so both sides settle from the same numbers. There are no holds to manage and no payment webhooks to handle — availability, book, cancel.

Authentication

Every call sends the key the operator gave you, either way works:

Bash

GET /channel/v1/me is the smoke test. It returns "mode": "live" or "mode": "test" — assert on it in your deploy checks so a sandbox key can never reach production, or the reverse. A single-operator key returns { "connection": { connectionId, channelName, merchantId, commissionRate, … } }. A platform (OTA) key returns { "channel": { slug, name, merchants: [ { merchantId, commissionRate, offerAllInventory, … } ] } } — one entry per operator that has opted in to you, each with their commission rate. Errors always come back as { "error": "<machine_code>", "message": "<human text>" }; branch on the code.

CodeMeaning
missing_api_key / invalid_api_keyNo key, or a key that doesn't exist (rotated keys stop working instantly)
connection_pausedThe operator paused your connection
rate_limitedOver 300 requests/minute — back off until X-RateLimit-Reset
not_sandboxPOST /sandbox/reset was called with a live key

1. Pull the catalog

Bash

Returns every product you've been offered:

JSON

seasons carries the operator's retail pricing so you can price your own listings:

  • Both maps are keyed by weekday name (MondaySunday).
  • dailyPrices values are the full-day rate.
  • hourlyPrices values are a rule object — basePrice is the per-hour rate, minimumHours/maximumHours bound the rental length, and multiHourDiscounts (if any) lists { hours, discountPercentage } breaks. Older listings may carry a bare number instead of the object; treat it as basePrice.
  • startingPrice + priceUnit is the cheapest of the above, pre-computed for card display. Tours do not use seasons at all — see below.
  • Tax: prices are pre-tax. taxes lists the rates the operator applies to this product (already narrowed to the ones that apply — some products are exempt from some taxes) and totalTaxRate is their sum in percent. Charge the guest price × (1 + totalTaxRate / 100) and send that tax-inclusive figure as totalPrice when you book; the operator remits the tax.

Tours are priced differently

A product with "type": "tour" is not sold by the hour or the day. Ignore its seasons entirely — the array is empty, or present with every rate at 0. A tour's fares arrive in tourPricing instead:

JSON
  • priceUnit is person (a per-head ticket) or charter (a whole-boat private booking), never hr/day.
  • startingPrice is the standard adult fare, not the cheapest tier. Build your own fare table from priceTiers — displaying the child price as "from" is a mis-sell.
  • minParticipants is the smallest party the operator will run. Treat it as your minimum sellable quantity.
  • A private charter has isPrivate: true and a privatePricing block instead of tiers: basePrice covers baseHeadcount guests and each guest beyond that costs extraParticipantPrice.
A tour with no `tourPricing` is not free

Some tour listings resolve to no priced product on the operator's side. They keep their catalog entry — they are still bookable, since you supply totalPrice — but they carry no tourPricing and a null startingPrice. Ask the operator for the rate. Never treat an absent price as zero.

Every product carries merchantId / merchantName. With an OTA key you get the union of every opted-in operator's offer set — group by merchantId for your supplier pages. Cache the catalog and refresh it daily; it changes when an operator edits listings, changes their offer set, or connects/disconnects — not per booking.

2. Check availability

Real time, and answered by the same engine the operator's own checkout uses turnaround buffers, maintenance blocks, and capacity overrides included. If this endpoint says available, the booking call will succeed moments later.

Bash
JSON
  • locationId is optional — omit it and each product's own location is used (an OTA key spans many operators, so one locationId rarely fits).
  • Timestamps are ISO 8601 with an offset; the window may span up to 366 days.
  • Up to 25 productIds per request; lines come back in the order you asked.
  • unitsFree is null for seat-based products (tours) — trust available.
  • unknown_product means the id isn't offered to your connection. Products the merchant hasn't offered you answer exactly like products that don't exist.

3. Create a booking

You've collected the guest's payment — now push the confirmed sale. Idempotency-Key is required: pick a unique string per checkout (your own order id is perfect) and reuse it on retries.

Bash

201 Created:

JSON

Store bookingId — it's what you'll use to read or cancel. commissionRate is the operator's rate for you (with an OTA key each operator sets their own), so settlement numbers come straight off the booking.

Idempotency, precisely:

ResponseMeaning
200 + "idempotentReplay": trueThis key already created a booking — here it is again. Safe to retry on any timeout.
409 booking_in_progressSame key, still mid-flight. Wait a second and retry.
422 idempotency_key_reuseSame key, different request (product, window, quantity, or price changed). Use a new key.
409 unavailableReal conflict — someone booked it first. The key is freed; re-check availability.
503 idempotency_unavailable / inventory_lockedTransient. Retry with the same key.

Bookings are created under the same lock the operator's checkout holds, so a race against a direct customer can't double-book — one of you wins, the other gets unavailable.

4. Read or cancel

Bash

Cancel is idempotent — cancelling an already-cancelled booking returns 200 with "alreadyCancelled": true. You can only see and cancel bookings your connection created; anything else is a 404. A booking the operator has already checked in or completed returns 409 not_cancellable — call them.

Refunds are yours

You took the guest's payment, so you issue the refund. Cancelling here only releases the operator's inventory (and tour seats cascade to their waitlist).

Fees

RentalTide charges the operator a flat $5 platform fee per booking you send (added to their RentalTide account, reversed if you cancel). Nothing is charged to you and nothing is deducted from what you remit — your commission is the only thing between the sale price and the operator's payout.

Getting the operator paid

You collected the guest's money, so you owe the operator sale price − your commission for every non-cancelled booking. Both sides read the same numbers:

  • You: partners.rentaltide.com → Reseller & OTA API → Settlement — per operator, per month (by rental date): bookings, gross, your commission, owed.
  • The operator: the same figures under Settings → OTAs & Resellers.

Declare how you pay on your portal page (method, cadence, net days, and an optional payout-enrolment link such as Hyperwallet / Tipalti / PayPal Payouts) — operators see it on your card before they connect. Then pay on that cadence; each booking's reference and bookingId reconcile line by line. Automated payouts through RentalTide are on the roadmap.

Managing operators

From the same portal page you can, per operator: set a custom commission (overrides your default; the operator sees it read-only), pause (their listings drop out of your catalog until you resume — they cannot un-pause themselves), or remove (they'd need to click Connect again). Pause channel stops your key for everyone at once.

Staying in sync

Two complementary options:

  • Poll availability before showing a checkout — it's cheap and always right.
  • Webhooks: ask the operator to add your endpoint under Settings → Webhooks subscribed to booking.* events. You'll be notified when any booking is created, cancelled, or rescheduled — including direct sales that consume capacity you were about to sell. See Webhooks for signatures and retries.

Testing

Use your sandbox key — Channel API sandbox. It is the same endpoints against a demo operator of your own, with POST /channel/v1/sandbox/reset to start over, and GET /me returning "mode": "test" so you can assert which environment you are pointed at. It is also the right place to reproduce a bug after go-live, rather than experimenting on an operator's live account.

Limits & conventions

  • 300 requests per minute per connection (X-RateLimit-* headers on every response).
  • Timestamps: ISO 8601 with offset in, UTC out.
  • Prices are decimal dollars in the connection's currency.
  • Keys can be rotated by the operator at any time — handle invalid_api_key by contacting them, not by retrying.

Building a deeper integration? The Channel API is for reselling. If you're building an app that lives inside RentalTide or needs broader account access, see the Developer platform and the server-to-server API.

Was this page helpful?
Need help? Contact Support.See what’s new. Check out changelog.Questions? Book a video chat.
Ask AI
Responses are generated using AI and may contain mistakes.
Ask questions about RentalTide and get help with your integration.