REST API · v1

VerticalRent API

Programmatic access to your properties, listings, leases, screening, and rental applications. Build integrations, automate workflows, or power custom internal tools.

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 request must include an Authorization header with a Bearer token. Create a key in Settings → API Keys. 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

All endpoints under /api/v1 require API-key authentication.

GET/api/v1/listings

Search active listings owned by the API key holder. Paginated.

Parameters
NameTypeRequiredDescription
pageintegernoPage number, default 1
perPageintegernoResults per page, default 25, max 100
citystringnoCase-insensitive partial match
statestringnoTwo-letter US state code (PA, CA, etc.)
minRentnumbernoMinimum monthly rent in dollars
maxRentnumbernoMaximum monthly rent in dollars
bedroomsintegernoExact bedroom count match
petsbooleannotrue = only pet-friendly listings
Example request
cURL
curl "https://www.verticalrent.com/api/v1/listings?state=PA&minRent=1000" \
  -H "Authorization: Bearer vr_pk_xxx"
Example response
JSON
{
  "ok": true,
  "data": [
    {
      "id": "abc-123",
      "title": "3BR / 2BA in Erie, PA",
      "description": "...",
      "photos": ["https://..."],
      "availableDate": "2026-06-01T00:00:00.000Z",
      "petPolicy": "cats_ok",
      "unit": { "bedrooms": 3, "bathrooms": 2, "rent": 1600 },
      "property": { "city": "Erie", "state": "PA", "address": "..." },
      "publicUrl": "https://www.verticalrent.com/listings/abc-123"
    }
  ],
  "pagination": { "page": 1, "perPage": 25, "total": 4, "hasMore": false }
}
GET/api/v1/listings/{id}

Fetch a single listing by ID.

Example request
cURL
curl https://www.verticalrent.com/api/v1/listings/abc-123 \
  -H "Authorization: Bearer vr_pk_xxx"
Example response
JSON
{ "ok": true, "data": { "id": "abc-123", ... } }
POST/api/v1/listings

Create a new listing on a unit you own.

Parameters
NameTypeRequiredDescription
unitIduuidyesMust be a unit you own
titlestringyesUp to 150 chars
descriptionstringyesFree text
availableDateISO dateyesWhen the unit becomes available
petPolicystringnoOne of: cats_ok, dogs_small, dogs_any, all_pets, negotiable, not_allowed
parkingSpotsintegerno0–10
utilitiesIncludedstring[]noe.g. ['water','trash']
leaseTermstringnoe.g. '12_months'
photosstring[]noUp to 20 HTTPS image URLs
videoUrlstringnoYouTube or Vimeo URL
Example request
cURL
curl -X POST https://www.verticalrent.com/api/v1/listings \
  -H "Authorization: Bearer vr_pk_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "unitId": "...",
    "title": "3BR / 2BA in Erie, PA",
    "description": "Spacious...",
    "availableDate": "2026-06-01"
  }'
Example response
JSON
{ "ok": true, "data": { "id": "...", ... } }
PUT/api/v1/listings/{id}

Full update — requires title, description, availableDate.

Example request
cURL
curl -X PUT https://www.verticalrent.com/api/v1/listings/abc-123 \
  -H "Authorization: Bearer vr_pk_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "description": "...", "availableDate": "2026-07-01" }'
Example response
JSON
{ "ok": true, "data": { "id": "abc-123", ... } }
PATCH/api/v1/listings/{id}

Partial update — provide only the fields to change.

Example request
cURL
curl -X PATCH https://www.verticalrent.com/api/v1/listings/abc-123 \
  -H "Authorization: Bearer vr_pk_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "isActive": false }'
Example response
JSON
{ "ok": true, "data": { ..., "isActive": false } }
DELETE/api/v1/listings/{id}

Permanently delete a listing.

Example request
cURL
curl -X DELETE https://www.verticalrent.com/api/v1/listings/abc-123 \
  -H "Authorization: Bearer vr_pk_xxx"
Example response
JSON
{ "ok": true, "data": { "deleted": true } }
POST/api/v1/applications

Create a rental application invite. Renter completes via the returned inviteUrl.

Parameters
NameTypeRequiredDescription
applicantEmailstringyesWhere to send the invite
applicantNamestringnoPre-fills the form
applicantPhonestringnoFor SMS invites
unitIduuidnoPre-select a unit (must be yours)
messagestringnoPersonal note to the applicant
Example request
cURL
curl -X POST https://www.verticalrent.com/api/v1/applications \
  -H "Authorization: Bearer vr_pk_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "applicantEmail": "jane@example.com",
    "applicantName": "Jane Smith",
    "unitId": "..."
  }'
Example response
JSON
{
  "ok": true,
  "data": {
    "id": "...",
    "token": "...",
    "inviteUrl": "https://www.verticalrent.com/apply/...",
    "expiresAt": "2026-06-17T..."
  }
}
GET/api/v1/screening-reports/{id}

Retrieve a screening report. FCRA-audited: every access logs an entry attributed to your API key. Only accessible if you have permissible purpose (e.g. an open application from the renter).

Example request
cURL
curl https://www.verticalrent.com/api/v1/screening-reports/abc-123 \
  -H "Authorization: Bearer vr_pk_xxx"
Example response
JSON
{
  "ok": true,
  "data": {
    "id": "abc-123",
    "reportType": "criminal",
    "status": "complete",
    "completedAt": "2026-05-15T...",
    "renter": { "id": "...", "email": "...", "fullName": "..." },
    "data": { /* report payload — treat as FCRA-regulated PII */ }
  }
}

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 → Webhooks.

Verifying the signature

Each delivery includes an X-VerticalRent-Signature header. 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.