API Documentation

The PropAgent AI public REST API lets you read and write core records — properties, tenants, maintenance tickets, and leads — from your own scripts or from tools like Zapier and Make. This is the same API our official Zapier integration is built on.

This is an Enterprise-plan feature. Get your API key from your dashboard at Settings → API Key — generate one if you don't have one yet, and reveal or copy it from there any time. If you're not on Enterprise, see Pricing.

Base URL

https://propagent-api.onrender.com/api/v1

Every endpoint below is relative to this base URL. All requests and responses use JSON.

Authentication

Send your organization's API key on every request in an X-API-Key header. There is no OAuth flow and no separate bearer token — the key itself is the credential, scoped to your organization the same way a logged-in dashboard user is.

X-API-Key: pa_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • Missing the header returns 401 Unauthorized with {"detail": "Missing X-API-Key header"}.
  • An invalid key returns 401 Unauthorized with {"detail": "Invalid API key"}.
  • A key belonging to an org whose trial has ended or subscription has lapsed returns 402 Payment Required.
  • Regenerating your key from Settings immediately invalidates the old one — update it everywhere you use it (including any Zapier/Make connection).

Notes & limits

  • Every record is scoped to your organization — there is no way to read or write another organization's data with your key.
  • GET list endpoints (/tenants, /maintenance, /leads) support since (ISO 8601 timestamp) and limit (default 25, max 100) query params for polling-style integrations.
  • Invalid enum values (e.g. an unrecognized category, priority, or source) return 422 Unprocessable Entity listing the valid options.
  • There is currently no published per-key rate limit on these endpoints beyond normal fair use — if you're building a high-frequency integration, please keep polling intervals reasonable (e.g. once a minute or slower) and reach out via Contact if you need something higher-throughput.

Endpoints

GET/me

Verify an API key and return the organization it belongs to. Useful as a connection test.

Example request
curl https://propagent-api.onrender.com/api/v1/me \
  -H "X-API-Key: pa_live_..."
Example response
{
  "id": "b3f1e2a0-6c1a-4e9d-9a3f-2d6e7c1a9b44",
  "name": "Sunrise Property Group"
}
Response fields
idUUID
namestring
GET/properties

List all properties in your organization, ordered by name. Read-only.

Example request
curl https://propagent-api.onrender.com/api/v1/properties \
  -H "X-API-Key: pa_live_..."
Example response (array)
[
  {
    "id": "d4a2f6e1-...",
    "name": "Maple Court Apartments",
    "address": "120 Maple St",
    "city": "Austin",
    "state": "TX",
    "total_units": 24
  }
]
Response fields
idUUID
namestring
addressstring
citystring
statestring
total_unitsinteger
GET/tenants

List tenants in your organization, newest first.

Query parameters
sinceISO 8601 datetimeoptional — only tenants created after this timestamp
limitintegeroptional, default 25, max 100
Example request
curl "https://propagent-api.onrender.com/api/v1/tenants?since=2026-08-01T00:00:00Z&limit=25" \
  -H "X-API-Key: pa_live_..."
Example response (array)
[
  {
    "id": "8a1c...",
    "first_name": "Maria",
    "last_name": "Gomez",
    "email": "maria@example.com",
    "phone": "+15125550100",
    "is_active": true,
    "created_at": "2026-08-05T14:22:01Z"
  }
]
Response fields
idUUID
first_namestring
last_namestring
emailstring | null
phonestring | null
is_activeboolean
created_atISO 8601 datetime
POST/tenants

Create a tenant in your organization.

Request body (JSON)
first_namestringrequired
last_namestringrequired
emailstring | nulloptional
phonestring | nulloptional
Example request
curl -X POST https://propagent-api.onrender.com/api/v1/tenants \
  -H "X-API-Key: pa_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Maria",
    "last_name": "Gomez",
    "email": "maria@example.com",
    "phone": "+15125550100"
  }'
Example response
{
  "id": "8a1c...",
  "first_name": "Maria",
  "last_name": "Gomez",
  "email": "maria@example.com",
  "phone": "+15125550100",
  "is_active": true,
  "created_at": "2026-08-07T18:04:12Z"
}
Response fields
idUUID
first_namestring
last_namestring
emailstring | null
phonestring | null
is_activeboolean
created_atISO 8601 datetime
GET/maintenance

