REST API · v1

VerticalRent API

Programmatic access to listings, rental applications, and screening reports. Build integrations, automate workflows, or power custom internal tools — all authenticated with an API key.

Available on Growth ($29/mo) and Portfolio ($79/mo) plans.

Free and Starter accounts can read the docs but can't create API keys. See pricing →

Base URL
https://www.verticalrent.com/api/v1
Rate Limit
100 req / min per key
Auth
Bearer vr_pk_xxx

Authentication

Every /api/v1 request must include Authorization: Bearer vr_pk_…. Create a key in Settings → API & Integrations. Keys start with vr_pk_ followed by 48 hex chars.

One-time display:Keys are shown to you exactly once when created. Store them securely — we can't recover lost keys.

curl https://www.verticalrent.com/api/v1/listings \
  -H "Authorization: Bearer vr_pk_a1b2c3d4e5f6..."

Rotating keys

  1. Create a new key in Settings → API Keys
  2. Update your integration to use the new key
  3. Verify everything still works, then revoke the old key

Security best practices

  • Never commit keys to source control — use environment variables
  • Use a separate key for each integration so one revocation doesn't break others
  • Rotate keys at least quarterly
  • Revoke immediately if you suspect a leak

Response Format

Success

JSON
{
  "ok": true,
  "data": { /* ... */ }
}

Paginated

JSON
{
  "ok": true,
  "data": [ /* ... */ ],
  "pagination": {
    "page": 1,
    "perPage": 25,
    "total": 142,
    "hasMore": true
  }
}

Error

JSON
{
  "error": "Invalid API key",
  "code": "INVALID_API_KEY"
}

Error codes

CodeHTTPMeaning
INVALID_API_KEY401Missing, malformed, revoked, or expired API key
PLAN_UPGRADE_REQUIRED403Account is not on a Growth or Portfolio plan
FORBIDDEN403Authenticated but not authorized for this resource
VALIDATION_ERROR400Request body or query params failed validation
NOT_FOUND404Resource doesn't exist or isn't owned by this key
CONFLICT409Operation conflicts with current state (e.g. duplicate)
RATE_LIMITED429100 req/min exceeded. See Retry-After header.
INTERNAL_ERROR500Unexpected server-side failure

Endpoint Reference

Full request/response schemas are generated from our OpenAPI spec — always in sync with production.

Interactive API reference

Browse Listings, Applications, and Screening endpoints — all require a Bearer API key.

Webhooks

Subscribe to real-time event notifications. We POST a JSON payload to your URL whenever a subscribed event fires, signed with HMAC-SHA256 so you can verify authenticity.

Create + manage subscriptions in Settings → API & Integrations (Webhooks).

Verifying the signature

Each delivery includes an X-VerticalRent-Signatureheader. Verify it by computing the same HMAC-SHA256 over the raw request body using your subscription's secret.

import crypto from "node:crypto";

export default function handler(req, res) {
  const sig = req.headers["x-verticalrent-signature"]; // "sha256=..."
  const body = req.rawBody; // raw request body string
  const expected = "sha256=" + crypto
    .createHmac("sha256", process.env.VR_WEBHOOK_SECRET)
    .update(body)
    .digest("hex");
  if (sig !== expected) return res.status(401).end();

  const event = JSON.parse(body);
  console.log("Received:", event.event, event.data);
  res.status(200).end();
}

Event types

EventFires when
application.submittedAn applicant submits a rental application
application.approvedLandlord approves an application
application.deniedLandlord denies an application
screening.completedA screening report finishes
lease.generatedAI lease generation completes
lease.signedTenant signs a lease
rent.receivedA rent payment succeeds
rent.lateRent payment becomes overdue
maintenance.submittedTenant submits a maintenance request
maintenance.completedVendor marks a job complete
tenant.move_out_noticeTenant submits a move-out notice

Retry policy

Deliveries that fail (non-2xx response or network error) are retried automatically on this schedule: 1 min, 5 min, 30 min, 2 hours, 12 hours. After 5 attempts, the delivery is marked failed permanently. You can manually replay any delivery from Settings → Webhooks.

Quick-start Tutorials

Common integration patterns to get you started fast.

Build a Zapier integration that creates a Slack message when a tenant pays rent

1. In Settings → Webhooks, click Add Endpoint.

2. In Zapier, create a Webhook by Zapier trigger with Catch Hook. Copy the URL Zapier gives you.

3. Paste that URL into VerticalRent, check the rent.received event, and save.

4. Save the signing secret — you'll need it later to verify signatures.

5. In Zapier, add a Slack → Send Channel Message action. Use the webhook payload fields (e.g. data.amount, data.tenant.name) in the message template.

Sync new listings to your own CRM via webhooks

1. Build a webhook receiver at e.g. https://your-crm.com/webhooks/vr.

2. Subscribe to application.submitted from VerticalRent.

3. On each delivery: verify the signature, then create a Contact + Deal in your CRM from data.applicantEmail and data.applicantName.

4. Return HTTP 200 within 10 seconds, or VerticalRent will retry.

Bulk-import properties using the REST API

The bulk-import endpoints land in Phase 8 of our roadmap. For now, you can loop over your data and call POST /api/v1/listings per unit. Mind the 100 req/min rate limit — add a 600ms delay between calls if importing in volume.

Ready to build?

Create your first API key and ship in minutes.