API reference

The PropSocket REST API lives under /v1/. Reads are synchronous list + retrieve across four entities; writes are asynchronous write-back — a create or update returns anOperation you poll until it's applied. Bearer auth, offset pagination, filtering, sorting, andRFC 7807 errors throughout.

The basics

  • Base URL. https://api.propsocket.io/v1 — the same host for live and test mode; the key prefix selects the mode.
  • Auth. Authorization: Bearer ps_live_… — see authentication.
  • Pagination. Offset-based, default limit=25, max 100 — see pagination.
  • Filtering & sorting. Per-entity filters; ?order-by=field:asc|desc — see filtering.
  • Errors. application/problem+json with a request_id — see errors.

Entities

Each entity supports GET /v1/{entity}/ (list) and GET /v1/{entity}/{id} (retrieve):

LeaseResident is a relation, not an endpoint — there's no/v1/lease-residents. You read it as the nested residents array on a Lease (shown below). See the CDM overview for the relationship.

Writes don't have their own per-entity pages — every entity's create/update flow works the same way. See the Operations reference for the async write-back lifecycle, polling, and idempotency.

What a response looks like

Money is integer minor units plus a currency, datetimes are UTC ISO 8601, andx_id is the native PMS identifier — the conventions from theCDM overview hold on every response.

List response

List endpoints return the standard pagination envelope, with the full entity in each result:

GET /v1/properties
{
  "meta": {
    "limit": 25,
    "offset": 0,
    "hasMore": true
  },
  "results": [
    {
      "id": "prp_01HX0G5T8N3KEWBYV2QMR4DCFA",
      "x_id": "entrata-property-3391",
      "organization_id": "b3f1c2d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
      "integration_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "name": "Maple Court Apartments",
      "type": "apartment",
      "status": "active",
      "custom_data": {},
      "created_at": "2026-05-01T09:12:44Z",
      "updated_at": "2026-05-11T18:04:58Z"
    }
  ]
}

A full Property

Retrieving one record returns the full entity:

GET /v1/properties/{id}
{
  "id": "prp_01HX0G5T8N3KEWBYV2QMR4DCFA",
  "x_id": "entrata-property-3391",
  "organization_id": "b3f1c2d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
  "integration_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "name": "Maple Court Apartments",
  "type": "apartment",
  "status": "active",
  "address": {
    "line_1": "1400 Maple Court",
    "line_2": null,
    "city": "Austin",
    "state": "TX",
    "postal_code": "78704",
    "country": "US"
  },
  "description": "Garden-style community near South Lamar.",
  "year_built": 2014,
  "total_units": 188,
  "total_buildings": 6,
  "total_floors": 3,
  "website_url": "https://maplecourt.example.com",
  "email": "leasing@maplecourt.example.com",
  "phones": [
    {
      "type": "work",
      "number": "+15125550133",
      "primary": true
    }
  ],
  "latitude": 30.2451,
  "longitude": -97.7689,
  "management_company_name": "Lamar Residential",
  "pet_policy": "restricted",
  "smoking_policy": "not_allowed",
  "media": [],
  "custom_data": {},
  "created_at": "2026-05-01T09:12:44Z",
  "updated_at": "2026-05-11T18:04:58Z",
  "deleted_at": null
}

A full Lease

Leases expose two things worth seeing in full: Money fields (rent_amount, security_deposit, balance) and the nestedresidents array — the LeaseResident relation, with each resident'srole on this lease.

GET /v1/leases/{id}
{
  "id": "lse_01HX9P3K2N7QZRWY4B8MJ5VCDF",
  "x_id": "entrata-lease-8847291",
  "organization_id": "b3f1c2d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
  "integration_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "property_id": "prp_01HX0G5T8N3KEWBYV2QMR4DCFA",
  "unit_id": "unt_01HX1H6V9P4MFXCZW3RNS5EDGB",
  "resident_ids": [
    "res_01HX2J7V0Q5MGYDAW4SPT6FEHC",
    "res_01HX2K8W1R6NHZEBX5TPV7GFJD"
  ],
  "status": "active",
  "type": "fixed",
  "start_date": "2026-06-01",
  "end_date": "2027-05-31",
  "move_in_date": "2026-06-01",
  "notice_date": null,
  "rent_amount": {
    "amount": 272500,
    "currency": "USD"
  },
  "security_deposit": {
    "amount": 285000,
    "currency": "USD"
  },
  "balance": {
    "amount": 0,
    "currency": "USD"
  },
  "term_months": 12,
  "renewal_status": "not_started",
  "signed_date": "2026-05-11",
  "is_renewal": false,
  "previous_lease_id": null,
  "residents": [
    {
      "resident_id": "res_01HX2J7V0Q5MGYDAW4SPT6FEHC",
      "x_id": "entrata-resident-44218",
      "role": "primary"
    },
    {
      "resident_id": "res_01HX2K8W1R6NHZEBX5TPV7GFJD",
      "x_id": "entrata-resident-44219",
      "role": "responsible"
    }
  ],
  "custom_data": {},
  "created_at": "2026-05-11T17:41:52Z",
  "updated_at": "2026-05-11T17:41:52Z",
  "deleted_at": null
}

A soft-deleted record

Records removed from the source PMS aren't deleted — they get a non-null deleted_at. List endpoints hide them by default; pass ?include_deleted=true to see them:

GET /v1/leases/{id}?include_deleted=true
{
  "id": "lse_01HX9P3K2N7QZRWY4B8MJ5VCDF",
  "x_id": "entrata-lease-8847291",
  "organization_id": "b3f1c2d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
  "integration_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "property_id": "prp_01HX0G5T8N3KEWBYV2QMR4DCFA",
  "unit_id": "unt_01HX1H6V9P4MFXCZW3RNS5EDGB",
  "resident_ids": [],
  "status": "terminated",
  "type": "fixed",
  "start_date": "2026-06-01",
  "end_date": "2027-05-31",
  "move_in_date": "2026-06-01",
  "notice_date": "2026-08-15",
  "rent_amount": {
    "amount": 272500,
    "currency": "USD"
  },
  "security_deposit": {
    "amount": 285000,
    "currency": "USD"
  },
  "balance": {
    "amount": 0,
    "currency": "USD"
  },
  "term_months": 12,
  "renewal_status": "not_started",
  "signed_date": "2026-05-11",
  "is_renewal": false,
  "previous_lease_id": null,
  "residents": [],
  "custom_data": {},
  "created_at": "2026-05-11T17:41:52Z",
  "updated_at": "2026-09-02T11:08:33Z",
  "deleted_at": "2026-09-02T11:08:33Z"
}

Next

Make your first call in the quickstart, or learn the entity shapes in depth in the Common Data Model overview.