_Last updated: May 2026_
Last updated: May 2026
Welcome to the LotWize API. This documentation covers authentication, endpoints, rate limits, error handling, webhooks, and SDK availability.
The LotWize API is a REST API that lets you:
Base URL:
https://api.lotwize.com/v1
All API requests must be made over HTTPS. HTTP requests are automatically redirected to HTTPS.
All requests require an API key passed in the Authorization header:
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.lotwize.com/v1/members
Getting an API key:
API key types:
| Type | Permissions | Use For |
|---|---|---|
| Read-only | GET requests only | Dashboards, analytics |
| Standard | GET + POST + PATCH | Normal operations |
| Admin | Full access including DELETE | Data management |
Security:
Webhooks sent by LotWize include a signature for verification:
X-LotWize-Signature: sha256=abcdef123456...
Verify the signature using your webhook secret:
import hmac
import hashlib
expected = hmac.new(
webhook_secret.encode(),
request_body.encode(),
hashlib.sha256
).hexdigest()
if not hmac.compare_digest(f"sha256={expected}", request_signature):
raise ValueError("Invalid signature")
Rate limits prevent abuse and ensure platform stability.
| Plan | Requests per minute | Burst limit |
|---|---|---|
| Starter | 60 | 10 |
| Growth | 300 | 50 |
| Pro | 3000 | 500 |
What counts: Every HTTP request (GET, POST, PATCH, DELETE) counts as one request.
Rate limit headers:
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 247
X-RateLimit-Reset: 1715769600
When you hit the limit:
429 Too Many Requests{ "error": "Rate limit exceeded", "retry_after": 45 }Best practices:
Manage homeowners, board members, and users.
List members:
GET /api/members?page=1&limit=50&role=homeowner
Response:
{
"data": [
{
"id": "mem_123abc",
"name": "Jane Smith",
"email": "jane@example.com",
"role": "homeowner",
"unit": "42B",
"status": "active",
"created_at": "2025-03-15T10:30:00Z"
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 127,
"has_more": true
}
}
Create member:
POST /api/members
Content-Type: application/json
{
"name": "John Doe",
"email": "john@example.com",
"role": "homeowner",
"unit": "12A",
"phone": "555-123-4567"
}
Update member:
PATCH /api/members/mem_123abc
Content-Type: application/json
{
"phone": "555-987-6543",
"status": "active"
}
Delete member:
DELETE /api/members/mem_123abc
Filters:
role — homeowner, board, pmc, adminstatus — active, pending, suspendedunit — specific unit numbercreated_after — ISO 8601 dateProcess and query payments.
List payments:
GET /api/payments?status=completed&start_date=2026-04-01&end_date=2026-04-30
Create payment:
POST /api/payments
Content-Type: application/json
{
"member_id": "mem_123abc",
"amount": 25000,
"currency": "usd",
"type": "dues",
"description": "April 2026 HOA dues"
}
Note: Amount is in cents ($250.00 = 25000)
Payment statuses:
pending — Payment initiated, awaiting confirmationcompleted — Successfully processedfailed — Payment did not go throughrefunded — Full refund issuedpartially_refunded — Partial refund issuedWebhooks: Payment status changes trigger payment.updated events.
Manage violation notices.
List violations:
GET /api/violations?status=open&severity=high
Create violation:
POST /api/violations
Content-Type: application/json
{
"member_id": "mem_123abc",
"rule_id": "rule_456def",
"description": "Unapproved fence installation",
"severity": "medium",
"fine_amount": 5000,
"cure_period_days": 14,
"evidence_urls": ["https://.../photo1.jpg"]
}
Update violation status:
PATCH /api/violations/vio_789ghi
Content-Type: application/json
{
"status": "resolved",
"resolution_notes": "Homeowner removed fence on 2026-05-01"
}
Violation statuses:
open — Issued, awaiting responseacknowledged — Homeowner acknowledgedin_hearing — Scheduled for board hearingresolved — Issue fixed or fine paidescalated — Legal action pendingclosed — Final status, no further actionSchedule and manage meetings.
List meetings:
GET /api/meetings?upcoming=true&community_id=org_abc123
Create meeting:
POST /api/meetings
Content-Type: application/json
{
"title": "May 2026 Board Meeting",
"type": "board",
"start_time": "2026-05-15T19:00:00Z",
"end_time": "2026-05-15T21:00:00Z",
"location": "Community Center, 123 Main St",
"agenda": "Budget review, landscaping proposal, violation appeals",
"attendees": ["mem_123abc", "mem_456def"]
}
Meeting types:
board — Board of directors meetingannual — Annual homeowners meetingspecial — Special/emergency meetingcommittee — Committee meetingUpload and manage documents.
List documents:
GET /api/documents?folder=bylaws&visibility=public
Upload document:
POST /api/documents
Content-Type: multipart/form-data
file: <binary file data>
name: "Updated Bylaws 2026.pdf"
folder: "bylaws"
visibility: "public"
tags: ["governance", "2026"]
Supported formats: PDF, DOC, DOCX, XLS, XLSX, JPG, PNG, TXT
Max file size: 50MB per file
Visibility:
public — Visible to all homeownersprivate — Board and PMC onlyrestricted — Specific users onlyGenerate and export reports.
Request report:
POST /api/reports
Content-Type: application/json
{
"type": "financial_summary",
"community_id": "org_abc123",
"date_range": {
"start": "2026-04-01",
"end": "2026-04-30"
},
"format": "pdf"
}
Report types:
financial_summary — Income, expenses, balancesar_aging — Accounts receivable agingviolation_summary — Violations by status and typepayment_history — All payments with detailsmember_directory — Homeowner contact listmeeting_minutes — Meeting recordsFormats: pdf, csv, xlsx
Async reports: Large reports are processed asynchronously. The response includes a report_id for status checking:
GET /api/reports/status/rep_789xyz
Receive real-time payment events from Stripe.
Endpoint:
POST /api/stripe/webhook
Events we send:
| Event | When It Fires | Payload Includes |
|---|---|---|
payment_intent.succeeded | Payment completes | Payment ID, amount, member |
payment_intent.payment_failed | Payment fails | Failure reason, member |
invoice.payment_succeeded | Subscription invoice paid | Invoice details |
invoice.payment_failed | Subscription invoice fails | Retry schedule |
customer.subscription.created | New subscription | Plan, trial info |
customer.subscription.updated | Subscription changed | New plan, status |
customer.subscription.deleted | Subscription cancelled | Cancellation date |
refund.created | Refund issued | Original payment, amount |
Webhook payload example:
{
"event": "payment_intent.succeeded",
"timestamp": "2026-05-08T14:23:00Z",
"data": {
"payment_id": "pay_abc123",
"member_id": "mem_456def",
"amount": 25000,
"currency": "usd",
"status": "completed",
"receipt_url": "https://lotwize.com/receipts/pay_abc123"
}
}
Retry policy: If your webhook endpoint returns a non-200 status, we retry:
| Code | Meaning | Common Causes |
|---|---|---|
200 | OK | Request succeeded |
201 | Created | Resource created successfully |
400 | Bad Request | Invalid JSON, missing required fields |
401 | Unauthorized | Invalid or missing API key |
403 | Forbidden | API key lacks permission for this action |
404 | Not Found | Resource doesn't exist |
409 | Conflict | Duplicate resource, conflicting state |
422 | Unprocessable | Validation failed (check details) |
429 | Too Many Requests | Rate limit hit |
500 | Server Error | Our fault — retry with backoff |
{
"error": {
"code": "invalid_request",
"message": "The request body contains invalid data",
"details": [
{
"field": "email",
"message": "Must be a valid email address"
}
],
"request_id": "req_abc123def456",
"documentation_url": "https://docs.lotwize.com/errors/invalid_request"
}
}
| Code | Meaning | Fix |
|---|---|---|
invalid_request | Malformed request | Check request body and headers |
authentication_failed | API key invalid | Verify key in Settings → API |
insufficient_permissions | Key lacks scope | Use a key with higher permissions |
resource_not_found | ID doesn't exist | Verify the resource ID |
duplicate_resource | Already exists | Use PATCH to update instead |
validation_failed | Field validation error | Check details for specific fields |
rate_limit_exceeded | Too many requests | Wait and retry with backoff |
payment_processing_error | Stripe error | Check Stripe dashboard |
file_too_large | Upload exceeds 50MB | Compress or split the file |
unsupported_format | File type not allowed | Use PDF, DOC, XLS, or image formats |
payment.createdpayment.updatedpayment.completedpayment.failedpayment.refundedmember.createdmember.updatedmember.deletedmember.suspendedmember.activatedviolation.createdviolation.updatedviolation.resolvedviolation.escalatedmeeting.createdmeeting.updatedmeeting.reminder (24h before)meeting.cancelleddocument.uploadeddocument.updateddocument.deletedorganization.createdorganization.updatedorganization.trial_startedorganization.trial_endedorganization.subscribedorganization.cancelledTesting webhooks locally: Use ngrok to expose localhost:
ngrok http 3000
# Use the HTTPS URL as your webhook endpoint
| Language | Status | Install | Docs |
|---|---|---|---|
| JavaScript/TypeScript | ✅ Available | npm install @lotwize/sdk | JS Docs |
| Python | ✅ Available | pip install lotwize-sdk | Python Docs |
| PHP | 🔄 In Development | — | — |
| Ruby | 🔄 In Development | — | — |
| Go | 📋 Planned | — | — |
import { LotWize } from '@lotwize/sdk';
const client = new LotWize({
apiKey: 'your_api_key_here',
baseUrl: 'https://api.lotwize.com/v1'
});
// List members
const members = await client.members.list({
role: 'homeowner',
limit: 50
});
// Create a payment
const payment = await client.payments.create({
memberId: 'mem_123abc',
amount: 25000, // cents
type: 'dues',
description: 'May 2026 dues'
});
// Handle webhooks
app.post('/webhooks/lotwize', (req, res) => {
const event = client.webhooks.verify(req.body, req.headers['x-lotwize-signature']);
if (event.type === 'payment.completed') {
console.log(`Payment ${event.data.payment_id} completed!`);
}
res.status(200).send('OK');
});
from lotwize import LotWize
client = LotWize(api_key="your_api_key_here")
# List members
members = client.members.list(role="homeowner", limit=50)
# Create a violation
violation = client.violations.create(
member_id="mem_123abc",
rule_id="rule_456def",
description="Unauthorized modification",
severity="medium",
fine_amount=5000
)
# Generate a report
report = client.reports.create(
type="financial_summary",
community_id="org_abc123",
date_range={"start": "2026-04-01", "end": "2026-04-30"},
format="pdf"
)
The current API version is v1.
Version in URL:
https://api.lotwize.com/v1/...
Deprecation policy:
Changelog: Subscribe to API updates at lotwize.com/api-changelog.
Ready to build? Generate your API key in Settings → API and make your first request!
The Amenities feature lets you browse and reserve community spaces like pools, gyms, clubhouses, and parks. You can see what is available, check operating hours, and book a time slot that works for yo
HomeownerThe Architectural Review feature lets you submit home improvement requests for board approval. This covers projects like fences, patios, paint colors, or exterior changes. The board reviews your reque
HomeownerThe Chat feature is your AI assistant for community questions. You can ask about HOA rules, due dates, amenity hours, or how to use any part of the portal. The assistant gives instant answers based on