PropSight API
Integrate property inspections directly into your Loan Origination System, vendor management platform, or any application. Create orders, receive real-time status updates via webhooks, and automatically retrieve completed inspection reports.
RESTful API
Simple JSON over HTTPS with API key authentication
Real-time Webhooks
Get notified instantly when inspections complete
Auto PDF Delivery
Completed reports pushed back to your system automatically
Integration Flow
Authentication
All API requests require an API key passed in the x-api-key header. Generate keys from your organization's Settings → Security & API page.
x-api-key: pk_live_a1b2c3d4e5f6g7h8i9j0...Key Types
| Scope | Permissions |
|---|---|
full | Read + Write (create orders, download reports) |
read_only | Read only (list orders, get details, download reports) |
Security: API keys are hashed with SHA-256 before storage. Keep your key secret, rotate periodically, and never expose it in client-side code. Each key is scoped to your organization.
Quick Start
Get up and running in 3 steps. This example creates an inspection order, and your webhook receives the completed report.
Create an inspection order
curl -X POST "https://propsight360.app/api/v1/orders" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"orderNumber": "LOS-2026-12345",
"clientName": "Acme Lending",
"inspectionType": "Interior + Exterior",
"subjectAddress": "456 Oak Ave",
"city": "Dallas",
"state": "TX",
"zipCode": "75201",
"homeownerName": "Jane Doe",
"homeownerPhone": "+15559876543",
"homeownerEmail": "[email protected]"
}'Configure your webhook endpoint
In your PropSight dashboard, go to Webhooks and add your endpoint URL. Subscribe to order.approved to receive completed inspections.
Receive the completed report
{
"event": "order.approved",
"timestamp": "2026-05-10T14:30:00.000Z",
"data": {
"orderId": 42,
"orderNumber": "LOS-2026-12345",
"status": "approved",
"subjectAddress": "456 Oak Ave",
"city": "Dallas",
"state": "TX",
"zipCode": "75201",
"homeownerName": "Jane Doe",
"approvedAt": "2026-05-10T14:30:00.000Z",
"reportUrl": "https://propsight360.app/api/v1/orders/42/report"
}
}API Endpoints
Base URL: https://propsight360.app/api/v1
/ordersCreate a new inspection order. PropSight generates a magic link and optionally sends SMS/email to the borrower.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| orderNumber | string | required | Your internal reference/loan number |
| clientName | string | required | Client/lender name |
| subjectAddress | string | required | Property street address |
| city | string | required | City |
| state | string | required | State (2-letter code) |
| zipCode | string | required | ZIP code |
| homeownerName | string | required | Borrower/homeowner full name |
| homeownerPhone | string | optional | Phone for SMS delivery (E.164 format) |
| homeownerEmail | string | optional | Email for magic link delivery |
| inspectionType | string | optional | Default: "Interior + Exterior" |
| callbackUrl | string | optional | Per-order webhook override URL |
| formTemplateId | number | optional | Custom form template ID |
{
"id": 42,
"orderNumber": "LOS-2026-12345",
"status": "link_sent",
"magicUrl": "https://propsight360.app/inspect/abc123def456...",
"createdAt": "2026-05-07T10:00:00.000Z"
}/ordersList all inspection orders for your organization, sorted by creation date (newest first).
{
"orders": [
{
"id": 42,
"orderNumber": "LOS-2026-12345",
"clientName": "Acme Lending",
"inspectionType": "Interior + Exterior",
"subjectAddress": "456 Oak Ave",
"city": "Dallas",
"state": "TX",
"zipCode": "75201",
"homeownerName": "Jane Doe",
"homeownerPhone": "+15559876543",
"homeownerEmail": "[email protected]",
"status": "approved",
"createdAt": "2026-05-07T10:00:00.000Z",
"updatedAt": "2026-05-10T14:30:00.000Z"
}
],
"total": 1
}/orders/:idGet detailed information about a specific order including inspection data and photo metadata.
{
"id": 42,
"orderNumber": "LOS-2026-12345",
"clientName": "Acme Lending",
"status": "approved",
"subjectAddress": "456 Oak Ave",
"city": "Dallas",
"state": "TX",
"zipCode": "75201",
"homeownerName": "Jane Doe",
"homeownerPhone": "+15559876543",
"homeownerEmail": "[email protected]",
"createdAt": "2026-05-07T10:00:00.000Z",
"updatedAt": "2026-05-10T14:30:00.000Z",
"inspection": {
"occupancy": "Occupied",
"occupiedBy": "Owner",
"propertyType": "SFR",
"overallCondition": "C3",
"bedrooms": "3",
"bathrooms": "2",
"numberOfStories": "2",
"basement": "Yes",
"hvac": "Central",
"submittedAt": "2026-05-09T09:15:00.000Z"
},
"photos": [
{
"id": 101,
"section": "exterior",
"label": "Front of Home",
"storageUrl": "/manus-storage/...",
"latitude": "32.7767",
"longitude": "-96.7970",
"capturedAt": 1746432900000,
"aiQcStatus": "passed"
}
]
}/orders/:id/reportDownload the completed inspection PDF report. Only available for orders with status approved or completed.
{
"reportUrl": "https://propsight360.app/manus-storage/reports/order-42-report.pdf",
"filename": "Inspection-Report-LOS-2026-12345.pdf",
"generatedAt": "2026-05-10T14:35:00.000Z",
"expiresAt": "2026-05-11T14:35:00.000Z"
}Note: The reportUrl is a signed URL valid for 24 hours. Download the PDF within this window or request a new URL.
Order Status Flow
Orders may also transition to flagged (needs re-inspection) or revision_requested.
Enterprise Features
Production-grade capabilities for high-volume integrations, including batch processing, idempotency, pagination, and sandbox/production key separation.
/orders/batchEnterpriseCreate up to 50 orders in a single request. Each order is processed independently — partial failures don't affect other orders in the batch.
curl -X POST https://propsight360.app/api/v1/orders/batch \
-H "x-api-key: YOUR_KEY" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: batch-import-2026-05-15" \
-d '{
"orders": [
{
"orderNumber": "LOS-001",
"clientName": "Acme Lending",
"subjectAddress": "123 Main St",
"city": "Dallas",
"state": "TX",
"zipCode": "75201",
"homeownerName": "John Doe",
"homeownerPhone": "+15551234567"
},
{
"orderNumber": "LOS-002",
"clientName": "Acme Lending",
"subjectAddress": "456 Oak Ave",
"city": "Houston",
"state": "TX",
"zipCode": "77001",
"homeownerName": "Jane Smith",
"homeownerEmail": "[email protected]"
}
]
}'{
"results": [
{ "index": 0, "success": true, "order": { "id": 42, "orderNumber": "LOS-001", "status": "link_sent" } },
{ "index": 1, "success": true, "order": { "id": 43, "orderNumber": "LOS-002", "status": "link_sent" } }
],
"summary": { "total": 2, "succeeded": 2, "failed": 0 }
}Idempotency Keys
Prevent duplicate order creation by including an X-Idempotency-Key header. If the same key is sent within 24 hours, the API returns the original response without creating a duplicate.
# Include with any POST request to prevent duplicates
curl -X POST https://propsight360.app/api/v1/orders \
-H "x-api-key: YOUR_KEY" \
-H "X-Idempotency-Key: loan-12345-create-v1" \
-H "Content-Type: application/json" \
-d '{...}'Tip: Use a deterministic key derived from your loan number + action (e.g., loan-12345-create-v1). This ensures safe retries even across network failures.
Pagination, Filtering & Sorting
The GET /orders endpoint supports cursor-based pagination, field filtering, and multi-column sorting.
| Parameter | Type | Description |
|---|---|---|
| limit | number | Results per page (1-100, default 50) |
| offset | number | Number of results to skip (default 0) |
| status | string | Filter by status (pending, link_sent, submitted, approved, flagged) |
| search | string | Full-text search across order number, address, homeowner name |
| sort | string | Sort field (createdAt, updatedAt, orderNumber, status) |
| order | string | Sort direction (asc or desc, default desc) |
| createdAfter | ISO date | Filter orders created after this date |
GET /api/v1/orders?limit=25&offset=0&status=submitted&sort=createdAt&order=desc&search=oak+ave
# Response includes pagination metadata:
{
"orders": [...],
"total": 142,
"limit": 25,
"offset": 0,
"hasMore": true
}Sandbox vs Production Keys
PropSight supports dual-environment API keys. Sandbox keys allow full lifecycle testing without triggering real notifications.
| Feature | Sandbox (val_test_*) | Production (val_*) |
|---|---|---|
| SMS Notifications | Suppressed | Active |
| Email Notifications | Suppressed | Active |
| Order Creation | Full lifecycle | Full lifecycle |
| Webhook Delivery | Active | Active |
| Rate Limits | 100 req/min | 100 req/min |
| Data Isolation | Shared (tagged) | Full production data |
Key prefix matters: Sandbox keys start with val_test_ and production keys start with val_. The API automatically detects the environment from the key prefix.
Request & Response Headers
Every API response includes metadata headers for debugging and rate limit tracking.
| Header | Direction | Description |
|---|---|---|
| X-Request-Id | Response | Unique request identifier for support/debugging |
| X-RateLimit-Remaining | Response | Requests remaining in current window |
| X-Idempotency-Key | Request | Prevents duplicate writes (24h TTL) |
| X-Sandbox-Mode | Response | "true" when using a sandbox key |
| X-Api-Version | Response | Current API version (v1) |
API Usage Analytics
Monitor your integration health with built-in analytics. Access real-time usage data programmatically or via the dashboard.
GET /api/v1/usage?days=30
{
"dailyCounts": [{"date": "2026-05-15", "count": 47}],
"total": 1420,
"endpointBreakdown": [
{"endpoint": "POST /orders", "count": 890},
{"endpoint": "GET /orders", "count": 380}
],
"avgResponseTimeMs": 142,
"perKeyStats": [
{"keyPrefix": "val_test_abc", "count": 200},
{"keyPrefix": "val_xyz12345", "count": 1220}
]
}Also available in the dashboard at Settings → API Usage Analytics.
Webhooks
Receive real-time HTTP POST notifications when inspection orders change status. Configure webhook endpoints from your PropSight dashboard under Webhooks.
Available Events
| Event | Trigger |
|---|---|
| order.created | New order created (via API or dashboard) |
| order.submitted | Borrower completed and submitted the inspection |
| order.approved | Admin approved — report ready for download |
| order.flagged | Admin flagged for issues (photos, data quality) |
| order.completed | Full lifecycle complete (final state) |
| photo.uploaded | Individual photo uploaded by borrower |
| photo.analyzed | AI QC analysis completed on a photo |
| report.generated | PDF report generated and ready |
| inspection.scheduled | Inspection scheduled for a future date |
Webhook Headers
POST /your-webhook-endpoint HTTP/1.1
Content-Type: application/json
User-Agent: PropSight-Webhooks/1.0
x-webhook-event: order.approved
x-webhook-signature: a1b2c3d4e5f6... (HMAC-SHA256 of body)Signature Verification
# The x-webhook-signature header contains:
# HMAC-SHA256(your_webhook_secret, raw_request_body)
#
# Verify before processing any event.
# Reject requests with invalid signatures.Retry Policy
If your endpoint returns a non-2xx status or times out (10s), PropSight retries up to 3 times with exponential backoff: 30 seconds → 2 minutes → 10 minutes. Failed deliveries are logged in your webhook history dashboard.
Automatic Report Delivery
The most common integration pattern: your system creates an order via API, and PropSight automatically delivers the completed PDF report back to your system via webhook when approved.
Option A: Webhook + Download (Recommended)
Subscribe to the order.approved event. When fired, the payload includes a reportUrl — download the PDF and push it into your system.
# When you receive the order.approved webhook:
curl -o report.pdf "REPORT_URL_FROM_WEBHOOK"
# Or use the API endpoint directly:
curl -H "x-api-key: YOUR_KEY" \
"https://propsight360.app/api/v1/orders/42/report"Option B: Polling
If your system cannot receive webhooks, poll the order status periodically and download the report when status changes to approved.
# Poll every 5 minutes until status = "approved"
while true; do
STATUS=$(curl -s -H "x-api-key: KEY" \
"https://propsight360.app/api/v1/orders/42" | jq -r '.status')
if [ "$STATUS" = "approved" ]; then
curl -H "x-api-key: KEY" \
"https://propsight360.app/api/v1/orders/42/report" > report.json
break
fi
sleep 300
doneSDKs & Libraries
Official client libraries are coming soon. In the meantime, the API is simple enough to call directly with any HTTP client.
Python
pip install propsight (coming soon)
Use requests library directly — see examples above.
JavaScript / Node.js
npm install @propsight/sdk (coming soon)
Use native fetch — see examples above.
C# / .NET
NuGet package (coming soon)
Use HttpClient with JSON serialization.
Ruby
gem install propsight (coming soon)
Use Net::HTTP or Faraday.
Error Handling
All errors return a JSON object with an error field and appropriate HTTP status code.
| Code | Meaning | Resolution |
|---|---|---|
| 400 | Bad Request | Check required fields in request body |
| 401 | Unauthorized | Missing or invalid API key |
| 403 | Forbidden | Key deactivated, expired, or accessing another org's data |
| 404 | Not Found | Resource does not exist |
| 429 | Rate Limited | Exceeded 100 req/min — wait and retry |
| 500 | Server Error | Contact support — include request ID if available |
{
"error": "Missing required fields",
"required": ["orderNumber", "clientName", "subjectAddress", "city", "state", "zipCode", "homeownerName"]
}Sandbox & Testing
Test your integration safely before going live. Sandbox keys (val_test_*) mirror production behavior without triggering real SMS/email notifications.
New to PropSight API?
Use our step-by-step setup wizard to generate keys, configure webhooks, and test your first order.
Getting Started with Testing
- 1Log into your PropSight account and navigate to Settings → Security & API
- 2Generate a Sandbox API key — select "Sandbox" environment to get a
val_test_*key - 3Use the Interactive API Tester in your dashboard to test endpoints directly
- 4Configure a webhook endpoint and use the Webhook Event Tester to send sample payloads
- 5When ready for production, generate a Production key (
val_*) and update your integration
Test Data
Use these test values when creating orders in development:
| Phone (no SMS sent) | +15550001234 |
| Email (no email sent) | [email protected] |
| Order prefix | TEST-* |
Rate Limits
100 requests per minute per API key. The rate limit applies equally to all endpoints. If exceeded, you'll receive a 429 response — wait and retry with exponential backoff.
Interactive API Console
Execute live API calls directly from this page. Enter your API key (sandbox or production) and test any endpoint in real time.
Response will appear here
Select an endpoint and click Send Request
curl -X GET "https://YOUR_DOMAIN/api/v1/health" \ -H "Content-Type: application/json"
OpenAPI Specification
Import into Postman, generate typed SDKs, or use with any OpenAPI-compatible tool.
Client SDKs
Download typed client libraries for your preferred language
TypeScript SDK
@propsight/sdk v1.0.0
npm install @propsight/sdk\u2022 Full type definitions for all endpoints
\u2022 Zero dependencies (uses native fetch)
\u2022 ESM + CJS dual exports
\u2022 Node.js 18+ / Browser / Deno
Python SDK
propsight v1.0.0
pip install propsight\u2022 Dataclass-based type hints
\u2022 Zero dependencies (stdlib urllib)
\u2022 Python 3.8+ compatible
\u2022 Async support coming soon
Webhook Event Simulator
Test your webhook endpoint by sending sample event payloads
Delivery result will appear here
Select an event and click Send Test Event
How it works: The test payload is sent directly from your browser to your webhook endpoint via HTTP POST. If you provide a secret, an HMAC-SHA256 signature is computed client-side and included in the x-webhook-signature header — identical to production webhook deliveries.
Security: Requests are sent directly from your browser to the API. Your API key is never stored or transmitted to any third party. Use a sandbox key (val_test_*) for testing.
Ready to integrate?
Get your API key and start sending inspection orders in minutes. Our integration team is here to help.