Perch Developer Portal

Build integrations with the Perch API. Access properties, transactions, bookings, and reports programmatically.

Interactive API Reference Getting Started

Getting Started

The Perch API lets you read and write rental property data — properties, transactions, bookings, categorization rules, participation hours, and reports. It's a standard REST API with JSON payloads and API key authentication.

1. Get an API Key

Log into app.getperch.ai, click API in the nav bar, and generate a key. API access requires a Starter plan ($29/mo) or higher.

Two key types:

2. Make Your First Request

curl -H "Authorization: Bearer pk_user_YOUR_KEY" \
  https://api.getperch.ai/v1/properties

3. Import into Postman

Postman Collection Postman Environment OpenAPI Spec

Authentication

All API requests require an API key in the Authorization header:

Authorization: Bearer pk_user_your-api-key-here

Keys are scoped to the user who generated them. CPA keys (pk_cpa_...) can access all shared client accounts by passing ?owner_uid=CLIENT_UID on requests.

API keys are shown once on creation. Store them securely — we only store the SHA-256 hash.

API Endpoints

Base URL: https://api.getperch.ai/api/v1

Properties

CRUD for rental properties — name, address, type, listing channels.

Transactions

Create, categorize, and query financial transactions. Filter by property, date, category.

Bookings

Guest bookings with channel, revenue, and date data.

Categorization Rules

Auto-categorization rules for transaction patterns.

Participation Hours

Log material participation hours for IRS compliance.

Reports

Portfolio summary and financial reports (read-only).

Response Format

All responses return JSON. List endpoints include pagination metadata:

{
  "data": [...],
  "meta": {
    "total": 150,
    "limit": 50,
    "offset": 0
  }
}

Pagination & Filtering

ParameterDescriptionDefault
limitMax items per page50 (max 200)
offsetSkip N items0
property-idFilter by property (transactions)
categoryFilter by account code (transactions)
from-dateStart date filter (YYYY-MM-DD)
to-dateEnd date filter (YYYY-MM-DD)
owner_uidClient UID (CPA keys only)own account

Account Codes

Transactions use Perch account codes for categorization:

CodeNameType
401Rental IncomeIncome
402Platform FeesIncome
601CleaningExpense
602SuppliesExpense
603UtilitiesExpense
604InsuranceExpense
605Repairs & MaintenanceExpense
606Property ManagementExpense
607Professional FeesExpense
608Software & SubscriptionsExpense
609HOA DuesExpense
701Property TaxesTax
702Occupancy TaxesTax
801Mortgage PaymentMortgage
301Personal/Owner DrawHolding
302UnallocatedHolding

Webhooks

Receive real-time notifications when data changes in Perch. Webhooks are signed with HMAC-SHA256 so you can verify authenticity.

Create a Webhook

curl -X POST \
  -H "Authorization: Bearer pk_user_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"My Integration","url":"https://example.com/webhook","events":["transaction.created","property.created"]}' \
  https://api.getperch.ai/v1/webhooks

The response includes a signing-secret — save it, it's shown only once.

Available Events

EventTriggered When
property.createdNew property added
property.updatedProperty details changed
property.deletedProperty removed
transaction.createdNew transaction
transaction.updatedTransaction modified
transaction.categorizedCategory assigned
transaction.deletedTransaction removed
booking.createdNew booking
booking.updatedBooking modified
booking.deletedBooking removed
bank.syncedBank feed sync completed
report.generatedReport refreshed
rule.createdNew categorization rule
rule.deletedRule removed
hours.loggedParticipation hours logged

Webhook Payload

POST https://your-endpoint.com/webhook
Headers:
  Content-Type: application/json
  X-Perch-Signature: t=1712345678,v1=abc123def456...
  X-Perch-Event: transaction.created
  X-Perch-Timestamp: 1712345678

Body:
{
  "id": "txn-abc123",
  "data": { ... }
}

Verifying Signatures

To verify a webhook is from Perch:

  1. Extract the timestamp (t=) and signature (v1=) from X-Perch-Signature
  2. Build the signed content: timestamp + "." + raw_body
  3. Compute HMAC-SHA256(signing_secret, signed_content)
  4. Compare the hex-encoded result with the v1= value
# Python example
import hmac, hashlib

def verify_signature(payload, signature_header, secret):
    parts = dict(p.split('=', 1) for p in signature_header.split(','))
    timestamp = parts['t']
    expected = parts['v1']
    signed = f"{timestamp}.{payload}"
    computed = hmac.new(
        secret.encode(), signed.encode(), hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(computed, expected)

Rate Limits

The API is rate-limited per user:

Rate-limited responses return HTTP 429 with a Retry-After header.

Support

Questions? Email peter@getperch.ai or ask the Perch AI agent in the app.