REST API reference
Generated from the OpenAPI 3.1 document at /api/v1/openapi.json, which you can load into any OpenAPI tool. API version 1.0.0.
Basics
Owner and inventory data for one organization, chosen by the token. Renter information appears as the criterion assertions the owner app shows, for renters who engaged with your vacancy; the values a renter shared with an application only with the read:applicant_data scope, each read audited and shown to the renter. Never documents or background check reports. Nothing here publishes a vacancy or decides an application: an AI or a script must not decide on applicants (fair housing), so approving, declining and waitlisting stay with a person in the app, and the API only reads the outcome. A background check can be asked for (the renter authorizes it) but is ordered and read in the app. Writes go through the same checks as the app (roles, plan, billing). Every call is audited with the token.
- Base URL:
https://developers.propfit.co/api/v1. Authenticate with an organization API token. - Money is in integer cents (165000 = $1,650.00). Dates and times are ISO 8601.
- Lists are paginated:
?limit=(1–100, default 25) and?cursor=with thenext_cursorof the previous page.next_cursorisnullon the last page. - Writes accept an
Idempotency-Keyheader (8–128 ofA-Z a-z 0-9 _ . : -). A retry with the same key and body returns the first response, withIdempotent-Replayed: true, for 24 hours. The same key with a different body answers409 idempotency_key_reused. - The API never publishes a vacancy:
POST /offerscreates a draft, andPATCH /offers/{id}edits drafts only. - Every response has an
X-Request-Id. See Errors and Rate limits.
export PROPFIT_TOKEN=pf_api_…
curl -s "https://developers.propfit.co/api/v1/offers?status=published&limit=10" \
-H "Authorization: Bearer $PROPFIT_TOKEN"
# A draft vacancy, safe to retry with the same key:
curl -s -X POST https://developers.propfit.co/api/v1/offers \
-H "Authorization: Bearer $PROPFIT_TOKEN" -H "Content-Type: application/json" \
-H "Idempotency-Key: buildium-unit-4411-2026-11" \
-d '{"unit_id": "<unit id>", "rent_cents": 165000, "available_on": "2026-12-01"}'Operations
The token and its organizationGET /me
Scope: any token
List propertiesGET /properties
Scope: read:inventory
| Parameter | In | Type | Description |
|---|---|---|---|
cursor | query | string | The next_cursor from the previous page. |
limit | query | integer | Page size, 1–100 (default 25).. 1–100. Default 25 |
include_archived | query | boolean | Include archived records.. Default false |
Returns 200 with PropertyPage. Errors: 400, 401, 403, 404, 429 (see Errors) .
Create a propertyPOST /properties
Scope: write:inventory
| Parameter | In | Type | Description |
|---|---|---|---|
Idempotency-Key | header | string | Retries with the same key and body get the first response (24 hours).. Pattern ^[A-Za-z0-9_.:-]{8,128}$ |
Request body (JSON): PropertyInput
Returns 201 with Property. Errors: 400, 401, 403, 404, 409, 422, 429 (see Errors) .
Get a propertyGET /properties/{id}
Scope: read:inventory
List unitsGET /units
Scope: read:inventory
| Parameter | In | Type | Description |
|---|---|---|---|
property_id | query | string (uuid) | Only this property’s units. |
cursor | query | string | The next_cursor from the previous page. |
limit | query | integer | Page size, 1–100 (default 25).. 1–100. Default 25 |
include_archived | query | boolean | Include archived records.. Default false |
Returns 200 with UnitPage. Errors: 400, 401, 403, 404, 429 (see Errors) .
Create a unitPOST /units
Scope: write:inventory
List vacanciesGET /offers
Scope: read:offers
Vacancies (offers) with status, rent, terms, fees, move-in cost, readiness and live links.
| Parameter | In | Type | Description |
|---|---|---|---|
status | query | string | Comma-separated: draft, published, paused, leased, withdrawn. |
property_id | query | string (uuid) | Only this property. |
unit_id | query | string (uuid) | Only this unit. |
cursor | query | string | The next_cursor from the previous page. |
limit | query | integer | Page size, 1–100 (default 25).. 1–100. Default 25 |
Returns 200 with OfferPage. Errors: 400, 401, 403, 404, 429 (see Errors) .
Create a draft vacancyPOST /offers
Scope: write:offers
Always a draft. Publishing has verification and compliance gates and stays a person’s action in the PropFit app.
| Parameter | In | Type | Description |
|---|---|---|---|
Idempotency-Key | header | string | Retries with the same key and body get the first response (24 hours).. Pattern ^[A-Za-z0-9_.:-]{8,128}$ |
Request body (JSON): OfferInput
Returns 201 with Offer. Errors: 400, 401, 403, 404, 409, 422, 429 (see Errors) .
Get a vacancyGET /offers/{id}
Scope: read:offers
Change a draft vacancyPATCH /offers/{id}
Scope: write:offers
Drafts only. A published vacancy is changed in the app (pause, edit, republish).
| Parameter | In | Type | Description |
|---|---|---|---|
id (required) | path | string (uuid) | |
Idempotency-Key | header | string | Retries with the same key and body get the first response (24 hours).. Pattern ^[A-Za-z0-9_.:-]{8,128}$ |
Request body (JSON): OfferPatch
Returns 200 with Offer. Errors: 400, 401, 403, 404, 409, 422, 429 (see Errors) .
Pause a published vacancyPOST /offers/{id}/pause
Scope: write:offers
Takes it off the market. Pausing a paused vacancy is a no-op. Resuming is publishing, which stays in the app.
| Parameter | In | Type | Description |
|---|---|---|---|
id (required) | path | string (uuid) | |
Idempotency-Key | header | string | Retries with the same key and body get the first response (24 hours).. Pattern ^[A-Za-z0-9_.:-]{8,128}$ |
Returns 200 with Offer. Errors: 400, 401, 403, 404, 409, 422, 429 (see Errors) .
The criteria that govern a vacancyGET /offers/{id}/criteria
Scope: read:criteria
The most specific active policy, its criteria in plain words by pathway, and its compliance-check result.
| Parameter | In | Type | Description |
|---|---|---|---|
id (required) | path | string (uuid) |
Returns 200 with OfferCriteria. Errors: 400, 401, 403, 404, 429 (see Errors) .
Prospects for a vacancy, as assertionsGET /offers/{id}/matches
Scope: read:matches
Counts by match state and, per renter who engaged with this vacancy, the criterion assertions the owner app shows: a pseudonymous handle, state, readiness and per-criterion status and evidence level. Never names, contact details, renter values, documents or reports. Requires a verified organization.
| Parameter | In | Type | Description |
|---|---|---|---|
id (required) | path | string (uuid) | |
cursor | query | string | The next_cursor from the previous page. |
limit | query | integer | Page size, 1–100 (default 25).. 1–100. Default 25 |
Returns 200 with ProspectPage. Errors: 400, 401, 403, 404, 429 (see Errors) .
Funnel counts for a vacancyGET /offers/{id}/funnel
Scope: read:analytics
Create a qualification linkPOST /offers/{id}/links
Scope: write:links
| Parameter | In | Type | Description |
|---|---|---|---|
id (required) | path | string (uuid) | |
Idempotency-Key | header | string | Retries with the same key and body get the first response (24 hours).. Pattern ^[A-Za-z0-9_.:-]{8,128}$ |
Request body (JSON): LinkInput
Returns 201 with Link. Errors: 400, 401, 403, 404, 409, 422, 429 (see Errors) .
List active criteria policiesGET /criteria
Scope: read:criteria
| Parameter | In | Type | Description |
|---|---|---|---|
cursor | query | string | The next_cursor from the previous page. |
limit | query | integer | Page size, 1–100 (default 25).. 1–100. Default 25 |
Returns 200 with PolicyPage. Errors: 400, 401, 403, 404, 429 (see Errors) .
Prospect counts by state for every published or paused vacancyGET /matches
Scope: read:matches
Counts only. Requires a verified organization.
Returns 200 with MatchSummary. Errors: 400, 401, 403, 404, 429 (see Errors) .
List applicationsGET /applications
Scope: read:applications
Submitted applications, oldest first per vacancy (first-come order in queue_position): status, the criterion assertions the owner app shows, which kinds of data the renter shared, and the outcome once a person in the app has made it. Read only: no endpoint changes an outcome (see the API description). No names or contact details: those are in shared-data.
| Parameter | In | Type | Description |
|---|---|---|---|
offer_id | query | string (uuid) | Only this vacancy. |
status | query | string | Comma-separated application statuses (Application.status). |
cursor | query | string | The next_cursor from the previous page. |
limit | query | integer | Page size, 1–100 (default 25).. 1–100. Default 25 |
Returns 200 with ApplicationPage. Errors: 400, 401, 403, 404, 429 (see Errors) .
Get an applicationGET /applications/{id}
Scope: read:applications
| Parameter | In | Type | Description |
|---|---|---|---|
id (required) | path | string (uuid) |
Returns 200 with Application. Errors: 400, 401, 403, 404, 429 (see Errors) .
Background checks asked forGET /background-checks
Scope: read:background_checks
Every application with a background check asked for, and where it stands. The result is only pass or needs_review; the report itself is read by a person in the app.
| Parameter | In | Type | Description |
|---|---|---|---|
offer_id | query | string (uuid) | Only this vacancy. |
cursor | query | string | The next_cursor from the previous page. |
limit | query | integer | Page size, 1–100 (default 25).. 1–100. Default 25 |
Returns 200 with BackgroundCheckPage. Errors: 400, 401, 403, 404, 429 (see Errors) .
An applicant’s background check statusGET /applications/{id}/background-check
Scope: read:background_checks
| Parameter | In | Type | Description |
|---|---|---|---|
id (required) | path | string (uuid) |
Returns 200 with BackgroundCheck. Errors: 400, 401, 403, 404, 429 (see Errors) .
Ask the applicant to authorize a background checkPOST /applications/{id}/background-check
Scope: write:background_checks
The same as “Request background check” in the app: the renter is asked to authorize it, and it counts against your plan only once ordered. Asking twice is a no-op. Ordering and reading the report stay in the app.
| Parameter | In | Type | Description |
|---|---|---|---|
id (required) | path | string (uuid) | |
Idempotency-Key | header | string | Retries with the same key and body get the first response (24 hours).. Pattern ^[A-Za-z0-9_.:-]{8,128}$ |
Returns 200 with BackgroundCheck. Errors: 400, 401, 403, 404, 409, 422, 429 (see Errors) .
Tour times and their toursGET /tour-slots
Scope: read:tours
Tour times from `from` (default: yesterday) to `to`, at most 500, with the tours booked in them (pseudonymous prospects, never contact details).
| Parameter | In | Type | Description |
|---|---|---|---|
offer_id | query | string (uuid) | Only this vacancy. |
from | query | string (date-time) | ISO 8601: times ending after this. |
to | query | string (date-time) | ISO 8601: times starting before this. |
Returns 200 with TourSlotList. Errors: 400, 401, 403, 404, 429 (see Errors) .
Add tour times to a vacancyPOST /offers/{id}/tour-slots
Scope: write:tours
Local wall-clock start times in the vacancy’s market time zone. The vacancy must be live (published or paused).
| Parameter | In | Type | Description |
|---|---|---|---|
id (required) | path | string (uuid) | |
Idempotency-Key | header | string | Retries with the same key and body get the first response (24 hours).. Pattern ^[A-Za-z0-9_.:-]{8,128}$ |
Request body (JSON): TourSlotsInput
Returns 201 with TourSlotsCreated. Errors: 400, 401, 403, 404, 409, 422, 429 (see Errors) .
Cancel a tour timePOST /tour-slots/{id}/cancel
Scope: write:tours
Cancels the time and every tour booked in it; renters are told.
| Parameter | In | Type | Description |
|---|---|---|---|
id (required) | path | string (uuid) | |
Idempotency-Key | header | string | Retries with the same key and body get the first response (24 hours).. Pattern ^[A-Za-z0-9_.:-]{8,128}$ |
Returns 200 with TourSlotCanceled. Errors: 400, 401, 403, 404, 409, 422, 429 (see Errors) .
Cancel a booked tourPOST /tours/{id}/cancel
Scope: write:tours
The renter is told. A tour that isn’t booked any more is a 409.
| Parameter | In | Type | Description |
|---|---|---|---|
id (required) | path | string (uuid) | |
Idempotency-Key | header | string | Retries with the same key and body get the first response (24 hours).. Pattern ^[A-Za-z0-9_.:-]{8,128}$ |
Returns 200 with TourCanceled. Errors: 400, 401, 403, 404, 409, 422, 429 (see Errors) .
Owner reportsGET /reports
Scope: read:reports
Billing summaryGET /billing
Scope: read:billing
Plan, billing status, doors, subscription and the last 12 invoices’ totals. Read only; never card details or payment links.
Returns 200 with BillingSummary. Errors: 400, 401, 403, 404, 429 (see Errors) .
Notification preferencesGET /notification-preferences
Scope: read:notifications
The token creator’s notification and email preferences for this organization, quiet hours and daily cap.
Returns 200 with NotificationPreferences. Errors: 400, 401, 403, 404, 429 (see Errors) .
Search homes in open marketsGET /renter/homes
Scope: read:homes
Published homes in PropFit’s open markets, as a public listing shows them, with the list of open markets. A renter’s own OAuth token.
| Parameter | In | Type | Description |
|---|---|---|---|
market | query | string | An open market key (see open_markets). Default: every open market. |
area | query | string | A city or ZIP code. |
min_bedrooms | query | integer | At least this many bedrooms. |
max_rent_cents | query | integer | Rent at most this, in cents. |
cursor | query | string | The next_cursor from the previous page. |
limit | query | integer | Page size, 1–100 (default 25).. 1–100. Default 25 |
Returns 200 with HomePage. Errors: 400, 401, 403, 404, 429 (see Errors) .
My matches, with why each home fitsGET /renter/matches
Scope: read:my_matches
The signed-in renter’s matches: the home, the match state and, per criterion, the explanation written for the renter, the gap if any and their next steps.
| Parameter | In | Type | Description |
|---|---|---|---|
cursor | query | string | The next_cursor from the previous page. |
limit | query | integer | Page size, 1–100 (default 25).. 1–100. Default 25 |
Returns 200 with RenterMatchPage. Errors: 400, 401, 403, 404, 429 (see Errors) .
My applicationsGET /renter/applications
Scope: read:my_applications
Returns 200 with RenterApplicationList. Errors: 400, 401, 403, 404, 429 (see Errors) .
My toursGET /renter/tours
Scope: read:my_tours
Returns 200 with RenterTourList. Errors: 400, 401, 403, 404, 429 (see Errors) .
My Passport statusGET /renter/passport
Scope: read:my_passport
Schemas
Error
| Field | Type | Notes |
|---|---|---|
error | object | |
error.code | unauthorized | token_revoked | token_expired | insufficient_scope | not_entitled | account_suspended | org_unverified | forbidden | rate_limited | not_found | method_not_allowed | conflict | idempotency_key_reused | validation_failed | invalid_request | internal_error | |
error.message | string | |
error.request_id | string |
Me
| Field | Type | Notes |
|---|---|---|
token | object | |
token.id | string (uuid) | |
token.name | string | |
token.prefix | string | |
token.scopes | string[] | |
token.expires_at | string (date-time) | |
token.rate_limit_per_minute | integer | |
organization | object | |
organization.id | string (uuid) | |
organization.name | string | |
organization.verification_status | string | |
organization.market | string |
Property
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | |
name | string or null | |
address_line1 | string | |
address_line2 | string or null | |
city | string | |
state | string | |
postal_code | string | |
county | string or null | |
latitude | number or null | |
longitude | number or null | |
property_type | single_family | condo | townhouse | duplex | triplex | fourplex | multifamily | other | |
ownership_form | string or null | |
description | string or null | |
verification_status | string | |
archived | boolean | |
unit_count | integer | |
created_at | string (date-time) | |
updated_at | string (date-time) |
PropertyInput
| Field | Type | Notes |
|---|---|---|
name | string | |
address_line1 (required) | string | |
address_line2 | string | |
city (required) | string | |
state (required) | string | Pattern ^[A-Za-z]{2}$ |
postal_code (required) | string | Pattern ^\d{5}(-\d{4})?$ |
county | string | |
latitude | number | |
longitude | number | |
property_type (required) | single_family | condo | townhouse | duplex | triplex | fourplex | multifamily | other | |
ownership_form | string | |
description | string |
PropertyPage
| Field | Type | Notes |
|---|---|---|
data | Property[] | |
next_cursor | string or null |
Unit
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | |
property_id | string (uuid) | |
label | string | |
bedrooms | integer | |
bathrooms | number | |
square_feet | integer or null | |
accessibility_features | string[] | |
parking | string or null | |
furnished | boolean | |
amenities | string[] | |
archived | boolean | |
created_at | string (date-time) | |
updated_at | string (date-time) |
UnitInput
| Field | Type | Notes |
|---|---|---|
property_id (required) | string (uuid) | |
label (required) | string | |
bedrooms (required) | integer | 0 = studio |
bathrooms (required) | number | |
square_feet | integer | |
accessibility_features | string[] | |
parking | string | |
furnished | boolean | |
amenities | string[] |
UnitPage
| Field | Type | Notes |
|---|---|---|
data | Unit[] | |
next_cursor | string or null |
Offer
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | |
status | draft | published | paused | leased | withdrawn | |
label | string | |
unit | object | |
unit.id | string (uuid) | |
unit.label | string | |
unit.bedrooms | integer | |
unit.bathrooms | number | |
unit.square_feet | integer or null | |
property | object | |
property.id | string (uuid) | |
property.name | string or null | |
property.address_line1 | string | |
property.city | string | |
property.state | string | |
property.postal_code | string | |
rent_cents | integer | |
deposit_cents | integer | |
application_fee_cents | integer | |
lease_terms_months | integer[] | |
available_on | string (date) | |
pet_policy | none | cats | dogs | cats_and_dogs | case_by_case | |
utilities_included | string[] | |
smoking_allowed | boolean | |
description | string or null | |
fees | object[] | |
fees[].label | string | |
fees[].kind | monthly | move_in | |
fees[].amount_cents | integer | |
pricing_verified | boolean | |
published_at | string (date-time) or null | |
monthly_cost_cents | integer | Rent plus mandatory monthly fees. |
move_in_cost_cents | integer | First month’s rent and monthly fees, deposit, application fee and move-in fees. |
readiness | object[] | |
readiness[].key | string | |
readiness[].required | boolean | |
readiness[].ok | boolean | |
policy | any | |
links | object[] | |
links[].id | string (uuid) | |
links[].slug | string | |
links[].channel | string | |
links[].created_at | string (date-time) | |
links[].url | string | |
created_at | string (date-time) | |
updated_at | string (date-time) |
OfferInput
| Field | Type | Notes |
|---|---|---|
unit_id (required) | string (uuid) | |
rent_cents (required) | integer | |
deposit_cents | integer | |
application_fee_cents | integer | |
lease_terms_months | integer[] | |
available_on (required) | string (date) | |
pet_policy | none | cats | dogs | cats_and_dogs | case_by_case | |
utilities_included | string[] | |
smoking_allowed | boolean | |
description | string or null | |
fees | object[] | Replaces all fees when given. |
fees[].label (required) | string | |
fees[].kind (required) | monthly | move_in | |
fees[].amount_cents (required) | integer |
OfferPatch
| Field | Type | Notes |
|---|---|---|
rent_cents | integer | |
deposit_cents | integer | |
application_fee_cents | integer | |
lease_terms_months | integer[] | |
available_on | string (date) | |
pet_policy | none | cats | dogs | cats_and_dogs | case_by_case | |
utilities_included | string[] | |
smoking_allowed | boolean | |
description | string or null | |
fees | object[] | Replaces all fees when given. |
fees[].label | string | |
fees[].kind | monthly | move_in | |
fees[].amount_cents | integer |
OfferPage
| Field | Type | Notes |
|---|---|---|
data | Offer[] | |
next_cursor | string or null |
OfferCriteria
| Field | Type | Notes |
|---|---|---|
offer_id | string (uuid) | |
policy | any | |
criteria | object[] | |
criteria[].key | string | |
criteria[].name | string or null | |
criteria[].stage | discovery | screening | |
criteria[].pathway | integer | |
criteria[].parameters | object | |
criteria[].text | string | The criterion in plain words. |
Policy
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | |
scope_type | string | |
scope_id | string (uuid) | |
version | integer | |
activated_at | string (date-time) or null | |
compliance_status | string | |
criteria | object[] | |
criteria[].key | string | |
criteria[].name | string or null | |
criteria[].stage | discovery | screening | |
criteria[].pathway | integer | |
criteria[].parameters | object | |
criteria[].text | string | The criterion in plain words. |
PolicyPage
| Field | Type | Notes |
|---|---|---|
data | Policy[] | |
next_cursor | string or null |
Prospect
| Field | Type | Notes |
|---|---|---|
prospect | string | A pseudonymous handle, stable for one renter within your organization. |
state | POTENTIAL_MATCH | VERIFICATION_NEEDED | VERIFIED_MATCH | PARTIAL_MATCH | NOT_CURRENT_MATCH | CRITERIA_INCOMPLETE | APPLICATION_PENDING | LANDLORD_APPROVED | LANDLORD_DECLINED | |
match_group | string | |
ready | boolean | |
evidence | verified | reported | missing | null | |
criteria | object[] | |
criteria[].key | string | |
criteria[].name | string | |
criteria[].pathway | integer | |
criteria[].status | MET | NOT_MET | REVIEW_REQUIRED | NOT_APPLICABLE | UNKNOWN | |
criteria[].evidence | string or null | |
criteria[].policy_data_issue | boolean | |
criteria[].explanation | string | An assertion, never a renter value. |
next_steps | object[] | |
next_steps[].code | string | |
next_steps[].audience | string | |
next_steps[].criterion_key | string or null | |
decided_at | string (date-time) | |
state_changed_at | string (date-time) | |
invitations | object[] | |
invitations[].kind | string | |
invitations[].invited_at | string (date-time) |
ProspectPage
| Field | Type | Notes |
|---|---|---|
offer_id | string (uuid) | |
by_state | map of integer | |
data | Prospect[] | |
next_cursor | string or null |
MatchSummary
| Field | Type | Notes |
|---|---|---|
data | object[] | |
data[].offer_id | string (uuid) | |
data[].label | string | |
data[].status | draft | published | paused | leased | withdrawn | |
data[].prospects | integer | |
data[].by_state | map of integer |
Funnel
| Field | Type | Notes |
|---|---|---|
offer_id | string (uuid) | |
suppressed_below | integer | |
counts | object | |
counts.shown_to_renters | integer or null | null when 1–4 |
counts.prospects | integer or null | null when 1–4 |
counts.potential | integer or null | null when 1–4 |
counts.verified | integer or null | null when 1–4 |
counts.applications | integer or null | null when 1–4 |
counts.invited_to_verify | integer or null | null when 1–4 |
counts.invited_to_tour | integer or null | null when 1–4 |
counts.invited_to_apply | integer or null | null when 1–4 |
links_by_channel | map of integer |
LinkInput
| Field | Type | Notes |
|---|---|---|
channel | string | Pattern ^[a-z][a-z0-9_]{1,31}$. Default "api" |
Link
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | |
offer_id | string (uuid) | |
slug | string | |
channel | string | |
offer_status | draft | published | paused | leased | withdrawn | |
created_at | string (date-time) | |
url | string |
Application
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | |
offer_id | string (uuid) | |
offer_label | string | |
prospect | string | A pseudonymous handle (as in Prospect). |
status | submitted | in_review | screening_requested | screening_in_progress | screened | approved | declined | waitlisted | lease_recorded | withdrawn | expired | |
submitted_at | string (date-time) or null | |
queue_position | integer | First-come order within the vacancy (1 = first). |
match_state | POTENTIAL_MATCH | VERIFICATION_NEEDED | VERIFIED_MATCH | PARTIAL_MATCH | NOT_CURRENT_MATCH | CRITERIA_INCOMPLETE | APPLICATION_PENDING | LANDLORD_APPROVED | LANDLORD_DECLINED | |
evidence | verified | reported | missing | null | |
meets_criteria | boolean | |
criteria | object[] | Criterion assertions, shaped as Prospect.criteria. Never renter values. |
household | object[] | Roles only (primary, co-applicant, guarantor…), never people. |
household[].role | string | |
household[].income_counted | boolean | |
household[].has_account | boolean | |
shared_scope | string[] | Which kinds of data the renter shared (not the values). |
shared_data_available | boolean | |
move_in_date | string (date) or null | |
pets_confirmation | string or null | |
application_fee_cents | integer or null | |
reviewed_at | string (date-time) or null | |
decided_at | string (date-time) or null | |
withdrawn_at | string (date-time) or null | |
expired_at | string (date-time) or null | |
expires_at | string (date-time) or null | |
decision | object or null | What a person decided in the app, on which published criteria. Read only: the API never decides. |
decision.decision | approved | declined | waitlisted | |
decision.basis_codes | string[] | |
decision.consumer_report_used | boolean | |
decision.decided_at | string (date-time) | |
adverse_action_notice | object or null | |
adverse_action_notice.status | string or null | |
adverse_action_notice.delivered_at | string (date-time) or null |
ApplicationPage
| Field | Type | Notes |
|---|---|---|
data | Application[] | |
next_cursor | string or null |
BackgroundCheck
| Field | Type | Notes |
|---|---|---|
application_id | string (uuid) | |
offer_id | string (uuid) | |
prospect | string | |
status | not_requested | awaiting_renter | renter_declined | authorized | in_progress | completed | failed | canceled | expired | |
requested_at | string (date-time) or null | |
renter_answered_at | string (date-time) or null | |
ordered_at | string (date-time) or null | |
stage | string or null | |
stage_changed_at | string (date-time) or null | |
failure_code | string or null | |
result | pass | needs_review | null | Only pass or needs review. The report is read by a person in the app. |
BackgroundCheckPage
| Field | Type | Notes |
|---|---|---|
data | BackgroundCheck[] | |
next_cursor | string or null |
TourSlot
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | |
offer_id | string (uuid) | |
offer_label | string | |
starts_at | string (date-time) | |
ends_at | string (date-time) | |
capacity | integer | |
canceled_at | string (date-time) or null | |
booked | integer | |
tours | object[] | |
tours[].id | string (uuid) | |
tours[].prospect | string | |
tours[].status | string | |
tours[].match_state | POTENTIAL_MATCH | VERIFICATION_NEEDED | VERIFIED_MATCH | PARTIAL_MATCH | NOT_CURRENT_MATCH | CRITERIA_INCOMPLETE | APPLICATION_PENDING | LANDLORD_APPROVED | LANDLORD_DECLINED | |
tours[].invited | boolean | |
tours[].rescheduled | boolean | |
tours[].cancel_reason | string or null | |
tours[].booked_at | string (date-time) | |
tours[].status_changed_at | string (date-time) |
TourSlotList
| Field | Type | Notes |
|---|---|---|
data | TourSlot[] |
TourSlotsInput
| Field | Type | Notes |
|---|---|---|
starts (required) | string[] | Local wall-clock start times in the vacancy’s market time zone. |
minutes | integer | 15–240. Default 30 |
capacity | integer | 1–20. Default 1 |
TourSlotsCreated
| Field | Type | Notes |
|---|---|---|
offer_id | string (uuid) | |
slot_ids | string (uuid)[] |
TourSlotCanceled
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | |
canceled | boolean | |
tours_canceled | integer |
TourCanceled
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | |
status | string |
Report
| Field | Type | Notes |
|---|---|---|
summary | object | Per-vacancy funnel and timing (owner_report). |
details | object | Report details (owner_report_details). |
BillingSummary
| Field | Type | Notes |
|---|---|---|
plan | object or null | |
plan.id | string | |
plan.name | string | |
plan.billing_model | string | |
billing_status | string | |
limited | boolean | Billing has lapsed: new listings and checks are paused. |
pilot_ends_on | string (date) or null | |
card_on_file | boolean | |
active_doors | integer | |
active_doors_limit | integer or null | |
subscription | object or null | |
subscription.status | string | |
subscription.quantity | integer or null | |
subscription.current_period_end | string (date-time) or null | |
subscription.cancel_at_period_end | boolean | |
invoices | object[] | |
invoices[].number | string or null | |
invoices[].status | string | |
invoices[].currency | string | |
invoices[].amount_due_cents | integer | |
invoices[].amount_paid_cents | integer | |
invoices[].amount_remaining_cents | integer | |
invoices[].created_at | string (date-time) |
NotificationPreferences
| Field | Type | Notes |
|---|---|---|
settings | object | |
settings.timezone | string or null | |
settings.quiet_start | integer | |
settings.quiet_end | integer | |
settings.daily_cap | integer | |
kinds | object[] | |
kinds[].kind | string | |
kinds[].label | string | |
kinds[].category | string | |
kinds[].locked | boolean | |
kinds[].in_app | boolean | |
kinds[].email | boolean |
Home
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | |
name | string | |
address_line1 | string | |
unit_label | string | |
city | string | |
state | string | |
postal_code | string | |
market | string | |
property_type | single_family | condo | townhouse | duplex | triplex | fourplex | multifamily | other | |
bedrooms | integer | |
bathrooms | number | |
square_feet | integer or null | |
rent_cents | integer | |
monthly_cost_cents | integer | |
move_in_cost_cents | integer | |
deposit_cents | integer | |
application_fee_cents | integer | |
lease_terms_months | integer[] | |
available_on | string (date) | |
pet_policy | none | cats | dogs | cats_and_dogs | case_by_case | |
smoking_allowed | boolean | |
accessibility_features | string[] | |
status | draft | published | paused | leased | withdrawn | |
listed_by | string | |
slug | string or null | |
url | string or null | The public listing, where the renter checks if they qualify. |
HomePage
| Field | Type | Notes |
|---|---|---|
open_markets | object[] | |
open_markets[].key | string | |
open_markets[].name | string | |
open_markets[].status | string | |
data | Home[] | |
next_cursor | string or null |
RenterMatch
| Field | Type | Notes |
|---|---|---|
home | Home | |
state | POTENTIAL_MATCH | VERIFICATION_NEEDED | VERIFIED_MATCH | PARTIAL_MATCH | NOT_CURRENT_MATCH | CRITERIA_INCOMPLETE | APPLICATION_PENDING | LANDLORD_APPROVED | LANDLORD_DECLINED | |
group | string | |
state_changed_at | string (date-time) | |
summary | string or null | |
qualifies | boolean | |
gap | string or null | |
criteria | object[] | |
criteria[].key | string | |
criteria[].pathway | integer | |
criteria[].status | string | |
criteria[].evidence | string or null | |
criteria[].explanation | string or null | |
next_steps | object[] | |
next_steps[].code | string | |
next_steps[].text | string or null |
RenterMatchPage
| Field | Type | Notes |
|---|---|---|
data | RenterMatch[] | |
next_cursor | string or null |
RenterApplicationList
| Field | Type | Notes |
|---|---|---|
data | object[] | |
data[].id | string (uuid) | |
data[].offer_id | string (uuid) | |
data[].listed_by | string | |
data[].home | string | |
data[].status | string | |
data[].is_primary | boolean | |
data[].shared_scope | string[] | |
data[].move_in_date | string (date) or null | |
data[].started_at | string (date-time) or null | |
data[].submitted_at | string (date-time) or null | |
data[].decided_at | string (date-time) or null | |
data[].withdrawn_at | string (date-time) or null | |
data[].expires_at | string (date-time) or null | |
data[].decision | string or null | |
data[].decision_reasons | object[] or null | |
data[].decision_reasons[].key | string | |
data[].decision_reasons[].name | string | |
data[].adverse_action_notice | object or null |
RenterTourList
| Field | Type | Notes |
|---|---|---|
data | object[] | |
data[].id | string (uuid) | |
data[].offer_id | string (uuid) | |
data[].status | string | |
data[].starts_at | string (date-time) | |
data[].ends_at | string (date-time) | |
data[].contact_shared | boolean | |
data[].cancel_reason | string or null | |
data[].booked_at | string (date-time) | |
data[].home | object |
Passport
| Field | Type | Notes |
|---|---|---|
checks | object | |
checks.identity | object | |
checks.identity.status | string | |
checks.identity.method | string or null | |
checks.identity.verified_at | string (date-time) or null | |
checks.identity.expires_at | string (date-time) or null | |
checks.identity.updated_at | string (date-time) or null | |
checks.income | object | |
checks.income.status | string | |
checks.income.method | string or null | |
checks.income.verified_at | string (date-time) or null | |
checks.income.expires_at | string (date-time) or null | |
checks.income.updated_at | string (date-time) or null | |
checks.credit | object | |
checks.credit.status | string | |
checks.credit.method | string or null | |
checks.credit.verified_at | string (date-time) or null | |
checks.credit.expires_at | string (date-time) or null | |
checks.credit.updated_at | string (date-time) or null |