Getting Started

The RentingHive API is a REST API that allows you to manage your listings, register webhook endpoints, and upload images — all programmatically.

Base URL: https://rentinghive.com/api/v1

Authentication

All API requests require a bearer token in the Authorization header. Generate a key from the API Keys page.

Authorization: Bearer rhk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Scopes

ScopeAccess
readList and read listings
webhookread + status updates + webhook endpoints
fullAll operations including create/delete

Listings

GET /listings

Returns paginated list of your listings. Scope: read

GET /listings/{id}

Returns a single listing. Scope: read

POST /listings

Create a listing. Scope: full

{
  "title": "Power Drill",
  "category": "Tools & Hardware",
  "description": "DeWalt 20V drill, great condition...",
  "price_per_day": 12.00,
  "zip_code": "30075",
  "images": ["listings/tmp/uuid.jpg"]
}
PATCH /listings/{id}/status

Update listing status. Scope: webhook
When you receive a listing.status_changed webhook showing a listing is now rented, update your own system. To tell RentingHive when you've rented an item externally, call this endpoint with rented_externally.

Allowed values: available, unavailable, rented_externally

Outbound Webhooks

Register an HTTPS endpoint to receive listing events in real time.

Available events

EventFired when
listing.createdNew listing created
listing.updatedListing details changed
listing.status_changedStatus transitions (e.g. available → rented)
listing.deletedListing soft-deleted

Verifying webhook signatures

Each delivery includes a X-RentingHive-Signature header. Compute HMAC-SHA256(secret, payload) and compare.

// PHP
$expected = hash_hmac('sha256', $rawBody, $secret);
if (!hash_equals($expected, $request->header('X-RentingHive-Signature'))) {
    abort(401);
}
# Python
import hmac, hashlib
expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, request.headers['X-RentingHive-Signature']):
    abort(401)
// Node.js
const crypto = require('crypto')
const expected = crypto.createHmac('sha256', secret).update(rawBody).digest('hex')
if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig))) {
  res.status(401).end()
}

Inbound Webhooks (Stripe)

RentingHive listens for Stripe account.updated and account.application.deauthorized events. If your Stripe Connect account is suspended or deauthorized, all API keys for your account are automatically revoked.

Media Upload

Images must be uploaded directly to S3 via a pre-signed URL. Call POST /media/upload-url to get a signed URL, then PUT your file to that URL. Pass the returned path in images[] when creating a listing.

POST /media/upload-url
{ "mime_type": "image/jpeg" }

→ { "upload_url": "https://s3.amazonaws.com/...", "path": "listings/tmp/uuid.jpg" }

Plans & Limits

PlanListing limitRate limit
Free50 listings60 req/min
Pro1,000 listings600 req/min

Error Codes

HTTPerror codeMeaning
401unauthenticatedNo API key provided
401invalid_api_keyKey invalid or revoked
403insufficient_scopeKey scope too narrow
403plan_limit_exceededFree tier listing limit reached
403forbidden_statusStatus not owner-settable
404not_foundResource not found
422validation_errorInvalid request body
429Rate limit exceeded
500server_errorInternal error — retry with backoff

🐝 Renting Hive

© 2026 Renting Hive. All rights reserved.