List maintenance tickets across all your properties, newest first.

Query parameters
sinceISO 8601 datetimeoptional
limitintegeroptional, default 25, max 100
Example request
curl "https://propagent-api.onrender.com/api/v1/maintenance?limit=10" \
  -H "X-API-Key: pa_live_..."
Example response (array)
[
  {
    "id": "f0e9...",
    "property_id": "d4a2f6e1-...",
    "title": "Leaking kitchen faucet",
    "description": "Tenant reports steady drip under the sink.",
    "category": "plumbing",
    "priority": "medium",
    "status": "open",
    "created_at": "2026-08-06T09:11:40Z"
  }
]
Response fields
idUUID
property_idUUID
titlestring
descriptionstring
categorystringplumbing, electrical, hvac, appliance, structural, pest_control, cleaning, landscaping, other
prioritystringlow, medium, high, emergency
statusstringopen, in_progress, waiting_vendor, scheduled, completed, cancelled
created_atISO 8601 datetime
POST/maintenance

Create a maintenance ticket for one of your properties. Status is always set to open on creation.

Request body (JSON)
property_idUUIDrequired — must belong to your organization
titlestringrequired
descriptionstringrequired
categorystringoptional, default "other" — see valid values above
prioritystringoptional, default "medium" — low, medium, high, emergency
Example request
curl -X POST https://propagent-api.onrender.com/api/v1/maintenance \
  -H "X-API-Key: pa_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "property_id": "d4a2f6e1-...",
    "title": "Leaking kitchen faucet",
    "description": "Tenant reports steady drip under the sink.",
    "category": "plumbing",
    "priority": "medium"
  }'
Example response
{
  "id": "f0e9...",
  "property_id": "d4a2f6e1-...",
  "title": "Leaking kitchen faucet",
  "description": "Tenant reports steady drip under the sink.",
  "category": "plumbing",
  "priority": "medium",
  "status": "open",
  "created_at": "2026-08-07T18:07:55Z"
}
Response fields
idUUID
property_idUUID
titlestring
descriptionstring
categorystring
prioritystring
statusstring
created_atISO 8601 datetime
GET/leads

List leads in your organization, newest first.

Query parameters
sinceISO 8601 datetimeoptional
limitintegeroptional, default 25, max 100
Example request
curl "https://propagent-api.onrender.com/api/v1/leads?limit=25" \
  -H "X-API-Key: pa_live_..."
Example response (array)
[
  {
    "id": "3c7b...",
    "first_name": "Alex",
    "last_name": "Chen",
    "company": "Chen Holdings",
    "email": "alex@chenholdings.com",
    "phone": "+15125550101",
    "source": "website",
    "status": "new",
    "score": 62,
    "created_at": "2026-08-07T11:30:00Z"
  }
]
Response fields
idUUID
first_namestring | null
last_namestring | null
companystring | null
emailstring | null
phonestring | null
sourcestringgoogle_maps, linkedin, zillow, referral, website, cold_outreach, manual
statusstringnew, contacted, interested, demo_scheduled, negotiating, closed_won, closed_lost
scoreinteger
created_atISO 8601 datetime
POST/leads

Create a lead in your organization. Status is always set to new on creation — useful for piping in leads from a landing page, ad platform, or Zapier/Make.

Request body (JSON)
first_namestring | nulloptional
last_namestring | nulloptional
companystring | nulloptional
emailstring | nulloptional
phonestring | nulloptional
sourcestringoptional, default "manual" — see valid values above
Example request
curl -X POST https://propagent-api.onrender.com/api/v1/leads \
  -H "X-API-Key: pa_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Alex",
    "last_name": "Chen",
    "email": "alex@chenholdings.com",
    "source": "website"
  }'
Example response
{
  "id": "3c7b...",
  "first_name": "Alex",
  "last_name": "Chen",
  "company": null,
  "email": "alex@chenholdings.com",
  "phone": null,
  "source": "website",
  "status": "new",
  "score": 0,
  "created_at": "2026-08-07T18:12:03Z"
}
Response fields
idUUID
first_namestring | null
last_namestring | null
companystring | null
emailstring | null
phonestring | null
sourcestring
statusstring
scoreinteger
created_atISO 8601 datetime

Questions or need a higher-volume integration? Reach us via Contact, or see our Security & Data Handling page for how organization data is isolated.