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

1. Your Platform2. POST /orders3. Borrower Inspects4. Webhook + PDF

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.

Example Request Header
x-api-key: pk_live_a1b2c3d4e5f6g7h8i9j0...

Key Types

ScopePermissions
fullRead + Write (create orders, download reports)
read_onlyRead 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.

1

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]"
  }'
2

Configure your webhook endpoint

In your PropSight dashboard, go to Webhooks and add your endpoint URL. Subscribe to order.approved to receive completed inspections.

3

Receive the completed report

Webhook payload (order.approved)
{
  "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

POST/orders

Create a new inspection order. PropSight generates a magic link and optionally sends SMS/email to the borrower.

Request Body

FieldTypeRequiredDescription
orderNumberstringrequiredYour internal reference/loan number
clientNamestringrequiredClient/lender name
subjectAddressstringrequiredProperty street address
citystringrequiredCity
statestringrequiredState (2-letter code)
zipCodestringrequiredZIP code
homeownerNamestringrequiredBorrower/homeowner full name
homeownerPhonestringoptionalPhone for SMS delivery (E.164 format)
homeownerEmailstringoptionalEmail for magic link delivery
inspectionTypestringoptionalDefault: "Interior + Exterior"
callbackUrlstringoptionalPer-order webhook override URL
formTemplateIdnumberoptionalCustom form template ID
Response (201 Created)
{
  "id": 42,
  "orderNumber": "LOS-2026-12345",
  "status": "link_sent",
  "magicUrl": "https://propsight360.app/inspect/abc123def456...",
  "createdAt": "2026-05-07T10:00:00.000Z"
}
GET/orders

List all inspection orders for your organization, sorted by creation date (newest first).

Response (200 OK)
{
  "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
}
GET/orders/:id

Get detailed information about a specific order including inspection data and photo metadata.

Response (200 OK)
{
  "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"
    }
  ]
}
GET/orders/:id/report

Download the completed inspection PDF report. Only available for orders with status approved or completed.

Response (200 OK)
{
  "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

pendinglink_sentsubmittedapproved

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.

POST/orders/batchEnterprise

Create 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]"
      }
    ]
  }'
Response (207 Multi-Status)
{
  "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.

ParameterTypeDescription
limitnumberResults per page (1-100, default 50)
offsetnumberNumber of results to skip (default 0)
statusstringFilter by status (pending, link_sent, submitted, approved, flagged)
searchstringFull-text search across order number, address, homeowner name
sortstringSort field (createdAt, updatedAt, orderNumber, status)
orderstringSort direction (asc or desc, default desc)
createdAfterISO dateFilter 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.

FeatureSandbox (val_test_*)Production (val_*)
SMS NotificationsSuppressedActive
Email NotificationsSuppressedActive
Order CreationFull lifecycleFull lifecycle
Webhook DeliveryActiveActive
Rate Limits100 req/min100 req/min
Data IsolationShared (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.

HeaderDirectionDescription
X-Request-IdResponseUnique request identifier for support/debugging
X-RateLimit-RemainingResponseRequests remaining in current window
X-Idempotency-KeyRequestPrevents duplicate writes (24h TTL)
X-Sandbox-ModeResponse"true" when using a sandbox key
X-Api-VersionResponseCurrent 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

EventTrigger
order.createdNew order created (via API or dashboard)
order.submittedBorrower completed and submitted the inspection
order.approvedAdmin approved — report ready for download
order.flaggedAdmin flagged for issues (photos, data quality)
order.completedFull lifecycle complete (final state)
photo.uploadedIndividual photo uploaded by borrower
photo.analyzedAI QC analysis completed on a photo
report.generatedPDF report generated and ready
inspection.scheduledInspection 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
done

SDKs & Libraries

Official client libraries are coming soon. In the meantime, the API is simple enough to call directly with any HTTP client.

Py

Python

pip install propsight (coming soon)

Use requests library directly — see examples above.

JS

JavaScript / Node.js

npm install @propsight/sdk (coming soon)

Use native fetch — see examples above.

C#

C# / .NET

NuGet package (coming soon)

Use HttpClient with JSON serialization.

Rb

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.

CodeMeaningResolution
400Bad RequestCheck required fields in request body
401UnauthorizedMissing or invalid API key
403ForbiddenKey deactivated, expired, or accessing another org's data
404Not FoundResource does not exist
429Rate LimitedExceeded 100 req/min — wait and retry
500Server ErrorContact support — include request ID if available
Error Response Format
{
  "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.

Launch Setup Wizard

Getting Started with Testing

  1. 1Log into your PropSight account and navigate to Settings → Security & API
  2. 2Generate a Sandbox API key — select "Sandbox" environment to get a val_test_* key
  3. 3Use the Interactive API Tester in your dashboard to test endpoints directly
  4. 4Configure a webhook endpoint and use the Webhook Event Tester to send sample payloads
  5. 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 prefixTEST-*

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.

Authentication
Endpoint
Response

Response will appear here

Select an endpoint and click Send Request

Generated cURL
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.

Download JSON

Client SDKs

Download typed client libraries for your preferred language

TS

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

Download TypeScript SDK
PY

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

Download Python SDK

Webhook Event Simulator

Test your webhook endpoint by sending sample event payloads

Webhook Endpoint URL
Webhook Secret (optional — for HMAC signature)
Event Type
Payload
Delivery Result

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.