Rentvine API Docs (1.0.0)

Download OpenAPI specification:Download

Authentication

Requests are made using HTTP Basic Authentication with the access key as the username and secret as the password.

# Use the -u flag with {access key}:{secret}
curl https://example.rentvine.com/api/manager/properties \
  -u eba2c5e402e1476cb8ce5083a671d528:bd804fe81fd043598600939b9a257b2e

Obtaining API Keys

  1. In your Rentvine dashboard navigate to Settings > Users, Roles and API > API
  2. Select New API Key
  3. Enter a reference name in the Name field and select a predefined role in the Role dropdown

    ℹ️ Roles need to be setup before creating an API key. Create Roles via the Roles tab.

  4. Copy the generated Access Key and Secret. You will not be able to view the Secret again after closing this form.

Leases

Export Leases

List Leases for Export

The Last Modified Timestamp on Leases is updated by multiple actions including, but not limited to, the following.

  • Updating lease detaila in the manager portal
  • Taking actions such as activate, renewal, move out, rent increase etc.
  • Residents initiating move out process
  • Disabling or enabling portal or portal payment access actions.
  • Lease Transactions such as charges, credit, and payment are created, updated, or voided.
  • When tenant, occupant, pet, or vehicle information is added, updated or deleted.
Authorizations:
basicAuth
query Parameters
leaseIDs[]
Array of integers

Filter by Lease IDs

primaryLeaseStatusIDs[]
Array of integers (primary_lease_statuses)
Items Enum: 1 2 3

Filter by Primary Lease Status

leaseStatusIDs[]
Array of integers

Filter by Lease Status

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Schema: application/json
Array
object (lease_export)
object (balances)
object (unpaid_charges)
object (property_export)
object (unit_export)
object (portfolio_export)

Response samples

Content type
application/json
[
  • {
    }
]

Properties

Export Properties

List Properties for Export

The Last Modified Timestamp on Properties is updated by multiple actions including, but not limited to, the following.

  • Updating property details in the manager portal
  • Updating groups and associations
  • Activating or deactivating property or portfolio
Authorizations:
basicAuth
query Parameters
isActive
boolean
dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Schema: application/json
Array
object
object (portfolio_export)

Response samples

Content type
application/json
[
  • {
    }
]

Units

Export Units

List Units for Export

The Last Modified Timestamp on Units is updated by multiple actions including, but not limited to, the following.

  • Updating unit details in the manager portal
  • Creating or updating listings
  • Updating Appliance information
Authorizations:
basicAuth
query Parameters
isActive
boolean
dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Schema: application/json
Array
object (property_export)
object

Response samples

Content type
application/json
[
  • {
    }
]

Applications

Export Applications

List Applications for Export

The Last Modified Timestamp on Applications is set on creation and updated when applications are modified by the manager portal user.

Authorizations:
basicAuth
query Parameters
primaryApplicationStatusIDs[]
Array of integers (primary_application_statuses)
Items Enum: 1 2 3 4 5 6 7 8

Filter by Primary Application Status

applicationStatusIDs[]
Array of integers

Filter by Application Status

hasLease
boolean

Filter by if there is a Lease Attached

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Schema: application/json
Array
object (application_export)
object (unit_export)
object

Response samples

Content type
application/json
[
  • {
    }
]

Accounts

List Accounts

Returns a paginated list of chart-of-accounts records. Each item contains a full account object.

Use Cases

  • Filter accounts by type (e.g. Bank, Expense, Income) using accountTypeID or accountTypeIDs.
  • Narrow the list to active-only or escrow-only accounts using isActive and isEscrow.

Business Rules

  • Results are scoped to the authenticated user's portfolio.
  • GET /accounting/accounts/search - Search with additional filters (accountID, dateTimeModified range).
  • GET /accounting/accounts/{accountID} - Retrieve a single account with optional includes.
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 5000
Example: pageSize=25

Number of results per page. Defaults to 5000.

search
string
Example: search=Receivable

Full-text search against account name and account number.

accountTypeID
string
Example: accountTypeID=3,7

Filter by account type. Accepts a single integer or a comma-separated list.

  • 1 - Accounts Receivable
  • 2 - Accounts Payable
  • 3 - Bank
  • 4 - Asset
  • 5 - Liability
  • 6 - Equity
  • 7 - Income
  • 8 - Other Income
  • 9 - Expense
  • 10 - Other Expense
accountTypeIDs
Array of integers
Example: accountTypeIDs=3&accountTypeIDs=7

Array form of the account type filter. Takes precedence over accountTypeID. Use when the client sends array-style query parameters (e.g. accountTypeIDs[]=3&accountTypeIDs[]=7).

isActive
boolean
Example: isActive=true

Filter by active status. true returns active accounts, false returns inactive accounts.

isEscrow
boolean

Filter to accounts flagged as escrow accounts.

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of results per page.

pagination-total-items
integer
Example: 199

Total number of accounts matching the filters.

pagination-total-pages
integer
Example: 8

Total number of pages.

pagination-current-page
integer
Example: 1

Current page number.

pagination-next-page
integer or null
Example: 2

Next page number, or null on the last page.

pagination-before-page
integer or null

Previous page number, or null on the first page.

pagination-first-page
integer
Example: 1

Always 1.

pagination-last-page
integer
Example: 8

Last page number.

Response Schema: application/json
Array
required
object (account)
token
required
string

Session token associated with this response.

Response samples

Content type
application/json
Example
[
  • {
    }
]

Search Accounts

Returns a paginated, searchable list of chart-of-accounts records joined with their account category. Each result item contains a full account object and an accountCategory object (all fields null when no category is assigned).

This endpoint is the preferred way to search accounts with advanced filters such as accountID lookup.

Use Cases

  • Look up a single account by accountID.

Business Rules

  • The accountCategory object is always present; its fields are null when the account has no category assigned.
  • isActive and isEscrow accept boolean values (true/false or 1/0).
  • dateTimeModifiedMin and dateTimeModifiedMax accept ISO 8601 datetime strings.
  • GET /accounting/accounts - Simpler list endpoint with a 5000 default page size.
  • GET /accounting/accounts/{accountID} - Retrieve a single account with optional includes.
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=Operating

Full-text search against account name and account number.

isActive
boolean
Example: isActive=true

Filter by active status. true returns active accounts, false returns inactive.

isEscrow
boolean

Filter to accounts flagged as escrow accounts.

accountTypeIDs
Array of integers
Example: accountTypeIDs=3&accountTypeIDs=7

Filter by one or more account type IDs (array form).

  • 1 - Accounts Receivable
  • 2 - Accounts Payable
  • 3 - Bank
  • 4 - Asset
  • 5 - Liability
  • 6 - Equity
  • 7 - Income
  • 8 - Other Income
  • 9 - Expense
  • 10 - Other Expense
accountID
integer
Example: accountID=31

Look up a single account by its ID.

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of results per page.

pagination-total-items
integer
Example: 199

Total number of accounts matching the filters.

pagination-total-pages
integer
Example: 8

Total number of pages.

pagination-current-page
integer
Example: 1

Current page number.

pagination-next-page
integer or null
Example: 2

Next page number, or null on the last page.

pagination-before-page
integer or null

Previous page number, or null on the first page.

pagination-first-page
integer
Example: 1

Always 1.

pagination-last-page
integer
Example: 8

Last page number.

Response Schema: application/json
Array
required
object (account)
required
object or null

Account category associated with this account, or null fields when uncategorized.

Response samples

Content type
application/json
Example
[
  • {
    }
]

Bills

List Bills

Returns a paginated list of bills. Each item in the response includes the bill record and its associated payee contact.

Use Cases

  • Retrieve all bills for display in a bills list view.
  • Filter bills by date range, approval status, or payee for reporting.

Business Rules

  • The contact object is always returned alongside each bill — it is not opt-in.
  • Results are paginated; use the page and pageSize query parameters to navigate pages.
  • GET /bills/{billID} - Retrieve a single bill with full includes support.
  • POST /bills - Create a bill.
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page.

pagination-total-items
integer
Example: 142

Total number of bills matching the query.

pagination-total-pages
integer
Example: 6

Total number of pages.

pagination-current-page
integer
Example: 1

The current page number.

pagination-next-page
integer or null
Example: 2

The next page number, or null if on the last page.

pagination-before-page
integer or null

The previous page number, or null if on the first page.

pagination-first-page
integer
Example: 1

Always 1.

pagination-last-page
integer
Example: 6

The last page number.

Response Schema: application/json
Array
required
object (bill)
required
object

The payee contact associated with this bill.

Response samples

Content type
application/json
[
  • {
    }
]

Create Bill

Creates a new bill in the system.

Use Cases

  • Record vendor invoices and distribute costs across property ledgers.
  • Attach tenant-responsible amounts via leaseCharges.
  • Link a bill to an existing work order for maintenance cost tracking.
  • Override the default bank account used to pay the bill.

Business Rules

  • payeeContactID, billDate, and dateDue are required.
  • Linking to a work order: First create the work order, then pass its workOrderID on this request. Optionally set workOrderStatusID to update the work order's status at the same time the bill is created.
  • Bank account selection: Set overrideBankAccount: true and supply bankAccountID to pay the bill from a specific bank account. When overrideBankAccount is false (or omitted), the system uses the bank account defined in the payer's posting settings.
  • Each entry in charges must include ledgerID, chargeAccountID, and amount.
  • Each entry in leaseCharges must include leaseID, chargeAccountID, and amount.
  • GET /bills - List all bills.
  • GET /bills/{billID} - Retrieve a single bill with optional includes.
  • PUT /bills/{billID} - Update an existing bill.
  • DELETE /bills/{billID} - Void a bill.
Authorizations:
basicAuth
Request Body schema: application/json
payeeContactID
required
integer
billDate
required
string <date>
dateDue
required
string <date>
billBatchID
integer or null
parentBillID
integer or null
reference
string or null
paymentMemo
string or null
description
string or null
workOrderID
integer or null

The ID of a work order to associate with this bill. To tie a bill to a work order, first create the work order, then pass its workOrderID here.

bankAccountID
integer or null

The bank account to use for this bill. Only applicable when overrideBankAccount is true.

serviceAccountNumber
string or null
utilityPeriodStartDate
string or null <date>
utilityPeriodEndDate
string or null <date>
discountPercent
number or null <double>
markupPercent
number or null <double>
Array of objects

Line-item charges applied to ledger accounts.

Array of objects

Charges posted directly to lease ledgers (tenant-responsible amounts).

tenantAmount
number or null

The portion of the bill to be collected from the tenant.

workOrderStatusID
integer or null

The status to set on the linked work order when the bill is created.

markupOverridePercentage
string or null

Overrides the default markup percentage for this bill (decimal string).

overrideBankAccount
boolean

When true, the bill will be paid from the bankAccountID specified on this request. When false (or omitted), the bank account is determined by the payer's posting settings.

Responses

Response Schema: application/json
required
object (bill)

Request samples

Content type
application/json
Example
{
  • "payeeContactID": "67",
  • "billDate": "2026-04-22",
  • "dateDue": "2026-04-22",
  • "reference": "12345",
  • "paymentMemo": "Plumbing invoice April",
  • "description": "Bathroom plumbing repair",
  • "charges": [
    ],
  • "leaseCharges": [ ],
  • "overrideBankAccount": false
}

Response samples

Content type
application/json
{
  • "bill": {
    }
}

Get Bill

Retrieves a single bill by ID, with optional related data via includes.

Available Includes (12+)

Pass a comma-separated list of include names in the includes query parameter.

Include name What it adds
contact Full payee contact record (vendor/owner details, ACH info, insurance).
charges Line-item charges posted to ledgers for this bill.
bankAccount The bank account used to pay this bill.
leaseCharges Tenant-responsible charge transactions, each with property/unit/ledger.
payouts Payouts that have been applied toward this bill.
workOrder The linked work order, if any.
parentBill The parent bill when this is a discount or markup child bill.
discountBill The associated discount bill, if one was generated.
markupBill The associated markup bill, if one was generated.
markupDiscount Computed markup and discount dollar amounts for the bill.
utility The utility associated with this bill, if any.
property The property associated with this bill, if any.
  • GET /bills - List all bills.
  • POST /bills - Create a bill.
  • PUT /bills/{billID} - Update a bill.
  • DELETE /bills/{billID} - Void a bill.
Authorizations:
basicAuth
path Parameters
billID
required
integer
Example: 15054
query Parameters
includes
string
Example: includes=contact,charges,bankAccount,leaseCharges,payouts,workOrder,discountBill,markupBill,markupDiscount

Comma-separated list of related data to include in the response. Available values: contact, charges, bankAccount, leaseCharges, payouts, workOrder, parentBill, discountBill, markupBill, markupDiscount, utility, property.

Responses

Response Schema: application/json
required
object (bill)
object or null

Payee contact details (if includes=contact).

Array of objects

Ledger charge lines (if includes=charges).

object or null

Bank account used for payment (if includes=bankAccount).

Array of objects

Tenant-responsible charge transactions (if includes=leaseCharges).

payouts
Array of objects

Payouts applied to this bill (if includes=payouts).

object or null

Linked work order (if includes=workOrder).

object or null (bill)

The parent bill when this is a child discount/markup bill (if includes=parentBill).

object or null (bill)

Associated discount bill (if includes=discountBill).

object or null (bill)

Associated markup bill (if includes=markupBill).

object or null

Computed markup and discount totals (if includes=markupDiscount).

utility
object or null

Linked utility (if includes=utility).

property
object or null

Linked property (if includes=property).

object

Access restrictions for the current user.

approvalRequirementType
string or null

The type of approval requirement for this bill, if any.

Response samples

Content type
application/json
{
  • "bill": {
    },
  • "contact": {
    },
  • "charges": [
    ],
  • "bankAccount": {
    },
  • "leaseCharges": [
    ],
  • "payouts": [ ],
  • "workOrder": {
    },
  • "parentBill": null,
  • "discountBill": {
    },
  • "markupBill": {
    },
  • "markupDiscount": {
    },
  • "utility": null,
  • "property": null,
  • "restrictions": {
    },
  • "approvalRequirementType": null
}

Update Bill

Updates an existing bill. All fields are optional — only the fields provided in the request body are changed. Charges are matched by transactionID.

Use Cases

  • Correct bill details such as the payee, dates, reference number, or memo.
  • Adjust charge line amounts, discounts, or markup values.
  • Link or change the associated work order.
  • Update utility billing period dates or service account number.

Business Rules

  • The bill must not be voided. Voided bills cannot be updated.
  • Each entry in charges must include transactionID to identify the charge being updated.

Available Includes (4+)

Pass a comma-separated list of include names in the includes query parameter.

Include name What it adds
charges Updated charge lines with full transaction details.
contact Full payee contact record.
payouts Payouts applied toward this bill.
workOrder The linked work order, if any.
  • GET /bills/{billID} - Retrieve the updated bill.
  • POST /bills - Create a new bill.
  • DELETE /bills/{billID} - Void a bill.
Authorizations:
basicAuth
path Parameters
billID
required
integer
Example: 15026
query Parameters
includes
string
Example: includes=charges,contact,payouts,workOrder

Comma-separated list of related data to include in the response. Available values: charges, contact, payouts, workOrder.

Request Body schema: application/json
payeeContactID
integer

The ID of the payee contact (vendor) for this bill.

billDate
string <date>

The date of the bill.

dateDue
string <date>

The date the bill is due.

amount
number

Total bill amount.

discountPercent
number

Discount percentage applied to the bill.

markupPercent
number

Markup percentage applied to the bill.

bankAccountID
integer

The bank account used to pay this bill.

reference
string or null

External reference number (e.g. invoice number, check number).

paymentMemo
string or null

Memo to include with the payment.

description
string or null

Internal description for the bill.

workOrderID
integer or null

The ID of the work order to link to this bill.

Array of objects

Charge lines to update on this bill. Each entry must include transactionID to identify the charge being updated.

serviceAccountNumber
string or null

Utility service account number, if applicable.

utilityPeriodStartDate
string or null <date>

Start date of the utility billing period.

utilityPeriodEndDate
string or null <date>

End date of the utility billing period.

Responses

Response Schema: application/json
required
object (bill)
object or null

Payee contact details (if includes=contact).

Array of objects

Updated charge line items with full transaction details (if includes=charges).

payouts
Array of objects

Payouts applied to this bill (if includes=payouts).

object or null

Linked work order (if includes=workOrder).

Request samples

Content type
application/json
{
  • "payeeContactID": 21,
  • "billDate": "2026-04-22",
  • "dateDue": "2026-04-22",
  • "amount": 0,
  • "discountPercent": 0,
  • "markupPercent": 0,
  • "bankAccountID": 216,
  • "reference": "123456",
  • "paymentMemo": "test memo",
  • "description": "test description",
  • "workOrderID": 5954,
  • "charges": [
    ],
  • "serviceAccountNumber": "0001",
  • "utilityPeriodStartDate": "2026-04-22",
  • "utilityPeriodEndDate": "2027-04-22"
}

Response samples

Content type
application/json
{
  • "bill": {
    },
  • "contact": {
    },
  • "charges": [
    ],
  • "payouts": [ ],
  • "workOrder": {
    }
}

Void Bill

Voids a bill, reversing its accounting impact. The bill remains in the system with isVoided: "1" and cannot be deleted.

Use Cases

  • Cancel a bill entered in error before any payments are applied.
  • Void a bill and simultaneously void its linked discount or markup child bills.

Business Rules

  • A bill cannot be voided if any payments have been applied to it. If transactions exist against the bill, the void will be rejected. Unapply or reverse any payments before attempting to void.
  • Linked discount/markup bills: When a bill is created with a discount or markup, companion child bills (discountBill, markupBill) are generated automatically. To void those companion bills at the same time, set voidLinkedBills: true in the request body. If omitted or false, only the parent bill is voided.

Available Includes (12+)

The void response supports the same includes as GET /bills/{billID}. Pass a comma-separated list in the includes query parameter.

Include name What it adds
contact Full payee contact record (vendor/owner details, ACH info, insurance).
charges Line-item charges posted to ledgers for this bill.
bankAccount The bank account used to pay this bill.
leaseCharges Tenant-responsible charge transactions, each with property/unit/ledger.
payouts Payouts that have been applied toward this bill.
workOrder The linked work order, if any.
parentBill The parent bill when this is a discount or markup child bill.
discountBill The associated discount bill (voided when voidLinkedBills: true).
markupBill The associated markup bill (voided when voidLinkedBills: true).
markupDiscount Computed markup and discount dollar amounts for the bill.
utility The utility associated with this bill, if any.
property The property associated with this bill, if any.
  • GET /bills/{billID} - Retrieve a bill and its current state.
  • POST /bills - Create a new bill.
Authorizations:
basicAuth
path Parameters
billID
required
integer
Example: 15051
query Parameters
includes
string
Example: includes=contact,charges,workOrder,discountBill,markupBill,leaseCharges

Comma-separated list of related data to include in the response. Available values: contact, charges, bankAccount, leaseCharges, payouts, workOrder, parentBill, discountBill, markupBill, markupDiscount, utility, property.

Request Body schema: application/json
voidLinkedBills
boolean

When true, any discount and/or markup child bills linked to this bill are also voided in the same operation. When false or omitted, only the parent bill is voided.

Responses

Response Schema: application/json
required
object (bill)
object or null

Payee contact details (if includes=contact).

charges
Array of objects

Ledger charge lines (if includes=charges).

object or null

Bank account used for payment (if includes=bankAccount).

Array of objects

Tenant-responsible charge transactions (if includes=leaseCharges).

payouts
Array of objects

Payouts applied to this bill (if includes=payouts).

object or null

Linked work order (if includes=workOrder).

object (bill)
object or null (bill)

The companion discount bill linked to this bill, if any. Voided alongside the parent when voidLinkedBills: true.

object or null (bill)

The companion markup bill linked to this bill, if any. Voided alongside the parent when voidLinkedBills: true.

object or null

Computed markup and discount totals (if includes=markupDiscount).

utility
object or null

Linked utility (if includes=utility).

property
object or null

Linked property (if includes=property).

Request samples

Content type
application/json
{
  • "voidLinkedBills": true
}

Response samples

Content type
application/json
{
  • "bill": {
    },
  • "contact": {
    },
  • "charges": [ ],
  • "bankAccount": {
    },
  • "leaseCharges": [
    ],
  • "payouts": [ ],
  • "workOrder": {
    },
  • "parentBill": null,
  • "discountBill": {
    },
  • "markupBill": {
    },
  • "markupDiscount": {
    },
  • "utility": null,
  • "property": null
}

Approve Bill

Approves a bill, marking it as authorized for payment. Once approved, the bill's isApproved flag is set to 1 and approvedByUserID is recorded.

Use Cases

  • Authorize a vendor bill before it can be included in a payment batch.
  • Complete a two-step approval workflow where bills are created and reviewed before payment.
  • Fulfill a master-level approval when a bill's total exceeds a configured threshold.

Business Rules

  • Requires the ApproveBill permission (Accounting component).
  • If the bill total meets or exceeds the account's master-approval threshold, the ApproveBillMaster permission is also required.
  • The bill must exist. A 400 is returned if the billID is not found.
  • The caller must have full access to the bill under the account's restrictions policy.
  • On success the response is identical to GET /bills/{billID} — the same includes query parameter is supported.
  • GET /bills/{billID} - Retrieve a bill and its current approval state.
  • POST /bills - Create a bill.
  • PUT /bills/{billID} - Update a bill.
  • DELETE /bills/{billID} - Void a bill.
Authorizations:
basicAuth
path Parameters
billID
required
integer
Example: 14973
query Parameters
includes
string
Example: includes=contact,charges,workOrder

Comma-separated list of related data to include in the response. Available values: contact, charges, bankAccount, leaseCharges, payouts, workOrder, parentBill, discountBill, markupBill, markupDiscount, utility, property.

Responses

Response Schema: application/json
required
object (bill)

Response samples

Content type
application/json
{
  • "bill": {
    }
}

Print Bill PDF

Renders a bill as a PDF document and streams the binary content directly in the response body. The PDF is generated from the bill's data and rendered using the portfolio's branding/letterhead when a portfolioID is provided.

Use Cases

  • Download a printable copy of a bill to send to a vendor or attach to a work order.
  • Generate a PDF receipt for a paid bill for record-keeping or audit purposes.
  • Produce a branded bill PDF using a specific portfolio's letterhead.

Business Rules

  • The bill must exist; if {billID} does not match any bill, a 400 error is returned.
  • The portfolioID query parameter is optional. When omitted, the PDF is rendered without portfolio-specific branding.
  • The response content type is application/pdf. Clients should treat the body as a binary stream, not JSON.
  • GET /accounting/bills/{billID} - Retrieve bill data as JSON.
  • GET /accounting/bills - List all bills.
Authorizations:
basicAuth
path Parameters
billID
required
integer
Example: 15054

Unique identifier of the bill to print.

query Parameters
portfolioID
integer
Example: portfolioID=42

Portfolio ID used to apply branded letterhead/styling to the rendered PDF.

Responses

Response Headers
Cache-Control
string
Example: "no-cache"

Cache directive set to no-cache by the server.

Response Schema: application/pdf
string <binary>

Raw PDF binary data of the bill.

Response samples

Content type
application/json
{
  • "error": "Bill 15054 not found"
}

Search Payables

Returns a paginated list of payable transactions (bill charges) with joined bill, ledger, portfolio, property, unit, and payee contact data. Each result row represents one transaction line from a bill, so a multi-line bill produces multiple rows.

Use Cases

  • Build a payables queue filtered by approval status, due date, or payee vendor.
  • Find all open (unpaid) charges across a set of properties or portfolios.
  • Identify bills that require master approval because their total meets or exceeds the configured approval threshold.
  • Export payables data for reconciliation against an external AP system.

Business Rules

  • Results are restricted to the authenticated user's accessible portfolios. Charges on portfolios outside the user's access are automatically excluded.
  • The isPaid filter compares amountPaid to amount. A transaction where amountPaid < amount is unpaid (isPaid=false); a transaction where amountPaid = amount is fully paid (isPaid=true). Partially-paid charges always appear when isPaid=false.
  • requiresMasterApproval=true only has effect when a Bill Approval Maximum Threshold is configured in Accounting Settings. It matches unapproved parent bills whose total charge amount meets or exceeds that threshold. Child bills are excluded from this filter (they defer to their parent's approval state).
  • Both singular and plural variants of ID array parameters are accepted (payeeContactID / payeeContactIDs, portfolioID / portfolioIDs, propertyID / propertyIDs, unitID / unitIDs). Pass multiple values as a comma-separated string: propertyIDs=101,102,103.
  • Default sort is transaction.datePosted descending. Append |asc or |desc to any orderBy value to control direction (e.g. orderBy=transaction.amount|asc).
  • GET /accounting/bills - List bills (bill-level, not transaction-level).
  • GET /accounting/bills/{billID} - Retrieve a single bill with full detail and includes.
  • GET /accounting/payables - Simple bill-charge list with account and vendor includes.
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=HVAC repair

Full-text search applied across multiple fields. Matches any transaction or bill where the search string appears in:

  • transaction.description
  • ledger.name
  • portfolio.name
  • property.address
  • bill.reference
  • contact.name (payee)

Also matches rows where transaction.amount equals the search string exactly (useful for looking up a specific dollar amount).

isVoided
boolean

Filter by voided status of the transaction.

  • false — return only active (non-voided) transactions.
  • true — return only voided transactions.

Omit to return both.

isApproved
boolean

Filter by the bill's approval status.

  • false — unapproved bills only.
  • true — approved bills only.

Omit to return both.

isPaid
boolean

Filter by payment status of the transaction.

  • false — open charges where amountPaid < amount.
  • true — fully paid charges where amountPaid = amount.

Omit to return both paid and unpaid.

amountMin
number <double>
Example: amountMin=100

Return only transactions where amount is greater than or equal to this value.

amountMax
number <double>
Example: amountMax=5000

Return only transactions where amount is less than or equal to this value.

datePostedMin
string <date>
Example: datePostedMin=2026-01-01

Return only transactions posted on or after this date (transaction.datePosted). Format: YYYY-MM-DD.

datePostedMax
string <date>
Example: datePostedMax=2026-04-30

Return only transactions posted on or before this date (transaction.datePosted). Format: YYYY-MM-DD.

billDateMin
string <date>
Example: billDateMin=2026-01-01

Return only transactions whose bill date (bill.billDate) is on or after this date. Format: YYYY-MM-DD.

billDateMax
string <date>
Example: billDateMax=2026-04-30

Return only transactions whose bill date (bill.billDate) is on or before this date. Format: YYYY-MM-DD.

dateDueMin
string <date>
Example: dateDueMin=2026-04-01

Return only transactions whose bill due date (bill.dateDue) is on or after this date. Format: YYYY-MM-DD.

dateDueMax
string <date>
Example: dateDueMax=2026-04-30

Return only transactions whose bill due date (bill.dateDue) is on or before this date. Format: YYYY-MM-DD.

ledgerTypeID
integer (ledger_types)
Enum: 1 2 3 4
Example: ledgerTypeID=3

Return only transactions posted to ledgers of this type.

payeeContactIDs
string
Example: payeeContactIDs=200,201

Comma-separated list of payee contact IDs to filter by. Also accepted as singular payeeContactID for a single value.

Example: payeeContactIDs=200,201,215

portfolioIDs
string
Example: portfolioIDs=50,51

Comma-separated list of portfolio IDs to filter by. Also accepted as singular portfolioID for a single value.

Example: portfolioIDs=50,51

propertyIDs
string
Example: propertyIDs=101,102

Comma-separated list of property IDs to filter by. Also accepted as singular propertyID for a single value.

Example: propertyIDs=101,102,103

unitIDs
string
Example: unitIDs=310,311

Comma-separated list of unit IDs to filter by. Also accepted as singular unitID for a single value.

Example: unitIDs=310,311

requiresMasterApproval
boolean
Example: requiresMasterApproval=true

When true, return only unapproved parent bills whose total charge amount meets or exceeds the Bill Approval Maximum Threshold configured in Accounting Settings. Child bills are excluded. Has no effect if no threshold is configured.

orderBy
string
Example: orderBy=transaction.amount|asc

Sort the results by a specific column. Append |asc or |desc to control direction. Default: transaction.datePosted|desc.

Sortable columns:

  • bill.billDate
  • bill.dateDue
  • bill.reference
  • contact.name
  • ledger.name
  • property.name
  • transaction.datePosted
  • transaction.amount
  • transaction.amountPaid

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page.

pagination-total-items
integer
Example: 87

Total number of transactions matching the query.

pagination-total-pages
integer
Example: 4

Total number of pages.

pagination-current-page
integer
Example: 1

The current page number.

pagination-next-page
integer or null
Example: 2

The next page number, or null if on the last page.

pagination-before-page
integer or null

The previous page number, or null if on the first page.

pagination-first-page
integer
Example: 1

Always 1.

pagination-last-page
integer
Example: 4

The last page number.

Response Schema: application/json
Array
required
object

The parent bill record for this transaction line.

required
object

The individual transaction (bill charge line) for this row.

required
object

The ledger (property, portfolio, or manager account) charged.

required
object

The payee contact (vendor or other payee) for the bill.

object or null

The portfolio associated with the transaction. May be null if the ledger is not portfolio-linked.

object or null

The property associated with the transaction. May be null for manager-level charges.

object or null

The unit associated with the transaction. Null when the charge is at the property or portfolio level.

Response samples

Content type
application/json
Example
[
  • {
    }
]

Deposits

List Deposits

Returns a paginated list of bank deposits. Each item in the response includes the deposit record and its associated bank account.

Use Cases

  • Display a list of deposits for a specific bank account.
  • Filter deposits by reconciliation ID to see what was deposited in a given reconciliation cycle.

Business Rules

  • Results are scoped to the authenticated user's portfolio restrictions.
  • The account object is always included in each list item.
  • Use GET /accounting/deposits/search for richer filtering with min/max amounts and date ranges.
  • GET /accounting/deposits/search - Search deposits with advanced filters.
  • GET /accounting/deposits/{depositID} - Retrieve a single deposit with includes support.
  • POST /accounting/deposits - Create a new deposit.
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=DEP-2024

Full-text search against deposit number and description.

bankAccountID
integer
Example: bankAccountID=12

Filter by a specific bank account ID.

reconciliationID
integer
Example: reconciliationID=88

Filter deposits associated with a specific reconciliation ID.

Responses

Response Schema: application/json
required
object (deposit)

A bank deposit groups one or more payment transactions (and bulk payments) into a single deposited amount that can be reconciled against a bank statement. Deposits belong to a bank account and track their reconciliation state via reconciliationID.

token
required
string

Session token associated with this response.

Response samples

Content type
application/json
{
  • "deposit": {
    },
  • "token": "1777036078"
}

Create Deposit

Creates a new bank deposit, optionally adding transactions, bulk payments, and file attachments in the same request. On success, returns the newly created deposit (same shape as GET /accounting/deposits/{depositID}).

Use Cases

  • Create a deposit and attach existing undeposited transactions to it.
  • Create a deposit with bulk payments from a bulk payment batch.

Business Rules

  • Requires the Accounting > ModifyDeposit permission.
  • Each transactionID in transactions must exist and pass portfolio restrictions.
  • Each bulkPaymentID in bulkPayments must exist.
  • The attachments array contains fileID values for pre-uploaded files.
  • After creation the endpoint forwards to GET /accounting/deposits/{depositID} and returns the full deposit detail.
  • GET /accounting/deposits/transactions/undeposited - Retrieve undeposited transactions to include.
  • GET /accounting/deposits/{depositID} - View the created deposit.
Authorizations:
basicAuth
Request Body schema: application/json
bankAccountID
required
integer

The bank account to deposit into.

dateDeposited
required
string <date>

The date of the deposit.

amount
required
string

Total deposit amount as a decimal string.

depositNumber
string or null

Optional reference number.

description
string or null

Optional description.

Array of objects

List of transactions to include in this deposit.

Array of objects

List of bulk payments to include in this deposit.

attachments
Array of integers

File IDs of documents to attach to this deposit.

Responses

Response Schema: application/json
required
object (deposit)

A bank deposit groups one or more payment transactions (and bulk payments) into a single deposited amount that can be reconciled against a bank statement. Deposits belong to a bank account and track their reconciliation state via reconciliationID.

transactions
Array of objects

Deposited transactions (if includes=transactions).

Request samples

Content type
application/json
Example
{
  • "bankAccountID": 146,
  • "depositNumber": "27",
  • "description": null,
  • "dateDeposited": "2026-04-24",
  • "attachments": [ ],
  • "transactions": [
    ],
  • "bulkPayments": [ ],
  • "amount": "1400.00"
}

Response samples

Content type
application/json
{
  • "deposit": {
    }
}

Search Deposits

Returns a paginated, searchable list of deposits with advanced filtering options including amount ranges, date ranges, reconciliation state, and bank account. Each result item contains a deposit object, the associated bank account object, and a reconciliation object (populated when the deposit is linked to a reconciliation, otherwise all fields are null).

Use Cases

  • Search deposits by amount range for audit or reconciliation workflows.
  • Filter by isReconciled=false to find deposits pending reconciliation.
  • Filter by bankAccountIDs to scope results to specific bank accounts.
  • Search deposit number, description, amount, or account name/number via search.

Business Rules

  • Both bankAccountIDs (comma-separated) and bankAccountID (single integer) are accepted; bankAccountIDs takes precedence.
  • Similarly, reconciliationIDs takes precedence over reconciliationID.
  • Results are restricted to the authenticated user's portfolio.
  • Results are ordered by dateDeposited DESC, then depositID DESC.
  • GET /accounting/deposits - Simple list with basic filters.
  • GET /accounting/deposits/{depositID} - Retrieve a single deposit with includes support.
Authorizations:
basicAuth
query Parameters
search
search

Filter by term in description, name, amount, or address

bankAccountIDs
string
Example: bankAccountIDs=12,15

Comma-separated list of bank account IDs to filter by.

bankAccountID
integer
Example: bankAccountID=31

Single bank account ID to filter by (use bankAccountIDs for multiple).

isVoided
boolean

Filter by voided state. true returns only voided, false returns only non-voided.

showVoided
boolean

When false, returns only voided deposits. Distinct from isVoided — use isVoided=false to exclude voided deposits, showVoided=false to show only voided.

isReconciled
boolean

Filter by reconciliation state. true returns only deposits linked to a reconciliation. false returns only unreconciled deposits.

amountMin
string
Example: amountMin=1000.00

Minimum deposit amount (inclusive).

amountMax
string
Example: amountMax=10000.00

Maximum deposit amount (inclusive).

dateDepositedMin
string <date>
Example: dateDepositedMin=2024-01-01

Earliest deposit date (inclusive), ISO 8601 date.

dateDepositedMax
string <date>
Example: dateDepositedMax=2024-12-31

Latest deposit date (inclusive), ISO 8601 date.

reconciliationIDs
string
Example: reconciliationIDs=88,89

Comma-separated list of reconciliation IDs to filter by.

reconciliationID
integer
Example: reconciliationID=88

Single reconciliation ID to filter by (use reconciliationIDs for multiple).

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page.

pagination-total-items
integer
Example: 18

Total number of deposits matching the query.

pagination-total-pages
integer
Example: 1

Total number of pages.

pagination-current-page
integer
Example: 1

The current page number.

pagination-next-page
integer or null

The next page number, or null if on the last page.

pagination-before-page
integer or null

The previous page number, or null if on the first page.

pagination-first-page
integer
Example: 1

Always 1.

pagination-last-page
integer
Example: 1

The last page number.

Response Schema: application/json
Array
required
object (deposit)

A bank deposit groups one or more payment transactions (and bulk payments) into a single deposited amount that can be reconciled against a bank statement. Deposits belong to a bank account and track their reconciliation state via reconciliationID.

required
object

The bank account associated with this deposit.

required
object

The reconciliation this deposit is linked to. All fields are null when the deposit has not been reconciled.

Response samples

Content type
application/json
[
  • {
    }
]

List Undeposited Transactions

Returns all transactions not yet assigned to a deposit, scoped to a specific bank account. This endpoint populates the transaction picker when creating or editing a deposit.

The result is a union of two item types returned in the same array:

  • Regular transactions (depositTransactionTypeID: 1, objectTypeID: 9) — lease payments, owner payments, and other payments that have not been deposited and are not routed through a bank gateway.
  • Bulk payments (depositTransactionTypeID: 2, objectTypeID: 84) — undeposited bulk payment batches. For bulk payments the ledger, property, and unit objects will be null.

Use Cases

  • Retrieve all undeposited transactions for a bank account before creating a new deposit.
  • Filter by transactionTypeID to show only specific payment types (e.g. lease payments only).
  • Filter by createdByUserID to show transactions entered by a specific user.

Business Rules

  • bankAccountID is required and must refer to an account of type Bank.
  • Voided transactions are excluded.
  • Transactions already assigned to a deposit (depositID IS NOT NULL) are excluded.
  • Transactions routed through a bank gateway (bankAccountGatewayID IS NOT NULL) are excluded.
  • Results are restricted to the authenticated user's portfolio.
  • Results are not paginated — the full matching list is returned in a single array, ordered by datePosted DESC.
  • POST /accounting/deposits - Create a deposit using transactions from this list.
  • POST /accounting/deposits/{depositID}/transactions - Add transactions to an existing deposit.
Authorizations:
basicAuth
query Parameters
bankAccountID
required
integer
Example: bankAccountID=31

The bank account to retrieve undeposited transactions for. Must be a Bank-type account.

createdByUserID
integer
Example: createdByUserID=901735

Filter by the ID of the user who created the transactions.

transactionTypeID
integer
Example: transactionTypeID=2

Filter by a specific transaction type ID (e.g. 2 = LeasePayment). Only applies to regular transactions, not bulk payments.

Responses

Response Schema: application/json
Array
required
object
required
object or null

Ledger associated with the transaction. Null for bulk payments.

required
object

Payer information. For OtherPayment transactions the name comes from receivedFrom; for all others it is the contact name.

required
object or null

Property associated with the transaction. Null for bulk payments.

required
object or null

Unit associated with the transaction. Null for bulk payments.

required
object

User who created the transaction or bulk payment.

Response samples

Content type
application/json
Example
[
  • {
    }
]

Get Deposit

Retrieves a single deposit by ID. The base response always includes the deposit record. Additional data can be requested via the includes query parameter.

Use Cases

  • Load a deposit detail page including its transactions and reconciliation info.
  • Check reconciliation status before allowing an edit or void action.

Business Rules

  • Returns a 400 error if the deposit does not exist.
  • Access is verified via the authenticated user's license for the deposit's portfolio.
  • The restrictions include adds access-control metadata (read/write/void permissions) derived from the user's license for this deposit.

Available Includes (4+)

Use ?includes=transactions,reconciliation to request additional data.

  • transactions — Array of transactions associated with this deposit, including ledger and property context for each entry.
  • reconciliation — The reconciliation record this deposit is linked to (or null if unreconciled).
  • previousReconciliation — The previous reconciliation record if the deposit was moved during a re-reconciliation (or null).
  • restrictions — Access-control metadata indicating what actions the current user can perform on this deposit.
  • GET /accounting/deposits - List all deposits.
  • POST /accounting/deposits/{depositID} - Update this deposit.
  • DELETE /accounting/deposits/{depositID} - Void this deposit.
  • POST /accounting/deposits/{depositID}/reconcile - Reconcile this deposit.
Authorizations:
basicAuth
path Parameters
depositID
required
integer
Example: 4210

The ID of the deposit to retrieve.

query Parameters
includes
string
Example: includes=transactions,reconciliation

Comma-separated list of additional data to include. Available values: transactions, reconciliation, previousReconciliation, restrictions.

Responses

Response Schema: application/json
required
object (deposit)

A bank deposit groups one or more payment transactions (and bulk payments) into a single deposited amount that can be reconciled against a bank statement. Deposits belong to a bank account and track their reconciliation state via reconciliationID.

Array of objects

Transactions in this deposit (if includes=transactions). Each item contains the transaction record plus denormalized ledger, payer, property, and unit context.

object or null (reconciliation)

The reconciliation record this deposit is linked to (if includes=reconciliation), or null if unreconciled.

object or null (reconciliation)

The previous reconciliation record if the deposit was moved during re-reconciliation (if includes=previousReconciliation), or null.

object

Access-control metadata for this deposit (if includes=restrictions).

Response samples

Content type
application/json
Example
{
  • "deposit": {
    }
}

Update Deposit

Updates editable fields on an existing deposit. Only depositNumber, description, and dateDeposited may be changed after creation. On success, returns the updated deposit (same shape as GET /accounting/deposits/{depositID}).

Business Rules

  • Requires the Accounting > ModifyDeposit permission.
  • Access is verified via the authenticated user's license for the deposit's portfolio.
  • bankAccountID and amount cannot be changed after creation.
  • POST /accounting/deposits/{depositID}/transactions - Add/remove transactions.
  • DELETE /accounting/deposits/{depositID} - Void the deposit.
Authorizations:
basicAuth
path Parameters
depositID
required
integer
Example: 4210

The ID of the deposit to update.

Request Body schema: application/json
depositNumber
integer or null

Updated reference number.

description
string or null

Updated description.

dateDeposited
string <date>

Updated deposit date.

Responses

Response Schema: application/json
required
object (deposit)

A bank deposit groups one or more payment transactions (and bulk payments) into a single deposited amount that can be reconciled against a bank statement. Deposits belong to a bank account and track their reconciliation state via reconciliationID.

Request samples

Content type
application/json
{
  • "depositNumber": 29,
  • "description": "October rent deposits (revised)",
  • "dateDeposited": "2024-10-23"
}

Response samples

Content type
application/json
{
  • "deposit": {
    }
}

Void Deposit

Voids a deposit, reversing its effect on the bank account balance. The deposit record is marked isVoided = 1 and the associated transactions are undeposited. Returns the deposit record after voiding.

Business Rules

  • Requires the Accounting > VoidDeposit permission.
  • Requires full portfolio access to the deposit (not just read access).
  • A voided deposit cannot be un-voided via API.
  • POST /accounting/deposits/{depositID}/reconcile - Reconcile a deposit instead of voiding.
  • GET /accounting/deposits/{depositID} - Check deposit state before voiding.
Authorizations:
basicAuth
path Parameters
depositID
required
integer
Example: 4210

The ID of the deposit to void.

Responses

Response Schema: application/json
depositID
required
integer

Unique identifier for the deposit.

bankAccountID
required
integer

The bank account this deposit belongs to.

amount
required
string

Total deposited amount as a decimal string.

isVoided
required
integer

0 = active, 1 = voided.

dateDeposited
required
string <date>

The date the deposit was made.

dateTimeCreated
required
string

Timestamp when the deposit record was created (MySQL datetime format, e.g. "2021-04-14 13:40:48").

reconciliationID
integer or null

The reconciliation this deposit is linked to, or null if unreconciled.

previousReconciliationID
integer or null

The previous reconciliation ID if the deposit was moved, or null.

depositNumber
string or null

A user-assigned reference number for the deposit.

description
string or null

Optional free-text description.

Response samples

Content type
application/json
{
  • "depositID": "33",
  • "bankAccountID": "31",
  • "reconciliationID": null,
  • "previousReconciliationID": "22",
  • "depositNumber": "54",
  • "description": "December rent deposits",
  • "amount": "11781.00",
  • "isVoided": "1",
  • "dateDeposited": "2021-12-14",
  • "dateTimeCreated": "2021-12-14 20:35:15"
}

Add Transactions to Deposit

Adds one or more transactions (and/or bulk payments) to an existing deposit. This endpoint is used to incrementally build up a deposit rather than specifying all transactions at creation time.

Use Cases

  • Add a forgotten transaction to an existing deposit before reconciliation.
  • Attach bulk payments (ACH batches) to a deposit.

Business Rules

  • Requires the Accounting > ModifyDeposit permission.
  • Each transactionID in transactions must exist and pass portfolio access checks.
  • Each bulkPaymentID in bulkPayments must exist.
  • Returns { "success": true } on success, not the updated deposit. Fetch the deposit separately via GET /accounting/deposits/{depositID}?includes=transactions to see the updated state.
  • GET /accounting/deposits/transactions/undeposited - Get available undeposited transactions.
  • GET /accounting/deposits/{depositID} - View the deposit with transactions included.
Authorizations:
basicAuth
path Parameters
depositID
required
integer
Example: 4210

The ID of the deposit to add transactions to.

Request Body schema: application/json
transactions
Array of integers

List of transaction IDs to add to the deposit.

bulkPayments
Array of integers

List of bulk payment IDs to add to the deposit.

Responses

Response Schema: application/json
success
required
boolean

Request samples

Content type
application/json
Example
{
  • "transactions": [
    ]
}

Response samples

Content type
application/json
{
  • "success": true
}

Print Deposit

Renders a printable PDF for the given deposit and streams it as the response body. The response Content-Type is application/pdf.

Use Cases

  • Download a PDF receipt for a bank deposit to attach to physical bank records.
  • Generate a deposit slip for accounting audit purposes.

Business Rules

  • Returns a 400 error if the deposit does not exist.
  • Access is verified via the authenticated user's license for the deposit's portfolio.
  • The response is streamed directly — there is no JSON envelope.
  • GET /accounting/deposits/{depositID} - Retrieve deposit data in JSON format.
Authorizations:
basicAuth
path Parameters
depositID
required
integer
Example: 4210

The ID of the deposit to print.

Responses

Response Headers
Cache-Control
string
Example: "no-cache"
Response Schema: application/pdf
string <binary>

Response samples

Content type
application/json
{
  • "error": "Deposit 9999 not found"
}

Reconcile Deposit

Marks a deposit as reconciled, optionally linking it to an existing reconciliation record. This performs a single-item reconciliation (as opposed to a full bank statement reconciliation). On success, returns the updated deposit detail.

Use Cases

  • Reconcile a single deposit against a bank statement line item without running a full reconciliation cycle.
  • Link a deposit to an existing reconciliation by providing reconciliationID.

Business Rules

  • Requires both the Accounting > ModifyDeposit and Accounting > ModifyReconciliations permissions.
  • If reconciliationID is provided and the reconciliation exists, the deposit is linked to it. If no ID is provided, a new reconciliation record is created.
  • The isSingleTransaction flag is set internally — this action reconciles this deposit only, not all items in a reconciliation batch.
  • Returns the updated deposit via a forward to GET /accounting/deposits/{depositID}.
  • POST /accounting/deposits/{depositID}/unreconcile - Reverse this reconciliation.
  • GET /accounting/deposits/{depositID}?includes=reconciliation - Check reconciliation state.
Authorizations:
basicAuth
path Parameters
depositID
required
integer
Example: 4210

The ID of the deposit to reconcile.

Request Body schema: application/json
reconciliationID
integer or null

The ID of an existing reconciliation to link this deposit to. If omitted or null, a new reconciliation record is created.

Responses

Response Schema: application/json
required
object (deposit)

A bank deposit groups one or more payment transactions (and bulk payments) into a single deposited amount that can be reconciled against a bank statement. Deposits belong to a bank account and track their reconciliation state via reconciliationID.

Request samples

Content type
application/json
Example
{
  • "reconciliationID": 88
}

Response samples

Content type
application/json
{
  • "deposit": {
    }
}

Unreconcile Deposit

Removes the reconciliation link from a deposit, reverting it to an unreconciled state. On success, returns the updated deposit detail with reconciliationID set to null.

Use Cases

  • Correct a mis-reconciled deposit before closing the accounting period.
  • Unreconcile a deposit to allow edits to its transactions.

Business Rules

  • Requires both the Accounting > ModifyDeposit and Accounting > ModifyReconciliations permissions.
  • The previousReconciliationID field on the deposit will record the reconciliation that was removed.
  • This action is single-item only — it does not affect other items in the reconciliation.
  • Returns the updated deposit via a forward to GET /accounting/deposits/{depositID}.
  • POST /accounting/deposits/{depositID}/reconcile - Reconcile the deposit again.
  • GET /accounting/deposits/{depositID}?includes=reconciliation - Check current reconciliation state.
Authorizations:
basicAuth
path Parameters
depositID
required
integer
Example: 4210

The ID of the deposit to unreconcile.

Responses

Response Schema: application/json
required
object (deposit)

A bank deposit groups one or more payment transactions (and bulk payments) into a single deposited amount that can be reconciled against a bank statement. Deposits belong to a bank account and track their reconciliation state via reconciliationID.

Response samples

Content type
application/json
{
  • "deposit": {
    }
}

Invoices

List Invoices

Returns a paginated list of invoices. Invoices are inbound documents (uploaded PDFs or vendor-created line items) in various processing states. The AI extraction service populates predicted fields for uploaded invoices.

Use Cases

  • Display a queue of invoices pending review (invoiceStatusID=2).
  • Filter invoices assigned to a specific user for workflow management.
  • Pull all invoices associated with a work order.

Business Rules

  • Results are restricted to the authenticated user's portfolio.
  • Both singular and plural filter parameters are accepted (e.g. invoiceStatusID and invoiceStatusIDs); the plural form takes precedence.
  • Results are paginated; default page size is 25.
  • GET /accounting/invoices/{invoiceID} - Retrieve a single invoice with full detail.
  • POST /accounting/invoices/upload - Upload a new invoice PDF.
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=Acme Plumbing

Full-text search against invoice reference and payee name.

invoiceStatusIDs
string
Example: invoiceStatusIDs=1,2

Comma-separated list of invoice status IDs to filter by.

invoiceStatusID
integer
Example: invoiceStatusID=2

Single invoice status ID filter.

payeeContactIDs
string
Example: payeeContactIDs=210,211

Comma-separated list of payee contact IDs to filter by.

payeeContactID
integer
Example: payeeContactID=210

Single payee contact ID filter.

assignedToUserIDs
string
Example: assignedToUserIDs=55,56

Comma-separated list of user IDs the invoice is assigned to.

assignedToUserID
integer
Example: assignedToUserID=55

Single assigned user ID filter.

workOrderIDs
string
Example: workOrderIDs=1001,1002

Comma-separated list of work order IDs to filter by.

workOrderID
integer
Example: workOrderID=1001

Single work order ID filter.

dateCreatedMin
string <date>
Example: dateCreatedMin=2024-10-01

Earliest creation date (inclusive), ISO 8601 date.

dateCreatedMax
string <date>
Example: dateCreatedMax=2024-10-31

Latest creation date (inclusive), ISO 8601 date.

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page.

pagination-total-items
integer
Example: 74

Total number of invoices matching the query.

pagination-total-pages
integer
Example: 3

Total number of pages.

pagination-current-page
integer
Example: 1

The current page number.

pagination-next-page
integer or null
Example: 2

The next page number, or null if on the last page.

pagination-before-page
integer or null

The previous page number, or null if on the first page.

pagination-first-page
integer
Example: 1

Always 1.

pagination-last-page
integer
Example: 3

The last page number.

Response Schema: application/json
Array
required
object

Core invoice record fields.

required
object or null

File record for the uploaded invoice PDF, or null if no file.

required
object

Confirmed payee contact, or null values if not yet assigned.

required
object

Property assignment context derived from the predicted ledger.

required
object

Associated work order summary, or null values if not linked.

required
object

Bill this invoice was converted to, or null values if not yet converted.

required
object

User who submitted the invoice.

required
object

Address and ledger context for manually-created invoices (invoiceTypeID=2).

Response samples

Content type
application/json
[
  • {
    }
]

Upload Invoice

Uploads an invoice PDF or image file. The file is stored and an invoice record is created in Processing status. The AI extraction service processes the file asynchronously and populates the predicted* fields when complete. The invoice transitions to Ready status once extraction is done.

Use Cases

  • Allow a property manager to upload a vendor invoice PDF from the manager portal.
  • Trigger AI-powered field extraction for invoice automation workflows.

Business Rules

  • The request must be multipart/form-data with the file as the first upload.
  • The file must be a valid upload (checked by the internal file validation layer).
  • The new invoice is created with invoiceStatusID=1 (Processing) and invoiceSourceID=2 (Upload).
  • On success, forwards to GET /accounting/invoices/{invoiceID} and returns the full invoice detail.
  • The AI prediction runs asynchronously via the queue — the predicted* fields will be populated after a short delay.
  • GET /accounting/invoices/{invoiceID} - Poll for updated prediction results.
  • POST /accounting/invoices/{invoiceID}/decline - Decline an invoice after review.
Authorizations:
basicAuth
Request Body schema: multipart/form-data
file
required
string <binary>

The invoice PDF or image file to upload.

Responses

Response Schema: application/json
required
object (invoice)

An invoice is an inbound document (uploaded PDF or vendor-created line-item entry) that can be reviewed, converted to a bill, or declined. The invoiceStatusID tracks processing state; the invoiceTypeID distinguishes uploaded PDFs from manually created invoices. Predicted fields are populated by the AI extraction service for uploaded invoices.

lineItems
required
Array of objects

Line items (empty until AI extraction completes).

Response samples

Content type
application/json
{
  • "invoice": {
    },
  • "lineItems": [ ]
}

Get Invoice

Retrieves a single invoice by ID. The base response includes the invoice record and its line items (actual or AI-predicted depending on invoiceTypeID). Additional related data can be requested via the includes query parameter.

Use Cases

  • Load a full invoice detail page including the vendor contact and predicted field data.
  • Display line items for a Created (manually entered) invoice.
  • Pull the associated work order and property for routing/approval context.

Business Rules

  • Returns a 400 error if the invoice does not exist.
  • lineItems are always returned — for invoiceTypeID=2 (Created) these come from InvoiceLineItems; for uploaded invoices they come from the AI prediction data.
  • The workOrder, unit, property, lease, and ledger includes are nested: unit, property, lease, and ledger require workOrder to also be included.

Available Includes (7+)

Use ?includes=contact,workOrder,property to request additional data.

  • contact — The confirmed or predicted payee contact record.
  • predictedInvoice — The raw AI extraction result for uploaded invoices.
  • invoiceFile — The file record for the uploaded invoice PDF.
  • files — Attachments shared with the vendor on this invoice.
  • workOrder — The associated work order, if set.
  • unit — The unit linked to the work order (requires workOrder).
  • property — The property linked to the work order (requires workOrder).
  • lease — The lease linked to the work order (requires workOrder).
  • ledger — The ledger for the unit or property (requires workOrder).
  • GET /accounting/invoices - List all invoices.
  • POST /accounting/invoices/{invoiceID}/decline - Decline this invoice.
  • GET /accounting/invoices/{invoiceID}/print - Download the invoice as a PDF.
Authorizations:
basicAuth
path Parameters
invoiceID
required
integer
Example: 8850

The ID of the invoice to retrieve.

query Parameters
includes
string
Example: includes=contact,workOrder,property

Comma-separated list of additional data to include. Available values: contact, predictedInvoice, invoiceFile, files, workOrder, unit, property, lease, ledger.

Responses

Response Schema: application/json
required
object (invoice)

An invoice is an inbound document (uploaded PDF or vendor-created line-item entry) that can be reviewed, converted to a bill, or declined. The invoiceStatusID tracks processing state; the invoiceTypeID distinguishes uploaded PDFs from manually created invoices. Predicted fields are populated by the AI extraction service for uploaded invoices.

required
Array of objects

Line items — from InvoiceLineItems for Created invoices, or AI-predicted for uploads.

object or null

The payee contact (if includes=contact).

predictedInvoice
object or null

Raw AI extraction result (if includes=predictedInvoice).

object or null

The uploaded invoice PDF file record (if includes=invoiceFile).

files
Array of objects

Attachments shared with the vendor (if includes=files).

object or null

The associated work order (if includes=workOrder).

unit
object or null

The unit from the work order (if includes=unit and workOrder).

property
object or null

The property from the work order (if includes=property and workOrder).

lease
object or null

The lease from the work order (if includes=lease and workOrder).

ledger
object or null

The ledger for the unit or property (if includes=ledger and workOrder).

Response samples

Content type
application/json
Example
{
  • "invoice": {
    },
  • "lineItems": [ ]
}

Print Invoice

Renders a printable PDF for the given invoice and streams it as the response body. The response Content-Type is application/pdf.

Use Cases

  • Download a PDF copy of an invoice to send to an owner or attach to a bill.
  • Generate an invoice PDF for record-keeping before converting to a bill.

Business Rules

  • Returns a 400 error if the invoice does not exist.
  • The response is streamed directly — there is no JSON envelope.
  • GET /accounting/invoices/{invoiceID} - Retrieve invoice data in JSON format.
Authorizations:
basicAuth
path Parameters
invoiceID
required
integer
Example: 8850

The ID of the invoice to print.

Responses

Response Headers
Cache-Control
string
Example: "no-cache"
Response Schema: application/pdf
string <binary>

Response samples

Content type
application/json
{
  • "error": "Invoice not found"
}

Decline Invoice

Declines an invoice, setting its status to Declined (4) and optionally sending a decline notification to the vendor. On success, returns the updated invoice detail.

Use Cases

  • Reject a vendor invoice that does not match an approved work order or has incorrect details.
  • Decline a duplicate or invalid invoice submission.

Business Rules

  • The invoice invoiceStatusID is set to 4 (Declined) internally regardless of the value provided in the request body.
  • declinedMessage is stored on the invoice and included in the notification email if sendNotification is true.
  • sendNotification defaults to true if not provided in the request body.
  • On success, forwards to GET /accounting/invoices/{invoiceID} and returns the full invoice detail.
  • GET /accounting/invoices/{invoiceID} - View the declined invoice.
  • POST /accounting/invoices/upload - Upload a replacement invoice.
Authorizations:
basicAuth
path Parameters
invoiceID
required
integer
Example: 8850

The ID of the invoice to decline.

Request Body schema: application/json
declinedMessage
string or null

Message explaining why the invoice was declined. Sent to the vendor if sendNotification is true.

sendNotification
boolean
Default: true

Whether to send a decline notification email to the vendor.

Responses

Response Schema: application/json
required
object (invoice)

An invoice is an inbound document (uploaded PDF or vendor-created line-item entry) that can be reviewed, converted to a bill, or declined. The invoiceStatusID tracks processing state; the invoiceTypeID distinguishes uploaded PDFs from manually created invoices. Predicted fields are populated by the AI extraction service for uploaded invoices.

lineItems
required
Array of objects

Request samples

Content type
application/json
Example
{
  • "declinedMessage": "Invoice amount does not match the approved work order estimate.",
  • "sendNotification": true
}

Response samples

Content type
application/json
{
  • "invoice": {
    },
  • "lineItems": [ ]
}

Ledgers

List Ledgers

Returns a flat array of ledger objects matching the given search criteria. At least one of search or ledgerIDs should be provided; supplying neither returns an empty result set.

Use Cases

  • Typeahead / autocomplete: pass search to find ledgers by name.
  • Batch lookup: pass ledgerIDs to fetch a known set of ledgers by ID.
  • Filtered listing: combine ledgerTypeID with search to narrow results to a specific ledger type (e.g. only property operating accounts).

Business Rules

  • Users without the manager-ledger permission will have manager ledgers filtered out of the results automatically.
  • Results are ordered by search relevance rank, then ledger type, then name.
  • GET /accounting/ledgers/search — Paginated ledger search with extended filters.
  • GET /accounting/ledgers/{ledgerID} — Retrieve a single ledger with optional includes.
Authorizations:
basicAuth
query Parameters
search
string
Example: search=Operating

Search string matched against the ledger name.

ledgerTypeID
integer
Enum: 1 2 3 4
Example: ledgerTypeID=2

Filter results to a single ledger type.

  • 1 - Manager
  • 2 - Portfolio
  • 3 - Property
  • 4 - Unit
ledgerIDs[]
Array of integers
Example: ledgerIDs[]=100&ledgerIDs[]=101

Filter by one or more ledger IDs. Pass each value as a separate query parameter: ledgerIDs[]=100&ledgerIDs[]=101.

Responses

Response Schema: application/json
Array
required
object (ledger)

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Search Ledgers

Paginated search across all ledgers with filtering by type, status, and modification date. Results include a left-joined unit object populated only when the ledger is of type Unit (ledgerTypeID 4).

Use Cases

  • Retrieve all active ledgers modified after a given date for sync/reconciliation.
  • Filter to a specific set of ledger types (e.g. property and portfolio) for a reporting UI.
  • Look up a single known ledger by ledgerID to confirm its current state.
  • Combine search + ledgerTypeIDs to power a filtered autocomplete when exact IDs are not known.

Business Rules

  • Portfolio/access restrictions are applied automatically — results are limited to ledgers the authenticated user has permission to view.
  • isActive filters on ledger status; omit it to receive both active and inactive records.
  • ledgerTypeIDs accepts a comma-separated string or repeated array values; ledgerTypeID (singular) is accepted as a convenience fallback for a single type.
  • The unit object is always present in each item but its fields will be null for non-unit ledgers.
  • GET /accounting/ledgers — Lightweight, non-paginated ledger lookup (typeahead / batch ID lookup).
  • GET /accounting/ledgers/{ledgerID} — Single ledger detail with optional includes.
Authorizations:
basicAuth
query Parameters
search
search

Filter by term in description, name, amount, or address

isActive
boolean
ledgerID
integer
Example: ledgerID=100

Filter to a single ledger by its primary key.

ledgerTypeIDs[]
Array of arrays

Filter by an array of ledgerTypeIDs

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page.

pagination-total-items
integer
Example: 120

Total number of items across all pages.

pagination-total-pages
integer
Example: 5

Total number of pages.

pagination-current-page
integer
Example: 1

Current page number.

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page.

pagination-before-page
integer or null

Previous page number, or null if on the first page.

pagination-first-page
integer
Example: 1

First page number (always 1).

pagination-last-page
integer
Example: 5

Last page number.

Response Schema: application/json
Array
required
object
required
object or null

Unit details joined from property_units. Populated only when ledger.ledgerTypeID is 4 (Unit). All fields are null for non-unit ledgers.

Response samples

Content type
application/json
Example
[
  • {
    }
]

Transactions

Search Transactions

Returns a paginated, searchable list of accounting transactions with associated ledger, property, portfolio, and unit context. Each result item contains the transaction plus denormalized lookup data useful for display in transaction lists and reports.

Use Cases

  • Search transactions by date range, amount, or text for audit and reconciliation.
  • Filter by transactionTypeIDs to show only specific payment types (e.g. rent payments).
  • Filter by primaryLedgerIDs to scope results to a specific bank account ledger.
  • Pull recent transactions modified after a given timestamp for sync workflows.

Business Rules

  • Results are restricted to the authenticated user's portfolio.
  • Both propertyIDs (comma-separated) and propertyID (single integer) are accepted; propertyIDs takes precedence.
  • Similarly, transactionTypeIDs takes precedence over transactionTypeID.
  • The ledger, property, portfolio, and unit fields are joined from related tables and may be null if the transaction has no associated property or unit.
  • GET /accounting/transactions/entries/search - Search individual debit/credit entries.
Authorizations:
basicAuth
query Parameters
search
search

Filter by term in description, name, amount, or address

isVoided
boolean

Filter by isVoided

amountMin
number <double>

Filter by minumum amount

amountMax
number <double>

Filter by maximum amount

datePostedMin
date

Filter by minumum datePosted

datePostedMax
date

Filter by maximum datePosted

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

transactionTypeIDs[]
Array of arrays

Filter by an array of transactionTypeIDs

propertyIDs[]
Array of arrays

Filter by an array of propertyIDs

transactionEntriesLedgerIDs[]
Array of arrays

Filter by an array of transactionEntriesLedgerIDs

primaryLedgerIDs[]
Array of arrays

Filter by an array of primaryLedgerIDs

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Headers
pagination-page-size
integer
Example: 15

Number of items per page.

pagination-total-items
integer
Example: 320

Total number of transactions matching the query.

pagination-total-pages
integer
Example: 22

Total number of pages.

pagination-current-page
integer
Example: 1

The current page number.

pagination-next-page
integer or null
Example: 2

The next page number, or null if on the last page.

pagination-before-page
integer or null

The previous page number, or null if on the first page.

pagination-first-page
integer
Example: 1

Always 1.

pagination-last-page
integer
Example: 22

The last page number.

Response Schema: application/json
Array
required
object (transaction)
object or null
object or null
object or null
object or null
object

Aggregated data from the transaction's debit/credit entries.

Response samples

Content type
application/json
[
  • {
    }
]

Create Other Payment

Records a miscellaneous payment receipt against a ledger (e.g. a Money Order, Cash, or Check received that is not a lease rent payment). Creates a transaction of type 12 (Other Payment) and returns the newly created transaction.

Use Cases

  • Record a cash, check, or money order receipt that isn't a standard rent payment.
  • Collect HOA dues, utility reimbursements, or other ad-hoc income against a ledger.
  • Attach scanned copies of receipts via attachments (array of fileID values).

Business Rules

  • Requires the ModifyOtherPayments permission under the Accounting component.
  • ledgerID is required and must reference a valid, accessible ledger.
  • chargeAccountID identifies the income account to credit.
  • bankAccountID identifies the bank account to debit.
  • paymentTypeID must be one of the defined payment type integers (1–8).
  • After a successful save the response is identical to GET /accounting/other-payments/{transactionID}.
  • GET /accounting/other-payments/{transactionID} - Retrieve a specific other payment.
  • PUT /accounting/other-payments/{transactionID} - Update an existing other payment.
  • DELETE /accounting/other-payments/{transactionID} - Void an other payment.
Authorizations:
basicAuth
Request Body schema: application/json
ledgerID
required
integer

ID of the ledger to post the payment against.

amount
required
number <float>

Payment amount.

chargeAccountID
required
integer

Income account ID to credit.

datePosted
required
string <date>

Date the payment was received.

bankAccountID
required
integer

Bank account ID to debit.

paymentTypeID
required
integer (payment_types)
Enum: 1 2 3 4 5 6 7 8
  • 1 - eCheck (ACH)
  • 2 - Credit Card
  • 3 - Check
  • 4 - Money Order
  • 5 - Cash
  • 6 - Other
  • 7 - Cash Pay
  • 8 - Cashier's Check
receivedFrom
string or null

Name or description of the payer.

reference
string or null

Check number, transaction reference, or other identifier.

description
string or null

Internal memo describing the payment.

attachments
Array of integers

Array of fileID integers from previously uploaded files.

depositID
integer or null

Deposit ID to associate this payment with, if applicable.

Responses

Response Schema: application/json
required
object

Request samples

Content type
application/json
Example
{
  • "ledgerID": 1165,
  • "receivedFrom": "123pm",
  • "amount": 1000,
  • "chargeAccountID": 106,
  • "datePosted": "2026-05-15",
  • "reference": "Test Reference",
  • "description": "Test Description",
  • "bankAccountID": 31,
  • "attachments": [ ],
  • "paymentTypeID": 4
}

Response samples

Content type
application/json
{
  • "transaction": {
    }
}

Create Lease Charge

Posts a new charge transaction against a lease. The charge is recorded against the specified chart-of-account entry and immediately increases the lease's outstanding balance. Management fees and sales tax charges may be auto-generated depending on the account's configuration and the portfolio's management fee settings.

Use Cases

  • Posting a one-time rent charge outside the recurring schedule (e.g. a prorated amount or a missed month).
  • Applying a non-rent fee such as a parking fee, maintenance reimbursement, or NSF fee.
  • Recording an amenity or utility charge billed directly to the tenant.

Business Rules

  • Requires the Add Charge permission under the Leasing component.
  • The lease must exist and fall within the authenticated user's accessible portfolios; a 400 is returned otherwise.
  • chargeAccountID must reference a valid income-type chart-of-account entry configured for lease charges; invalid accounts are rejected with a 400.
  • datePosted must be a valid calendar date in YYYY-MM-DD format.
  • amount is accepted as a decimal string (e.g. "1000.00").
  • If the account is subject to management fees, a management fee charge transaction is automatically created and linked to this charge.
  • If the account is subject to sales tax, a corresponding sales tax charge transaction is automatically created.
  • POST /accounting/leases/{leaseID}/payments - Apply a payment against this or other charges on the lease.
  • GET /accounting/transactions/search - Search and retrieve existing transactions for the lease.
  • GET /leases/{leaseID}/recurring-charges - Manage recurring charges that auto-generate transactions.
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2982

ID of the lease to post the charge against.

Request Body schema: application/json
datePosted
required
string <date>

Date the charge should be posted to the ledger (YYYY-MM-DD).

amount
required
string

Charge amount as a decimal string.

chargeAccountID
required
string

Chart-of-account ID to post this charge against. Must be an income-type account enabled for lease charges.

description
required
string

Label for the charge as it appears on statements and the tenant ledger.

Responses

Response Schema: application/json
required
object (transaction_detail)

Full accounting transaction record as returned by lease charge and payment creation endpoints. Contains all fields including management-fee, sales-tax, ACH, prepayment, and reconciliation metadata. Fields that are not applicable to a given transaction type will be null.

Request samples

Content type
application/json
Example
{
  • "datePosted": "2026-04-25",
  • "amount": "1500.00",
  • "chargeAccountID": "9",
  • "description": "April Rent"
}

Response samples

Content type
application/json
{
  • "transaction": {
    }
}

Create Lease Payment

Records a payment received from a tenant against a lease. The payment can be applied to specific outstanding charges via the receipts array, applied automatically to the oldest charges first, or held as a prepayment (unapplied credit) for future application. An email receipt is optionally sent to the tenant on success.

Use Cases

  • Recording a rent check payment and applying it to the current month's rent charge.
  • Accepting a partial payment and holding the remainder as a prepayment.
  • Applying a payment automatically across all outstanding charges without specifying individual receipts.
  • Posting an online payment received via the resident portal.

Business Rules

  • Requires the Add Payment permission under the Leasing component.
  • The lease must exist and fall within the authenticated user's accessible portfolios; a 400 is returned otherwise.
  • bankAccountID defaults to the portfolio's primary trust account when null; provide a specific bank account ID to override.
  • leaseTenantID identifies which tenant on the lease is making the payment; this controls the contactID recorded on the transaction and determines where the email receipt is sent.
  • prepaymentAccountID controls where unallocated funds are held. Use -1 to apply to the portfolio's default prepayment account. Set hasPrepayment: true and supply prepaymentAmount to split the payment between charges and prepayment.
  • If applyAutomatically is true, the server allocates the payment to outstanding charges from oldest to newest, ignoring the receipts array.
  • If applyAutomatically is false, supply a receipts array specifying which charge transactions to apply the payment to and the amount to apply to each.
  • receipts[].chargeTransactionID must reference a charge transaction on this lease.
  • The sum of receipts[].amount plus prepaymentAmount should equal amount.
  • emailReceipt: true triggers an email receipt to the tenant identified by leaseTenantID.
  • POST /accounting/leases/{leaseID}/charges - Create a charge before applying a payment.
  • GET /accounting/transactions/search - Search existing payment and charge transactions for the lease.
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2982

ID of the lease to record the payment against.

Request Body schema: application/json
amount
required
string

Total payment amount as a decimal string.

datePosted
required
string <date>

Date the payment should be posted to the ledger (YYYY-MM-DD).

leaseTenantID
required
string

ID of the lease-tenant record identifying the paying tenant. Controls contactID on the transaction and email receipt recipient.

bankAccountID
string or null

ID of the bank account to deposit the payment into. Pass null to use the portfolio's default trust account.

emailReceipt
boolean
Default: false

Whether to send a payment receipt email to the tenant identified by leaseTenantID.

leaseID
string

ID of the lease (must match the {leaseID} path parameter).

prepaymentAccountID
string or null

Account to hold unallocated (prepayment) funds. Use "-1" for the portfolio's default prepayment account. Required when hasPrepayment is true.

prepaymentAmount
number or null

Portion of amount to hold as a prepayment (unapplied credit). Required when hasPrepayment is true.

reference
string or null

External reference number such as a check number or ACH trace ID.

description
string or null

Free-text label for this payment as it appears on the tenant ledger.

applyAutomatically
boolean
Default: false

When true, the server applies the payment to outstanding charges oldest-first, ignoring the receipts array. When false, use the receipts array to specify exactly which charges to apply the payment to.

Array of objects

List of charge transactions to apply this payment to. Required when applyAutomatically is false and there are charges to apply the payment against.

hasPrepayment
boolean
Default: false

Whether any portion of this payment should be held as a prepayment. When true, supply prepaymentAccountID and prepaymentAmount.

Responses

Response Schema: application/json
required
object (transaction_detail)

Full accounting transaction record as returned by lease charge and payment creation endpoints. Contains all fields including management-fee, sales-tax, ACH, prepayment, and reconciliation metadata. Fields that are not applicable to a given transaction type will be null.

Request samples

Content type
application/json
Example
{
  • "bankAccountID": null,
  • "emailReceipt": true,
  • "leaseID": "2982",
  • "prepaymentAccountID": null,
  • "amount": "1500.00",
  • "datePosted": "2026-04-25",
  • "prepaymentAmount": null,
  • "reference": "1001",
  • "leaseTenantID": "3356",
  • "description": "April rent payment",
  • "applyAutomatically": false,
  • "receipts": [
    ],
  • "hasPrepayment": false
}

Response samples

Content type
application/json
{
  • "transaction": {
    }
}

Search Ledger Transfers

Paginated search for ledger transfer transactions. Returns transactions of type LedgerTransfer only, each enriched with the primary ledger, property, portfolio, unit, and the names of all debited/credited ledgers from the transaction entries.

Use Cases

  • List all ledger transfers posted between two dates for a reconciliation report.
  • Filter by one or more propertyIDs to see transfers affecting specific properties.
  • Filter by transactionEntriesLedgerIDs to find transfers that touched a given ledger.
  • Retrieve voided transfers separately using isVoided=1.

Business Rules

  • Only transactions of type LedgerTransfer (transactionTypeID 15) are returned; the type filter is applied server-side and cannot be overridden by the caller.
  • Portfolio/property access restrictions are applied automatically.
  • amountMin and amountMax filter on the absolute transaction amount as a decimal.
  • GET /accounting/recurring-ledger-transfers/search — Search recurring ledger transfer schedules.
  • GET /accounting/transactions/search — Broad transaction search across all types.
Authorizations:
basicAuth
query Parameters
search
search

Filter by term in description, name, amount, or address

isVoided
boolean

Filter by isVoided

amountMin
number <double>

Filter by minumum amount

amountMax
number <double>

Filter by maximum amount

datePostedMin
date

Filter by minumum datePosted

datePostedMax
date

Filter by maximum datePosted

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

propertyIDs[]
Array of arrays

Filter by an array of propertyIDs

transactionEntriesLedgerIDs[]
Array of arrays

Filter by an array of transactionEntriesLedgerIDs

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page.

pagination-total-items
integer
Example: 940

Total number of items across all pages.

pagination-total-pages
integer
Example: 38

Total number of pages.

pagination-current-page
integer
Example: 1

Current page number.

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page.

pagination-before-page
integer or null

Previous page number, or null if on the first page.

pagination-first-page
integer
Example: 1

First page number (always 1).

pagination-last-page
integer
Example: 38

Last page number.

Response Schema: application/json
Array
required
object (transaction)
required
object
required
object
required
object
required
object
required
object

Response samples

Content type
application/json
[
  • {
    }
]

Search Journal Entries

Paginated search for journal entry transactions. Returns transactions of type JournalEntry only, each enriched with the primary ledger, property, portfolio, unit, and the names of all debited/credited ledgers from the transaction entries.

Use Cases

  • List all journal entries posted within a date range for an audit or reconciliation.
  • Filter by propertyIDs to find journal entries affecting a specific property.
  • Filter by transactionEntriesLedgerIDs to find entries that touched a given ledger.
  • Retrieve voided journal entries using isVoided=1.

Business Rules

  • Only transactions of type JournalEntry (transactionTypeID 11) are returned; the type filter is applied server-side and cannot be overridden by the caller.
  • Portfolio/property access restrictions are applied automatically.
  • amountMin and amountMax filter on the absolute transaction amount as a decimal.
  • GET /accounting/recurring-journal-entries/search — Search recurring journal entry schedules.
  • GET /accounting/transactions/search — Broad transaction search across all types.
Authorizations:
basicAuth
query Parameters
search
search

Filter by term in description, name, amount, or address

isVoided
boolean

Filter by isVoided

amountMin
number <double>

Filter by minumum amount

amountMax
number <double>

Filter by maximum amount

datePostedMin
date

Filter by minumum datePosted

datePostedMax
date

Filter by maximum datePosted

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

propertyIDs[]
Array of arrays

Filter by an array of propertyIDs

transactionEntriesLedgerIDs[]
Array of arrays

Filter by an array of transactionEntriesLedgerIDs

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page.

pagination-total-items
integer
Example: 200

Total number of items across all pages.

pagination-total-pages
integer
Example: 8

Total number of pages.

pagination-current-page
integer
Example: 1

Current page number.

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page.

pagination-before-page
integer or null

Previous page number, or null if on the first page.

pagination-first-page
integer
Example: 1

First page number (always 1).

pagination-last-page
integer
Example: 8

Last page number.

Response Schema: application/json
Array
required
object (transaction)
required
object
required
object
required
object
required
object
required
object

Response samples

Content type
application/json
[
  • {
    }
]

Search Recurring Ledger Transfers

Paginated search for recurring ledger transfer schedules. Each result represents a scheduled transfer that posts ledger-to-ledger transactions on a recurring basis (daily, weekly, monthly, etc.). The ledgerNames field contains a comma-separated list of the involved ledger names.

Use Cases

  • List all active recurring ledger transfers to display in a scheduled payments UI.
  • Filter by bankAccountIDs to find transfers associated with a specific bank account.
  • Filter by nextRunDateMin/nextRunDateMax to see transfers running in the next N days.
  • Filter by ledgerIDs to find transfers that involve a specific ledger.

Business Rules

  • Portfolio/access restrictions are applied automatically.
  • amountMin and amountMax filter on the transfer amount as a decimal.
  • endDate is nullable; a null value means the schedule runs indefinitely.
  • GET /accounting/ledger-transfers/search — Search posted ledger transfer transactions.
Authorizations:
basicAuth
query Parameters
search
search

Filter by term in description, name, amount, or address

ledgerIDs[]
Array of arrays

Filter by an array of ledgerIDs

bankAccountIDs[]
Array of arrays

Filter by an array of bankAccountIDs

amountMin
number <double>

Filter by minumum amount

amountMax
number <double>

Filter by maximum amount

endDateMin
string <date>

Filter by minimum end date (inclusive)

endDateMax
string <date>

Filter by maximum end date (inclusive)

nextRunDateMin
string <date>

Filter by minimum next run date (inclusive)

nextRunDateMax
string <date>

Filter by maximum next run date (inclusive)

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page.

pagination-total-items
integer
Example: 12

Total number of items across all pages.

pagination-total-pages
integer
Example: 1

Total number of pages.

pagination-current-page
integer
Example: 1

Current page number.

pagination-next-page
integer or null

Next page number, or null if on the last page.

pagination-before-page
integer or null

Previous page number, or null if on the first page.

pagination-first-page
integer
Example: 1

First page number (always 1).

pagination-last-page
integer
Example: 1

Last page number.

Response Schema: application/json
Array
required
object

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Search Recurring Journal Entries

Paginated search for recurring journal entry schedules. Each result contains the recurring journal entry record alongside the full ledger object it is associated with.

Use Cases

  • List all recurring journal entries to display in a scheduled accounting UI.
  • Filter by ledgerIDs to find recurring entries associated with a specific ledger.
  • Filter by nextRunDateMin/nextRunDateMax to see entries posting in the next N days.
  • Filter by endDateMin/endDateMax to find schedules expiring in a given window.

Business Rules

  • Portfolio/access restrictions are applied automatically.
  • amountMin and amountMax filter on the entry amount as a decimal.
  • endDate is nullable; a null value means the schedule runs indefinitely.
  • GET /accounting/journal-entries/search — Search posted journal entry transactions.
Authorizations:
basicAuth
query Parameters
search
search

Filter by term in description, name, amount, or address

ledgerIDs[]
Array of arrays

Filter by an array of ledgerIDs

amountMin
number <double>

Filter by minumum amount

amountMax
number <double>

Filter by maximum amount

endDateMin
string <date>

Filter by minimum end date (inclusive)

endDateMax
string <date>

Filter by maximum end date (inclusive)

nextRunDateMin
string <date>

Filter by minimum next run date (inclusive)

nextRunDateMax
string <date>

Filter by maximum next run date (inclusive)

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page.

pagination-total-items
integer
Example: 8

Total number of items across all pages.

pagination-total-pages
integer
Example: 1

Total number of pages.

pagination-current-page
integer
Example: 1

Current page number.

pagination-next-page
integer or null

Next page number, or null if on the last page.

pagination-before-page
integer or null

Previous page number, or null if on the first page.

pagination-first-page
integer
Example: 1

First page number (always 1).

pagination-last-page
integer
Example: 1

Last page number.

Response Schema: application/json
Array
required
object
required
object

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Transaction Entries

Search Transaction Entries

Returns a paginated, searchable list of individual transaction entries (debit/credit lines) with associated transaction, ledger, property, portfolio, and unit context. Transaction entries represent the individual accounting lines within a double-entry transaction.

Use Cases

  • Search entries by ledger to build a ledger statement or account register.
  • Filter by isCash or isAccrual for cash vs. accrual basis reporting.
  • Filter by isSuppressed to show or exclude management-fee suppressed entries.
  • Pull entries modified after a given timestamp for sync or reconciliation workflows.

Business Rules

  • Results are restricted to the authenticated user's portfolio.
  • Both propertyIDs (comma-separated) and propertyID (single integer) are accepted; propertyIDs takes precedence.
  • Similarly, ledgerIDs takes precedence over ledgerID.
  • The ledger, primaryLedger, property, portfolio, and unit fields are joined from related tables and may be null if the entry has no associated property or unit.
  • Each entry references both its own ledger (the account being debited/credited) and the primaryLedger (the bank account of the parent transaction).
  • GET /accounting/transactions/search - Search parent transactions.
Authorizations:
basicAuth
query Parameters
search
search

Filter by term in description, name, amount, or address

isVoided
boolean

Filter by isVoided

isSuppressed
boolean

Filter by isSuppressed

isCash
boolean

Filter by isCash

isAccrual
boolean

Filter by isAccrual

amountMin
number <double>

Filter by minumum amount

amountMax
number <double>

Filter by maximum amount

datePostedMin
date

Filter by minumum datePosted

datePostedMax
date

Filter by maximum datePosted

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

transactionTypeIDs[]
Array of arrays

Filter by an array of transactionTypeIDs

propertyIDs[]
Array of arrays

Filter by an array of propertyIDs

ledgerIDs[]
Array of arrays

Filter by an array of ledgerIDs

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 15

Number of items per page

Responses

Response Headers
pagination-page-size
integer
Example: 15

Number of items per page.

pagination-total-items
integer
Example: 580

Total number of entries matching the query.

pagination-total-pages
integer
Example: 39

Total number of pages.

pagination-current-page
integer
Example: 1

The current page number.

pagination-next-page
integer or null
Example: 2

The next page number, or null if on the last page.

pagination-before-page
integer or null

The previous page number, or null if on the first page.

pagination-first-page
integer
Example: 1

Always 1.

pagination-last-page
integer
Example: 39

The last page number.

Response Schema: application/json
Array
required
object (transaction_entry)
required
object (transaction)
object or null
object or null
object or null
object or null
object or null

Response samples

Content type
application/json
[
  • {
    }
]

Diagnostics

Unused Vendor Credits

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
transactionID
integer
primaryLedgerID
integer
portfolioID
integer
ledgerName
string
propertyID
integer
propertyAddress
string
propertyAddress2
string or null
propertyCity
string
propertyStateID
string
propertyPostalCode
string
chargeAccountID
integer
contactID
integer
contactTypeID
integer (contact_types)
Enum: 1 2 3 4 5 6
  • 1 - Owner
  • 2 - Tenant
  • 3 - Vendor
  • 4 - Manager
  • 5 - Association
  • 6 - Applicant
contactName
string
amount
number <double>
amountAllocated
number <double>
description
string
isSuppressed
integer
datePosted
string <date>

Response samples

Content type
application/json
[
  • {
    }
]

Suppressed Fee Balance Mismatch

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
propertyID
integer
propertyName
string or null
propertyStreetName
string
propertyStreetNumber
string
propertyAddress
string
propertyAddress2
string or null
propertyCity
string
propertyStateID
string
propertyPostalCode
string
accountID
integer
balance
number <double>
managerLedgerID
integer

Response samples

Content type
application/json
[
  • {
    }
]

Negative Bank Accounts

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
ledgerID
integer
ledgerName
string
ledgerTypeID
integer (ledger_types)
Enum: 1 2 3 4
  • 1 - Manager
  • 2 - Portfolio
  • 3 - Property
  • 4 - Unit
ledgerObjectID
integer
accountID
integer
accountName
string
accountNumber
string
balance
number <double>

Response samples

Content type
application/json
[
  • {
    }
]

Reserve Not Met By Ledger

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
ledgerID
integer
ledgerName
string
ledgerTypeID
integer (ledger_types)
Enum: 1 2 3 4
  • 1 - Manager
  • 2 - Portfolio
  • 3 - Property
  • 4 - Unit
ledgerObjectID
integer
operatingBalance
number <double>
reserveAmount
number <double>

Response samples

Content type
application/json
[
  • {
    }
]

Escrow Mismatch By Ledger

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
ledgerID
integer
ledgerName
string
ledgerTypeID
integer (ledger_types)
Enum: 1 2 3 4
  • 1 - Manager
  • 2 - Portfolio
  • 3 - Property
  • 4 - Unit
ledgerObjectID
integer
depositBalance
number <double>
escrowBalance
number <double>

Response samples

Content type
application/json
[
  • {
    }
]

Prepayment Mismatch By Ledger

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
ledgerID
integer
ledgerName
string
ledgerTypeID
integer (ledger_types)
Enum: 1 2 3 4
  • 1 - Manager
  • 2 - Portfolio
  • 3 - Property
  • 4 - Unit
ledgerObjectID
integer
operatingBalance
number <double>
prepaymentBalance
number <double>

Response samples

Content type
application/json
[
  • {
    }
]

Unused Prepayments

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
leaseID
integer
tenants
Array of strings
unitID
integer
unitAddress
string
unitAddress2
string
unitCity
string
unitStateID
string
unitPostalCode
string
unitName
string
propertyID
integer
propertyAddress
string
propertyAddress2
string
propertyCity
string
propertyStateID
string
propertyPostalCode
string
propertyName
string
prepaymentBalance
number <double>

Response samples

Content type
application/json
[
  • {
    }
]

Bank Account Reconcialiation Lapse

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
accountID
integer
name
string
number
string
lastReconciliationDate
string <date>

Response samples

Content type
application/json
[
  • {
    }
]

Vendor Insurance Lapse

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
contactID
integer
name
string
contactTypeID
integer (contact_types)
Enum: 1 2 3 4 5 6
  • 1 - Owner
  • 2 - Tenant
  • 3 - Vendor
  • 4 - Manager
  • 5 - Association
  • 6 - Applicant
liabilityInsuranceExpiresDate
string <date>
workersCompInsuranceExpiresDate
string <date>

Response samples

Content type
application/json
[
  • {
    }
]

Credit Debit Mismatch

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
transactionID
integer
transactionTypeID
integer
primaryLedgerID
integer
primaryLedgerName
string
portfolioID
integer
propertyID
integer
propertyName
string
propertyAddress
string
propertyAddress2
string
propertyCity
string
propertyStateID
string
propertyPostalCode
string
unitAddress
string
unitAddress2
string
unitCity
string
unitStateID
string
unitPostalCode
string
unitName
string
unitID
integer
leaseID
integer
billID
integer
datePosted
string <date>
cashCredits
number <double>
cashDebits
number <double>
accrualCredits
number <double>
accrualDebits
number <double>

Response samples

Content type
application/json
[
  • {
    }
]

Manager Ledger Balances

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
ledgerID
integer
ledgerName
string
ledgerTypeID
integer (ledger_types)
Enum: 1 2 3 4
  • 1 - Manager
  • 2 - Portfolio
  • 3 - Property
  • 4 - Unit
objectID
integer
reserveAmount
number <double>
additionalReserveAmount
number <double>
overdraftOverrideAmount
number <double>
cashBalance
number <double>
escrowBalance
number <double>
prepaymentBalance
number <double>
depositBalance
number <double>
nonHeldDepositBalance
number <double>
accountsReceivableBalance
number <double>
accountsPayableBalance
number <double>
creditBalance
number <double>
currentCreditBalance
number <double>
currentAccountsPayableBalance
number <double>
liabilityBalance
number <double>
nonHeldLiabilityBalance
number <double>
undepositedReceiptsBalance
number <double>
undepositedEscrowReceiptsBalance
number <double>
workOrderEstimateBalance
number <double>
operatingBalance
number <double>
availableFunds
number <double>

Response samples

Content type
application/json
[
  • {
    }
]

Owners

List Owners

Returns a paginated list of owner contacts visible to the authenticated account.

Use Cases

  • Sync active owners with an external system using the isActive filter
  • Search owners by name or code across the account

Business Rules

  • Results are restricted to owners within the authenticated account's portfolio access scope.
  • isActive defaults to 1 (active owners only). Pass isActive=0 for inactive owners.
  • Default page size is 15.
  • search matches against name and code.
  • GET /owners/search — advanced filtered search with insurance, payout, and date filters
  • GET /owners/{contactID} — retrieve a single owner with full detail and includes
  • POST /owners — create a new owner
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 15

Number of items per page

search
string
Example: search=Campos

Full-text search against owner name and code

isActive
integer
Default: 1
Enum: 0 1
Example: isActive=1

Filter by active status. Defaults to 1 (active only). Pass 0 for inactive owners.

Responses

Response Headers
pagination-page-size
integer
Example: 15

Number of items per page

pagination-total-items
integer
Example: 42

Total number of items across all pages

pagination-total-pages
integer
Example: 3

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 3

Last page number

Response Schema: application/json
Array
contactID
required
integer
contactTypeID
required
integer (contact_types)
Enum: 1 2 3 4 5 6
  • 1 - Owner
  • 2 - Tenant
  • 3 - Vendor
  • 4 - Manager
  • 5 - Association
  • 6 - Applicant
name
required
string
payoutTypeID
required
integer (payout_types)
Enum: 1 2 3 4
  • 1 - Cash
  • 2 - Check
  • 3 - eCheck (ACH)
  • 4 - NACHA (ACH)
achIsCorporateAccount
required
boolean
holdPayments
required
integer
isActive
required
boolean
preventConsolidatedPayments
required
integer
isFromImport
required
boolean
vendorTypeID
integer or null
firstName
string or null
middleName
string or null
lastName
string or null
suffix
string or null
emails
string or null
phones
string or null
addresses
string or null
birthDate
string or null <date>
defaultBillChargeAccountID
integer or null
taxPayerName
string or null
taxFormTypeID
boolean or null
achDetailsCiphertextID
integer or null
achAccountNumberTruncated
string or null
achAccountTypeID
integer (bank_account_types)
Enum: 1 2
  • 1 - Savings
  • 2 - Checking
liabilityInsuranceName
string or null
liabilityInsurancePolicyNumber
string or null
liabilityInsuranceExpiresDate
string or null <date>
workersCompInsuranceName
string or null
workersCompInsurancePolicyNumber
string or null
workersCompInsuranceExpiresDate
string or null <date>
discountPercent
number or null <double>
discountGraceDays
integer or null
isInsuranceRequiredForPayment
boolean or null
importSourceKey
string or null
websiteUrl
string or null
applicantID
integer or null

Response samples

Content type
application/json
[
  • {
    }
]

Create Owner

Creates a new owner contact and returns the full owner detail (same shape as GET /owners/{contactID}).

Use Cases

  • Onboard a new property owner into the system
  • Create an owner with initial payout settings, emails, phones, and addresses in a single request

Business Rules

  • Requires Contacts.UpdateOwner permission.
  • name is required.
  • payoutTypeID, achAccountTypeID, achIsCorporateAccount, holdPayments, preventConsolidatedPayments, and payeeName may only be set at creation time via this endpoint; use the ACH details endpoint to modify payout settings after creation.
  • Tax fields (taxPayerName, taxFormTypeID, taxIdentifier) require the Contacts.ManageTaxInfo permission.
  • Bank account fields (routingNumber, accountNumber) are stored encrypted; only the last 4 digits of accountNumber are returned in responses.
  • After creation the endpoint forwards to the view action — the response is the full owner detail.
  • GET /owners/{contactID} — retrieve the created owner
  • POST /owners/{contactID} — update owner fields after creation
  • POST /owners/{contactID}/ach-details — update payout/ACH settings
Authorizations:
basicAuth
Request Body schema: application/json
name
required
string

Full display name of the owner

code
string or null

Optional short code for the owner

websiteUrl
string or null <uri>

Owner website URL

birthDate
string or null <date>
payoutTypeID
any
achAccountTypeID
any
achIsCorporateAccount
string

1 if ACH account is corporate, 0 otherwise

holdPayments
string

1 to hold all payments to this owner

preventConsolidatedPayments
string

1 to prevent consolidated payouts

payeeName
string or null

Override name for checks and ACH

isBillApprovalExempt
string

1 to exempt owner from bill approval workflow (requires UpdateBillApprovalExemption permission)

taxPayerName
string or null

Name on tax documents (requires ManageTaxInfo permission)

taxFormTypeID
string or null

1099 form type ID (requires ManageTaxInfo permission)

taxIdentifier
string or null

SSN/EIN stored encrypted (requires ManageTaxInfo permission)

routingNumber
string or null

ACH routing number — stored encrypted, not returned in responses

accountNumber
string or null

ACH account number — stored encrypted, only last 4 digits returned

Array of objects

Email records to attach to the owner

Array of objects

Phone records to attach to the owner

addresses
Array of objects

Address records to attach to the owner

Responses

Response Schema: application/json
required
object (contact)

Request samples

Content type
application/json
Example
{
  • "name": "New User"
}

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Search Owners

Advanced paginated search for owner contacts with rich filter support.

Use Cases

  • Find owners by name or code

Business Rules

  • Results are restricted to owners within the authenticated account's portfolio access scope.
  • isActive defaults to showing all owners when omitted. Pass true/false to filter.
  • Default page size is 25.
  • Each result item has a nested contact object containing all contact fields plus computed fields (daysUntilLiabilityInsuranceExpires, daysUntilWorkersCompInsuranceExpires, daysUntilInsuranceExpires, insuranceExpiresDate, propertyCount, hasTaxIdentifier).
  • GET /owners — basic paginated list with name search only
  • GET /owners/{contactID} — full owner detail with includes
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=Campos

Full-text search against owner name

isActive
boolean
Example: isActive=true

Filter by active status. Pass true for active, false for inactive.

payoutTypeID
integer
Example: payoutTypeID=2

Filter owners by payout type ID

holdPayments
boolean

Filter owners with payments on hold

isInsuranceRequiredForPayment
boolean

Filter owners that require insurance for payment

isLiabilityInsuranceExpired
boolean

Filter owners whose liability insurance has expired

daysUntilLiabilityInsuranceExpiresMin
integer

Minimum number of days until liability insurance expires

daysUntilLiabilityInsuranceExpiresMax
integer
Example: daysUntilLiabilityInsuranceExpiresMax=30

Maximum number of days until liability insurance expires

isWorkersCompInsuranceExpired
boolean

Filter owners whose workers' comp insurance has expired

daysUntilWorkersCompInsuranceExpiresMin
integer

Minimum number of days until workers' comp insurance expires

daysUntilWorkersCompInsuranceExpiresMax
integer

Maximum number of days until workers' comp insurance expires

isInsuranceExpired
boolean

Filter owners whose earliest insurance (liability or workers' comp) has expired

daysUntilInsuranceExpiresMin
integer

Minimum days until the earliest insurance expires

daysUntilInsuranceExpiresMax
integer

Maximum days until the earliest insurance expires

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

orderBy
string
Example: orderBy=contact.name

Sort field in dot-notation. Prefix with - for descending order.

Available values: contact.name, contact.isActive, contact.contactTypeID, contact.payoutTypeID, contact.holdPayments, contact.discountPercent, contact.isInsuranceRequiredForPayment, contact.propertyCount, contact.daysUntilInsuranceExpires, contact.daysUntilLiabilityInsuranceExpires, contact.daysUntilWorkersCompInsuranceExpires

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 42

Total number of items across all pages

pagination-total-pages
integer
Example: 2

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 2

Last page number

Response Schema: application/json
Array
required
object

Owner contact with all fields plus computed insurance and portfolio data

Response samples

Content type
application/json
[
  • {
    }
]

Get Owner

Retrieves a single owner contact by ID, including all stored attributes and any optionally requested related data via the includes parameter.

Use Cases

  • Display full owner details in an owner overview screen
  • Load portfolio and portal account data in a single request for an owner detail page
  • Fetch tax adjustment or portal invitation data for onboarding and compliance views

Business Rules

  • Access is restricted to contacts within the authenticated account's scope via verifyAccessToContact.
  • Returns 400 if the contact is not found or does not have contactTypeID matching Owner.

Available Includes (7)

  • emails — array of email records for the owner
  • phones — array of phone records for the owner
  • addresses — array of address records for the owner
  • portfolios — array of portfolio memberships, each containing an owner (portfolioOwner record) and a portfolio object with contacts array
  • portalAccounts — array of active owner portal accounts linked to this contact
  • portalInvitations — array of pending owner portal invitations
  • taxAdjustments — array of 1099 tax adjustment records for the owner
  • GET /owners — list all owners
  • GET /owners/search — search owners with filters
  • POST /owners — create a new owner
  • POST /owners/{contactID} — update an owner
  • DELETE /owners/{contactID} — delete an owner
  • POST /owners/{contactID}/activate — activate an owner
  • POST /owners/{contactID}/deactivate — deactivate an owner
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 3513

The unique owner contact ID

query Parameters
includes
string
Example: includes=portfolios,portalAccounts,portalInvitations,taxAdjustments

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portfolios, portalAccounts, portalInvitations, taxAdjustments

Responses

Response Schema: application/json
required
object
emails
Array of objects

Email records for the owner (if includes=emails)

phones
Array of objects

Phone records for the owner (if includes=phones)

addresses
Array of objects

Address records for the owner (if includes=addresses)

Array of objects

Portfolio memberships with owner share details and portfolio data (if includes=portfolios)

Array of objects

Owner portal accounts linked to this contact (if includes=portalAccounts)

portalInvitations
Array of objects

Pending owner portal invitations (if includes=portalInvitations)

taxAdjustments
Array of objects

1099 tax adjustment records for the owner (if includes=taxAdjustments)

Response samples

Content type
application/json
{
  • "contact": {
    },
  • "portfolios": [
    ],
  • "portalAccounts": [
    ],
  • "portalInvitations": [ ],
  • "taxAdjustments": [ ]
}

Update Owner

Updates editable fields on an existing owner contact and returns the full owner detail (same shape as GET /owners/{contactID}).

Use Cases

  • Update an owner's display name, code, website, or birth date
  • Toggle bill approval exemption for an owner (requires UpdateBillApprovalExemption permission)

Business Rules

  • Requires Update Owner Details permission.
  • Returns 400 if the contact is not found or is not an owner.
  • Access is restricted to contacts within the authenticated account's scope.
  • Only the following fields are accepted: name, code, websiteUrl, birthDate, and isBillApprovalExempt (permission-gated).
  • After update the endpoint forwards to the view action — pass includes query params to include related data in the response.
  • GET /owners/{contactID} — retrieve current owner detail
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 3513

The unique owner contact ID

query Parameters
includes
string
Example: includes=portfolios

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portfolios, portalAccounts, portalInvitations, taxAdjustments

Request Body schema: application/json
name
string

Full display name of the owner

code
string or null

Optional short code

websiteUrl
string or null <uri>

Owner website URL

birthDate
string or null <date>
isBillApprovalExempt
string

1 to exempt from bill approval workflow (requires UpdateBillApprovalExemption permission)

Responses

Response Schema: application/json
required
object (contact)

Request samples

Content type
application/json
{
  • "name": "Chris Campos",
  • "isBillApprovalExempt": "0",
  • "birthDate": null,
  • "code": null
}

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Delete Owner

Permanently deletes an owner contact. Returns the deleted contact as a flat object (not wrapped in a contact key).

Use Cases

  • Remove an owner who was created in error
  • Clean up test or duplicate owner records

Business Rules

  • Requires Update Owner Details permission.
  • Returns 400 if the contact is not found or is not an owner.
  • Access is restricted to contacts within the authenticated account's scope.
  • Deletion may fail if the owner has associated financial records or active portfolio memberships — the service layer will return errors in that case.
  • The response is the contact's last known state as a flat object (no contact wrapper).
  • POST /owners/{contactID}/deactivate — soft-deactivate instead of permanently deleting
  • GET /owners/{contactID} — verify owner state before deletion
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 5258

The unique owner contact ID to delete

Responses

Response Schema: application/json
contactID
required
integer
contactTypeID
required
integer (contact_types)
Enum: 1 2 3 4 5 6
  • 1 - Owner
  • 2 - Tenant
  • 3 - Vendor
  • 4 - Manager
  • 5 - Association
  • 6 - Applicant
name
required
string
payoutTypeID
required
integer (payout_types)
Enum: 1 2 3 4
  • 1 - Cash
  • 2 - Check
  • 3 - eCheck (ACH)
  • 4 - NACHA (ACH)
achIsCorporateAccount
required
boolean
holdPayments
required
integer
isActive
required
boolean
preventConsolidatedPayments
required
integer
isFromImport
required
boolean
vendorTypeID
integer or null
firstName
string or null
middleName
string or null
lastName
string or null
suffix
string or null
emails
string or null
phones
string or null
addresses
string or null
birthDate
string or null <date>
defaultBillChargeAccountID
integer or null
taxPayerName
string or null
taxFormTypeID
boolean or null
achDetailsCiphertextID
integer or null
achAccountNumberTruncated
string or null
achAccountTypeID
integer (bank_account_types)
Enum: 1 2
  • 1 - Savings
  • 2 - Checking
liabilityInsuranceName
string or null
liabilityInsurancePolicyNumber
string or null
liabilityInsuranceExpiresDate
string or null <date>
workersCompInsuranceName
string or null
workersCompInsurancePolicyNumber
string or null
workersCompInsuranceExpiresDate
string or null <date>
discountPercent
number or null <double>
discountGraceDays
integer or null
isInsuranceRequiredForPayment
boolean or null
importSourceKey
string or null
websiteUrl
string or null
applicantID
integer or null

Response samples

Content type
application/json
{
  • "contactID": "5258",
  • "contactTypeID": "1",
  • "vendorTypeID": null,
  • "code": null,
  • "name": "New User",
  • "firstName": "New",
  • "middleName": null,
  • "lastName": "User",
  • "suffix": null,
  • "email": null,
  • "phone": null,
  • "countryID": null,
  • "address": null,
  • "address2": null,
  • "city": null,
  • "stateID": null,
  • "postalCode": null,
  • "birthDate": null,
  • "defaultBillChargeAccountID": null,
  • "payeeName": null,
  • "taxPayerName": null,
  • "taxFormTypeID": null,
  • "identificationTypeID": null,
  • "identificationNumber": null,
  • "identificationCountryID": null,
  • "identificationIssuingLocation": null,
  • "identificationExpirationDate": null,
  • "payoutTypeID": "2",
  • "otherPayoutTypeID": null,
  • "achDetailsCiphertextID": null,
  • "achAccountNumberTruncated": null,
  • "achAccountTypeID": null,
  • "achIsCorporateAccount": "0",
  • "holdPayments": "0",
  • "isActive": "1",
  • "preventConsolidatedPayments": "0",
  • "isFromImport": "0",
  • "importSourceKey": null,
  • "isBillApprovalExempt": "0",
  • "isBillingSalesTaxEnabled": "0",
  • "isQuickbooksExportEnabled": "0",
  • "dateTimeCreated": "2026-04-24 17:49:23",
  • "dateTimeModified": "2026-04-24 17:49:23",
  • "dateTimeDeactivated": null,
  • "contactType": "Owner"
}

Activate Owner

Sets an owner's isActive flag to 1, re-activating them after a previous deactivation. Returns the updated owner detail (same shape as GET /owners/{contactID}).

Use Cases

  • Re-activate an owner who was previously deactivated but has returned as an active client
  • Restore owner portal access and distribution eligibility

Business Rules

  • Requires Contacts.UpdateOwner permission.
  • Returns 400 if the contact is not found or is not an owner.
  • Access is restricted to contacts within the authenticated account's scope via verifyAccessToContact.
  • Sets isActive = 1 and clears dateTimeDeactivated on the contact record.
  • The response is the full owner detail (forwarded to the view action). Pass includes query params to include related data.
  • GET /owners/{contactID} — retrieve owner details
  • POST /owners/{contactID}/deactivate — deactivate an active owner
  • POST /owners/{contactID} — update owner fields
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 3513

The unique owner contact ID to activate

query Parameters
includes
string
Example: includes=portfolios

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portfolios, portalAccounts, portalInvitations, taxAdjustments

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Deactivate Owner

Sets an owner's isActive flag to 0, marking them as inactive. Returns the updated owner detail (same shape as GET /owners/{contactID}).

Use Cases

  • Mark an owner as inactive when they no longer have an active relationship with the property management company
  • Prevent future distributions or portal access without deleting the record

Business Rules

  • Requires Contacts.UpdateOwner permission.
  • Returns 400 if the contact is not found or is not an owner.
  • Access is restricted to contacts within the authenticated account's scope via verifyAccessToContact.
  • Sets isActive = 0 and updates dateTimeModified and dateTimeDeactivated on the contact record.
  • The response is the full owner detail (forwarded to the view action). Pass includes query params to include related data.
  • GET /owners/{contactID} — retrieve owner details
  • POST /owners/{contactID}/activate — re-activate a deactivated owner
  • POST /owners/{contactID} — update owner fields
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 3513

The unique owner contact ID to deactivate

query Parameters
includes
string
Example: includes=portfolios

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portfolios, portalAccounts, portalInvitations, taxAdjustments

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Tenants

List Tenants

Returns a paginated list of tenant contacts visible to the authenticated account.

Use Cases

  • Sync active tenants with an external system using the isActive filter
  • Search tenants by name across the account

Business Rules

  • Results are restricted to tenants within the authenticated account's scope.
  • isActive defaults to 1 (active tenants only). Pass 0 for inactive tenants.
  • Default page size is 15.
  • search matches against name.
  • GET /tenants/search — advanced filtered search with payout and date filters
  • GET /tenants/{contactID} — retrieve a single tenant with full detail and includes
  • POST /tenants — create a new tenant
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 15

Number of items per page

search
string
Example: search=Boone

Full-text search against tenant name

isActive
integer
Default: 1
Enum: 0 1
Example: isActive=1

Filter by active status. Defaults to 1 (active only). Pass 0 for inactive tenants.

Responses

Response Headers
pagination-page-size
integer
Example: 15

Number of items per page

pagination-total-items
integer
Example: 87

Total number of items across all pages

pagination-total-pages
integer
Example: 6

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 6

Last page number

Response Schema: application/json
Array
required
object (contact)

Response samples

Content type
application/json
[
  • {
    }
]

Create Tenant

Creates a new tenant contact and returns the full tenant detail (same shape as GET /tenants/{contactID}).

Use Cases

  • Onboard a new tenant into the system before adding them to a lease
  • Create a tenant with contact details (emails, phones, addresses) in a single request

Business Rules

  • Requires Contacts.UpdateTenant permission.
  • name is required.
  • Accepted fields are restricted to code, name, websiteUrl, birthDate, identificationTypeID, identificationNumber, identificationCountryID, identificationIssuingLocation, and identificationExpirationDate. Any other fields in the request body are silently ignored.
  • Tax fields (taxPayerName, taxFormTypeID, taxIdentifier) require the Contacts.ManageTaxInfo permission.
  • After creation the endpoint forwards to the view action — the response is the full tenant detail.
  • GET /tenants/{contactID} — retrieve the created tenant
  • POST /tenants/{contactID} — update tenant fields after creation
Authorizations:
basicAuth
Request Body schema: application/json
name
required
string

Full display name of the tenant

code
string or null

Optional short code for the tenant

birthDate
string or null <date>
identificationTypeID
string or null

Government ID type identifier

identificationNumber
string or null

Government ID number

identificationCountryID
string or null

Country that issued the government ID

identificationIssuingLocation
string or null

State or location that issued the government ID

identificationExpirationDate
string or null <date>

Expiration date of the government ID

Array of objects

Email records to attach to the tenant

Array of objects

Phone records to attach to the tenant

addresses
Array of objects

Address records to attach to the tenant

Responses

Response Schema: application/json
required
object (contact)

Request samples

Content type
application/json
Example
{
  • "name": "Aaron Boone"
}

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Search Tenants

Advanced paginated search for tenant contacts with rich filter support.

Use Cases

  • Find tenants by name across the account

Business Rules

  • Results are restricted to tenants within the authenticated account's scope.
  • isActive shows all tenants when omitted. Pass true/false to filter.
  • Default page size is 25.

Available Includes (6)

  • emails — array of email records for each tenant
  • phones — array of phone records for each tenant
  • addresses — array of address records for each tenant
  • leases — array of lease memberships with lease, property, and unit data
  • portalAccounts — array of active tenant portal accounts
  • portalInvitations — array of pending tenant portal invitations
  • GET /tenants — basic paginated list with name search only
  • GET /tenants/{contactID} — full tenant detail with includes
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=Boone

Full-text search against tenant name

isActive
boolean
Example: isActive=true

Filter by active status. Pass true for active, false for inactive.

payoutTypeID
integer
Example: payoutTypeID=2

Filter tenants by payout type ID

holdPayments
boolean

Filter tenants with payments on hold

isInsuranceRequiredForPayment
boolean

Filter tenants that require insurance for payment

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

orderBy
string
Example: orderBy=contact.name

Sort field in dot-notation. Prefix with - for descending order.

Available values: contact.name, contact.isActive, contact.contactTypeID, contact.payoutTypeID, contact.holdPayments

includes
string
Example: includes=leases,portalAccounts

Comma-separated list of related data to include in each result.

Available values: emails, phones, addresses, leases, portalAccounts, portalInvitations

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 87

Total number of items across all pages

pagination-total-pages
integer
Example: 4

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 4

Last page number

Response Schema: application/json
Array
required
object

Tenant contact with all fields plus computed data

Response samples

Content type
application/json
[
  • {
    }
]

Get Tenant

Retrieves a single tenant contact by ID, including all stored attributes and any optionally requested related data via the includes parameter.

Use Cases

  • Display full tenant details in a tenant overview screen
  • Load leases and portal account data in a single request for a tenant detail page
  • Fetch portal invitation data for onboarding views

Business Rules

  • Access is restricted to contacts within the authenticated account's scope via verifyAccessToContact.
  • Returns 400 if the contact is not found or does not have contactTypeID matching Tenant (2).

Available Includes (6)

  • emails — array of email records for the tenant
  • phones — array of phone records for the tenant
  • addresses — array of address records for the tenant
  • leases — array of lease memberships, each containing leaseTenant, contact, lease, property, and unit objects
  • portalAccounts — array of active tenant portal accounts linked to this contact
  • portalInvitations — array of pending tenant portal invitations
  • GET /tenants — list all tenants
  • GET /tenants/search — search tenants with filters
  • POST /tenants — create a new tenant
  • POST /tenants/{contactID} — update a tenant
  • DELETE /tenants/{contactID} — delete a tenant
  • POST /tenants/{contactID}/activate — activate a tenant
  • POST /tenants/{contactID}/deactivate — deactivate a tenant
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2793

The unique tenant contact ID

query Parameters
includes
string
Example: includes=leases,portalAccounts,portalInvitations

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, leases, portalAccounts, portalInvitations

Responses

Response Schema: application/json
required
object
emails
Array of objects

Email records for the tenant (if includes=emails)

phones
Array of objects

Phone records for the tenant (if includes=phones)

addresses
Array of objects

Address records for the tenant (if includes=addresses)

Array of objects

Lease memberships for the tenant (if includes=leases)

Array of objects

Tenant portal accounts linked to this contact (if includes=portalAccounts)

portalInvitations
Array of objects

Pending tenant portal invitations (if includes=portalInvitations)

Response samples

Content type
application/json
{
  • "contact": {
    },
  • "leases": [
    ],
  • "portalAccounts": [ ],
  • "portalInvitations": [ ]
}

Update Tenant

Updates editable fields on an existing tenant contact and returns the full tenant detail (same shape as GET /tenants/{contactID}).

Use Cases

  • Update a tenant's display name, code, birth date, or government identification details
  • Correct a name spelling or code after initial creation

Business Rules

  • Requires Update Tenant Details permission.
  • Returns 400 if the contact is not found or is not a tenant.
  • Access is restricted to contacts within the authenticated account's scope.
  • Only the following fields are accepted: code, name, birthDate, identificationTypeID, identificationNumber, identificationCountryID, identificationIssuingLocation, identificationExpirationDate. All other fields in the request body are silently ignored.
  • After update the endpoint forwards to the view action — pass includes query params to include related data in the response.
  • GET /tenants/{contactID} — retrieve current tenant detail
  • POST /tenants/{contactID}/activate — activate an inactive tenant
  • POST /tenants/{contactID}/deactivate — deactivate an active tenant
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 4976

The unique tenant contact ID

query Parameters
includes
string
Example: includes=leases

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, leases, portalAccounts, portalInvitations

Request Body schema: application/json
name
string

Full display name of the tenant

code
string or null

Optional short code

birthDate
string or null <date>
identificationTypeID
string or null

Government ID type identifier

identificationNumber
string or null

Government ID number

identificationCountryID
string or null

Country that issued the government ID

identificationIssuingLocation
string or null

State or location that issued the government ID

identificationExpirationDate
string or null <date>

Expiration date of the government ID

Responses

Response Schema: application/json
required
object (contact)

Request samples

Content type
application/json
Example
{
  • "name": "Aaron Boone"
}

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Delete Tenant

Permanently deletes a tenant contact. Returns the deleted contact as a flat object (not wrapped in a contact key).

Use Cases

  • Remove a tenant who was created in error
  • Clean up test or duplicate tenant records

Business Rules

  • Requires Contacts.UpdateTenant permission.
  • Returns 400 if the contact is not found or is not a tenant.
  • Access is restricted to contacts within the authenticated account's scope.
  • Deletion may fail if the tenant has associated financial records or active lease memberships — the service layer will return errors in that case.
  • The response is the contact's last known state as a flat object (no contact wrapper).
  • POST /tenants/{contactID}/deactivate — soft-deactivate instead of permanently deleting
  • GET /tenants/{contactID} — verify tenant state before deletion
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2793

The unique tenant contact ID to delete

Responses

Response Schema: application/json
contactID
required
integer
contactTypeID
required
integer (contact_types)
Enum: 1 2 3 4 5 6
  • 1 - Owner
  • 2 - Tenant
  • 3 - Vendor
  • 4 - Manager
  • 5 - Association
  • 6 - Applicant
name
required
string
payoutTypeID
required
integer (payout_types)
Enum: 1 2 3 4
  • 1 - Cash
  • 2 - Check
  • 3 - eCheck (ACH)
  • 4 - NACHA (ACH)
achIsCorporateAccount
required
boolean
holdPayments
required
integer
isActive
required
boolean
preventConsolidatedPayments
required
integer
isFromImport
required
boolean
vendorTypeID
integer or null
firstName
string or null
middleName
string or null
lastName
string or null
suffix
string or null
emails
string or null
phones
string or null
addresses
string or null
birthDate
string or null <date>
defaultBillChargeAccountID
integer or null
taxPayerName
string or null
taxFormTypeID
boolean or null
achDetailsCiphertextID
integer or null
achAccountNumberTruncated
string or null
achAccountTypeID
integer (bank_account_types)
Enum: 1 2
  • 1 - Savings
  • 2 - Checking
liabilityInsuranceName
string or null
liabilityInsurancePolicyNumber
string or null
liabilityInsuranceExpiresDate
string or null <date>
workersCompInsuranceName
string or null
workersCompInsurancePolicyNumber
string or null
workersCompInsuranceExpiresDate
string or null <date>
discountPercent
number or null <double>
discountGraceDays
integer or null
isInsuranceRequiredForPayment
boolean or null
importSourceKey
string or null
websiteUrl
string or null
applicantID
integer or null

Response samples

Content type
application/json
{
  • "contactID": "2793",
  • "contactTypeID": "2",
  • "vendorTypeID": null,
  • "code": null,
  • "name": "Aaron Boone",
  • "firstName": "Aaron",
  • "middleName": null,
  • "lastName": "Boone",
  • "suffix": null,
  • "email": "tenant@example.com",
  • "phone": "+12395370474",
  • "countryID": null,
  • "address": null,
  • "address2": null,
  • "city": null,
  • "stateID": null,
  • "postalCode": null,
  • "birthDate": "1981-10-22",
  • "defaultBillChargeAccountID": null,
  • "payeeName": null,
  • "taxPayerName": null,
  • "taxFormTypeID": null,
  • "identificationTypeID": null,
  • "identificationNumber": null,
  • "identificationCountryID": null,
  • "identificationIssuingLocation": null,
  • "identificationExpirationDate": null,
  • "payoutTypeID": "2",
  • "otherPayoutTypeID": null,
  • "achDetailsCiphertextID": null,
  • "achAccountNumberTruncated": null,
  • "achAccountTypeID": null,
  • "achIsCorporateAccount": "0",
  • "holdPayments": "0",
  • "isActive": "1",
  • "preventConsolidatedPayments": "0",
  • "isFromImport": "0",
  • "importSourceKey": null,
  • "isBillApprovalExempt": "0",
  • "isBillingSalesTaxEnabled": "0",
  • "isQuickbooksExportEnabled": "0",
  • "dateTimeCreated": "2024-10-31 17:32:50",
  • "dateTimeModified": "2025-04-25 21:06:37",
  • "dateTimeDeactivated": null,
  • "contactType": "Tenant"
}

Activate Tenant

Sets a tenant's isActive flag to 1, re-activating them after a previous deactivation. Returns the updated tenant detail (same shape as GET /tenants/{contactID}).

Use Cases

  • Re-activate a tenant who was previously deactivated but has renewed a lease
  • Restore tenant portal access after reinstatement

Business Rules

  • Requires Update Tenant Details permission.
  • Returns 400 if the contact is not found or is not a tenant.
  • Sets isActive = 1
  • GET /tenants/{contactID} — retrieve tenant details
  • POST /tenants/{contactID}/deactivate — deactivate an active tenant
  • POST /tenants/{contactID} — update tenant fields
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2793

The unique tenant contact ID to activate

query Parameters
includes
string
Example: includes=leases

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, leases, portalAccounts, portalInvitations

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Deactivate Tenant

Sets a tenant's isActive flag to 0, marking them as inactive. Returns the updated tenant detail (same shape as GET /tenants/{contactID}).

Use Cases

  • Mark a tenant as inactive after they have vacated and closed out their lease
  • Prevent portal access without permanently deleting the contact record

Business Rules

  • Requires Update Tenant Details permission.
  • Returns 400 if the contact is not found or is not a tenant.
  • Sets isActive = 0 and updates dateTimeModified and dateTimeDeactivated on the contact record.
  • The response is the full tenant detail (forwarded to the view action). Pass includes query params to include related data.
  • GET /tenants/{contactID} — retrieve tenant details
  • POST /tenants/{contactID}/activate — re-activate a deactivated tenant
  • POST /tenants/{contactID} — update tenant fields
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2793

The unique tenant contact ID to deactivate

query Parameters
includes
string
Example: includes=leases

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, leases, portalAccounts, portalInvitations

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Vendors

List Vendors

Returns a paginated list of vendor contacts visible to the authenticated account.

Use Cases

  • Sync active vendors with an external billing or accounting system using the isActive filter
  • Search vendors by name or code across the account

Business Rules

  • isActive defaults to 1 (active vendors only). Pass isActive=0 for inactive vendors.
  • search matches against vendor name and code.
  • GET /vendors/search — advanced filtered search
  • GET /vendors/{contactID} — retrieve a single vendor with full detail and includes
  • POST /vendors — create a new vendor
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 250
Example: pageSize=25

Number of results per page. Defaults to 250.

search
string
Example: search=Acme Plumbing

Full-text search against vendor name and code

isActive
integer
Default: 1
Enum: 0 1
Example: isActive=1

Filter by active status. Defaults to 1 (active only). Pass 0 for inactive vendors.

vendorTypeID
integer
Example: vendorTypeID=1

Filter vendors by vendor type ID

contactIDs
Array of integers
Example: contactIDs=743&contactIDs=2965

Filter to a specific set of contact IDs (comma-separated or array)

includeManager
integer
Default: 0
Enum: 0 1

When 1, includes manager-type contacts alongside vendors in results

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 87

Total number of items across all pages

pagination-total-pages
integer
Example: 4

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 4

Last page number

Response Schema: application/json
Array
required
object

Response samples

Content type
application/json
[
  • {
    }
]

Create Vendor

Creates a new vendor contact and returns the full vendor detail (same shape as GET /vendors/{contactID}).

Use Cases

  • Onboard a new vendor into the system with name, contact info, and payout settings
  • Create a vendor with initial emails, phones, and addresses in a single request

Business Rules

  • Requires Update Vendor Details permission.
  • name is the only required field.
  • After creation the endpoint forwards to the view action — the response is the full vendor detail.
  • GET /vendors/{contactID} — retrieve the created vendor
  • POST /vendors/{contactID} — update vendor fields after creation
Authorizations:
basicAuth
Request Body schema: application/json
name
required
string

Full display name of the vendor

vendorTypeID
integer or null

Vendor trade category type ID

code
string or null

Optional short code or reference

defaultBillChargeAccountID
integer or null

Default chart of accounts ID for bills

websiteUrl
string or null <uri>

Vendor website URL

payeeName
string or null

Override name for checks and ACH

payoutTypeID
any
achAccountTypeID
any
achIsCorporateAccount
string

"1" if ACH account is corporate, "0" otherwise

holdPayments
string

"1" to hold all payments to this vendor

preventConsolidatedPayments
string

"1" to prevent consolidated payouts

maxLineItemsOnPayment
integer or null

Maximum number of line items allowed per payment run

taxPayerName
string or null

Name on 1099 tax documents (requires ManageTaxInfo permission)

taxIdentifier
string or null

SSN/EIN stored encrypted (requires ManageTaxInfo permission)

taxFormTypeID
integer or null

1099 form type ID (requires ManageTaxInfo permission)

discountPercent
number or null

Discount percentage applied to bills from this vendor

discountGraceDays
integer or null

Grace days before discount expires

routingNumber
string or null

ACH routing number — stored encrypted, not returned in responses

accountNumber
string or null

ACH account number — stored encrypted, only last 4 digits returned

Array of objects

Email records to attach to the vendor

Array of objects

Phone records to attach to the vendor

Array of objects

Address records to attach to the vendor

attachments
Array of integers

File IDs to attach to the vendor record

Responses

Response Schema: application/json
required
object (contact)

Request samples

Content type
application/json
Example
{
  • "name": "New Vendor"
}

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Search Vendors

Advanced paginated search for vendor contacts

Use Cases

  • Find vendors by name or code
  • Filter vendors by active status

Business Rules

  • isActive defaults to showing all vendors when omitted. Pass true/false to filter.
  • Each result item has a nested contact object containing all contact fields plus computed insurance fields.

Available Includes

  • emails — array of email records for each vendor
  • phones — array of phone records for each vendor
  • addresses — array of address records for each vendor
  • GET /vendors — basic paginated list with name search only
  • GET /vendors/{contactID} — full vendor detail with all includes
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=Acme Plumbing

Full-text search against vendor name and code

isActive
boolean
Example: isActive=true

Filter by active status. Pass true for active, false for inactive.

includeManager
integer
Default: 0
Enum: 0 1

When 1, includes manager-type contacts alongside vendors in results

vendorTypeIDs
Array of integers
Example: vendorTypeIDs=1&vendorTypeIDs=2

Filter vendors by one or more vendor type IDs (array)

payoutTypeID
integer
Example: payoutTypeID=2

Filter vendors by payout type ID

holdPayments
boolean

Filter vendors with payments on hold

isInsuranceRequiredForPayment
boolean

Filter vendors that require insurance for payment

vendorTradeIDs
Array of integers
Example: vendorTradeIDs=5

Filter vendors by one or more associated trade IDs (array)

propertyIDs
Array of integers
Example: propertyIDs=100

Filter vendors associated with specific property IDs (array)

tagIDs
Array of integers
Example: tagIDs=12

Filter vendors by tag IDs (array)

isLiabilityInsuranceExpired
boolean

Filter vendors whose liability insurance has expired

daysUntilLiabilityInsuranceExpiresMin
integer

Minimum number of days until liability insurance expires

daysUntilLiabilityInsuranceExpiresMax
integer
Example: daysUntilLiabilityInsuranceExpiresMax=30

Maximum number of days until liability insurance expires

isWorkersCompInsuranceExpired
boolean

Filter vendors whose workers' comp insurance has expired

daysUntilWorkersCompInsuranceExpiresMin
integer

Minimum number of days until workers' comp insurance expires

daysUntilWorkersCompInsuranceExpiresMax
integer

Maximum number of days until workers' comp insurance expires

isInsuranceExpired
boolean

Filter vendors whose earliest insurance (liability or workers' comp) has expired

daysUntilInsuranceExpiresMin
integer

Minimum days until the earliest insurance expires

daysUntilInsuranceExpiresMax
integer

Maximum days until the earliest insurance expires

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

orderBy
string
Example: orderBy=contact.name

Sort field in dot-notation. Prefix with - for descending order.

Available values: contact.name, contact.isActive, contact.payoutTypeID, contact.holdPayments, contact.discountPercent, contact.isInsuranceRequiredForPayment, contact.daysUntilInsuranceExpires, contact.daysUntilLiabilityInsuranceExpires, contact.daysUntilWorkersCompInsuranceExpires

includes
string
Example: includes=emails,phones

Comma-separated list of related data to include in each result item.

Available values: emails, phones, addresses

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 87

Total number of items across all pages

pagination-total-pages
integer
Example: 4

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 4

Last page number

Response Schema: application/json
Array
required
object

Vendor contact with all fields plus computed insurance data

emails
Array of objects

Email records for the vendor (if includes=emails)

phones
Array of objects

Phone records for the vendor (if includes=phones)

addresses
Array of objects

Address records for the vendor (if includes=addresses)

Response samples

Content type
application/json
[
  • {
    }
]

Get Vendor

Retrieves a single vendor contact by ID, including all stored attributes and any optionally requested related data via the includes parameter.

Use Cases

  • Display full vendor details in a vendor overview screen
  • Load trade, portal account, and insurance data in a single request for a vendor detail page

Business Rules

  • Returns 400 if the contact is not found or does not have contactTypeID matching Vendor.

Available Includes (10)

  • emails — array of email records for the vendor
  • phones — array of phone records for the vendor
  • addresses — array of address records for the vendor
  • portalAccounts — array of active vendor portal accounts linked to this contact
  • portalInvitations — array of pending vendor portal invitations
  • vendorTrades — array of trade associations with nested vendorTrade objects
  • contactPersons — array of contact person records linked to the vendor
  • reviewStats — review statistics (average rating, count) for the vendor
  • invoiceAutofillTemplate — the linked invoice autofill template object, or null
  • GET /vendors — list all vendors
  • GET /vendors/search — search vendors with filters
  • POST /vendors — create a new vendor
  • POST /vendors/{contactID} — update a vendor
  • DELETE /vendors/{contactID} — delete a vendor
  • POST /vendors/{contactID}/activate — activate a vendor
  • POST /vendors/{contactID}/deactivate — deactivate a vendor
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2888

The unique vendor contact ID

query Parameters
includes
string
Example: includes=emails,phones,addresses,vendorTrades

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portalAccounts, portalInvitations, vendorTrades, taxAdjustments, contactPersons, reviewStats, invoiceAutofillTemplate

Responses

Response Schema: application/json
required
object
emails
Array of objects

Email records for the vendor (if includes=emails)

phones
Array of objects

Phone records for the vendor (if includes=phones)

addresses
Array of objects

Address records for the vendor (if includes=addresses)

portalAccounts
Array of objects

Vendor portal accounts linked to this contact (if includes=portalAccounts)

portalInvitations
Array of objects

Pending vendor portal invitations (if includes=portalInvitations)

Array of objects

Trade associations with nested vendorTrade detail (if includes=vendorTrades)

taxAdjustments
Array of objects

1099 tax adjustment records for the vendor (if includes=taxAdjustments)

contactPersons
Array of objects

Contact person records linked to the vendor (if includes=contactPersons)

reviewStats
object

Review statistics including average rating and count (if includes=reviewStats)

invoiceAutofillTemplate
object or null

The linked invoice autofill template, or null if none set (if includes=invoiceAutofillTemplate)

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Update Vendor

Updates editable fields on an existing vendor contact and returns the full vendor detail (same shape as GET /vendors/{contactID}).

Use Cases

  • Update a vendor's display name, code, website, or discount settings
  • Toggle bill approval exemption, sales tax, or QuickBooks export for a vendor
  • Update insurance information for payment eligibility

Business Rules

  • Requires Update Vendor Details permission.
  • Returns 400 if the contact is not found or is not a vendor.
  • isBillApprovalExempt requires the Update Bill Approval Exemption permission to take effect.
  • After update the endpoint forwards to the view action — pass includes query params to include related data in the response.
  • GET /vendors/{contactID} — retrieve current vendor detail
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 5263

The unique vendor contact ID

query Parameters
includes
string
Example: includes=vendorTrades

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portalAccounts, portalInvitations, vendorTrades, taxAdjustments, contactPersons, reviewStats, invoiceAutofillTemplate

Request Body schema: application/json
name
string

Full display name of the vendor

vendorTypeID
integer or null

Vendor trade category type ID

code
string or null

Optional short code or reference

birthDate
string or null <date>
defaultBillChargeAccountID
integer or null

Default chart of accounts ID for bills

websiteUrl
string or null <uri>

Vendor website URL

ownerPortalNameOverride
string or null

Override display name shown in the owner portal

liabilityInsuranceName
string or null
liabilityInsurancePolicyNumber
string or null
liabilityInsuranceExpiresDate
string or null <date>
workersCompInsuranceName
string or null
workersCompInsurancePolicyNumber
string or null
workersCompInsuranceExpiresDate
string or null <date>
discountPercent
number or null

Discount percentage applied to bills

discountAmount
number or null

Flat discount amount applied to bills

discountAmountMin
number or null
discountAmountMax
number or null
discountGraceDays
integer or null

Grace days before discount expires

isInsuranceRequiredForPayment
string or null

"1" if valid insurance is required before releasing payment

isBillingSalesTaxEnabled
string

"1" to enable sales tax on invoices billed from this vendor

isQuickbooksExportEnabled
string

"1" to enable QuickBooks export for this vendor

quickbooksCustomerName
string or null
invoiceAutofillTemplateID
integer or null

ID of the invoice autofill template to link

isBillApprovalExempt
string

"1" to exempt from bill approval workflow (requires UpdateBillApprovalExemption permission)

Responses

Response Schema: application/json
required
object (contact)

Request samples

Content type
application/json
{
  • "name": "New Vendor Name",
  • "code": null,
  • "ownerPortalNameOverride": null,
  • "isBillApprovalExempt": "0",
  • "birthDate": null,
  • "websiteUrl": null,
  • "defaultBillChargeAccountID": null,
  • "vendorTypeID": null,
  • "discountGraceDays": null,
  • "discountPercent": null,
  • "discountAmount": null,
  • "discountAmountMin": null,
  • "discountAmountMax": null,
  • "isBillingSalesTaxEnabled": "0",
  • "invoiceAutofillTemplateID": null
}

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Delete Vendor

Permanently deletes a vendor contact. Returns the deleted contact as a flat object.

Use Cases

  • Remove a vendor who was created in error
  • Clean up test or duplicate vendor records

Business Rules

  • Requires Update Vendor Details permission.
  • Returns 400 if the contact is not found or is not a vendor.
  • Deletion may fail if the vendor has associated financial records (bills, invoices, payouts) — the service layer returns errors in that case.
  • POST /vendors/{contactID}/deactivate — soft-deactivate instead of permanently deleting
  • GET /vendors/{contactID} — verify vendor state before deletion
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 5263

The unique vendor contact ID to delete

Responses

Response Schema: application/json
contactID
required
integer
contactTypeID
required
integer (contact_types)
Enum: 1 2 3 4 5 6
  • 1 - Owner
  • 2 - Tenant
  • 3 - Vendor
  • 4 - Manager
  • 5 - Association
  • 6 - Applicant
name
required
string
payoutTypeID
required
integer (payout_types)
Enum: 1 2 3 4
  • 1 - Cash
  • 2 - Check
  • 3 - eCheck (ACH)
  • 4 - NACHA (ACH)
achIsCorporateAccount
required
boolean
holdPayments
required
integer
isActive
required
boolean
preventConsolidatedPayments
required
integer
isFromImport
required
boolean
vendorTypeID
integer or null
firstName
string or null
middleName
string or null
lastName
string or null
suffix
string or null
emails
string or null
phones
string or null
addresses
string or null
birthDate
string or null <date>
defaultBillChargeAccountID
integer or null
taxPayerName
string or null
taxFormTypeID
boolean or null
achDetailsCiphertextID
integer or null
achAccountNumberTruncated
string or null
achAccountTypeID
integer (bank_account_types)
Enum: 1 2
  • 1 - Savings
  • 2 - Checking
liabilityInsuranceName
string or null
liabilityInsurancePolicyNumber
string or null
liabilityInsuranceExpiresDate
string or null <date>
workersCompInsuranceName
string or null
workersCompInsurancePolicyNumber
string or null
workersCompInsuranceExpiresDate
string or null <date>
discountPercent
number or null <double>
discountGraceDays
integer or null
isInsuranceRequiredForPayment
boolean or null
importSourceKey
string or null
websiteUrl
string or null
applicantID
integer or null

Response samples

Content type
application/json
{
  • "contactID": "5263",
  • "contactTypeID": "3",
  • "vendorTypeID": null,
  • "code": null,
  • "name": "New Vendor Name",
  • "firstName": null,
  • "middleName": null,
  • "lastName": null,
  • "suffix": null,
  • "email": null,
  • "phone": null,
  • "countryID": null,
  • "address": null,
  • "address2": null,
  • "city": null,
  • "stateID": null,
  • "postalCode": null,
  • "birthDate": null,
  • "defaultBillChargeAccountID": null,
  • "payeeName": null,
  • "taxPayerName": "New Vendor",
  • "taxFormTypeID": "1",
  • "identificationTypeID": null,
  • "identificationNumber": null,
  • "identificationCountryID": null,
  • "identificationIssuingLocation": null,
  • "identificationExpirationDate": null,
  • "payoutTypeID": "2",
  • "otherPayoutTypeID": null,
  • "achDetailsCiphertextID": null,
  • "achAccountNumberTruncated": null,
  • "achAccountTypeID": "2",
  • "achIsCorporateAccount": "0",
  • "holdPayments": "0",
  • "liabilityInsuranceName": null,
  • "liabilityInsurancePolicyNumber": null,
  • "liabilityInsuranceExpiresDate": null,
  • "workersCompInsuranceName": null,
  • "workersCompInsurancePolicyNumber": null,
  • "workersCompInsuranceExpiresDate": null,
  • "discountPercent": null,
  • "discountAmount": null,
  • "discountAmountMin": null,
  • "discountAmountMax": null,
  • "discountGraceDays": null,
  • "isActive": "1",
  • "isInsuranceRequiredForPayment": null,
  • "maxLineItemsOnPayment": null,
  • "preventConsolidatedPayments": "0",
  • "isFromImport": "0",
  • "importSourceKey": null,
  • "websiteUrl": null,
  • "applicantID": null,
  • "ownerPortalNameOverride": null,
  • "isBillApprovalExempt": "0",
  • "isBillingSalesTaxEnabled": "0",
  • "isQuickbooksExportEnabled": "0",
  • "quickbooksCustomerName": null,
  • "invoiceAutofillTemplateID": null,
  • "dateTimeCreated": "2026-04-24 19:26:47",
  • "dateTimeModified": "2026-04-24 19:28:28",
  • "dateTimeDeactivated": null,
  • "contactType": "Vendor"
}

Activate Vendor

Sets a vendor's isActive flag to 1, re-activating them after a previous deactivation. Returns the updated vendor detail (same shape as GET /vendors/{contactID}).

Use Cases

  • Re-activate a vendor who was previously deactivated but is returning as an active supplier
  • Restore a vendor to eligibility for bill payments and work order assignments

Business Rules

  • Requires Update Vendor Details permission.
  • Returns 400 if the contact is not found or is not a vendor.
  • Sets isActive = 1 and clears dateTimeDeactivated on the contact record.
  • The response is the full vendor detail (forwarded to the view action). Pass includes query params to include related data.
  • GET /vendors/{contactID} — retrieve vendor details
  • POST /vendors/{contactID}/deactivate — deactivate an active vendor
  • POST /vendors/{contactID} — update vendor fields
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2888

The unique vendor contact ID to activate

query Parameters
includes
string
Example: includes=vendorTrades

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portalAccounts, portalInvitations, vendorTrades, taxAdjustments, contactPersons, reviewStats, invoiceAutofillTemplate

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Deactivate Vendor

Sets a vendor's isActive flag to 0, soft-deactivating them. Returns the updated vendor detail (same shape as GET /vendors/{contactID}).

Use Cases

  • Deactivate a vendor who is no longer used to prevent new bill assignments
  • Soft-delete a vendor while preserving historical financial records

Business Rules

  • Requires Update Vendor Details permission.
  • Returns 400 if the contact is not found or is not a vendor.
  • Historical records (bills, invoices, payments) are preserved after deactivation.
  • The response is the full vendor detail (forwarded to the view action). Pass includes query params to include related data.
  • GET /vendors/{contactID} — retrieve vendor details
  • POST /vendors/{contactID}/activate — re-activate a deactivated vendor
  • DELETE /vendors/{contactID} — permanently delete a vendor
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2888

The unique vendor contact ID to deactivate

query Parameters
includes
string
Example: includes=vendorTrades

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portalAccounts, portalInvitations, vendorTrades, taxAdjustments, contactPersons, reviewStats, invoiceAutofillTemplate

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Associations

List Associations

Returns a list of association contacts visible to the authenticated account.

Use Cases

  • Search associations by name across the account
  • Retrieve a filtered set of associations by contact ID

Business Rules

  • isActive defaults to 1 (active associations only). Pass isActive=0 for inactive associations.
  • search matches against association name.
  • associationContactIDs filters results to the specified contact IDs.
  • GET /associations/search — advanced filtered search with additional filters
  • GET /associations/{contactID} — retrieve a single association with full detail and includes
  • POST /associations — create a new association
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 15
Example: pageSize=25

Number of results per page. Defaults to 15.

search
string
Example: search=Sunset Heights HOA

Full-text search against association name

isActive
integer
Default: 1
Enum: 0 1
Example: isActive=1

Filter by active status. Defaults to 1 (active only). Pass 0 for inactive associations.

associationContactIDs
Array of integers
Example: associationContactIDs=1281&associationContactIDs=1305

Filter to a specific set of association contact IDs (array)

includeManager
integer
Default: 0
Enum: 0 1

When 1, includes manager-type contacts alongside associations in results

Responses

Response Headers
pagination-page-size
integer
Example: 15

Number of items per page

pagination-total-items
integer
Example: 42

Total number of items across all pages

pagination-total-pages
integer
Example: 3

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 3

Last page number

Response Schema: application/json
Array
required
object

Response samples

Content type
application/json
[
  • {
    }
]

Create Association

Creates a new association contact and returns the full association detail (same shape as GET /associations/{contactID}).

Use Cases

  • Onboard a new homeowner association (HOA) or condo association into the system
  • Create an association with initial contact info (emails, phones, addresses) in a single request
  • Set up an association with ACH payout details for dues collection

Business Rules

  • Requires Update Association Details permission.
  • name is the only required field.
  • Tax info fields (taxPayerName, taxIdentifier, taxFormTypeID) require the ManageTaxInfo permission.
  • ACH bank details (routingNumber, accountNumber) are stored encrypted; only the last 4 digits of the account number are returned.
  • GET /associations/{contactID} — retrieve a created association
  • POST /associations/{contactID} — update association fields after creation
Authorizations:
basicAuth
Request Body schema: application/json
name
required
string

Full display name of the association

defaultBillChargeAccountID
integer or null

Default chart of accounts ID for bills charged to this association

websiteUrl
string or null <uri>

Association website URL

taxPayerName
string or null

Name on 1099 tax documents (requires ManageTaxInfo permission)

taxIdentifier
string or null

SSN/EIN stored encrypted (requires ManageTaxInfo permission)

taxFormTypeID
integer or null

1099 form type ID (requires ManageTaxInfo permission)

payoutTypeID
any
achAccountTypeID
any
achIsCorporateAccount
string

"1" if ACH account is corporate, "0" otherwise

holdPayments
string

"1" to hold all payments to this association

preventConsolidatedPayments
string

"1" to prevent consolidated payouts

maxLineItemsOnPayment
integer or null

Maximum number of line items allowed per payment run

payeeName
string or null

Override name for checks and ACH

otherPayoutTypeID
integer or null

Alternative payout type reference

code
string or null

Optional short code or reference for the association

discountPercent
number or null

Discount percentage applied to bills from this association

discountGraceDays
integer or null

Grace days before discount expires

routingNumber
string or null

ACH routing number — stored encrypted, not returned in responses

accountNumber
string or null

ACH account number — stored encrypted, only last 4 digits returned

Array of objects

Email records to attach to the association

Array of objects

Phone records to attach to the association

Array of objects

Address records to attach to the association

attachments
Array of integers

File IDs to attach to the association record

Responses

Response Schema: application/json
required
object (contact)

Request samples

Content type
application/json
Example
{
  • "name": "New Association"
}

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Search Associations

Advanced paginated search for association contacts.

Use Cases

  • Find associations by name across the account
  • Filter associations by active status
  • Filter associations linked to specific properties

Business Rules

  • isActive when omitted returns all associations regardless of status.
  • GET /associations — basic paginated list with name search only
  • GET /associations/{contactID} — full association detail with all includes
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=Sunset Heights

Full-text search against association name

isActive
boolean
Example: isActive=true

Filter by active status. Pass true for active, false for inactive.

payoutTypeID
integer
Example: payoutTypeID=2

Filter associations by payout type ID

holdPayments
boolean

Filter associations with payments on hold

propertyIDs
Array of integers
Example: propertyIDs=100&propertyIDs=150

Filter associations associated with specific property IDs (array)

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

orderBy
string
Example: orderBy=contact.name

Sort field in dot-notation. Prefix with - for descending order.

Available values: contact.name, contact.isActive, contact.payoutTypeID, contact.holdPayments

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 42

Total number of items across all pages

pagination-total-pages
integer
Example: 2

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 2

Last page number

Response Schema: application/json
Array
required
object

Association contact with all fields

Response samples

Content type
application/json
[
  • {
    }
]

Get Association

Retrieves a single association contact by ID, including all stored attributes and any optionally requested related data via the includes parameter. Validates that the contact exists and is of type Association (contactTypeID = 5).

Use Cases

  • Display full association details in an association overview screen
  • Load linked properties, emails, and contact persons in a single request for a detail page

Business Rules

  • Returns 400 if the contact is not found or does not have contactTypeID matching Association.

Available Includes (6)

  • emails — array of email records for the association
  • phones — array of phone records for the association
  • addresses — array of address records for the association
  • properties — array of property associations linked to this contact (with nested property object)
  • contactPersons — array of contact person records linked to the association
  • invoiceAutofillTemplate — the linked invoice autofill template object, or null
  • GET /associations — list all associations
  • GET /associations/search — search associations with filters
  • POST /associations — create a new association
  • POST /associations/{contactID} — update an association
  • DELETE /associations/{contactID} — delete an association
  • POST /associations/{contactID}/activate — activate an association
  • POST /associations/{contactID}/deactivate — deactivate an association
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2305

The unique association contact ID

query Parameters
includes
string
Example: includes=emails,phones,addresses,properties

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, properties, contactPersons, invoiceAutofillTemplate

Responses

Response Schema: application/json
required
object
emails
Array of objects

Email records for the association (if includes=emails)

phones
Array of objects

Phone records for the association (if includes=phones)

addresses
Array of objects

Address records for the association (if includes=addresses)

Array of objects

Property associations linked to this contact (if includes=properties)

contactPersons
Array of objects

Contact person records linked to the association (if includes=contactPersons)

invoiceAutofillTemplate
object or null

The linked invoice autofill template, or null if none set (if includes=invoiceAutofillTemplate)

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Update Association

Updates editable fields on an existing association contact and returns the full association detail (same shape as GET /associations/{contactID}).

Use Cases

  • Update an association's display name, website, or discount settings
  • Toggle bill approval exemption or sales tax for an association
  • Update insurance information for payment eligibility

Business Rules

  • Requires Update Association Details permission.
  • Returns 400 if the contact is not found or is not an association.
  • isBillApprovalExempt requires the Update Bill Approval Exemption permission to take effect.
  • Only changed fields need to be included in the request body.
  • After update the endpoint forwards to the view action — pass includes query params to include related data in the response.
  • GET /associations/{contactID} — retrieve current association detail
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2305

The unique association contact ID

query Parameters
includes
string
Example: includes=emails,properties

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, properties, contactPersons, invoiceAutofillTemplate

Request Body schema: application/json
name
string

Full display name of the association

code
string or null

Optional short code or reference

birthDate
string or null <date>
defaultBillChargeAccountID
integer or null

Default chart of accounts ID for bills

websiteUrl
string or null <uri>

Association website URL

ownerPortalNameOverride
string or null

Override display name shown in the owner portal

liabilityInsuranceName
string or null
liabilityInsurancePolicyNumber
string or null
liabilityInsuranceExpiresDate
string or null <date>
workersCompInsuranceName
string or null
workersCompInsurancePolicyNumber
string or null
workersCompInsuranceExpiresDate
string or null <date>
discountPercent
number or null

Discount percentage applied to bills

discountGraceDays
integer or null

Grace days before discount expires

isBillingSalesTaxEnabled
string

"1" to enable sales tax on invoices billed from this association

invoiceAutofillTemplateID
integer or null

ID of the invoice autofill template to link

isBillApprovalExempt
string

"1" to exempt from bill approval workflow (requires UpdateBillApprovalExemption permission)

Responses

Response Schema: application/json
required
object (contact)

Request samples

Content type
application/json
{
  • "name": "Sunset Heights HOA Updated",
  • "code": null,
  • "defaultBillChargeAccountID": null,
  • "discountPercent": null,
  • "discountGraceDays": null,
  • "isBillingSalesTaxEnabled": "0",
  • "invoiceAutofillTemplateID": null
}

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Delete Association

Permanently deletes an association contact. Returns the deleted contact as a flat object.

Use Cases

  • Remove an association that was created in error
  • Clean up test or duplicate association records

Business Rules

  • Requires Update Association Details permission.
  • Returns 400 if the contact is not found or is not an association.
  • Returns 400 if contactID is not provided in the path.
  • Deletion may fail if the association has associated financial records.
  • POST /associations/{contactID}/deactivate — soft-deactivate instead of permanently deleting
  • GET /associations/{contactID} — verify association state before deletion
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2305

The unique association contact ID to delete

Responses

Response Schema: application/json
contactID
required
integer
contactTypeID
required
integer (contact_types)
Enum: 1 2 3 4 5 6
  • 1 - Owner
  • 2 - Tenant
  • 3 - Vendor
  • 4 - Manager
  • 5 - Association
  • 6 - Applicant
name
required
string
payoutTypeID
required
integer (payout_types)
Enum: 1 2 3 4
  • 1 - Cash
  • 2 - Check
  • 3 - eCheck (ACH)
  • 4 - NACHA (ACH)
achIsCorporateAccount
required
boolean
holdPayments
required
integer
isActive
required
boolean
preventConsolidatedPayments
required
integer
isFromImport
required
boolean
vendorTypeID
integer or null
firstName
string or null
middleName
string or null
lastName
string or null
suffix
string or null
emails
string or null
phones
string or null
addresses
string or null
birthDate
string or null <date>
defaultBillChargeAccountID
integer or null
taxPayerName
string or null
taxFormTypeID
boolean or null
achDetailsCiphertextID
integer or null
achAccountNumberTruncated
string or null
achAccountTypeID
integer (bank_account_types)
Enum: 1 2
  • 1 - Savings
  • 2 - Checking
liabilityInsuranceName
string or null
liabilityInsurancePolicyNumber
string or null
liabilityInsuranceExpiresDate
string or null <date>
workersCompInsuranceName
string or null
workersCompInsurancePolicyNumber
string or null
workersCompInsuranceExpiresDate
string or null <date>
discountPercent
number or null <double>
discountGraceDays
integer or null
isInsuranceRequiredForPayment
boolean or null
importSourceKey
string or null
websiteUrl
string or null
applicantID
integer or null

Response samples

Content type
application/json
{
  • "contactID": "2305",
  • "contactTypeID": "5",
  • "vendorTypeID": null,
  • "code": null,
  • "name": "New Association",
  • "firstName": null,
  • "middleName": null,
  • "lastName": null,
  • "suffix": null,
  • "email": null,
  • "phone": null,
  • "countryID": null,
  • "address": null,
  • "address2": null,
  • "city": null,
  • "stateID": null,
  • "postalCode": null,
  • "birthDate": null,
  • "defaultBillChargeAccountID": null,
  • "payeeName": null,
  • "taxPayerName": null,
  • "taxFormTypeID": null,
  • "identificationTypeID": null,
  • "identificationNumber": null,
  • "identificationCountryID": null,
  • "identificationIssuingLocation": null,
  • "identificationExpirationDate": null,
  • "payoutTypeID": "2",
  • "otherPayoutTypeID": null,
  • "achDetailsCiphertextID": null,
  • "achAccountNumberTruncated": null,
  • "achAccountTypeID": "2",
  • "achIsCorporateAccount": "0",
  • "holdPayments": "0",
  • "liabilityInsuranceName": null,
  • "liabilityInsurancePolicyNumber": null,
  • "liabilityInsuranceExpiresDate": null,
  • "workersCompInsuranceName": null,
  • "workersCompInsurancePolicyNumber": null,
  • "workersCompInsuranceExpiresDate": null,
  • "discountPercent": null,
  • "discountAmount": null,
  • "discountAmountMin": null,
  • "discountAmountMax": null,
  • "discountGraceDays": null,
  • "isActive": "1",
  • "isInsuranceRequiredForPayment": null,
  • "maxLineItemsOnPayment": null,
  • "preventConsolidatedPayments": "0",
  • "isFromImport": "0",
  • "importSourceKey": null,
  • "websiteUrl": null,
  • "applicantID": null,
  • "ownerPortalNameOverride": null,
  • "isBillApprovalExempt": "0",
  • "isBillingSalesTaxEnabled": "0",
  • "isQuickbooksExportEnabled": "0",
  • "quickbooksCustomerName": null,
  • "invoiceAutofillTemplateID": null,
  • "dateTimeCreated": "2024-01-04 15:45:47",
  • "dateTimeModified": "2024-01-04 15:45:47",
  • "dateTimeDeactivated": null,
  • "contactType": "Association"
}

Activate Association

Sets an association's isActive flag to 1, re-activating it after a previous deactivation. Returns the updated association detail (same shape as GET /associations/{contactID}).

Use Cases

  • Re-activate an association that was previously deactivated but is now active again
  • Restore an association to eligibility for bill payments and property linkage

Business Rules

  • Requires Update Association Details permission.
  • Returns 400 if the contact is not found or is not an association.
  • Sets isActive = 1
  • The response is the full association detail (forwarded to the view action). Pass includes query params to include related data.
  • GET /associations/{contactID} — retrieve association details
  • POST /associations/{contactID}/deactivate — deactivate an active association
  • POST /associations/{contactID} — update association fields
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2305

The unique association contact ID to activate

query Parameters
includes
string
Example: includes=emails,properties

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, properties, contactPersons, invoiceAutofillTemplate

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Deactivate Association

Sets an association's isActive flag to 0, soft-deactivating it. Returns the updated association detail (same shape as GET /associations/{contactID}).

Use Cases

  • Deactivate an association that is no longer active to prevent new bill assignments
  • Soft-delete an association while preserving historical financial records

Business Rules

  • Requires Update Association Details permission.
  • Returns 400 if the contact is not found or is not an association.
  • Historical records (bills, invoices, payments) are preserved after deactivation.
  • The response is the full association detail (forwarded to the view action). Pass includes query params to include related data.
  • GET /associations/{contactID} — retrieve association details
  • POST /associations/{contactID}/activate — re-activate a deactivated association
  • DELETE /associations/{contactID} — permanently delete an association
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 2305

The unique association contact ID to deactivate

query Parameters
includes
string
Example: includes=emails,properties

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, properties, contactPersons, invoiceAutofillTemplate

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Maintenance Technicians

List Maintenance Technicians

Returns a paginated list of maintenance technician contacts visible to the authenticated account.

Use Cases

  • Retrieve all active internal technicians to populate assignment dropdowns in work orders
  • Sync technician records with an external workforce management system using the isActive filter

Business Rules

  • isActive defaults to 1 (active technicians only). Pass isActive=0 for inactive technicians.
  • search matches against technician name and code.
  • Results are filtered to contacts with contactTypeID = 8 (Internal Technician).
  • GET /maintenance-technicians/search — advanced filtered search
  • GET /maintenance-technicians/{contactID} — retrieve a single technician with full detail and includes
  • POST /maintenance-technicians — create a new maintenance technician
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 250
Example: pageSize=25

Number of results per page. Defaults to 250.

search
string
Example: search=Adrian

Full-text search against technician name and code

isActive
integer
Default: 1
Enum: 0 1
Example: isActive=1

Filter by active status. Defaults to 1 (active only). Pass 0 for inactive technicians.

contactIDs
Array of integers
Example: contactIDs=4808&contactIDs=5021

Filter to a specific set of contact IDs (comma-separated or array)

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 12

Total number of items across all pages

pagination-total-pages
integer
Example: 1

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 1

Last page number

Response Schema: application/json
Array
required
object

Response samples

Content type
application/json
[
  • {
    }
]

Create Maintenance Technician

Creates a new maintenance technician contact and returns the full technician detail (same shape as GET /maintenance-technicians/{contactID}).

Use Cases

  • Onboard a new in-house technician with a name and optional contact details
  • Create a technician with initial emails, phones, and addresses in a single request

Business Rules

  • Requires Update Internal Technician Details permission.
  • name is the only required field.
  • taxPayerName, taxFormTypeID, and taxIdentifier are only applied when the caller has the ManageTaxInfo permission.
  • After creation the endpoint forwards to the view action — the response is the full technician detail.
  • GET /maintenance-technicians/{contactID} — retrieve the created technician
  • POST /maintenance-technicians/{contactID} — update technician fields after creation
Authorizations:
basicAuth
Request Body schema: application/json
name
required
string

Full display name of the technician

code
string or null

Optional short code or reference

birthDate
string or null <date>

Date of birth

maxLineItemsOnPayment
integer or null

Maximum number of bill line items allowed per payment run

taxPayerName
string or null

Name on 1099 tax documents (requires ManageTaxInfo permission)

taxIdentifier
string or null

SSN/EIN stored encrypted (requires ManageTaxInfo permission)

taxFormTypeID
integer or null

1099 form type ID (requires ManageTaxInfo permission)

Array of objects

Email records to attach to the technician

Array of objects

Phone records to attach to the technician

Array of objects

Address records to attach to the technician

attachments
Array of integers

File IDs to attach to the technician record

Responses

Response Schema: application/json
required
object (contact)

Request samples

Content type
application/json
Example
{
  • "name": "New Tech Name"
}

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Search Maintenance Technicians

Advanced paginated search for maintenance technician contacts

Use Cases

  • Find technicians by name for work order assignment
  • Filter technicians by active status for a workforce management report

Business Rules

  • Results are scoped to contacts with contactTypeID = 8 (Internal Technician).
  • isActive shows all technicians when omitted. Pass true for active only, false for inactive only.
  • GET /maintenance-technicians — basic paginated list with name search only
  • GET /maintenance-technicians/{contactID} — full technician detail with all includes
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=Adrian

Full-text search against technician name and code

isActive
boolean
Example: isActive=true

Filter by active status. Pass true for active, false for inactive.

payoutTypeID
integer
Example: payoutTypeID=2

Filter technicians by payout type ID

holdPayments
boolean

Filter technicians with payments on hold

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

orderBy
string
Example: orderBy=contact.name

Sort field in dot-notation. Prefix with - for descending order.

Available values: contact.name, contact.isActive, contact.payoutTypeID, contact.holdPayments

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 12

Total number of items across all pages

pagination-total-pages
integer
Example: 1

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 1

Last page number

Response Schema: application/json
Array
required
object

Maintenance technician contact with all fields plus computed data

Response samples

Content type
application/json
[
  • {
    }
]

Get Maintenance Technician

Retrieves a single maintenance technician contact by ID, including all stored attributes and any optionally requested related data via the includes parameter.

Use Cases

  • Display full technician details in a technician profile screen
  • Load email, phone, and address data in a single request for a technician detail page

Business Rules

  • Returns 400 if the contact is not found or does not have contactTypeID = 8 (Internal Technician).

Available Includes (9)

  • emails — array of email records for the technician
  • phones — array of phone records for the technician
  • addresses — array of address records for the technician
  • portalAccounts — array of active maintenance portal accounts linked to this contact
  • portalInvitations — array of pending maintenance portal invitations
  • vendorTrades — array of trade associations with nested vendorTrade objects
  • contactPersons — array of contact person records linked to the technician
  • reviewStats — review statistics (average rating, count) for the technician
  • invoiceAutofillTemplate — the linked invoice autofill template object, or null
  • GET /maintenance-technicians — list all maintenance technicians
  • GET /maintenance-technicians/search — search with filters
  • POST /maintenance-technicians — create a new technician
  • POST /maintenance-technicians/{contactID} — update a technician
  • DELETE /maintenance-technicians/{contactID} — delete a technician
  • POST /maintenance-technicians/{contactID}/activate — activate a technician
  • POST /maintenance-technicians/{contactID}/deactivate — deactivate a technician
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 4808

The unique maintenance technician contact ID

query Parameters
includes
string
Example: includes=emails,phones,addresses

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portalAccounts, portalInvitations, vendorTrades, taxAdjustments, contactPersons, reviewStats, invoiceAutofillTemplate

Responses

Response Schema: application/json
required
object
emails
Array of objects

Email records for the technician (if includes=emails)

phones
Array of objects

Phone records for the technician (if includes=phones)

addresses
Array of objects

Address records for the technician (if includes=addresses)

portalAccounts
Array of objects

Maintenance portal accounts linked to this contact (if includes=portalAccounts)

portalInvitations
Array of objects

Pending maintenance portal invitations (if includes=portalInvitations)

Array of objects

Trade associations with nested vendorTrade detail (if includes=vendorTrades)

taxAdjustments
Array of objects

1099 tax adjustment records for the technician (if includes=taxAdjustments)

contactPersons
Array of objects

Contact person records linked to the technician (if includes=contactPersons)

reviewStats
object

Review statistics including average rating and count (if includes=reviewStats)

invoiceAutofillTemplate
object or null

The linked invoice autofill template, or null if none set (if includes=invoiceAutofillTemplate)

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Update Maintenance Technician

Updates editable fields on an existing maintenance technician contact and returns the full technician detail (same shape as GET /maintenance-technicians/{contactID}).

Use Cases

  • Update a technician's display name, code, birth date

Business Rules

  • Requires Update Internal Technician Details permission.
  • Returns 400 if the contact is not found or is not a maintenance technician.
  • Only the fields name, code, and birthDate are writable via this endpoint. All other fields in the request body are silently ignored.
  • After update the endpoint forwards to the view action — pass includes query params to include related data in the response.
  • GET /maintenance-technicians/{contactID} — retrieve current technician detail
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 5267

The unique maintenance technician contact ID

query Parameters
includes
string
Example: includes=emails,phones

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portalAccounts, portalInvitations, vendorTrades, taxAdjustments, contactPersons, reviewStats, invoiceAutofillTemplate

Request Body schema: application/json
name
string

Full display name of the technician

code
string or null

Optional short code or reference

birthDate
string or null <date>

Date of birth

Responses

Response Schema: application/json
required
object (contact)

Request samples

Content type
application/json
{
  • "name": "new tech names",
  • "code": null,
  • "birthDate": null
}

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Delete Maintenance Technician

Permanently deletes a maintenance technician contact. Returns the deleted contact as a flat object.

Use Cases

  • Remove a technician who was created in error
  • Clean up test or duplicate technician records

Business Rules

  • Requires Update Maintenance Technician permission.
  • Returns 400 if the contact is not found or is not a maintenance technician.
  • Deletion may fail if the technician has associated financial records — the service layer returns errors in that case.
  • POST /maintenance-technicians/{contactID}/deactivate — soft-deactivate instead of permanently deleting
  • GET /maintenance-technicians/{contactID} — verify technician state before deletion
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 5267

The unique maintenance technician contact ID to delete

Responses

Response Schema: application/json
contactID
required
integer
contactTypeID
required
integer (contact_types)
Enum: 1 2 3 4 5 6
  • 1 - Owner
  • 2 - Tenant
  • 3 - Vendor
  • 4 - Manager
  • 5 - Association
  • 6 - Applicant
name
required
string
payoutTypeID
required
integer (payout_types)
Enum: 1 2 3 4
  • 1 - Cash
  • 2 - Check
  • 3 - eCheck (ACH)
  • 4 - NACHA (ACH)
achIsCorporateAccount
required
boolean
holdPayments
required
integer
isActive
required
boolean
preventConsolidatedPayments
required
integer
isFromImport
required
boolean
vendorTypeID
integer or null
firstName
string or null
middleName
string or null
lastName
string or null
suffix
string or null
emails
string or null
phones
string or null
addresses
string or null
birthDate
string or null <date>
defaultBillChargeAccountID
integer or null
taxPayerName
string or null
taxFormTypeID
boolean or null
achDetailsCiphertextID
integer or null
achAccountNumberTruncated
string or null
achAccountTypeID
integer (bank_account_types)
Enum: 1 2
  • 1 - Savings
  • 2 - Checking
liabilityInsuranceName
string or null
liabilityInsurancePolicyNumber
string or null
liabilityInsuranceExpiresDate
string or null <date>
workersCompInsuranceName
string or null
workersCompInsurancePolicyNumber
string or null
workersCompInsuranceExpiresDate
string or null <date>
discountPercent
number or null <double>
discountGraceDays
integer or null
isInsuranceRequiredForPayment
boolean or null
importSourceKey
string or null
websiteUrl
string or null
applicantID
integer or null

Response samples

Content type
application/json
{
  • "contactID": "5267",
  • "contactTypeID": "8",
  • "vendorTypeID": null,
  • "code": null,
  • "name": "new tech names",
  • "firstName": null,
  • "middleName": null,
  • "lastName": null,
  • "suffix": null,
  • "email": null,
  • "phone": null,
  • "countryID": null,
  • "address": null,
  • "address2": null,
  • "city": null,
  • "stateID": null,
  • "postalCode": null,
  • "birthDate": null,
  • "defaultBillChargeAccountID": null,
  • "payeeName": null,
  • "taxPayerName": "new tech name",
  • "taxFormTypeID": "1",
  • "identificationTypeID": null,
  • "identificationNumber": null,
  • "identificationCountryID": null,
  • "identificationIssuingLocation": null,
  • "identificationExpirationDate": null,
  • "payoutTypeID": "2",
  • "otherPayoutTypeID": null,
  • "achDetailsCiphertextID": null,
  • "achAccountNumberTruncated": null,
  • "achAccountTypeID": "2",
  • "achIsCorporateAccount": "0",
  • "holdPayments": "0",
  • "liabilityInsuranceName": null,
  • "liabilityInsurancePolicyNumber": null,
  • "liabilityInsuranceExpiresDate": null,
  • "workersCompInsuranceName": null,
  • "workersCompInsurancePolicyNumber": null,
  • "workersCompInsuranceExpiresDate": null,
  • "discountPercent": null,
  • "discountAmount": null,
  • "discountAmountMin": null,
  • "discountAmountMax": null,
  • "discountGraceDays": null,
  • "isActive": "1",
  • "isInsuranceRequiredForPayment": null,
  • "maxLineItemsOnPayment": null,
  • "preventConsolidatedPayments": "0",
  • "isFromImport": "0",
  • "importSourceKey": null,
  • "websiteUrl": null,
  • "applicantID": null,
  • "ownerPortalNameOverride": null,
  • "isBillApprovalExempt": "0",
  • "isBillingSalesTaxEnabled": "0",
  • "isQuickbooksExportEnabled": "0",
  • "quickbooksCustomerName": null,
  • "invoiceAutofillTemplateID": null,
  • "dateTimeCreated": "2026-04-24 22:15:55",
  • "dateTimeModified": "2026-04-24 22:20:10",
  • "dateTimeDeactivated": null,
  • "contactType": "Internal Technician"
}

Activate Maintenance Technician

Sets a maintenance technician's isActive flag to 1, re-activating them after a previous deactivation. Returns the updated technician detail (same shape as GET /maintenance-technicians/{contactID}).

Use Cases

  • Re-activate a technician who was previously deactivated but is returning to service
  • Restore a technician to eligibility for work order assignments

Business Rules

  • Requires Update Internal Technician Details permission.
  • Returns 400 if the contact is not found or is not a maintenance technician.
  • Sets isActive = 1
  • The response is the full technician detail (forwarded to the view action). Pass includes query params to include related data.
  • GET /maintenance-technicians/{contactID} — retrieve technician details
  • POST /maintenance-technicians/{contactID}/deactivate — deactivate an active technician
  • POST /maintenance-technicians/{contactID} — update technician fields
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 5267

The unique maintenance technician contact ID to activate

query Parameters
includes
string
Example: includes=emails,phones

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portalAccounts, portalInvitations, vendorTrades, taxAdjustments, contactPersons, reviewStats, invoiceAutofillTemplate

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Deactivate Maintenance Technician

Sets a maintenance technician's isActive flag to 0, soft-deactivating them. Returns the updated technician detail (same shape as GET /maintenance-technicians/{contactID}).

Use Cases

  • Deactivate a technician who is no longer available to prevent new work order assignments
  • Soft-delete a technician while preserving historical records

Business Rules

  • Requires Update Internal Technician Details permission.
  • Returns 400 if the contact is not found or is not a maintenance technician.
  • Historical records (work orders, bills) are preserved after deactivation.
  • The response is the full technician detail (forwarded to the view action). Pass includes query params to include related data.
  • GET /maintenance-technicians/{contactID} — retrieve technician details
  • POST /maintenance-technicians/{contactID}/activate — re-activate a deactivated technician
  • DELETE /maintenance-technicians/{contactID} — permanently delete a technician
Authorizations:
basicAuth
path Parameters
contactID
required
integer
Example: 5267

The unique maintenance technician contact ID to deactivate

query Parameters
includes
string
Example: includes=emails,phones

Comma-separated list of related data to include in the response.

Available values: emails, phones, addresses, portalAccounts, portalInvitations, vendorTrades, taxAdjustments, contactPersons, reviewStats, invoiceAutofillTemplate

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "contact": {
    }
}

Files

Upload

Uploading a file in Rentvine is generally a 2-step process.

  1. Upload the file to store within Rentvine
  2. Attach the file to an object, e.g. Unit, Lease, etc.

To upload the file and attach it to an object in one step, provide the objectID and objectTypeID as query parameters.

E.g. if you uploaded the file using the path /files?objectTypeID=7&objectID=123, the file would be uploaded and attached to the Unit (object type id for Unit is 7) with unitID of 123.

Authorizations:
basicAuth
query Parameters
objectID
integer

The primary key of the object

objectTypeID
integer

The id of the Object Type

includes
string
Value: "attachment"
  • attachment - Includes the attachment object in the response
Request Body schema: multipart/form-data
file
string <binary>

Responses

Response Schema: application/json
required
object (file)
object (attachment)

Included if attachment provided in includes query parameter

Response samples

Content type
application/json
{
  • "file": {
    },
  • "attachment": {
    }
}

Leases

List Lease Statuses

Returns all lease statuses defined for the account, ordered by orderIndex. Each result wraps a single leaseStatus object. System statuses (isSystemStatus = 1) are built-in and cannot be deleted; custom statuses are account-defined.

Use Cases

  • Displaying the full list of available statuses in lease status management settings

Business Rules

  • No special permission required — any authenticated user can read lease statuses
  • Results are ordered by orderIndex ascending
  • primaryLeaseStatusID groups each status under one of three top-level states: Pending (1), Active (2), or Closed (3)
  • POST /leases/{leaseID}/status - Update the status of a specific lease
Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
required
object

Response samples

Content type
application/json
[
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    }
]

List Leases

Lists leases

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
object (lease)
object (unit)

Response samples

Content type
application/json
[
  • {
    }
]

Create Lease

Creates a new lease with all associated entities: tenants, recurring charges, move-in charges, occupants, pets, emergency contacts, and vehicles.

Use Cases

  • Converting an approved rental application into an active lease
  • Creating a lease directly without a prior application

Business Rules

  • Requires Update Lease permission in Roles
  • The unit specified in unitID must exist and be active
  • At least one entry in the tenants array is required
  • If applicationID is provided, the application must exist and be in a compatible state
  • If chargeLeaseFee is true, both leaseFeeAmount and leaseFeeDatePosted must be provided
  • On success the endpoint internally forwards to GET /leases/{leaseID} and returns the full lease detail
  • GET /leases - List leases
  • GET /leases/{leaseID} - Get lease detail (same shape as the response here)
  • PUT /leases/{leaseID} - Update lease
Authorizations:
basicAuth
Request Body schema: application/json
required
object
required
Array of objects non-empty

Primary tenants on the lease. At least one is required.

object

Optional application status update when converting an application to a lease.

Array of objects

Recurring charges (rent, pet fees, parking, etc.) to attach to the lease at creation.

Array of objects

Additional recurring charges (utility fees, etc.) using a simplified structure without escalations.

Array of objects

One-time move-in charges (security deposit, admin fee, etc.) posted when the lease is created.

Array of objects

Co-signer tenants (guarantors) on the lease.

Array of objects

Applicants from the linked application to convert to tenants. Only processed when lease.applicationID is set.

Array of objects

Co-signer applicants from the linked application. Only processed when lease.applicationID is set.

Array of objects

Non-tenant occupants (minors, roommates, etc.) listed on the lease.

processPetsFromApplication
boolean
Default: true

When true (default), pets are copied from the linked application. Set to false and provide the pets array to supply pet data directly.

Array of objects

Pets on the lease. Only used when processPetsFromApplication is false.

processEmergencyContactsFromApplication
boolean
Default: true

When true (default), emergency contacts are copied from the linked application. Set to false and provide emergencyContacts directly.

Array of objects

Emergency contacts for the tenant. Only used when processEmergencyContactsFromApplication is false.

processVehiclesFromApplication
boolean
Default: true

When true (default), vehicles are copied from the linked application. Set to false and provide the vehicles array directly.

Array of objects

Vehicles registered to the lease. Only used when processVehiclesFromApplication is false.

sendPortalInvitations
boolean
Default: false

When true, portal invitation emails are sent to all tenants on the lease at creation.

deactivateListing
boolean
Default: false

When true, the property listing is deactivated upon lease creation.

chargeLeaseFee
boolean
Default: false

When true, a management lease fee is charged at creation. Requires leaseFeeAmount and leaseFeeDatePosted.

leaseFeeAmount
string

Lease fee amount. Required when chargeLeaseFee is true.

leaseFeeDatePosted
string <date>

Date to post the lease fee. Required when chargeLeaseFee is true.

Responses

Response Schema: application/json
required
object

Request samples

Content type
application/json
{
  • "lease": {
    },
  • "application": {
    },
  • "applicants": [ ],
  • "tenants": [
    ],
  • "cosignerTenants": [ ],
  • "cosignerApplicants": [ ],
  • "occupants": [ ],
  • "processEmergencyContactsFromApplication": false,
  • "emergencyContacts": [ ],
  • "processPetsFromApplication": false,
  • "pets": [ ],
  • "processVehiclesFromApplication": false,
  • "vehicles": [ ],
  • "recurringCharges": [
    ],
  • "otherRecurringCharges": [
    ],
  • "charges": [
    ],
  • "sendPortalInvitations": false,
  • "deactivateListing": false,
  • "chargeLeaseFee": true,
  • "leaseFeeAmount": "1500.00",
  • "leaseFeeDatePosted": "04/29/2026"
}

Response samples

Content type
application/json
{
  • "lease": {
    }
}

View

Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2213

Responses

Response Schema: application/json
required
object (lease)

Response samples

Content type
application/json
{
  • "lease": {
    }
}

Update Lease

Updates an existing lease's details. On success the endpoint internally forwards to GET /leases/{leaseID} and returns the full lease detail.

Use Cases

  • Modifying lease dates (start, end, move-in, move-out, notice, expected move-out)
  • Changing the assigned property manager (assignedToUserID)
  • Adjusting late fee settings, allowed tenant payment amount, and statement settings
  • Providing the lease with a closedDate and closedDescription within the lease details

Business Rules

  • Requires Update Lease permission under the Leasing component
  • The lease must exist; a 400 is returned if not found
  • Portfolio restrictions apply — users can only update leases within their accessible portfolios
  • leaseStatusID is not updated by this endpoint; use POST /leases/{leaseID}/status to change status
  • GET /leases/{leaseID} - Get full lease detail (same response shape as returned here)
  • POST /leases/{leaseID}/status - Update lease status only
  • POST /leases - Create a new lease
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2213
Request Body schema: application/json
assignedToUserID
string or null

ID of the user assigned to manage this lease.

leaseStatusID
string or null

Lease status ID. Sent by the frontend but not applied by this endpoint — use POST /leases/{leaseID}/status to change status.

noticeDate
string or null <date>

Date the tenant gave notice to vacate.

expectedMoveOutDate
string or null <date>

Expected date the tenant will move out.

moveInDate
string or null <date>

Tenant move-in date.

moveOutDate
string or null <date>

Actual move-out date.

depositRefundDueDate
string or null <date>

Date by which the security deposit refund is due.

closedDate
string or null <date>

Date the lease was closed. Set along with closedDescription to close a lease.

closedDescription
string or null

Reason or notes recorded when the lease is closed.

startDate
string <date>

Lease start date.

endDate
string or null <date>

Lease end date. Omit or set null for month-to-month leases.

increaseEligibilityDate
string or null <date>

Date after which the lease is eligible for a rent increase.

leaseReturnChargeAmount
string

Amount charged for returned payments (NSF fee).

lateFeeSettingID
string or null

ID of the late fee configuration to apply to this lease.

showOverriddenAllowedPaymentType
boolean

Frontend flag controlling whether the allowed payment type override UI is shown. Sent in the payload but not persisted by this endpoint.

allowedPaymentAmountTypeID
integer or null

Restricts the payment amount type tenants may submit. Null means no restriction. (1 means any amount, 2 means full amount only)

isTenantPastDueNoticeEnabled
boolean

Whether past-due notice emails are sent for this lease (0 or 1).

statementSettingID
string or null

Statement setting override for this lease. Null uses the portfolio default.

sendStatements
string or integer

Whether statements are sent to tenants (0 or 1).

code
string or null

Optional lease reference code.

Responses

Response Schema: application/json
required
object (lease)

Request samples

Content type
application/json
{
  • "assignedToUserID": "122188",
  • "leaseStatusID": "21",
  • "noticeDate": "2025-03-21",
  • "expectedMoveOutDate": "2025-08-05",
  • "moveInDate": "2025-03-05",
  • "moveOutDate": "2025-08-05",
  • "depositRefundDueDate": "2026-04-21",
  • "closedDate": "2026-04-21",
  • "closedDescription": "test 1",
  • "startDate": "2026-04-17",
  • "endDate": "2026-10-17",
  • "increaseEligibilityDate": "2028-03-05",
  • "rentAmount": 100,
  • "leaseReturnChargeAmount": "35.00",
  • "lateFeeSettingID": "87",
  • "showOverriddenAllowedPaymentType": true,
  • "allowedPaymentAmountTypeID": 1,
  • "isTenantPastDueNoticeEnabled": true,
  • "statementSettingID": "1",
  • "sendStatements": "1"
}

Response samples

Content type
application/json
{
  • "lease": {
    }
}

Delete Lease

Permanently deletes a lease from the system. On success, returns the deleted lease record as it existed at time of deletion.

This endpoint will only succeed if the lease has never had any accounting transactions, payouts, or deposit releases tied to it. Voiding or deleting individual charges, tenant credits, or tenant receipts does not satisfy this requirement — once any transaction has ever been recorded against a lease, the lease cannot be deleted. Use lease closure or move-out workflows instead to retire a lease that has financial history.

Use Cases

  • Removing a lease that was created in error before any accounting activity occurred
  • Cleaning up test or draft leases in non-production environments

Business Rules

  • Requires Update Lease permission under the Leasing component
  • The lease must exist; a 400 is returned if not found
  • The lease must have zero accounting transactions ever recorded (including voided ones); a 400 is returned with "Cannot delete a lease that has accounting transactions" if any exist
  • All associated tenants, occupants, recurring charges, and related records are cascade-deleted as part of this operation
  • GET /leases/{leaseID} - Get the lease detail before deleting
  • POST /leases/{leaseID}/status - Close or change lease status (for leases with transaction history)
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2213

Responses

Response Schema: application/json
required
object (lease)

Response samples

Content type
application/json
{
  • "leaseID": "2213",
  • "propertyID": "406",
  • "unitID": "391",
  • "primaryLeaseStatusID": "1",
  • "leaseStatusID": "21",
  • "moveOutStatusID": "1",
  • "assignedToUserID": null,
  • "applicationID": null,
  • "leaseDocumentTransactionID": null,
  • "code": null,
  • "moveInDate": "2026-05-01",
  • "startDate": "2026-05-01",
  • "endDate": "2027-04-30",
  • "dateTimeCreated": "2026-04-22 10:00:00",
  • "dateTimeModified": "2026-04-22 10:00:00",
  • "lateFeeSettingID": null,
  • "isPortalDisabled": "0",
  • "isPortalPaymentDisabled": "0",
  • "isCertifiedFundsRequired": "0",
  • "isLateFeesActive": "1",
  • "isLeaseAgreementViolated": "0",
  • "tenantRefundPayoutTypeID": "1",
  • "isFromImport": "0",
  • "importSourceKey": null,
  • "isTenantPastDueNoticeEnabled": "0",
  • "isAutoClosed": "0",
  • "isPublicStatementEnabled": "0",
  • "isMarkedToVacate": "0"
}

Update Lease Status

Updates the status of an existing lease. On success the endpoint internally forwards to GET /leases/{leaseID} and returns the full lease detail.

Use Cases

  • Adjusting a lease status

Business Rules

  • Requires Update Lease permission under the Leasing component
  • The lease must exist; a 400 is returned if not found
  • Portfolio restrictions apply — users can only update leases within their accessible portfolios
  • leaseStatusID is the only required field; all other fields are optional and will be updated only when provided
  • leaseStatusID references custom statuses configured in the account (see GET /leases/statuses)
  • GET /leases/{leaseID} - Get full lease detail (same response shape as returned here)
  • POST /leases/{leaseID} - Update other lease fields (dates, settings, insurance info)
  • GET /leases/statuses - List available custom lease statuses
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2213
Request Body schema: application/json
leaseStatusID
required
integer

ID of the custom lease status to assign. References the account-configured statuses from GET /leases/statuses.

noticeDate
string or null <date>

Date the tenant gave notice to vacate.

expectedMoveOutDate
string or null <date>

Expected date the tenant will move out.

moveOutDate
string or null <date>

Actual date the tenant moved out.

depositRefundDueDate
string or null <date>

Date by which the security deposit refund must be issued.

closedDate
string or null <date>

Date the lease was closed.

closedDescription
string or null

Optional description or reason for closing the lease.

isPortalPaymentDisabled
integer or null

Whether portal payments are disabled for this lease (0 or 1).

isTenantPastDueNoticeEnabled
integer or null

Whether past-due notices are sent to tenants (0 or 1).

Responses

Response Schema: application/json
required
object (lease)

Request samples

Content type
application/json
Example
{
  • "leaseStatusID": 2
}

Response samples

Content type
application/json
{
  • "lease": {
    }
}

List Lease Tenants

Returns all tenants associated with a lease, each as a pair of leaseTenant and contact objects. Portal access data (hasPortalAccess, hasPortalInvitation, invitationDateTimeCreated, hasApplicantUser) is always included.

Use Cases

  • Displaying a list of current and past tenants for a lease
  • Checking whether a tenant has portal access or a pending invitation

Business Rules

  • The lease must be within the user's accessible portfolios; a 400 is returned otherwise
  • Results are ordered: active first, primary first, then by orderIndex, then by leaseTenantID
  • When isActive is omitted, both active and inactive tenants are returned
  • Portal data is always computed inline (not an opt-in include)
  • POST /leases/{leaseID}/tenants - Add a tenant to the lease
  • DELETE /leases/{leaseID}/tenants/{leaseTenantID} - Remove a tenant from the lease
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2213
query Parameters
isActive
integer
Enum: 0 1
Example: isActive=1

Filter by active status. 1 returns only active tenants, 0 returns only inactive tenants. Omit to return all.

Responses

Response Schema: application/json
Array
required
object
required
object

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Add Tenant to Lease

Adds a new tenant to an existing lease. You can either link an existing contact by providing contactID, or create a brand-new tenant contact by supplying name, emails, phones, and/or addresses. On success the endpoint internally forwards to GET /leases/{leaseID}/tenants/{leaseTenantID} and returns the full tenant detail.

Use Cases

  • Adding a new tenant to an active lease mid-term
  • Linking an existing tenant contact to a lease they will now occupy
  • Recording a co-signer who is financially responsible but not a primary tenant

Business Rules

  • Requires Update Lease permission under the Leasing component
  • The lease must exist and be within the user's accessible portfolios; a 400 is returned otherwise
  • Cannot add a tenant to a lease in Closed status (primaryLeaseStatusID = 3)
  • If contactID is omitted or empty, a new contact is created using name (required), plus optional emails, phones, and addresses
  • If contactID is provided, the existing contact is linked directly — name, emails, phones, and addresses are ignored
  • The linked or newly-created contact must be of type Tenant (contactTypeID = 2) and must be active
  • A contact can only appear once on a given lease — duplicate assignments return a 400
  • moveInDate is required
  • GET /leases/{leaseID}/tenants - List all tenants on the lease
  • GET /leases/{leaseID}/tenants/{leaseTenantID} - Get a single tenant (same response shape returned here)
  • DELETE /leases/{leaseID}/tenants/{leaseTenantID} - Remove a tenant from the lease
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2213
Request Body schema: application/json
moveInDate
required
string <date>

Date the tenant moves in. Required.

name
required
string

Full name of the new tenant contact. Required when contactID is not provided.

contactID
integer or null

ID of an existing contact to link to the lease. When provided, the contact must already be of type Tenant and be active. If omitted or null, a new tenant contact is created using name, emails, phones, and addresses.

Array of objects

Email addresses to attach to the new tenant contact. Ignored when contactID is provided.

Array of objects

Phone numbers to attach to the new tenant contact. Ignored when contactID is provided.

Array of objects

Addresses to attach to the new tenant contact. Ignored when contactID is provided.

Responses

Response Schema: application/json
required
object

The newly created lease tenant record.

required
object

The contact record for the tenant.

Request samples

Content type
application/json
Example
{
  • "moveInDate": "2026-04-21",
  • "isCosigner": 0,
  • "name": "Testing Doc",
  • "emails": [
    ],
  • "phones": [
    ]
}

Response samples

Content type
application/json
{
  • "leaseTenant": {
    },
  • "contact": {
    }
}

Remove Tenant from Lease

Removes a tenant from a lease. On success, returns the deleted lease tenant record as it existed at time of deletion.

Use Cases

  • Removing a tenant who no longer occupies the unit
  • Correcting a mistakenly added tenant before any accounting activity

Business Rules

  • Requires Update Lease permission under the Leasing component
  • The lease must exist and be within the user's accessible portfolios; a 400 is returned otherwise
  • The leaseTenantID must belong to the specified leaseID; a 400 is returned if the lease tenant is not found
  • The lease must have at least one active tenant; a 400 is returned if the lease has no active tenants
  • GET /leases/{leaseID}/tenants - List all tenants on the lease
  • GET /leases/{leaseID}/tenants/{leaseTenantID} - Get a single tenant detail
  • POST /leases/{leaseID}/tenants - Add a tenant to the lease
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2213
leaseTenantID
required
integer
Example: 3391

The leaseTenantID of the tenant record to remove.

Responses

Response Schema: application/json
leaseTenantID
required
string

Unique identifier for the lease tenant record.

leaseID
required
string

ID of the lease this tenant belonged to.

contactID
required
string

ID of the linked contact record.

isPrimary
required
string

Whether this tenant was the primary tenant on the lease (1 = yes, 0 = no).

isCosigner
required
string

Whether this tenant was a co-signer (1 = yes, 0 = no).

isActive
required
string

Active status at time of deletion (1 = active, 0 = inactive).

moveInDate
string or null <date>

Date the tenant moved in.

moveOutDate
string or null <date>

Date the tenant moved out. Null for active tenants.

orderIndex
string or null

Display order index for the tenant on the lease.

Response samples

Content type
application/json
{
  • "leaseTenantID": "3391",
  • "leaseID": "2213",
  • "contactID": "5246",
  • "isPrimary": "0",
  • "isCosigner": "0",
  • "isActive": "1",
  • "moveInDate": "2026-05-01",
  • "moveOutDate": null,
  • "orderIndex": "4"
}

List Recurring Charges

Returns a paginated list of recurring charges for a lease. Each item includes the recurringCharge record and the associated account (chart-of-accounts entry). The account is always included — no additional includes parameter is needed.

Use Cases

  • Displaying all recurring charges on a lease detail page

Business Rules

  • The lease must be within the user's accessible portfolios; a 400 is returned otherwise
  • The account is always present in each list item — it cannot be excluded
  • recurringStatusID is not included in list items — use GET /leases/{leaseID}/recurring-charges/{chargeID} to get the computed status for a specific charge
  • GET /leases/{leaseID}/recurring-charges/{chargeID} - Get a single recurring charge with computed status
  • POST /leases/{leaseID}/recurring-charges - Create a new recurring charge
Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
required
object
required
object (account-2)

A chart-of-accounts entry. Accounts define how money is categorized across the accounting system (income, deposits, escrow, bank accounts, etc.). Each recurring charge, bill, and invoice posts against one account.

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Create Recurring Charge

Creates a new recurring charge on a lease. On success the endpoint internally forwards to GET /leases/{leaseID}/recurring-charges/{chargeID} and returns the full charge detail along with the previous charge on the lease.

Use Cases

  • Adding a new monthly rent charge to a lease
  • Setting up recurring fees (e.g. pet fees, parking) that begin on a future date
  • Creating a time-bounded charge that expires before the lease ends

Business Rules

  • Requires Update Lease permission under the Leasing component
  • The lease must exist and be within the user's accessible portfolios; a 400 is returned otherwise
  • accountID must reference a valid chart-of-account entry of a charge type
  • startDate is the date the charge appears on reports such as the Rent Roll; accepted as MM/DD/YYYY
  • dayDue is the day of the month (1–31) on which recurring charge transactions are generated
  • frequency is the number of months between charge occurrences; defaults to 1 (monthly)
  • endDate is optional — leaving it blank causes the charge to continue until the lease reaches a Primary Closed Status
  • GET /leases/{leaseID}/recurring-charges - List all recurring charges for the lease
  • GET /leases/{leaseID}/recurring-charges/{chargeID} - Get a single recurring charge (same response shape returned here)
  • POST /leases/{leaseID}/recurring-charges/{chargeID} - Update an existing recurring charge
  • DELETE /leases/{leaseID}/recurring-charges/{chargeID} - Delete a recurring charge
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2213
Request Body schema: application/json
dayDue
required
string [ 1 .. 31 ]

Day of the month (1–31) on which charge transactions are generated.

frequency
required
string [ 1 .. 24 ]
Default: 1

Number of months between charge occurrences. Use 1 for monthly, 3 for quarterly, etc.

accountID
required
string

ID of the chart-of-account entry to post the charge against. Must be a charge-type account.

amount
required
string

Charge amount as a decimal string.

description
required
string

Label for the charge as it appears on statements and reports.

startDate
required
string

Date the charge begins appearing on reports such as the Rent Roll. Accepted format is MM/DD/YYYY.

endDate
string or null

Date the charge stops being generated. Accepted format is MM/DD/YYYY. Leave blank (omit) to continue the charge until the lease reaches a Primary Closed Status.

Responses

Response Schema: application/json
required
object

The newly created recurring charge.

object or null

The previous recurring charge on this lease (immediately before the new one), if any. Does not include recurringStatusID.

Request samples

Content type
application/json
Example
{
  • "dayDue": 1,
  • "frequency": 1,
  • "accountID": "16",
  • "amount": "1500.00",
  • "description": "Monthly Rent",
  • "startDate": "04/20/2027",
  • "endDate": "04/12/2028"
}

Response samples

Content type
application/json
{
  • "recurringCharge": {
    },
  • "previousCharge": {
    }
}

Get Recurring Charge

Returns a single recurring charge with its computed recurringStatusID and the previous charge on the lease (if one exists).

Use Cases

  • Displaying full detail for a specific recurring charge
  • Checking whether a charge is currently active, future, or past
  • Reviewing the prior charge that this one superseded

Business Rules

  • The lease must be within the user's accessible portfolios; a 400 is returned otherwise
  • If the recurring charge does not belong to the specified lease, a 400 is returned
  • account is only included when includes=account is passed
  • GET /leases/{leaseID}/recurring-charges - List all recurring charges for the lease
  • POST /leases/{leaseID}/recurring-charges/{chargeID} - Update this recurring charge
  • DELETE /leases/{leaseID}/recurring-charges/{chargeID} - Delete this recurring charge
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2213
chargeID
required
integer
Example: 11546

The leaseRecurringChargeID of the recurring charge to retrieve.

query Parameters
includes
string
Example: includes=account

Comma-separated list of related data to include in the response.

  • account - the full chart-of-accounts entry for the account this charge posts against

Responses

Response Schema: application/json
required
object
required
object or null

The previous recurring charge on this lease (highest leaseRecurringChargeID below this one), or null if this is the first charge. Does not include recurringStatusID.

object (account-2)

The chart-of-accounts entry for this charge (if includes=account).

Response samples

Content type
application/json
{
  • "recurringCharge": {
    },
  • "previousCharge": null
}

Update Recurring Charge

Updates an existing recurring charge on a lease. Only include the fields you want to change — fields omitted from the request body retain their current values. Fields cannot be set to null via this endpoint.

On success the endpoint internally forwards to GET /leases/{leaseID}/recurring-charges/{chargeID} and returns the full charge detail along with the previous charge on the lease.

Use Cases

  • Adjusting the amount on an existing rent charge
  • Changing the end date of a time-bounded charge
  • Updating the chart-of-account a charge posts against

Business Rules

  • Requires Update Lease permission under the Leasing component
  • The lease and recurring charge must both exist; a 400 is returned if either is not found
  • Portfolio restrictions apply — users can only update charges on leases within their accessible portfolios
  • Fields cannot be explicitly set to null; omit a field to leave it unchanged
  • startDate and endDate are accepted as MM/DD/YYYY in the request
  • POST /leases/{leaseID}/recurring-charges - Create a new recurring charge (use this to get the chargeID)
  • GET /leases/{leaseID}/recurring-charges - List all recurring charges for the lease
  • DELETE /leases/{leaseID}/recurring-charges/{chargeID} - Delete this recurring charge
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2213
chargeID
required
integer
Example: 12012

The leaseRecurringChargeID of the recurring charge to update. Obtain this from POST /leases/{leaseID}/recurring-charges or GET /leases/{leaseID}/recurring-charges.

Request Body schema: application/json
accountID
string

ID of the chart-of-account entry to post the charge against. Must be a charge-type account.

amount
string

Charge amount as a decimal string.

description
string

Label for the charge as it appears on statements and reports.

dayDue
string

Day of the month (1–31) on which charge transactions are generated.

frequency
string

Number of months between charge occurrences. Use 1 for monthly, 3 for quarterly, etc.

startDate
string

Date the charge begins appearing on reports such as the Rent Roll. Accepted format is MM/DD/YYYY.

endDate
string

Date the charge stops being generated. Accepted format is MM/DD/YYYY. To keep the charge open-ended, omit this field rather than sending null.

Responses

Response Schema: application/json
required
object

The updated recurring charge.

object or null

The previous recurring charge on this lease (immediately before this one), if any. Does not include recurringStatusID.

Request samples

Content type
application/json
Example
{
  • "amount": "120.00"
}

Response samples

Content type
application/json
{
  • "recurringCharge": {
    },
  • "previousCharge": {
    }
}

Delete Recurring Charge

Permanently deletes a recurring charge from a lease. On success, returns the deleted recurring charge record as it existed at time of deletion.

Use Cases

  • Removing a charge that was added in error
  • Deleting a charge whose schedule has been superseded by a new one

Business Rules

  • Requires Update Lease permission under the Leasing component
  • Portfolio restrictions apply — users can only delete recurring charges on leases within their accessible portfolios
  • The recurring charge must exist and belong to the specified lease; a 400 is returned if not found
  • This operation is permanent — use POST /leases/{leaseID}/recurring-charges/{chargeID} to set an endDate instead if you want to stop future postings while preserving history
  • GET /leases/{leaseID}/recurring-charges/{chargeID} - Get the charge detail before deleting
  • GET /leases/{leaseID}/recurring-charges - List all recurring charges for the lease
  • POST /leases/{leaseID}/recurring-charges/{chargeID} - Update the charge (e.g. set an end date)
Authorizations:
basicAuth
path Parameters
leaseID
required
integer
Example: 2213
chargeID
required
integer
Example: 12012

The leaseRecurringChargeID of the recurring charge to delete.

Responses

Response Schema: application/json
leaseRecurringChargeID
required
string

Unique identifier for the recurring charge.

leaseID
required
string

ID of the lease this charge belonged to.

accountID
required
string

Chart-of-account ID the charge posted against.

amount
required
string

Charge amount as a decimal string.

description
required
string

Label for the charge as it appeared on statements and reports.

dayDue
required
string

Day of the month on which charge transactions were generated.

frequency
required
string

Number of months between charge occurrences.

startDate
required
string <date>

Date the charge began appearing on reports.

isMoveInCharge
required
string

Whether this charge was created as a move-in charge (1 = yes, 0 = no).

isFromImport
required
string

Whether this charge was created via import (1 = yes, 0 = no).

rentIncreaseID
string or null

ID of the rent increase that created this charge, if any.

endDate
string or null <date>

Date the charge was scheduled to stop. Null means it was open-ended.

nextChargeDate
string or null <date>

Next charge date at time of deletion.

importSourceKey
string or null

Import source key if the charge came from an import, otherwise null.

Response samples

Content type
application/json
{
  • "leaseRecurringChargeID": "12012",
  • "leaseID": "2213",
  • "rentIncreaseID": null,
  • "accountID": "16",
  • "amount": "120.00",
  • "description": "More Rent",
  • "dayDue": "1",
  • "frequency": "1",
  • "startDate": "2027-04-20",
  • "endDate": "2028-04-12",
  • "nextChargeDate": "2027-05-01",
  • "isMoveInCharge": "0",
  • "isFromImport": "0",
  • "importSourceKey": null
}

Work Orders

Create Work Order

Create a new work order. Requires the Manage Work Orders permission. On success, returns the full work order detail (same shape as GET /maintenance/work-orders/{workOrderID}).

Use Cases

  • Submit a new maintenance request for a property or unit
  • Create a work order from a template via workOrderTemplateID
  • Assign a vendor and send a vendor notification email in one step

Business Rules

  • Requires Manage Work Orders permission
  • propertyID is required; unitID and leaseID are optional
  • technicianContactIDs assigns one or more technician contacts to the work order
  • When sendVendorNotification is true and a vendor is assigned, a notification email is dispatched
  • workOrderTemplateID pre-populates fields from an existing template when supplied
  • Dates accept MM/DD/YYYY or ISO 8601 YYYY-MM-DD format
  • GET /maintenance/work-orders/{workOrderID} - Get the created work order
  • GET /maintenance/work-orders - List all work orders
  • POST /maintenance/work-orders/{workOrderID} - Update a work order
Authorizations:
basicAuth
Request Body schema: application/json
propertyID
required
string

Property the work order is attached to

workOrderStatusID
required
string

Initial status ID for the work order

priorityID
required
string
  • 1 - Low
  • 2 - Medium
  • 3 - High
isOwnerApproved
required
boolean

Whether the owner has approved the work order

isVacant
required
boolean

Whether the unit is vacant

description
required
string

Description of the maintenance issue (may contain HTML)

isSharedWithTenant
required
string

1 to share with the Resident Portal, 0 to hide

isSharedWithOwner
required
boolean

Whether the work order is visible in the Owner Portal

unitID
string or null

Unit the work order is attached to (null for property-level)

leaseID
string or null

Lease associated with the work order

isInternal
string

1 = internal (not shared with tenant or owner), 0 = standard

vendorWorkOrderStatusID
string or null

Vendor-specific status ID

vendorContactID
string or null

Vendor contact ID to assign to the work order

vendorTradeID
string or null

Vendor trade / maintenance category ID

assignedToUserID
string or null

Internal user ID to assign to the work order

requestedByContactID
string or null

Contact ID of the person who requested the work

technicianContactIDs
Array of strings

One or more contact IDs to assign as technicians

estimatedAmount
string or null

Estimated cost as a decimal string (e.g. "500.00")

scheduledStartDate
string or null

Scheduled start date (MM/DD/YYYY or YYYY-MM-DD)

scheduledEndDate
string or null

Scheduled end date (MM/DD/YYYY or YYYY-MM-DD)

actualStartDate
string or null <date>
actualEndDate
string or null <date>
dateDue
string or null

Due date (MM/DD/YYYY or YYYY-MM-DD)

dateClosed
string or null <date>
vendorInstructions
string or null

HTML instructions for the assigned vendor

entryInstructions
string or null

Entry instructions for the vendor

residentProvidedEntryInstructions
string or null
closingDescription
string or null
vendorAccessTypeID
string or null
  • 1 - Permission Required
  • 2 - Permission Not Required
  • 3 - Do Not Enter
appointmentWindowStartDateTime
string or null <date-time>
appointmentWindowEndDateTime
string or null <date-time>
inspectionID
string or null
incidentLocation
string or null
workOrderProjectID
string or null

Project ID to attach this work order to

workOrderTemplateID
string or null

Template ID to pre-populate work order fields

orderIndex
integer or null
sourceTypeID
string or null
isTenantFinanciallyResponsible
string or null

1 when the tenant is responsible for the cost

sendVendorNotification
boolean
Default: true

Whether to send a notification email to the assigned vendor

sendEmail
boolean or null

Whether to send an email notification (separate from vendor notification)

object or null

Custom email content for the vendor notification

attachments
Array of integers

File IDs to attach to the work order

issueImages
Array of integers

File IDs to attach as issue images (shared with vendor)

Responses

Response Schema: application/json
required
object (work_order)
schedulingStatusID
required
integer or null

Request samples

Content type
application/json
Example
{
  • "propertyID": "172",
  • "unitID": null,
  • "leaseID": null,
  • "isInternal": "0",
  • "isVacant": false,
  • "description": "Leaky faucet in kitchen",
  • "priorityID": "2",
  • "workOrderStatusID": "1",
  • "isOwnerApproved": false,
  • "isSharedWithTenant": "1",
  • "isSharedWithOwner": true,
  • "vendorContactID": "5150",
  • "vendorTradeID": "5",
  • "vendorInstructions": "<p>Call tenant before arriving.</p>",
  • "technicianContactIDs": [
    ],
  • "sendVendorNotification": true,
  • "vendorAccessTypeID": "1",
  • "attachments": [ ],
  • "issueImages": [ ]
}

Response samples

Content type
application/json
{
  • "workOrder": {
    },
  • "schedulingStatusID": 1
}

List Work Orders

Retrieve a paginated list of work orders with their assigned vendor contact. Supports filtering by property, unit, status, vendor, date range, and more.

Use Cases

  • Filter open work orders by property or unit
  • Find work orders assigned to a specific vendor
  • Show newly submitted (unacknowledged) work orders
  • Review work orders within a specific date range

Business Rules

  • Results are scoped to the authenticated user's accessible portfolios
  • Default page size is 15
  • GET /maintenance/work-orders/{workOrderID} - Get full work order details with includes
  • POST /maintenance/work-orders - Create a work order
  • GET /maintenance/work-order/statuses - Get available work order statuses
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 15

Number of items per page

search
string
Example: search=leaky faucet

Free-text search across work order fields (description, work order number, etc.)

propertyID
integer
Example: propertyID=100

Filter by property ID

unitID
integer
Example: unitID=250

Filter by unit ID

workOrderStatusID
integer
Example: workOrderStatusID=1

Filter by work order status ID. See Work Order Statuses for available values.

isOwnerApproved
integer
Enum: 0 1

Filter by owner approval state (0 = pending, 1 = approved)

vendorContactID
integer
Example: vendorContactID=7001

Filter by assigned vendor contact ID

startDate
string <date>
Example: startDate=2024-01-01

Filter work orders created on or after this date (YYYY-MM-DD)

endDate
string <date>
Example: endDate=2024-12-31

Filter work orders created on or before this date (YYYY-MM-DD)

leaseID
integer
Example: leaseID=1500

Filter by associated lease ID

isNew
integer
Enum: 0 1
Example: isNew=1

Filter to only unacknowledged (1) or acknowledged (0) work orders

Responses

Response Headers
pagination-page-size
string
Example: 15

Number of items per page

pagination-total-items
integer
Example: 42

Total number of matching items

pagination-total-pages
integer
Example: 3

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number (null if on the last page)

pagination-before-page
integer or null

Previous page number (null if on the first page)

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 3

Last page number

Response Schema: application/json
Array
required
object (work_order)
required
object or null (contact)

Vendor contact assigned to the work order. All fields are null when no vendor is assigned.

Response samples

Content type
application/json
Example
[
  • {
    }
]

Get Work Order

Retrieve detailed information about a specific work order by ID, including computed overdue status and assigned technician data.

Use Cases

  • View complete work order details
  • Check work order status and progress
  • Review assigned technicians and scheduling status

Business Rules

  • Returns 400 with "Work Order {id} not found" if the work order does not exist
  • Access is verified against portfolio restrictions; unauthorized requests receive 403 "Work Order Access Not Allowed"
  • daysOverdue and isOverdue are calculated dynamically from dateDue and today's date
  • GET /maintenance/work-orders - List work orders
  • POST /maintenance/work-orders/{workOrderID} - Update work order
  • DELETE /maintenance/work-orders/{workOrderID} - Delete work order
  • GET /maintenance/work-orders/{workOrderID}/print - Print work order PDF
Authorizations:
basicAuth
path Parameters
workOrderID
required
integer
Example: 2314

The unique work order ID

Responses

Response Schema: application/json
required
object
schedulingStatusID
required
integer or null

Response samples

Content type
application/json
{
  • "workOrder": {
    },
  • "schedulingStatusID": 1
}

Update Work Order

Update an existing work order. Supports updating all work order fields including status, assignment, scheduling, and shared visibility settings.

Use Cases

  • Update work order status
  • Assign/reassign vendor
  • Change priority level
  • Update schedule dates
  • Modify description and instructions
  • Change owner/tenant visibility
  • Set appointment windows

Business Rules

  • Access controlled by portfolio restrictions
  • Changing status may trigger notifications
  • Owner approval may be required for certain changes
  • Vendor assignment triggers vendor notification (if sendVendorNotification=true)
  • Status changes to completed status can trigger review requests
  • Requires Manage Work Orders permission

Workflow Changes

  • Status Updates - May trigger workflow automations
  • Owner Sharing - Controls visibility in owner portal
  • Tenant Sharing - Controls visibility in resident portal
  • GET /maintenance/work-orders/{workOrderID} - View work order
  • DELETE /maintenance/work-orders/{workOrderID} - Delete work order
Authorizations:
basicAuth
path Parameters
workOrderID
required
integer
Example: 12345

The unique work order ID to update

Request Body schema: application/json
isInternal
string

Internal work order flag (0=no, 1=yes)

propertyID
string

Property ID

unitID
string or null

Unit ID (null for property-level)

leaseID
string or null

Associated lease ID

vendorTradeID
string or null

Vendor trade/specialty

vendorContactID
string or null

Assigned vendor contact ID

workOrderStatusID
string

Work order status

vendorWorkOrderStatusID
string or null

Vendor-specific status

priorityID
string

Priority (1=Low, 2=Normal, 3=High, 4=Emergency)

sourceTypeID
string

Work order source/origin

isOwnerApproved
string

Owner approval (0=pending, 1=approved)

isVacant
string

Vacant unit flag

assignedToUserID
string or null

Assigned internal user

requestedByContactID
string or null

Contact who requested work

estimatedAmount
string or null

Estimated cost

scheduledStartDate
string or null <date>

Scheduled start date

actualStartDate
string or null <date>

Actual start date

scheduledEndDate
string or null <date>

Scheduled end date

actualEndDate
string or null <date>

Actual end date

dateDue
string or null <date>

Due date

dateClosed
string or null <date>

Closed date

description
string

Work order description/issue

vendorInstructions
string or null

Instructions for vendor

closingDescription
string or null

Closing notes/resolution

isSharedWithOwner
string

Share with owner portal (0=no, 1=yes)

isSharedWithTenant
string

Share with resident portal (0=no, 1=yes)

inspectionID
string or null

Related inspection ID

incidentLocation
string or null

Location within property

workOrderProjectID
string or null

Parent project ID

orderIndex
string

Display order

vendorAccessTypeID
string or null

Access type for vendor

residentProvidedEntryInstructions
string or null

Entry instructions from tenant

entryInstructions
string or null

Entry instructions for vendor

isTenantFinanciallyResponsible
string

Tenant pays for work (0=no, 1=yes)

appointmentWindowStartDateTime
string or null <date-time>

Appointment window start

appointmentWindowEndDateTime
string or null <date-time>

Appointment window end

sendVendorNotification
boolean
Default: true

Send notification to vendor on changes

sendReview
boolean
Default: false

Send review request on completion

Responses

Response Schema: application/json
workOrder
object

Updated work order details (same structure as GET response)

Request samples

Content type
application/json
Example
{
  • "workOrderStatusID": 2,
  • "sendVendorNotification": false
}

Response samples

Content type
application/json
{
  • "workOrder": {
    }
}

Delete Work Order

Delete a work order. This operation removes the work order and all associated data including attachments, messages, and timeline events.

Use Cases

  • Remove duplicate work orders
  • Delete cancelled work orders
  • Clean up test/invalid work orders

Business Rules

  • Access controlled by portfolio restrictions
  • Cannot delete if associated bills exist
  • Deletes all attachments and messages
  • Requires Manage Work Orders permission

Data Cleanup

  • Removes work order record
  • Deletes file attachments
  • Removes work order messages
  • Removes from projects
  • GET /maintenance/work-orders/{workOrderID} - View work order
  • GET /maintenance/work-orders - View work orders
Authorizations:
basicAuth
path Parameters
workOrderID
required
string
Example: 12345

The unique work order ID to delete

Responses

Response Schema: application/json
workOrderID
string
workOrderNumber
string
description
string
dateTimeCreated
string <date-time>
dateTimeModified
string <date-time>

Response samples

Content type
application/json
{
  • "workOrderID": 12345,
  • "workOrderNumber": "WO-2024-12345",
  • "description": "Kitchen sink is leaking under the cabinet",
  • "dateTimeCreated": "2024-10-23T08:30:00Z",
  • "dateTimeModified": "2024-10-23T09:15:00Z"
}

Print Work Order PDF

Generate and download a PDF version of the specified work order. The response is a binary PDF document suitable for printing or archiving.

Use Cases

  • Print a work order to hand to a technician or vendor
  • Archive a completed work order as a PDF
  • Attach a work order PDF to an email or document management system

Business Rules

  • Returns 400 with "Work Order not found" if the work order does not exist
  • Access is verified against portfolio restrictions; unauthorized requests are rejected
  • GET /maintenance/work-orders/{workOrderID} - Get work order details as JSON
Authorizations:
basicAuth
path Parameters
workOrderID
required
integer
Example: 2314

The unique work order ID to print

Responses

Response Headers
Cache-Control
string
Example: "no-cache"

Cache directive (always no-cache)

Content-Type
string
Example: "application/pdf"

MIME type of the response body

Response Schema: application/pdf
string <binary>

Response samples

Content type
application/json
{
  • "error": "Work Order not found"
}

Work Order Statuses

Create

Authorizations:
basicAuth
Request Body schema: application/json
primaryWorkOrderStatusID
required
string (primary_statuses)
Enum: 1 2 3 4
  • 1 - Pending
  • 2 - Open
  • 3 - Closed
  • 4 - On Hold
name
required
string

The name of the status

Responses

Response Schema: application/json
primaryWorkOrderStatusID
required
string (primary_statuses)
Enum: 1 2 3 4
  • 1 - Pending
  • 2 - Open
  • 3 - Closed
  • 4 - On Hold
name
required
string

The name of the status

workOrderStatusID
required
string
isSystemStatus
required
string

Indicates if the status is one of the 7 system statuses (Open, Completed, Cancelled, Requested, On Hold, Estimating, Rejected). Statuses created by user will not be a system status.

orderIndex
string

Request samples

Content type
application/json
{
  • "primaryWorkOrderStatusID": 1,
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "primaryWorkOrderStatusID": 1,
  • "name": "string",
  • "workOrderStatusID": "string",
  • "isSystemStatus": "string",
  • "orderIndex": "string"
}

List Work Order Statuses

Retrieve all work order statuses available in the account, including both system statuses and any custom statuses created by the account.

Use Cases

  • Display a list of available statuses in a settings page

Business Rules

  • Returns both system statuses (isSystemStatus = 1) and custom account statuses (isSystemStatus = 0)
  • System statuses cannot be renamed or deleted, only custom statuses can be managed
  • The 7 built-in system statuses are: Open, Completed, Cancelled, Requested, On Hold, Estimating, Rejected
  • GET /maintenance/work-order/statuses/{workOrderStatusID} - Get a specific status by ID
  • POST /maintenance/work-order/statuses - Create or update a custom status
Authorizations:
basicAuth
query Parameters
search
string
Example: search=open

Free-text search on status name

isSystemStatus
integer
Enum: 0 1
Example: isSystemStatus=1

Filter to system statuses only (1) or custom statuses only (0)

Responses

Response Schema: application/json
Array
required
object (work_order_status)

Response samples

Content type
application/json
[
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    }
]

Get Work Order Status

Retrieve a single work order status by its ID. Returns both system statuses and custom account statuses.

Use Cases

  • Look up the name and primary status group for a specific status ID
  • Validate that a status ID exists before assigning it to a work order
  • Check whether a given status is a system status or a custom one

Business Rules

  • Returns 400 with "Work Order Status {id} not found" if the status does not exist
  • Both system statuses and custom account statuses are accessible by ID
  • GET /maintenance/work-order/statuses - List all work order statuses
  • POST /maintenance/work-order/statuses/{workOrderStatusID} - Update a custom status
  • DELETE /maintenance/work-order/statuses/{workOrderStatusID} - Delete a custom status
Authorizations:
basicAuth
path Parameters
workOrderStatusID
required
integer
Example: 5

The unique work order status ID

Responses

Response Schema: application/json
required
object (work_order_status)

Response samples

Content type
application/json
Example
{
  • "workOrderStatus": {
    }
}

Delete Work Order Status

Delete a custom work order status. Only custom statuses (those with isSystemStatus = 0) can be deleted; system statuses are protected.

Use Cases

  • Remove an outdated or duplicate custom status
  • Clean up statuses that are no longer used in the account's workflow

Business Rules

  • Requires Manage Work Order Statuses permission
  • Returns 400 with "Work Order Status {id} not found" if the status does not exist
  • System statuses (isSystemStatus = 1) cannot be deleted via this endpoint
  • Any work orders that currently have this status may need to be reassigned manually
  • GET /maintenance/work-order/statuses - List all statuses
  • GET /maintenance/work-order/statuses/{workOrderStatusID} - Get a status by ID
Authorizations:
basicAuth
path Parameters
workOrderStatusID
required
integer
Example: 9

The unique work order status ID to delete

Responses

Response Schema: application/json
workOrderStatusID
required
string
primaryWorkOrderStatusID
required
string
isSystemStatus
required
string
name
required
string
orderIndex
required
string

Response samples

Content type
application/json
{
  • "workOrderStatusID": "9",
  • "primaryWorkOrderStatusID": "2",
  • "isSystemStatus": "0",
  • "name": "Tech Completed",
  • "orderIndex": "1"
}

Update Work Order Status

Update an existing custom work order status by ID.

Use Cases

  • Rename a custom status

Business Rules

  • Requires Manage Work Order Statuses permission
  • Returns 400 with "Work Order Status {id} not found" if the status does not exist
  • On success, forwards to the GET detail endpoint and returns the updated status wrapped in workOrderStatus
  • primaryWorkOrderStatusID cannot be modified
  • GET /maintenance/work-order/statuses/{workOrderStatusID} - Get status by ID
  • DELETE /maintenance/work-order/statuses/{workOrderStatusID} - Delete a custom status
  • GET /maintenance/work-order/statuses - List all statuses
Authorizations:
basicAuth
path Parameters
workOrderStatusID
required
integer
Example: 9

The unique work order status ID to update

Request Body schema: application/json
name
required
string

Display name for the custom status

primaryWorkOrderStatusID
required
integer
Enum: 1 2 3 4 5

The primary status group this custom status belongs to.

  • 1 - Pending
  • 2 - Open
  • 3 - Closed
  • 4 - On Hold
  • 5 - Cancelled

Responses

Response Schema: application/json
required
object (work_order_status)

Request samples

Content type
application/json
{
  • "name": "Tech Completed",
  • "primaryWorkOrderStatusID": 2
}

Response samples

Content type
application/json
{
  • "workOrderStatus": {
    }
}

Vendor Trades

Create

Authorizations:
basicAuth
Request Body schema: application/json
name
required
string

Name of the vendor trade

isVisibleTenantPortal
required
boolean

Indicates whether the trade is visible to the resident when they are creating work orders.

Responses

Response Schema: application/json
vendorTradeID
required
integer
name
required
string

Name of the vendor trade

isVisibleTenantPortal
required
boolean

Indicates whether the trade is visible to the resident when they are creating work orders.

Request samples

Content type
application/json
{
  • "name": "string",
  • "isVisibleTenantPortal": true
}

Response samples

Content type
application/json
{
  • "vendorTradeID": 0,
  • "name": "string",
  • "isVisibleTenantPortal": true
}

List

List vendor trades

Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
vendorTradeID
required
integer
name
required
string

Name of the vendor trade

isVisibleTenantPortal
required
boolean

Indicates whether the trade is visible to the resident when they are creating work orders.

Response samples

Content type
application/json
[
  • {
    }
]

Get Vendor Trade

Retrieve a single vendor trade (maintenance category) by ID.

Use Cases

  • Fetch the list of vendors associated with a trade via the vendors include

Available Includes (1)

  • vendors - Contacts assigned to this vendor trade (each with their contact)
  • GET /maintenance/vendor-trades - List all vendor trades
  • POST /maintenance/vendor-trades/{vendorTradeID} - Update a vendor trade
Authorizations:
basicAuth
path Parameters
vendorTradeID
required
integer
Example: 5

The unique vendor trade ID

query Parameters
includes
string
Example: includes=vendors

Comma-separated list of related objects. Available values: vendors.

Responses

Response Schema: application/json
required
object (vendor_trade)
vendors
Array of objects

Vendor contacts assigned to this trade (if includes=vendors). Each item includes the contact sub-object.

Response samples

Content type
application/json
{
  • "vendorTrade": {
    }
}

Update Vendor Trade

Update an existing vendor trade (maintenance category). Requires the ManageMaintenanceCategories permission.

Use Cases

  • Rename a vendor trade
  • Toggle resident portal visibility for a trade

Business Rules

  • Requires Manage Maintenance Categories permission
  • Returns 400 with "Maintenance Category {id} not found" if the trade does not exist
  • On success, forwards to the GET detail endpoint and returns the updated trade wrapped in vendorTrade
  • GET /maintenance/vendor-trades/{vendorTradeID} - Get vendor trade details
  • DELETE /maintenance/vendor-trades/{vendorTradeID} - Delete a vendor trade
  • GET /maintenance/vendor-trades - List all vendor trades
Authorizations:
basicAuth
path Parameters
vendorTradeID
required
integer
Example: 5

The unique vendor trade ID to update

Request Body schema: application/json
name
required
string

Name of the vendor trade / maintenance category

isVisibleTenantPortal
required
boolean

Whether residents can select this trade when submitting work orders via the Resident Portal

Responses

Response Schema: application/json
required
object (vendor_trade)

Request samples

Content type
application/json
{
  • "name": "Plumbing",
  • "isVisibleTenantPortal": true
}

Response samples

Content type
application/json
{
  • "vendorTrade": {
    }
}

Inspections

Create

Authorizations:
basicAuth
Request Body schema: application/json
unitID
required
integer (unit_id_required)

The unique id of the Unit object. See the Unit API for more information.

inspectionTypeID
required
integer (inspection_types)
Enum: 1 2 3 4
  • 1 - Pre-Inspection
  • 2 - Move In
  • 3 - Move Out
  • 4 - Inspection
inspectionStatusID
required
integer (inspection_statuses)
Enum: 1 2 3 4
  • 1 - Pending
  • 2 - In Progress
  • 3 - Pending Maintenance
  • 4 - Completed
description
string or null
scheduledDate
string or null <date>
inspectionDate
string or null <date>

Responses

Response Schema: application/json
inspectionID
required
integer
propertyID
required
integer
dateTimeCreated
required
string <date>
unitID
required
integer (unit_id_required)

The unique id of the Unit object. See the Unit API for more information.

inspectionTypeID
required
integer (inspection_types)
Enum: 1 2 3 4
  • 1 - Pre-Inspection
  • 2 - Move In
  • 3 - Move Out
  • 4 - Inspection
inspectionStatusID
required
integer (inspection_statuses)
Enum: 1 2 3 4
  • 1 - Pending
  • 2 - In Progress
  • 3 - Pending Maintenance
  • 4 - Completed
leaseID
integer or null
assignedToUserID
integer or null (assigned_to_user_id)

The Rentvine user id of the user assigned to object.

description
string or null
scheduledDate
string or null <date>
inspectionDate
string or null <date>

Request samples

Content type
application/json
{
  • "unitID": 0,
  • "inspectionTypeID": 1,
  • "inspectionStatusID": 1,
  • "description": "string",
  • "scheduledDate": "2019-08-24",
  • "inspectionDate": "2019-08-24"
}

Response samples

Content type
application/json
{
  • "inspectionID": 0,
  • "propertyID": 0,
  • "leaseID": 0,
  • "assignedToUserID": 0,
  • "dateTimeCreated": "2019-08-24",
  • "unitID": 0,
  • "inspectionTypeID": 1,
  • "inspectionStatusID": 1,
  • "description": "string",
  • "scheduledDate": "2019-08-24",
  • "inspectionDate": "2019-08-24"
}

List

List of inspections

Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 15

Number of items per page

Responses

Response Schema: application/json
Array
inspectionID
required
integer
propertyID
required
integer
dateTimeCreated
required
string <date>
unitID
required
integer (unit_id_required)

The unique id of the Unit object. See the Unit API for more information.

inspectionTypeID
required
integer (inspection_types)
Enum: 1 2 3 4
  • 1 - Pre-Inspection
  • 2 - Move In
  • 3 - Move Out
  • 4 - Inspection
inspectionStatusID
required
integer (inspection_statuses)
Enum: 1 2 3 4
  • 1 - Pending
  • 2 - In Progress
  • 3 - Pending Maintenance
  • 4 - Completed
leaseID
integer or null
assignedToUserID
integer or null (assigned_to_user_id)

The Rentvine user id of the user assigned to object.

description
string or null
scheduledDate
string or null <date>
inspectionDate
string or null <date>

Response samples

Content type
application/json
[
  • {
    }
]

View

View inspection

Authorizations:
basicAuth
path Parameters
inspectionID
required
integer

Responses

Response Schema: application/json
inspectionID
required
integer
propertyID
required
integer
dateTimeCreated
required
string <date>
unitID
required
integer (unit_id_required)

The unique id of the Unit object. See the Unit API for more information.

inspectionTypeID
required
integer (inspection_types)
Enum: 1 2 3 4
  • 1 - Pre-Inspection
  • 2 - Move In
  • 3 - Move Out
  • 4 - Inspection
inspectionStatusID
required
integer (inspection_statuses)
Enum: 1 2 3 4
  • 1 - Pending
  • 2 - In Progress
  • 3 - Pending Maintenance
  • 4 - Completed
leaseID
integer or null
assignedToUserID
integer or null (assigned_to_user_id)

The Rentvine user id of the user assigned to object.

description
string or null
scheduledDate
string or null <date>
inspectionDate
string or null <date>

Response samples

Content type
application/json
{
  • "inspectionID": 0,
  • "propertyID": 0,
  • "leaseID": 0,
  • "assignedToUserID": 0,
  • "dateTimeCreated": "2019-08-24",
  • "unitID": 0,
  • "inspectionTypeID": 1,
  • "inspectionStatusID": 1,
  • "description": "string",
  • "scheduledDate": "2019-08-24",
  • "inspectionDate": "2019-08-24"
}

Materials

List Materials

Returns a paginated list of inventory materials available for use on work orders.

Use Cases

  • Search for a specific material by name, description, or UPC

Business Rules

  • search matches against name, description, and upc fields
  • isActive defaults to all active materials when omitted
  • GET /maintenance/materials/{materialID} — retrieve a single material with file detail
  • POST /maintenance/materials — create a new material
  • POST /maintenance/materials/{materialID} — update an existing material
  • DELETE /maintenance/materials/{materialID} — delete a material
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25
Example: pageSize=100

Number of results per page. Defaults to 25.

search
string
Example: search=Drywall

Full-text search against material name, description, and UPC

isActive
integer
Enum: 0 1
Example: isActive=1

Filter by active status. 1 = active, 0 = inactive

purchasePriceMin
number
Example: purchasePriceMin=5

Filter materials with a purchase price at or above this value

purchasePriceMax
number
Example: purchasePriceMax=500

Filter materials with a purchase price at or below this value

sellPriceMin
number
Example: sellPriceMin=10

Filter materials with a sell price at or above this value

sellPriceMax
number
Example: sellPriceMax=1000

Filter materials with a sell price at or below this value

orderBy
string
Example: orderBy=material.name

Sort field in dot-notation. Prefix with - for descending order. Available values: material.name, material.description, material.isActive, material.upc, material.purchasePrice, material.sellPrice

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 42

Total number of items across all pages

pagination-total-pages
integer
Example: 2

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 2

Last page number

Response Schema: application/json
Array
required
object (material)

Fields accepted when creating or updating a maintenance material (inventory item). Only name and sellPrice are required on create; all other fields are optional. For updates, send only the fields being changed.

Response samples

Content type
application/json
Example
[
  • {
    },
  • {
    }
]

Create Material

Creates a new maintenance material in the inventory catalog. On success, returns the full material detail (same shape as GET /maintenance/materials/{materialID}).

Use Cases

  • Add a new item to the materials catalog for use on work orders
  • Import materials from an external catalog by name and price

Business Rules

  • name and sellPrice are the only required fields
  • isActive defaults to 1 (active) when not supplied
  • name must be unique among non-deleted materials (max 200 characters)
  • purchasePrice and sellPrice must be valid decimal amounts
  • GET /maintenance/materials — list all materials
  • GET /maintenance/materials/{materialID} — retrieve the created material
  • POST /maintenance/materials/{materialID} — update an existing material
Authorizations:
basicAuth
Request Body schema: application/json
name
required
string <= 200 characters

Display name of the material

sellPrice
required
string

Price charged when the material is used on a work order (decimal as string)

description
string or null <= 4000 characters

Optional description or supplier note

isActive
integer
Default: 1
Enum: 0 1

Active status. 1 = active, 0 = inactive

upc
string or null

Universal Product Code

purchasePrice
string or null

Cost to purchase the material (decimal as string)

Responses

Response Schema: application/json
required
object (material)

Fields accepted when creating or updating a maintenance material (inventory item). Only name and sellPrice are required on create; all other fields are optional. For updates, send only the fields being changed.

Request samples

Content type
application/json
Example
{
  • "name": "New Item Name",
  • "sellPrice": "12.00"
}

Response samples

Content type
application/json
{
  • "material": {
    }
}

Get Material

Retrieves a single maintenance material by ID

Use Cases

  • Display full material detail in a management UI
  • Verify material data after creation or update

Business Rules

  • Returns 400 with "Material {id} not found" if the material does not exist or has been deleted
  • GET /maintenance/materials — list all materials
  • POST /maintenance/materials/{materialID} — update this material
  • DELETE /maintenance/materials/{materialID} — delete this material
Authorizations:
basicAuth
path Parameters
materialID
required
integer
Example: 8

The unique material ID

Responses

Response Schema: application/json
required
object (material)

Fields accepted when creating or updating a maintenance material (inventory item). Only name and sellPrice are required on create; all other fields are optional. For updates, send only the fields being changed.

required
object

Image file associated with the material, if any

Response samples

Content type
application/json
{
  • "material": {
    },
  • "file": {
    }
}

Update Material

Updates an existing maintenance material. Only send the fields you want to change — omitted fields are left unchanged. On success, returns the full updated material detail.

Use Cases

  • Adjust the sell price of a material after a supplier price change
  • Update the description or UPC of an existing item

Business Rules

  • Returns 400 with "Material {id} not found" if the material does not exist
  • name must remain unique among non-deleted materials if changed
  • purchasePrice and sellPrice must be valid decimal amounts when supplied
  • GET /maintenance/materials/{materialID} — retrieve current material state
  • GET /maintenance/materials — list all materials
  • DELETE /maintenance/materials/{materialID} — delete this material
Authorizations:
basicAuth
path Parameters
materialID
required
integer
Example: 13

The unique material ID

Request Body schema: application/json
name
string <= 200 characters

Display name of the material

description
string or null <= 4000 characters

Optional description or supplier note

isActive
string or integer

Active status. 1 = active, 0 = inactive

upc
string or null

Universal Product Code

purchasePrice
string or null

Cost to purchase the material (decimal as string)

sellPrice
string

Price charged when the material is used on a work order

imageFileID
integer or null

File ID of an associated image

Responses

Response Schema: application/json
required
object (material)

Fields accepted when creating or updating a maintenance material (inventory item). Only name and sellPrice are required on create; all other fields are optional. For updates, send only the fields being changed.

Request samples

Content type
application/json
Example
{
  • "sellPrice": "10.00"
}

Response samples

Content type
application/json
{
  • "material": {
    }
}

Delete Material

Deletes a maintenance material by setting isDeleted = 1. The record is retained in the database and the response includes the final state of the material.

Use Cases

  • Remove a discontinued item from the active material catalog
  • Clean up test or duplicate materials

Business Rules

  • Returns 400 with "Material {id} not found" if the material does not exist\
  • Deleted materials no longer appear in GET /maintenance/materials list results
  • Deletion is a permanent delete: the record is removed from the database
  • GET /maintenance/materials — list active materials
  • POST /maintenance/materials — create a replacement material
Authorizations:
basicAuth
path Parameters
materialID
required
integer
Example: 13

The unique material ID to delete

Responses

Response Schema: application/json
materialID
required
string

Unique identifier for the material

name
required
string

Display name of the material

isDeleted
required
integer

Soft-delete flag. Always 1 in this response.

dateTimeCreated
required
string <date-time>

Timestamp when the material was created

dateTimeModified
required
string <date-time>

Timestamp of the delete operation

description
string or null

Optional description or supplier note

isActive
string

Active status

upc
string or null

Universal Product Code

purchasePrice
string or null

Cost to purchase the material

sellPrice
string

Price charged when the material is used on a work order

imageFileID
integer or null

File ID of the associated image

Response samples

Content type
application/json
{
  • "materialID": "13",
  • "name": "New Item Name",
  • "description": null,
  • "isActive": "1",
  • "upc": null,
  • "purchasePrice": null,
  • "sellPrice": "10.00",
  • "imageFileID": null,
  • "dateTimeCreated": "2026-04-24 22:41:08",
  • "dateTimeModified": "2026-04-24 22:46:20",
  • "isDeleted": 1
}

Labor Rates

List Labor Rates

Returns a paginated list of maintenance labor rates. Supports full-text search and rate-range filtering. Results exclude soft-deleted records by default.

Use Cases

  • Search for a specific rate by name

Business Rules

  • search matches against the name field
  • GET /maintenance/labor-rates/{laborRateID} — retrieve a single labor rate
  • POST /maintenance/labor-rates — create a new labor rate
  • POST /maintenance/labor-rates/{laborRateID} — update an existing labor rate
  • DELETE /maintenance/labor-rates/{laborRateID} — delete a labor rate
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25
Example: pageSize=15

Number of results per page. Defaults to 25.

search
string
Example: search=Jake

Full-text search against labor rate name

laborRateID
integer
Example: laborRateID=7

Filter to a specific labor rate by ID

laborRateIDs
string
Example: laborRateIDs=2,4,7

Filter to a set of labor rate IDs (comma-separated)

rateMin
number
Example: rateMin=10

Filter labor rates with a rate at or above this value

rateMax
number
Example: rateMax=100

Filter labor rates with a rate at or below this value

isDeleted
integer
Default: 0
Enum: 0 1

Filter by deleted status. Defaults to 0 (active only). Pass 1 to include deleted records.

orderBy
string
Example: orderBy=laborRate.name

Sort field in dot-notation. Prefix with - for descending order. Available values: laborRate.name, laborRate.rate, laborRate.hourlyRate

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 7

Total number of items across all pages

pagination-total-pages
integer
Example: 1

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 1

Last page number

Response Schema: application/json
Array
required
object (labor_rate)

Fields accepted when creating or updating a maintenance labor rate. name and rate are required; all other fields are optional. For updates, send only the fields being changed.

Response samples

Content type
application/json
Example
[
  • {
    },
  • {
    },
  • {
    }
]

Create Labor Rate

Creates a new maintenance labor rate. On success, returns the created labor rate as a flat object.

Use Cases

  • Add a new labor rate to the catalog for use on work order line items

Business Rules

  • name, rate, and hourlyRate are required; description is optional
  • name must be unique among non-deleted labor rates
  • rate and hourlyRate must be non-negative decimal amounts; zero is allowed
  • GET /maintenance/labor-rates — list all labor rates
  • GET /maintenance/labor-rates/{laborRateID} — retrieve the created labor rate
  • POST /maintenance/labor-rates/{laborRateID} — update an existing labor rate
Authorizations:
basicAuth
Request Body schema: application/json
name
required
string

Display name of the labor rate

rate
required
string

Rate charged to Owner for this labor type (decimal as string). Zero is allowed.

hourlyRate
required
string or null

The Technician's hourly rate (decimal as string). Zero is allowed. Null when not applicable.

description
string or null

Optional description of the labor rate

Responses

Response Schema: application/json
name
required
string

Display name of the labor rate

rate
required
string

Rate charged to Owner for this labor type (decimal as string). Zero is allowed.

hourlyRate
required
string or null

The Technician's hourly rate (decimal as string). Zero is allowed. Null when not applicable.

laborRateID
required
string

Unique identifier for the labor rate

dateTimeCreated
required
string <date-time>

Timestamp when the labor rate was created

dateTimeModified
required
string <date-time>

Timestamp when the labor rate was last modified

description
string or null

Optional description of the labor rate

isDeleted
string or integer

Makes the labor rate Non-Billable

Request samples

Content type
application/json
Example
{
  • "name": "New Labor Item",
  • "rate": "5.00"
}

Response samples

Content type
application/json
{
  • "laborRateID": "8",
  • "name": "New Labor Item",
  • "description": null,
  • "rate": "5.00",
  • "hourlyRate": "10.00",
  • "isDeleted": 0,
  • "dateTimeCreated": "2026-04-24 23:04:24",
  • "dateTimeModified": "2026-04-24 23:04:24"
}

Get Labor Rate

Retrieves a single maintenance labor rate by ID. Returns a flat object (no wrapper key).

Use Cases

  • Display full labor rate detail in a management UI
  • Verify labor rate data after creation or update

Business Rules

  • Returns 400 with "Labor Rate {id} not found" if the labor rate does not exist
  • GET /maintenance/labor-rates — list all labor rates
  • POST /maintenance/labor-rates/{laborRateID} — update this labor rate
  • DELETE /maintenance/labor-rates/{laborRateID} — delete this labor rate
Authorizations:
basicAuth
path Parameters
laborRateID
required
integer
Example: 7

The unique labor rate ID

Responses

Response Schema: application/json
name
required
string

Display name of the labor rate

rate
required
string

Rate charged to Owner for this labor type (decimal as string). Zero is allowed.

hourlyRate
required
string or null

The Technician's hourly rate (decimal as string). Zero is allowed. Null when not applicable.

laborRateID
required
string

Unique identifier for the labor rate

dateTimeCreated
required
string <date-time>

Timestamp when the labor rate was created

dateTimeModified
required
string <date-time>

Timestamp when the labor rate was last modified

description
string or null

Optional description of the labor rate

isDeleted
string or integer

Makes the labor rate Non-Billable

Response samples

Content type
application/json
{
  • "laborRateID": "7",
  • "name": "Jake Internal Maintenance Tech",
  • "description": "Test",
  • "rate": "25.00",
  • "hourlyRate": "20.00",
  • "isDeleted": "0",
  • "dateTimeCreated": "2026-02-27 16:18:41",
  • "dateTimeModified": "2026-02-27 16:18:41"
}

Update Labor Rate

Updates an existing maintenance labor rate. Only send the fields you want to change — omitted fields are left unchanged. Returns the updated labor rate as a flat object.

Use Cases

  • Adjust the rate for a labor type after a cost review
  • Update the name or description of an existing rate
  • Set the hourly rate on a labor item that previously had none

Business Rules

  • Returns 400 with "Labor Rate {id} not found" if the labor rate does not exist
  • name must remain unique among non-deleted labor rates if changed
  • rate and hourlyRate must be non-negative decimal amounts when supplied; zero is allowed
  • laborRateID, dateTimeCreated, and dateTimeModified in the request body are accepted but ignored
  • GET /maintenance/labor-rates/{laborRateID} — retrieve current labor rate state
  • GET /maintenance/labor-rates — list all labor rates
  • DELETE /maintenance/labor-rates/{laborRateID} — delete this labor rate
Authorizations:
basicAuth
path Parameters
laborRateID
required
integer
Example: 7

The unique labor rate ID

Request Body schema: application/json
name
string <= 200 characters

Display name of the labor rate

description
string or null <= 4000 characters

Optional description

rate
string

Flat rate charged (decimal as string). Zero is allowed.

hourlyRate
string or null

Hourly cost rate (decimal as string). Zero is allowed.

Responses

Response Schema: application/json
name
required
string

Display name of the labor rate

rate
required
string

Rate charged to Owner for this labor type (decimal as string). Zero is allowed.

hourlyRate
required
string or null

The Technician's hourly rate (decimal as string). Zero is allowed. Null when not applicable.

laborRateID
required
string

Unique identifier for the labor rate

dateTimeCreated
required
string <date-time>

Timestamp when the labor rate was created

dateTimeModified
required
string <date-time>

Timestamp when the labor rate was last modified

description
string or null

Optional description of the labor rate

isDeleted
string or integer

Makes the labor rate Non-Billable

Request samples

Content type
application/json
Example
{
  • "rate": "0.00"
}

Response samples

Content type
application/json
{
  • "laborRateID": "7",
  • "name": "Jake Internal Maintenance Tech",
  • "description": "Test",
  • "rate": "0.00",
  • "hourlyRate": "20.00",
  • "isDeleted": "0",
  • "dateTimeCreated": "2026-02-27 16:18:41",
  • "dateTimeModified": "2026-02-27 16:18:41"
}

Delete Labor Rate

Deletes a labor rate from the catalog. The record is removed from the database. Returns a success confirmation.

Use Cases

  • Remove a discontinued labor rate from the active catalog
  • Clean up duplicate or test labor rates

Business Rules

  • Returns 400 with "Labor Rate {id} not found" if the labor rate does not exist
  • Deleted labor rates no longer appear in GET /maintenance/labor-rates by default
  • GET /maintenance/labor-rates — list active labor rates
  • POST /maintenance/labor-rates — create a replacement labor rate
Authorizations:
basicAuth
path Parameters
laborRateID
required
integer
Example: 7

The unique labor rate ID to delete

Responses

Response Schema: application/json
success
required
boolean

Always true on successful deletion

message
required
string

Confirmation message

Response samples

Content type
application/json
{
  • "success": true,
  • "message": "Labor rate deleted successfully"
}

Portfolios

List Portfolios

Returns a paginated list of portfolios with their associated statement settings. Each result item wraps the portfolio and its statement setting in keyed properties. Use /portfolios/search for advanced filtering by reserve amount, hold distributions, tags, portfolio groups, and assigned users.

Use Cases

  • Display a paginated list of all portfolios in the account
  • Filter to active or inactive portfolios
  • Filter to portfolios that send statements
  • Exclude a specific portfolio from results (e.g., for a reassignment UI)

Business Rules

  • Results are scoped to the authenticated account; cross-account data is never returned
  • Portfolio access is restricted based on the user's portfolio group assignments
  • isActive defaults to 1 — only active portfolios are returned unless explicitly set to 0
  • GET /portfolios/search - Advanced filtered search with denormalized columns and additional filters
  • GET /portfolios/{portfolioID} - Full portfolio detail with optional includes
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=Sunset

Free-text search across portfolio name and owner contact names.

isActive
boolean
sendStatements
integer
Enum: 0 1
Example: sendStatements=1

Filter to portfolios that have statement sending enabled (1) or disabled (0).

excludePortfolioID
integer
Example: excludePortfolioID=150

Exclude a specific portfolio from results by its ID.

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 84

Total number of items across all pages

pagination-total-pages
integer
Example: 4

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 4

Last page number

Response Schema: application/json
Array
required
object (portfolio)

Represents a portfolio — the ownership and financial management unit for one or more rental properties. Each portfolio tracks owner contacts, distribution rules, reserve requirements, and statement settings.

token
required
string

Opaque pagination token for this row.

Response samples

Content type
application/json
[
  • {
    }
]

Create Portfolio

Creates a new portfolio with the provided name, financial settings, owner assignments, and optional group memberships. On success the newly created portfolio is returned in the same shape as GET /portfolios/{portfolioID}.

Use Cases

  • Create a new owner portfolio when onboarding a property owner
  • Programmatically provision portfolios with pre-configured reserve and distribution rules
  • Bulk-create portfolios during a data migration by supplying attachments file IDs

Business Rules

  • Requires the UpdatePortfolio permission
  • owners must be supplied as an array; each entry requires contactID, percentOwned, and percentDistributed
  • isLiveLedgerEnabled accepts -1 to reset the value to null (account default); any other value is stored as-is
  • portfolioGroupIDs assigns the new portfolio to one or more portfolio groups
  • attachments is an array of existing file IDs to attach to the portfolio on creation
  • GET /portfolios/{portfolioID} - Retrieve the created portfolio
  • POST /portfolios/{portfolioID} - Update portfolio settings
  • POST /portfolios/{portfolioID}/owners - Sync owner list after creation
Authorizations:
basicAuth
Request Body schema: application/json
name
required
string

Display name of the portfolio.

code
string or null

Optional short reference code for the portfolio.

postingSettingID
integer or null

ID of the posting setting template to assign.

statementSettingID
integer or null

ID of the statement setting template to assign.

sendStatements
integer
Enum: 0 1

Whether to send owner statements. 1 = enabled, 0 = disabled.

payoutAmount
string or null

Fixed payout amount (decimal string), if applicable.

fiscalYearEndMonth
integer

Month number (1–12) when the fiscal year ends.

minimumDistributionAmount
string

Minimum distribution amount (decimal string).

maximumDistributionAmount
string

Maximum distribution amount per cycle (decimal string).

overdraftOverrideAmount
string

Amount the balance can go negative before blocking transactions (decimal string).

additionalReserveAmount
string

Additional reserve on top of the base reserve (decimal string).

additionalReserveDescription
string or null

Explanation of the additional reserve amount.

holdDistributions
integer
Enum: 0 1

Whether to hold distributions. 1 = held, 0 = normal.

isLiveLedgerEnabled
integer or null

Real-time ledger updates. Pass -1 to reset to account default (stored as null).

isBalanceNoticeDisabled
integer
Enum: 0 1

Whether to suppress balance notice emails. 1 = disabled, 0 = enabled.

Array of objects

Initial owner assignments for the portfolio.

portfolioGroupIDs
Array of integers

IDs of portfolio groups to add this portfolio to.

attachments
Array of integers

File IDs to attach to the new portfolio.

Responses

Response Schema: application/json
required
object (portfolio)

Represents a portfolio — the ownership and financial management unit for one or more rental properties. Each portfolio tracks owner contacts, distribution rules, reserve requirements, and statement settings.

Request samples

Content type
application/json
Example
{
  • "name": "456 Oak Ave - Johnson",
  • "postingSettingID": 3,
  • "statementSettingID": 1,
  • "sendStatements": 1,
  • "fiscalYearEndMonth": 12,
  • "minimumDistributionAmount": "0.00",
  • "maximumDistributionAmount": "5000.00",
  • "reserveAmount": "500.00",
  • "overdraftOverrideAmount": "100.00",
  • "additionalReserveAmount": "0.00",
  • "holdDistributions": 0,
  • "isBalanceNoticeDisabled": 0,
  • "owners": [
    ]
}

Response samples

Content type
application/json
{
  • "portfolio": {
    }
}

Search Portfolios

Performs an advanced, paginated search across portfolios. Returns denormalized rows combining portfolio data, statement setting details, derived property counts, owner contact names, and the most recent statement — ideal for list views and reporting dashboards.

Use Cases

  • Power the portfolio list UI with rich filter controls (reserve range, hold status, tags, assigned users)
  • Find portfolios by portfolio group, property group, or payout batch membership
  • Retrieve portfolios modified within a date range for sync/integration workflows

Business Rules

  • Results are scoped to the authenticated account; cross-account data is never returned
  • Portfolio access is restricted based on the user's portfolio group assignments
  • propertyCount is a derived column counting properties currently assigned to the portfolio
  • contactNames is a derived comma-separated string of owner contact names
  • GET /portfolios - Basic paginated list (fewer filters, lighter payload)
  • GET /portfolios/{portfolioID} - Full portfolio detail with optional includes
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25
Example: pageSize=25

Number of results per page.

search
string
Example: search=Sunset

Free-text search across portfolio name, code, and owner contact names.

isActive
integer
Enum: 0 1
Example: isActive=1

Filter by active status. Pass 1 for active, 0 for inactive.

portfolioIDs[]
Array of integers
Example: portfolioIDs[]=150

Filter to specific portfolios by ID. Pass multiple values as portfolioIDs[0]=150&portfolioIDs[1]=200.

postingSettingIDs[]
Array of integers
Example: postingSettingIDs[]=3

Filter to portfolios using specific posting settings.

statementSettingIDs[]
Array of integers
Example: statementSettingIDs[]=12

Filter to portfolios using specific statement settings.

portfolioGroupIDs[]
Array of integers
Example: portfolioGroupIDs[]=5

Filter to portfolios belonging to specific portfolio groups.

propertyGroupIDs[]
Array of integers
Example: propertyGroupIDs[]=8

Filter to portfolios that have at least one property in the specified property groups.

tagIDs[]
Array of integers
Example: tagIDs[]=22

Filter to portfolios tagged with specific tag IDs.

reserveAmountMin
number
Example: reserveAmountMin=500

Filter to portfolios with a reserve amount at or above this value.

reserveAmountMax
number
Example: reserveAmountMax=5000

Filter to portfolios with a reserve amount at or below this value.

holdDistributions
integer
Enum: 0 1

Filter by distribution hold status. 1 returns portfolios with distributions on hold.

hasAdditionalReserve
integer
Enum: 0 1
Example: hasAdditionalReserve=1

Filter to portfolios that have an additional reserve amount greater than zero.

sendStatements
integer
Enum: 0 1
Example: sendStatements=1

Filter by statement sending preference.

dateTimeModifiedMin
string <date-time>
Example: dateTimeModifiedMin=2024-01-01T00:00:00Z

Filter to portfolios modified on or after this datetime (ISO 8601).

dateTimeModifiedMax
string <date-time>
Example: dateTimeModifiedMax=2024-12-31T23:59:59Z

Filter to portfolios modified on or before this datetime (ISO 8601).

dateClosedMin
string <date>
Example: dateClosedMin=2024-01-01

Filter to portfolios closed on or after this date.

dateClosedMax
string <date>
Example: dateClosedMax=2024-12-31

Filter to portfolios closed on or before this date.

portfolioAssignedToUserIDs[]
Array of integers
Example: portfolioAssignedToUserIDs[]=42

Filter to portfolios assigned to specific users.

propertyAssignedToUserIDs[]
Array of integers
Example: propertyAssignedToUserIDs[]=42

Filter to portfolios that have at least one property assigned to specific users.

payoutBatchID
integer
Example: payoutBatchID=300

Filter to portfolios included in a specific payout batch.

orderBy
string
Example: orderBy=name

Field to sort results by.

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 84

Total number of items across all pages

pagination-total-pages
integer
Example: 4

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 4

Last page number

Response Schema: application/json
Array
required
object
required
object
required
object or null

Most recent statement for this portfolio, or null if none exists.

Response samples

Content type
application/json
[
  • {
    }
]

Get Portfolio

Returns the full detail for a single portfolio by its ID. The response always includes the core portfolio object; additional related data can be requested via the includes query parameter.

Use Cases

  • Load a portfolio detail page in the manager UI
  • Fetch owner and ledger context for distribution or accounting workflows

Business Rules

  • Access is restricted to portfolios the authenticated user's portfolio group assignments permit
  • isLiveLedgerEnabled of null means the account-level default applies; -1 is used by the update endpoint to reset to null, but the GET response always returns null or a boolean

Available Includes (4)

  • owners — List of portfolio owners, each with contact data included
  • ledger — The portfolio's accounting ledger record
  • posting — The posting setting template assigned to the portfolio
  • statementSetting — The statement setting template assigned to the portfolio
  • GET /portfolios - Paginated portfolio list
  • GET /portfolios/{portfolioID}/owners - List owners for the portfolio
  • GET /portfolios/{portfolioID}/statements - List statements for the portfolio
Authorizations:
basicAuth
path Parameters
portfolioID
required
integer
Example: 150

The ID of the portfolio to retrieve.

query Parameters
includes
string
Example: includes=owners,statementSetting

Comma-separated list of related data to include in the response. Available values: owners, ledger, posting, statementSetting

Responses

Response Schema: application/json
required
object (portfolio)

Represents a portfolio — the ownership and financial management unit for one or more rental properties. Each portfolio tracks owner contacts, distribution rules, reserve requirements, and statement settings.

Array of objects

Portfolio owners with contact data (if includes=owners).

object or null

The portfolio's accounting ledger record (if includes=ledger).

object or null

The posting setting template (if includes=posting).

object (statement_setting)

A statement setting template that controls how owner statements are generated and which modules are included.

Response samples

Content type
application/json
{
  • "portfolio": {
    }
}

Update Portfolio

Updates the settings for an existing portfolio. Only the fields present in the request body are written; omitted fields retain their current values. On success the updated portfolio is returned in the same shape as GET /portfolios/{portfolioID}.

Use Cases

  • Edit reserve amounts, distribution thresholds, or posting/statement settings
  • Reassign the portfolio to a different user (assignedToUserID)
  • Close a portfolio by setting dateClosed
  • Toggle live ledger, balance notices, or distribution hold

Business Rules

  • Requires the UpdatePortfolio permission
  • The caller must be permitted to access this portfolio via portfolio group restrictions
  • isLiveLedgerEnabled accepts -1 to reset the value to null (account default)
  • dateClosed accepts an ISO date string (YYYY-MM-DD); set to null to reopen
  • GET /portfolios/{portfolioID} - Retrieve current portfolio state
  • POST /portfolios/{portfolioID}/activate - Reactivate a deactivated portfolio
  • POST /portfolios/{portfolioID}/deactivate - Deactivate a portfolio
  • POST /portfolios/{portfolioID}/owners - Sync the owner list independently
Authorizations:
basicAuth
path Parameters
portfolioID
required
integer
Example: 279

The ID of the portfolio to update.

Request Body schema: application/json
name
string

Display name of the portfolio.

code
string or null

Optional short reference code.

postingSettingID
integer or null

ID of the posting setting template to assign.

statementSettingID
integer or null

ID of the statement setting template to assign.

sendStatements
integer
Enum: 0 1

Whether to send owner statements.

fiscalYearEndMonth
integer

Month number (1–12) when the fiscal year ends.

minimumDistributionAmount
string

Minimum distribution amount (decimal string).

maximumDistributionAmount
string

Maximum distribution amount per cycle (decimal string).

overdraftOverrideAmount
string

Amount the balance can go negative before blocking transactions (decimal string).

additionalReserveAmount
string

Additional reserve on top of the base reserve (decimal string).

additionalReserveDescription
string or null

Explanation of the additional reserve amount.

holdDistributions
integer
Enum: 0 1

Whether to hold distributions.

holdDistributionsDescription
string or null

Reason distributions are being held.

isLiveLedgerEnabled
integer or null

Real-time ledger updates. Pass -1 to reset to account default (stored as null).

isBalanceNoticeDisabled
integer
Enum: 0 1

Whether to suppress balance notice emails.

dateClosed
string or null

Date the portfolio was closed (YYYY-MM-DD). Set to null to reopen.

assignedToUserID
integer or null

ID of the user assigned to manage this portfolio.

Responses

Response Schema: application/json
required
object (portfolio)

Represents a portfolio — the ownership and financial management unit for one or more rental properties. Each portfolio tracks owner contacts, distribution rules, reserve requirements, and statement settings.

Request samples

Content type
application/json
{
  • "name": "456 Oak Ave - Johnson (Updated)",
  • "reserveAmount": "750.00",
  • "maximumDistributionAmount": "6000.00",
  • "assignedToUserID": 491061,
  • "holdDistributions": 0
}

Response samples

Content type
application/json
{
  • "portfolio": {
    }
}

Activate Portfolio

Reactivates a previously deactivated portfolio. On success the updated portfolio is returned in the same shape as GET /portfolios/{portfolioID}.

Use Cases

  • Reactivate a portfolio that was deactivated in error
  • Restore a portfolio after a temporary hold period

Business Rules

  • Requires the UpdatePortfolio permission
  • The caller must be permitted to access this portfolio via portfolio group restrictions
  • No request body is required; the action takes no input fields
  • Sets isActive to "1" and clears dateTimeDeactivated
  • POST /portfolios/{portfolioID}/deactivate - Deactivate a portfolio
  • GET /portfolios/{portfolioID} - Retrieve current portfolio state
Authorizations:
basicAuth
path Parameters
portfolioID
required
integer
Example: 279

The ID of the portfolio to activate.

Responses

Response Schema: application/json
required
object (portfolio)

Represents a portfolio — the ownership and financial management unit for one or more rental properties. Each portfolio tracks owner contacts, distribution rules, reserve requirements, and statement settings.

Response samples

Content type
application/json
{
  • "portfolio": {
    }
}

Deactivate Portfolio

Deactivates an active portfolio, optionally recording a closure date. On success the updated portfolio is returned in the same shape as GET /portfolios/{portfolioID}.

Use Cases

  • Mark a portfolio as inactive when the management agreement ends
  • Close a portfolio and record the official closure date for accounting purposes

Business Rules

  • Requires the UpdatePortfolio permission
  • The caller must be permitted to access this portfolio via portfolio group restrictions
  • dateClosed is optional; when supplied it must be a valid date string (YYYY-MM-DD)
  • Sets isActive to "0" and records dateTimeDeactivated
  • POST /portfolios/{portfolioID}/activate - Reactivate a deactivated portfolio
  • GET /portfolios/{portfolioID} - Retrieve current portfolio state
Authorizations:
basicAuth
path Parameters
portfolioID
required
integer
Example: 279

The ID of the portfolio to deactivate.

Request Body schema: application/json
dateClosed
string or null

Date the portfolio was officially closed (YYYY-MM-DD).

Responses

Response Schema: application/json
required
object (portfolio)

Represents a portfolio — the ownership and financial management unit for one or more rental properties. Each portfolio tracks owner contacts, distribution rules, reserve requirements, and statement settings.

Request samples

Content type
application/json
{
  • "dateClosed": "2026-04-30"
}

Response samples

Content type
application/json
{
  • "portfolio": {
    }
}

List Portfolio Owners

Returns a list of owners for a specific portfolio. Each item contains an owner object with the ownership and payout configuration, plus a token value used for cache validation. Use the includes parameter to attach the full contact record for each owner.

Use Cases

  • Display the owner list on a portfolio detail page
  • Build owner distribution summaries or payout previews
  • Fetch owner data for ACH / check payout workflows

Business Rules

  • The caller must have access to the specified portfolio (enforced via portfolio group restrictions)
  • Results are not paginated at the model level when includes are used; the search returns all owners for the portfolio

Available Includes (1)

  • contact — The full contact record for the owner (name, email, address, phone numbers)
  • GET /portfolios/{portfolioID}/owners/{portfolioOwnerID} - Single owner detail with includes
  • GET /portfolios/{portfolioID}/owners/{portfolioOwnerID}/ach-details - Decrypted ACH bank account info
  • GET /portfolios/{portfolioID} - Portfolio detail (also supports owners include)
Authorizations:
basicAuth
path Parameters
portfolioID
required
integer
Example: 279

The ID of the portfolio whose owners to retrieve.

query Parameters
search
string
Example: search=Smith

Free-text search across owner contact names.

includes
string
Example: includes=contact

Comma-separated list of related data to include in the response. Available values: contact

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 3

Total number of items across all pages

pagination-total-pages
integer
Example: 1

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 1

Last page number

Response Schema: application/json
Array
required
object (portfolio_owner)

Represents an owner's stake in a portfolio, including ownership percentage, distribution settings, and payout configuration.

token
required
string

Cache token for the owner record.

Response samples

Content type
application/json
[
  • {
    },
  • {
    },
  • {
    }
]

Sync Portfolio Owners

Replaces the full owner list for a portfolio in a single operation. All existing owners are removed and the supplied owners array is set as the new authoritative list. On success the updated owner list is returned in the same paginated shape as GET /portfolios/{portfolioID}/owners.

Use Cases

  • Set or completely replace the owner roster after a portfolio change-of-ownership
  • Programmatically sync owner data from an external system

Business Rules

  • Requires the UpdatePortfolio permission
  • The caller must be permitted to access this portfolio via portfolio group restrictions
  • owners is required and must be a non-empty array; each entry requires contactID, percentOwned, and percentDistributed
  • This is a full replace, not a merge — owners not present in the payload will be removed
  • GET /portfolios/{portfolioID}/owners - List current owners
  • GET /portfolios/{portfolioID}/owners/{portfolioOwnerID} - Single owner detail
  • POST /portfolios/{portfolioID} - Update portfolio settings (owners can also be set on create)
Authorizations:
basicAuth
path Parameters
portfolioID
required
integer
Example: 279

The ID of the portfolio whose owners to replace.

Request Body schema: application/json
required
Array of objects

Full replacement owner list. Each entry must include contactID, percentOwned, and percentDistributed.

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 2

Total number of items across all pages

pagination-total-pages
integer
Example: 1

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 1

Last page number

Response Schema: application/json
Array
required
object (portfolio_owner)

Represents an owner's stake in a portfolio, including ownership percentage, distribution settings, and payout configuration.

token
required
string

Cache token for the owner record.

Request samples

Content type
application/json
Example
{
  • "owners": [
    ]
}

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Get Portfolio Owner

Returns the detail for a single portfolio owner record. Use the includes parameter to attach the full portfolio or contact record.

Use Cases

  • Load an owner detail panel to display ownership percentage and payout configuration
  • Retrieve contact info for an owner without a separate contacts API call

Business Rules

  • The caller must have access to the specified portfolio (enforced via portfolio group restrictions)
  • Returns a 400 error if the portfolioOwnerID does not belong to the specified portfolioID

Available Includes (2)

  • portfolio — The portfolio this owner belongs to
  • contact — The full contact record for the owner (name, email, address, phone numbers)
  • GET /portfolios/{portfolioID}/owners - List all owners for the portfolio
  • GET /portfolios/{portfolioID}/owners/{portfolioOwnerID}/ach-details - Decrypted ACH bank account info
Authorizations:
basicAuth
path Parameters
portfolioID
required
integer
Example: 150

The ID of the portfolio.

portfolioOwnerID
required
integer
Example: 201

The ID of the portfolio owner record.

query Parameters
includes
string
Example: includes=contact

Comma-separated list of related data to include in the response. Available values: portfolio, contact

Responses

Response Schema: application/json
required
object (portfolio_owner)

Represents an owner's stake in a portfolio, including ownership percentage, distribution settings, and payout configuration.

object (portfolio)

Represents a portfolio — the ownership and financial management unit for one or more rental properties. Each portfolio tracks owner contacts, distribution rules, reserve requirements, and statement settings.

object

The owner's contact record (if includes=contact).

Response samples

Content type
application/json
{
  • "portfolioOwner": {
    }
}

Get Owner ACH Details

Returns the decrypted ACH bank account details for a specific portfolio owner. The account number and routing number are stored encrypted; this endpoint decrypts and returns the plain-text values.

Use Cases

  • Pre-populate an ACH payout settings form for editing
  • Verify bank account details before initiating a payout

Business Rules

  • The caller must have access to the specified portfolio (enforced via portfolio group restrictions)
  • Returns a 400 error if the portfolioOwnerID does not belong to the specified portfolioID
  • If no ACH details have been saved, all fields in achDetails are returned as empty strings
  • GET /portfolios/{portfolioID}/owners/{portfolioOwnerID} - Owner detail (includes truncated account number)
  • GET /portfolios/{portfolioID}/owners - List all portfolio owners
Authorizations:
basicAuth
path Parameters
portfolioID
required
integer
Example: 150

The ID of the portfolio.

portfolioOwnerID
required
integer
Example: 201

The ID of the portfolio owner record.

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "achDetails": {
    }
}

Search Statements

Performs an advanced, paginated search across all owner statements. Returns denormalized rows combining statement data, the associated portfolio, statement setting details, and derived file/attachment counts. Suitable for account-wide statement dashboards and batch management workflows.

Use Cases

  • List all statements in a specific batch (filter by statementBatchID)
  • Find statements in a specific status (e.g., all statements in Review)
  • Query statements for a set of portfolios within a date range

Business Rules

  • Results are scoped to the authenticated account; cross-account data is never returned
  • Statement access respects portfolio group restrictions for the authenticated user
  • statementFileCount and statementAttachmentCount are derived counts, not arrays
  • GET /portfolios/{portfolioID}/statements - Statements for a single portfolio
  • GET /portfolios/statements/{statementID} - Single statement detail with includes
  • GET /portfolios/statements/batches/search - Search statement batches
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25
Example: pageSize=25

Number of results per page.

search
string
Example: search=Sunset

Free-text search across portfolio name and owner contact names.

statementBatchID
integer
Example: statementBatchID=88

Filter to statements belonging to a specific batch.

statementStatusID
integer
Enum: 1 2 3 4 5
Example: statementStatusID=2

Filter by statement status.

  • 1 - Processing
  • 2 - Published
  • 3 - Failed
  • 4 - Review
  • 5 - Publishing
startDate
string <date>
Example: startDate=2024-10-01

Filter to statements whose period starts on or after this date.

endDate
string <date>
Example: endDate=2024-10-31

Filter to statements whose period ends on or before this date.

portfolioIDs[]
Array of integers
Example: portfolioIDs[]=150

Filter to statements for specific portfolios.

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 42

Total number of items across all pages

pagination-total-pages
integer
Example: 2

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 2

Last page number

Response Schema: application/json
Array
required
object

Denormalized statement row returned by the search query.

required
object

Abbreviated portfolio details for the statement's owner portfolio.

required
object

Statement setting template used when generating this statement.

Response samples

Content type
application/json
[
  • {
    }
]

List Portfolio Statements

Returns a paginated list of owner statements for a specific portfolio. Use /portfolios/statements/search for cross-portfolio queries with additional filters.

Use Cases

  • Display the statement history on a portfolio detail page
  • Check for a portfolio's most recent published statement

Business Rules

  • The caller must have access to the specified portfolio (enforced via portfolio group restrictions)
  • GET /portfolios/statements/search - Account-wide statement search with advanced filters
  • GET /portfolios/statements/{statementID} - Single statement detail with includes
  • GET /portfolios/statements/{statementID}/download - Download statement as a ZIP archive
Authorizations:
basicAuth
path Parameters
portfolioID
required
integer
Example: 150

The ID of the portfolio whose statements to list.

query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=October

Free-text search across statement names.

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 12

Total number of items across all pages

pagination-total-pages
integer
Example: 1

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 1

Last page number

Response Schema: application/json
Array
required
object (statement)

An owner statement for a portfolio covering a specific date range. Statements summarize financial activity including income, expenses, distributions, and reserve balances for an owner's review.

required
object (statement_setting)

A statement setting template that controls how owner statements are generated and which modules are included.

Response samples

Content type
application/json
[
  • {
    }
]

Get Statement

Returns the full detail for a single owner statement by its ID. Additional related data can be requested via the includes query parameter, including the statement files (generated PDFs/HTML), file attachments, and the parent portfolio.

Use Cases

  • Load a statement detail view showing financial summary and status
  • Retrieve statement files to display or link for download
  • Check public sharing settings (UUID, expiry) for a published statement

Business Rules

  • Access is restricted to statements whose portfolio the authenticated user's group permits
  • Public statement sharing uses publicUUID and publicVerificationCode — these are unrelated to API auth

Available Includes (3)

  • portfolio — The portfolio this statement belongs to
  • statementFiles — List of generated statement files (PDFs, HTML exports) attached to the statement
  • fileAttachments — File attachments manually added to the statement
  • GET /portfolios/statements/{statementID}/download - Download the statement as a ZIP archive
  • GET /portfolios/{portfolioID}/statements - All statements for the portfolio
  • GET /portfolios/statements/search - Account-wide statement search
Authorizations:
basicAuth
path Parameters
statementID
required
integer
Example: 4501

The ID of the statement to retrieve.

query Parameters
includes
string
Example: includes=portfolio,statementFiles

Comma-separated list of related data to include in the response. Available values: portfolio, statementFiles, fileAttachments

Responses

Response Schema: application/json
required
object (statement)

An owner statement for a portfolio covering a specific date range. Statements summarize financial activity including income, expenses, distributions, and reserve balances for an owner's review.

object (portfolio)

Represents a portfolio — the ownership and financial management unit for one or more rental properties. Each portfolio tracks owner contacts, distribution rules, reserve requirements, and statement settings.

Array of objects

Generated statement files (if includes=statementFiles).

Array of objects

Manually attached files (if includes=fileAttachments).

Response samples

Content type
application/json
{
  • "statement": {
    }
}

Download Statement

Downloads the statement as a ZIP archive containing all generated statement files (PDFs, HTML). The response streams the binary ZIP content with a Content-Disposition: attachment header.

Use Cases

  • Provide a download button for owners or managers to save the statement package locally
  • Programmatically retrieve the statement ZIP for archival or third-party distribution

Business Rules

  • Access is restricted to statements whose portfolio the authenticated user's group permits
  • Returns a 400 error if the statement has no generated files to include in the ZIP
  • GET /portfolios/statements/{statementID} - Statement detail and metadata (includes statementFiles)
  • GET /portfolios/{portfolioID}/statements - All statements for the portfolio
Authorizations:
basicAuth
path Parameters
statementID
required
integer
Example: 4501

The ID of the statement to download.

Responses

Response Headers
Content-Disposition
string
Example: "attachment; filename=\"October 2024 - Sunset Apartments Portfolio.zip\""

Instructs the browser to download the file.

Rentvine-Filename
string
Example: "October 2024 - Sunset Apartments Portfolio.zip"

The suggested filename for the downloaded file.

Response Schema: application/zip
string <binary>

Response samples

Content type
application/json
Example
{
  • "error": "Statement 4501 not found"
}

Search Statement Batches

Performs an advanced, paginated search across statement batches. Returns denormalized rows combining batch data, the associated statement setting, and a derived statement count. The response shape is a search projection — it includes only the fields from portfolio_statement_batches joined to portfolio_statement_settings, not the full batch entity.

Use Cases

  • Display a paginated list of all statement batches with status and statement count
  • Filter batches by status to find all batches in Review or Processing
  • Query batches created within a specific time range
  • Filter to batches that include statements for specific portfolios

Business Rules

  • Results are scoped to the authenticated account; cross-account data is never returned
  • statementCount is a derived count of statements in the batch (subquery)
  • statementSetting fields are nullable — a batch may not have an associated setting template
  • When startFromLastStatement is 1, each portfolio's start date is calculated from its most recent statement end date, so startDate will be null
  • GET /portfolios/statements/batches/{statementBatchID} - Single batch detail with optional statement list
  • GET /portfolios/statements/search - Search individual statements across all batches
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25
Example: pageSize=25

Number of results per page.

search
string
Example: search=October

Free-text search across batch name, portfolio names, and owner contact names.

statementStatusIDs[]
Array of integers
Items Enum: 1 2 3 4 5
Example: statementStatusIDs[]=4

Filter to batches with one or more of these statuses.

  • 1 - Processing
  • 2 - Published
  • 3 - Failed
  • 4 - Review
  • 5 - Publishing
dateTimeCreatedMin
string <date-time>
Example: dateTimeCreatedMin=2024-10-01T00:00:00Z

Filter to batches created on or after this datetime (account timezone).

dateTimeCreatedMax
string <date-time>
Example: dateTimeCreatedMax=2024-12-31T23:59:59Z

Filter to batches created on or before this datetime (account timezone).

portfolioIDs[]
Array of integers
Example: portfolioIDs[]=150

Filter to batches that include statements for specific portfolios.

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 18

Total number of items across all pages

pagination-total-pages
integer
Example: 1

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 1

Last page number

Response Schema: application/json
Array
required
object

Batch summary fields projected by the search query.

required
object

Statement setting template linked to this batch, if any.

Response samples

Content type
application/json
Example
[
  • {
    }
]

Get Statement Batch

Returns the full detail for a single statement batch by its ID. Use the includes parameter to attach the complete list of statements in the batch (each with its portfolio) and access restriction flags.

Use Cases

  • Load a batch detail page showing status, date range, and file generation progress
  • Retrieve all statements in a batch to display a per-portfolio status table
  • Check whether the authenticated user has full or restricted access to the batch

Business Rules

  • Access is enforced via verifyAccessToPortfolioBatch; users with restricted portfolio access see the batch but individual statements may be flagged restricted: 1
  • When includes=statements, each statement item includes a restricted flag (0 or 1) indicating whether the authenticated user can access that statement's portfolio

Available Includes (2)

  • statements — All statements in the batch, each with portfolio data and a restricted access flag
  • restrictions — Adds a fullAccess boolean indicating whether the user has unrestricted batch access
  • GET /portfolios/statements/batches/search - Paginated batch list with advanced filters
  • GET /portfolios/statements/{statementID} - Single statement detail
  • GET /portfolios/statements/search - Account-wide statement search (filter by statementBatchID)
Authorizations:
basicAuth
path Parameters
statementBatchID
required
integer
Example: 88

The ID of the statement batch to retrieve.

query Parameters
includes
string
Example: includes=statements,restrictions

Comma-separated list of related data to include in the response. Available values: statements, restrictions

Responses

Response Schema: application/json
required
object (statement_batch)

A batch of owner statements generated in a single operation across multiple portfolios. Batches coordinate processing, publication, and PDF file generation for all included statements.

fullAccess
boolean

Present when includes=restrictions. true if the user has unrestricted access to all portfolios in the batch; false if some statements are restricted.

Array of objects

All statements in the batch (if includes=statements).

Response samples

Content type
application/json
{
  • "statementBatch": {
    }
}

Properties

List Properties

Returns a paginated list of properties visible to the authenticated account. Each item contains a property object and a server-generated token (Unix timestamp) used as a cache-busting key.

Use Cases

  • Populate a property picker or list view in the manager portal
  • Sync active properties with an external system using isActive and dateTimeModifiedMin filters
  • Retrieve properties with embedded image or portfolio data in a single request via includes

Business Rules

  • Results are automatically restricted to the portfolios the authenticated account has access to.
  • isActive defaults to 1 (active properties only). Pass isActive=0 to retrieve inactive properties.
  • Default page size is 15. Maximum page size is enforced server-side.
  • search matches against name, address, address2, city, stateID, and postalCode.

Available Includes (2)

  • image — joins the property image record onto each result row
  • portfolio — joins the portfolio record onto each result row
  • GET /properties/search — advanced filtered search with more filter options
  • GET /properties/{propertyID} — retrieve a single property with full include support
  • POST /properties — create a new property
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=Kings St

Full-text search against name, address, city, stateID, and postalCode

isActive
integer
Default: 1
Enum: 0 1
Example: isActive=1

Filter by active status. Defaults to 1 (active only). Pass 0 for inactive properties.

managementFeeSettingID
integer
Example: managementFeeSettingID=2

Filter properties by management fee setting ID

includes
string
Example: includes=image,portfolio

Comma-separated list of related data to join onto each result row.

Available values: image, portfolio

Responses

Response Headers
pagination-page-size
integer
Example: 15

Number of items per page

pagination-total-items
integer
Example: 84

Total number of items across all pages

pagination-total-pages
integer
Example: 6

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 6

Last page number

Response Schema: application/json
Array
required
object (property)
token
required
string

Server-generated Unix timestamp used as a cache-busting key

image
object or null

Property image record (if includes=image)

portfolio
object or null

Portfolio record (if includes=portfolio)

Response samples

Content type
application/json
[
  • {
    }
]

Create

Creating a property will also create the associated Unit record.

Authorizations:
basicAuth
Request Body schema: application/json
One of
object (property_create)
object (unit_for_property_create)

Responses

Response Schema: application/json
object (property)

Request samples

Content type
application/json
Example
{
  • "property": {
    },
  • "unit": {
    }
}

Response samples

Content type
application/json
{
  • "property": {
    }
}

Search Properties

Performs a filtered, paginated search across all properties. Returns denormalized result rows combining the property, its portfolio, active lease, property groups, and primary image in a single response — ideal for list views that need contextual data without additional lookups.

Use Cases

  • Power the property list/grid UI with full portfolio and lease context
  • Filter properties by active status, vacancy, multi-unit flag, portfolio, portfolio group, property group, property type, assigned user, and tags
  • Retrieve a specific portfolio's properties via portfolioIDs[]

Business Rules

  • Results are scoped to the authenticated account; cross-account data is never returned
  • isVacant is null for multi-unit properties (vacancy is tracked at the unit level, not the property level)
  • lease is included for every result; leaseID and tenants are null when no active lease exists
  • propertyGroup.propertyGroupNames is a comma-separated string of all group names the property belongs to, or null if the property is not in any group
  • portfolio.contacts is a JSON-encoded string containing the array of owner contacts and their ownership percentages
  • primaryImage.filePath is "noimage" when no image has been uploaded
  • GET /properties - Basic paginated list (no denormalized portfolio/lease/group data)
  • GET /properties/{propertyID} - Full property detail with includes
  • POST /properties - Create a new property
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25
Example: pageSize=100

Number of results per page

search
string
Example: search=test

Free-text search across property name and address fields

isActive
integer
Enum: 0 1
Example: isActive=1

Filter by active status. 1 returns active properties, 0 returns deactivated properties.

isMultiUnit
integer
Enum: 0 1

Filter by multi-unit flag. 1 returns multi-unit properties, 0 returns single-unit properties.

isVacant
integer
Enum: 0 1

Filter by vacancy status. 1 returns vacant properties, 0 returns occupied properties. Has no effect on multi-unit properties.

isNonRevenue
integer
Enum: 0 1

Filter by non-revenue flag. 1 returns non-revenue properties, 0 returns revenue properties.

portfolioIDs[]
Array of integers
Example: portfolioIDs[]=416

Filter to properties belonging to one or more portfolios. Pass multiple values as portfolioIDs[0]=416&portfolioIDs[1]=297.

portfolioGroupIDs[]
Array of integers
Example: portfolioGroupIDs[]=32

Filter to properties in portfolios belonging to one or more portfolio groups. Pass multiple values as portfolioGroupIDs[0]=32&portfolioGroupIDs[1]=33.

propertyGroupIDs[]
Array of integers
Example: propertyGroupIDs[]=1

Filter to properties belonging to one or more property groups. Pass multiple values as propertyGroupIDs[0]=1&propertyGroupIDs[1]=2.

propertyTypeIDs[]
Array of integers
Items Enum: 1 2 3 4 5 6 7 8 9 10
Example: propertyTypeIDs[]=1

Filter by property type. Pass multiple values as propertyTypeIDs[0]=1&propertyTypeIDs[1]=2.

  • 1 - Single Family Home
  • 2 - Apartment
  • 3 - Condo
  • 4 - Townhouse
  • 5 - Duplex
  • 6 - Multiplex
  • 7 - Loft
  • 8 - MobileHome
  • 9 - Commercial
  • 10 - Garage
assignedToUserIDs[]
Array of integers
Example: assignedToUserIDs[]=501195

Filter to properties assigned to one or more users. Pass multiple values as assignedToUserIDs[0]=501195&assignedToUserIDs[1]=539498.

tagIDs[]
Array of integers
Example: tagIDs[]=33

Filter to properties tagged with one or more tags. Pass multiple values as tagIDs[0]=33&tagIDs[1]=34.

Responses

Response Headers
pagination-page-size
integer
Example: 100

Number of items per page

pagination-total-items
integer
Example: 250

Total number of matching items across all pages

pagination-total-pages
integer
Example: 3

Total number of pages

pagination-current-page
integer
Example: 1

The current page number

pagination-next-page
integer or null
Example: 2

The next page number, or null if on the last page

pagination-before-page
integer or null

The previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

Always 1

pagination-last-page
integer
Example: 3

The last page number

Response Schema: application/json
Array
required
object
required
object
required
object
required
object
required
object

Response samples

Content type
application/json
Example
[
  • {
    }
]

Get Property

Retrieves a single property by its ID, including all stored attributes and any optionally requested related data via the includes parameter.

Use Cases

  • Display full property details in a property overview screen
  • Load unit, lease, and owner data in a single request for a property detail page
  • Fetch ledger, balances, or inspection data for accounting and compliance views

Business Rules

  • Access is restricted to properties within the authenticated account's portfolio scope via verifyDirectAccess.
  • Returns 400 if the property is not found.
  • Returns 400 if unit is included but no unit record exists for the property.
  • units, workOrders (property-level), and ledger (property-level) only apply to multi-unit properties when requested.
  • unit, lease, leaseBalances, pastLeases, futureLeases, listing, appliances, propertyManager, and workOrders (unit-level) only apply to single-unit properties when requested.
  • leaseBalances requires both unit and lease to be included.
  • portfolioBalances requires portfolio to be included.

Available Includes (20)

  • image — the property image record
  • units — array of unit records (multi-unit properties only)
  • workOrders — array of work orders with contact data (applies at property level for multi-unit, unit level for single-unit)
  • ledger — accounting ledger record for the property or unit
  • unit — single unit record (single-unit properties only)
  • lease — current active lease for the unit (requires unit)
  • leaseBalances — financial balance details for the current lease (requires unit,lease)
  • pastLeases — array of closed leases for the unit (requires unit)
  • futureLeases — array of pending leases for the unit (requires unit)
  • listing — listing record with included utilities and listingFiles array (requires unit)
  • appliances — array of appliances for the unit (requires unit)
  • propertyManager — property manager record for the unit (requires unit)
  • portfolio — portfolio record the property belongs to
  • portfolioBalances — portfolio ledger balance details (requires portfolio)
  • portfolios — array of portfolio history records for the property
  • owners — array of portfolio owner records with associated contact data
  • managementFeeSetting — management fee setting record
  • inspections — array of inspection records for the property
  • associations — array of association records with contact data
  • applicationTemplate — application template record (if applicationTemplateID is set)
  • propertyShowingProvider — showing provider record (if propertyShowingProviderID is set)
  • GET /properties — list all properties
  • GET /properties/search — search properties with filters
  • POST /properties/{propertyID} — update a property
  • DELETE /properties/{propertyID} — delete a property
  • POST /properties/{propertyID}/activate — activate a property
  • POST /properties/{propertyID}/deactivate — deactivate a property
Authorizations:
basicAuth
path Parameters
propertyID
required
integer
Example: 732

The unique property ID

query Parameters
includes
string
Example: includes=unit,lease,portfolio,owners

Comma-separated list of related data to include in the response.

Available values: image, units, workOrders, ledger, unit, lease, leaseBalances, pastLeases, futureLeases, listing, appliances, propertyManager, portfolio, portfolioBalances, portfolios, owners, managementFeeSetting, inspections, associations, applicationTemplate, propertyShowingProvider

Responses

Response Schema: application/json
required
object (property)
image
object or null

Property image record (if includes=image)

units
Array of objects

Unit records for multi-unit properties (if includes=units)

workOrders
Array of objects

Work orders with contact data (if includes=workOrders)

ledger
object or null

Accounting ledger for the property or unit (if includes=ledger)

unit
object or null

Single unit record for single-unit properties (if includes=unit)

lease
object or null

Current active lease for the unit (if includes=unit,lease)

leaseStatus
object or null

Status record for the current lease (if includes=unit,lease)

leaseBalances
Array of objects

Financial balance rows for the current lease (if includes=unit,lease,leaseBalances)

pastLeases
Array of objects

Closed leases for the unit (if includes=unit,pastLeases)

futureLeases
Array of objects

Pending leases for the unit (if includes=unit,futureLeases)

listing
object or null

Listing record with includedUtilities (if includes=unit,listing)

listingFiles
Array of objects

Files attached to the listing (if includes=unit,listing)

appliances
Array of objects

Appliances for the unit (if includes=unit,appliances)

propertyManager
object or null

Property manager record (if includes=unit,propertyManager)

portfolio
object or null

Portfolio the property belongs to (if includes=portfolio)

portfolioBalances
Array of objects

Portfolio ledger balance rows (if includes=portfolio,portfolioBalances)

portfolios
Array of objects

Portfolio history records for the property (if includes=portfolios)

owners
Array of objects

Portfolio owners with contact data (if includes=owners)

managementFeeSetting
object or null

Management fee setting record (if includes=managementFeeSetting)

inspections
Array of objects

Inspection records for the property (if includes=inspections)

associations
Array of objects

Association records with contact data (if includes=associations)

applicationTemplate
object or null

Application template record (if includes=applicationTemplate)

propertyShowingProvider
object or null

Showing provider record (if includes=propertyShowingProvider)

Response samples

Content type
application/json
{
  • "property": {
    }
}

Update

Authorizations:
basicAuth
path Parameters
propertyID
required
integer
Example: 728
Request Body schema: application/json
propertyID
required
integer
propertyTypeID
integer (property_types)
Enum: 1 2 3 4 5 6 7 8 9 10
  • 1 - Single Family Home
  • 2 - Apartment
  • 3 - Condo
  • 4 - Townhouse
  • 5 - Duplex
  • 6 - Multiplex
  • 7 - Loft
  • 8 - MobileHome
  • 9 - Commercial
  • 10 - Garage
isMultiUnit
boolean
portfolioID
integer

Unique id of the portfolio the property belongs to

managementFeeSettingID
integer

Unique id of the management fee setting to use for this property

name
string or null
countryID
string

2-digit country code for the property, ex. US

address
string
address2
string or null
stateID
string

2-digit state code for the property, ex. FL

city
string
postalCode
string or null
county
string or null
assignedToUserID
string or null

ID of the user assigned to this property

legalDescription
string or null
maintenanceLimitAmount
number or null <double>
yearBuilt
integer or null
dateInsuranceExpires
string or null <date>
dateWarrantyExpires
string or null <date>
reserveAmount
number <double>
dateContractBegins
string or null <date>
dateContractEnds
string or null <date>
leaseReturnChargeAmount
string or null
withholdingTaxAgencyID
integer or null
markupPercent
string or null
markupAmount
string or null
markupAmountMin
string or null
markupAmountMax
string or null
maintenanceNotes
string or null
applicationTemplateID
integer or null
commercialClassTypeID
integer or null
salesTaxSettingID
integer or null
insuranceCompany
string or null
insuranceAgent
string or null
insurancePolicyNumber
string or null
insuranceContactDetails
string or null
propertyShowingProviderID
integer or null
importSourceKey
string or null

Responses

Response Schema: application/json
object (property)

Request samples

Content type
application/json
{
  • "propertyID": "728",
  • "propertyImageID": "1",
  • "propertyTypeID": "1",
  • "isMultiUnit": "0",
  • "isActive": "1",
  • "portfolioID": "448",
  • "managementFeeSettingID": "93",
  • "name": "Sunset Villa",
  • "countryID": "US",
  • "address": "300002 Main Street",
  • "streetNumber": "300002",
  • "streetName": "Main Street",
  • "address2": "217",
  • "stateID": "AL",
  • "city": "Alabama",
  • "postalCode": "90000",
  • "county": "Jefferson",
  • "assignedToUserID": "501195",
  • "legalDescription": "Lot 14, Block 3, Sunrise Subdivision",
  • "maintenanceLimitAmount": "375.00",
  • "yearBuilt": "2001",
  • "dateTimeModified": "2026-04-22 10:21:56",
  • "dateTimeDeactivated": null,
  • "isFromImport": "0",
  • "dateInsuranceExpires": "2027-06-30",
  • "dateWarrantyExpires": "2028-12-31",
  • "maintenanceNotes": "HVAC serviced annually",
  • "applicationTemplateID": "12",
  • "reserveAmount": "0.00",
  • "markupPercent": "5.00",
  • "markupAmount": "50.00",
  • "markupAmountMin": "25.00",
  • "markupAmountMax": "150.00",
  • "dateContractBegins": "2026-01-01",
  • "dateContractEnds": "2027-12-31",
  • "commercialClassTypeID": "2",
  • "salesTaxSettingID": "3",
  • "withholdingTaxAgencyID": "7",
  • "insuranceCompany": "State Farm Insurance",
  • "insuranceAgent": "Jane Doe",
  • "insurancePolicyNumber": "POL-2024-00728",
  • "insuranceContactDetails": "555-867-5309",
  • "leaseReturnChargeAmount": "15.00",
  • "propertyShowingProviderID": "4",
  • "dateTimeCreated": "2026-04-17 19:30:49",
  • "importSourceKey": "IMPORT-2024-728"
}

Response samples

Content type
application/json
{
  • "property": {
    }
}

Delete Property

Permanently deletes a property. The property cannot be deleted if it has any accounting transactions on record, including voided ones.

Business Rules

  • Returns 400 with a transactions error array if any accounting transactions, transaction entries, archived entries, utility bills, inspections, inspection areas, or leases are associated with the property.
  • Even voided accounting transactions block deletion.
  • POST /properties/{propertyID}/deactivate — deactivate a property instead of deleting it
Authorizations:
basicAuth
path Parameters
propertyID
required
integer
Example: 728

Responses

Response Schema: application/json
propertyID
required
integer
propertyImageID
required
integer
propertyTypeID
required
integer (property_types)
Enum: 1 2 3 4 5 6 7 8 9 10
  • 1 - Single Family Home
  • 2 - Apartment
  • 3 - Condo
  • 4 - Townhouse
  • 5 - Duplex
  • 6 - Multiplex
  • 7 - Loft
  • 8 - MobileHome
  • 9 - Commercial
  • 10 - Garage
isMultiUnit
required
boolean
portfolioID
required
integer

Unique id of the portfolio the property belongs to

managementFeeSettingID
required
integer

Unique id of the management fee setting to use for this property

countryID
required
string

2-digit country code for the property, ex. US

address
required
string
stateID
required
string

2-digit state code for the property, ex. FL

city
required
string
latitude
required
number <double>

The latitude for the property address. If not given, it will be calculated based on the property address.

longitude
required
number <double>

The longitude for the property address. If not given, it will be calculated based on the property address.

dateTimeCreated
required
string <date-time>
reserveAmount
required
number <double>
isActive
required
boolean
isFromImport
required
integer
name
string or null
streetNumber
integer or null
streetName
string or null
address2
string or null
postalCode
string or null
county
string or null
assignedToUserID
string or null

ID of the user assigned to this property

legalDescription
string or null
maintenanceLimitAmount
number or null <double>
yearBuilt
integer or null
dateInsuranceExpires
string or null <date>
dateWarrantyExpires
string or null <date>
dateContractBegins
string or null <date>
dateContractEnds
string or null <date>
leaseReturnChargeAmount
string or null
withholdingTaxAgencyID
integer or null
markupPercent
string or null
markupAmount
string or null
markupAmountMin
string or null
markupAmountMax
string or null
maintenanceNotes
string or null
applicationTemplateID
integer or null
commercialClassTypeID
integer or null
salesTaxSettingID
integer or null
insuranceCompany
string or null
insuranceAgent
string or null
insurancePolicyNumber
string or null
insuranceContactDetails
string or null
propertyShowingProviderID
integer or null
importSourceKey
string or null
dateTimeModified
string or null <date-time>
dateTimeDeactivated
string or null <date-time>

Response samples

Content type
application/json
{
  • "propertyID": "733",
  • "propertyImageID": "1",
  • "propertyTypeID": "1",
  • "isMultiUnit": "0",
  • "isActive": "1",
  • "portfolioID": "416",
  • "managementFeeSettingID": "93",
  • "name": null,
  • "countryID": "US",
  • "address": "9910 Estero Oaks Drive",
  • "streetNumber": "9910",
  • "streetName": "Estero Oaks Drive",
  • "address2": null,
  • "stateID": "FL",
  • "city": "Fort Myers",
  • "postalCode": "33967",
  • "latitude": "26.45128710",
  • "longitude": "-81.79257720",
  • "county": "Lee",
  • "assignedToUserID": null,
  • "legalDescription": null,
  • "maintenanceLimitAmount": "375.00",
  • "yearBuilt": null,
  • "dateTimeModified": "2026-04-22 12:18:07",
  • "dateTimeDeactivated": null,
  • "isFromImport": "0",
  • "dateInsuranceExpires": null,
  • "dateWarrantyExpires": null,
  • "maintenanceNotes": null,
  • "applicationTemplateID": null,
  • "reserveAmount": "500.00",
  • "markupPercent": null,
  • "markupAmount": null,
  • "markupAmountMin": null,
  • "markupAmountMax": null,
  • "dateContractBegins": null,
  • "dateContractEnds": null,
  • "commercialClassTypeID": null,
  • "salesTaxSettingID": null,
  • "withholdingTaxAgencyID": null,
  • "insuranceCompany": null,
  • "insuranceAgent": null,
  • "insurancePolicyNumber": null,
  • "insuranceContactDetails": null,
  • "leaseReturnChargeAmount": null,
  • "propertyShowingProviderID": null,
  • "dateTimeCreated": "2026-04-22 12:18:07",
  • "importSourceKey": null
}

Deactivate

Authorizations:
basicAuth
path Parameters
propertyID
required
integer
Example: 707

Responses

Response Schema: application/json
propertyID
required
integer
propertyImageID
required
integer
propertyTypeID
required
integer (property_types)
Enum: 1 2 3 4 5 6 7 8 9 10
  • 1 - Single Family Home
  • 2 - Apartment
  • 3 - Condo
  • 4 - Townhouse
  • 5 - Duplex
  • 6 - Multiplex
  • 7 - Loft
  • 8 - MobileHome
  • 9 - Commercial
  • 10 - Garage
isMultiUnit
required
boolean
portfolioID
required
integer

Unique id of the portfolio the property belongs to

managementFeeSettingID
required
integer

Unique id of the management fee setting to use for this property

countryID
required
string

2-digit country code for the property, ex. US

address
required
string
stateID
required
string

2-digit state code for the property, ex. FL

city
required
string
latitude
required
number <double>

The latitude for the property address. If not given, it will be calculated based on the property address.

longitude
required
number <double>

The longitude for the property address. If not given, it will be calculated based on the property address.

dateTimeCreated
required
string <date-time>
reserveAmount
required
number <double>
isActive
required
boolean
isFromImport
required
integer
name
string or null
streetNumber
integer or null
streetName
string or null
address2
string or null
postalCode
string or null
county
string or null
assignedToUserID
string or null

ID of the user assigned to this property

legalDescription
string or null
maintenanceLimitAmount
number or null <double>
yearBuilt
integer or null
dateInsuranceExpires
string or null <date>
dateWarrantyExpires
string or null <date>
dateContractBegins
string or null <date>
dateContractEnds
string or null <date>
leaseReturnChargeAmount
string or null
withholdingTaxAgencyID
integer or null
markupPercent
string or null
markupAmount
string or null
markupAmountMin
string or null
markupAmountMax
string or null
maintenanceNotes
string or null
applicationTemplateID
integer or null
commercialClassTypeID
integer or null
salesTaxSettingID
integer or null
insuranceCompany
string or null
insuranceAgent
string or null
insurancePolicyNumber
string or null
insuranceContactDetails
string or null
propertyShowingProviderID
integer or null
importSourceKey
string or null
dateTimeModified
string or null <date-time>
dateTimeDeactivated
string or null <date-time>

Response samples

Content type
application/json
{
  • "propertyID": 0,
  • "propertyTypeID": 1,
  • "isMultiUnit": true,
  • "portfolioID": 0,
  • "managementFeeSettingID": 0,
  • "name": "string",
  • "countryID": "US",
  • "address": "string",
  • "streetNumber": 0,
  • "streetName": "string",
  • "address2": "string",
  • "stateID": "FL",
  • "city": "string",
  • "postalCode": "string",
  • "latitude": 0,
  • "longitude": 0,
  • "county": "string",
  • "assignedToUserID": "string",
  • "legalDescription": "string",
  • "dateTimeCreated": "2019-08-24T14:15:22Z",
  • "maintenanceLimitAmount": 0,
  • "yearBuilt": 0,
  • "dateInsuranceExpires": "2019-08-24",
  • "dateWarrantyExpires": "2019-08-24",
  • "reserveAmount": 0,
  • "dateContractBegins": "2019-08-24",
  • "dateContractEnds": "2019-08-24",
  • "leaseReturnChargeAmount": "string",
  • "withholdingTaxAgencyID": 0,
  • "markupPercent": "string",
  • "markupAmount": "string",
  • "markupAmountMin": "string",
  • "markupAmountMax": "string",
  • "maintenanceNotes": "string",
  • "applicationTemplateID": 0,
  • "commercialClassTypeID": 0,
  • "salesTaxSettingID": 0,
  • "insuranceCompany": "string",
  • "insuranceAgent": "string",
  • "insurancePolicyNumber": "string",
  • "insuranceContactDetails": "string",
  • "propertyShowingProviderID": 0,
  • "isFromImport": 0,
  • "importSourceKey": "string",
  • "propertyImageID": 0,
  • "isActive": true,
  • "dateTimeModified": "2019-08-24T14:15:22Z",
  • "dateTimeDeactivated": "2019-08-24T14:15:22Z"
}

Activate

Activates a property, setting it to active status.

Business Rules

  • For multi-unit properties (isMultiUnit = 1): all units are activated only if activateUnit=1 is passed. If the parameter is omitted or sent as 0, the property is still set active but individual units are not activated.
  • For single-unit properties, activateUnit has no effect.
Authorizations:
basicAuth
path Parameters
propertyID
required
integer
Example: 707
query Parameters
activateUnit
boolean
Default: false
Example: activateUnit=1

When 1, also activates all units on a multi-unit property. When 0 or omitted, the property is activated but its units are left unchanged.

Responses

Response Schema: application/json
propertyID
required
integer
propertyImageID
required
integer
propertyTypeID
required
integer (property_types)
Enum: 1 2 3 4 5 6 7 8 9 10
  • 1 - Single Family Home
  • 2 - Apartment
  • 3 - Condo
  • 4 - Townhouse
  • 5 - Duplex
  • 6 - Multiplex
  • 7 - Loft
  • 8 - MobileHome
  • 9 - Commercial
  • 10 - Garage
isMultiUnit
required
boolean
portfolioID
required
integer

Unique id of the portfolio the property belongs to

managementFeeSettingID
required
integer

Unique id of the management fee setting to use for this property

countryID
required
string

2-digit country code for the property, ex. US

address
required
string
stateID
required
string

2-digit state code for the property, ex. FL

city
required
string
latitude
required
number <double>

The latitude for the property address. If not given, it will be calculated based on the property address.

longitude
required
number <double>

The longitude for the property address. If not given, it will be calculated based on the property address.

dateTimeCreated
required
string <date-time>
reserveAmount
required
number <double>
isActive
required
boolean
isFromImport
required
integer
name
string or null
streetNumber
integer or null
streetName
string or null
address2
string or null
postalCode
string or null
county
string or null
assignedToUserID
string or null

ID of the user assigned to this property

legalDescription
string or null
maintenanceLimitAmount
number or null <double>
yearBuilt
integer or null
dateInsuranceExpires
string or null <date>
dateWarrantyExpires
string or null <date>
dateContractBegins
string or null <date>
dateContractEnds
string or null <date>
leaseReturnChargeAmount
string or null
withholdingTaxAgencyID
integer or null
markupPercent
string or null
markupAmount
string or null
markupAmountMin
string or null
markupAmountMax
string or null
maintenanceNotes
string or null
applicationTemplateID
integer or null
commercialClassTypeID
integer or null
salesTaxSettingID
integer or null
insuranceCompany
string or null
insuranceAgent
string or null
insurancePolicyNumber
string or null
insuranceContactDetails
string or null
propertyShowingProviderID
integer or null
importSourceKey
string or null
dateTimeModified
string or null <date-time>
dateTimeDeactivated
string or null <date-time>

Response samples

Content type
application/json
{
  • "propertyID": 0,
  • "propertyTypeID": 1,
  • "isMultiUnit": true,
  • "portfolioID": 0,
  • "managementFeeSettingID": 0,
  • "name": "string",
  • "countryID": "US",
  • "address": "string",
  • "streetNumber": 0,
  • "streetName": "string",
  • "address2": "string",
  • "stateID": "FL",
  • "city": "string",
  • "postalCode": "string",
  • "latitude": 0,
  • "longitude": 0,
  • "county": "string",
  • "assignedToUserID": "string",
  • "legalDescription": "string",
  • "dateTimeCreated": "2019-08-24T14:15:22Z",
  • "maintenanceLimitAmount": 0,
  • "yearBuilt": 0,
  • "dateInsuranceExpires": "2019-08-24",
  • "dateWarrantyExpires": "2019-08-24",
  • "reserveAmount": 0,
  • "dateContractBegins": "2019-08-24",
  • "dateContractEnds": "2019-08-24",
  • "leaseReturnChargeAmount": "string",
  • "withholdingTaxAgencyID": 0,
  • "markupPercent": "string",
  • "markupAmount": "string",
  • "markupAmountMin": "string",
  • "markupAmountMax": "string",
  • "maintenanceNotes": "string",
  • "applicationTemplateID": 0,
  • "commercialClassTypeID": 0,
  • "salesTaxSettingID": 0,
  • "insuranceCompany": "string",
  • "insuranceAgent": "string",
  • "insurancePolicyNumber": "string",
  • "insuranceContactDetails": "string",
  • "propertyShowingProviderID": 0,
  • "isFromImport": 0,
  • "importSourceKey": "string",
  • "propertyImageID": 0,
  • "isActive": true,
  • "dateTimeModified": "2019-08-24T14:15:22Z",
  • "dateTimeDeactivated": "2019-08-24T14:15:22Z"
}

Units

List

Authorizations:
basicAuth
path Parameters
propertyID
required
integer
Example: 707

Responses

Response Schema: application/json
Array
unitID
required
string
propertyID
required
string
isActive
required
string

Whether the unit is active.

  • 0 - Inactive
  • 1 - Active
address
required
string
stateID
required
string

The ID of the state the unit is in. Uses the 2-letter state code.

city
required
string
rent
required
string <double>
propertyImageID
string
name
string or null
streetNumber
string or null
streetName
string or null
address2
string or null
postalCode
string or null
latitude
string <double>
longitude
string <double>
deposit
string or null <double>
size
string or null
beds
string or null
fullBaths
string or null
halfBaths
string or null
leaseID
string or null
dateTimeCreated
string <date-time>
propertyManagerID
integer or null
commercialSpaceTypeID
string or null
isNonRevenue
string

Whether the unit is a non-revenue unit.

  • 0 - Revenue unit
  • 1 - Non-revenue unit
nonRevenueTypeID
string or null
nonRevenueStartDate
string or null <date>
isFromImport
integer
importSourceKey
string or null
dateTimeModified
string <date-time>
dateTimeDeactivated
string or null <date-time>
isUtilityBillingEnabled
string

Whether utility billing is enabled for this unit.

  • 0 - Disabled
  • 1 - Enabled
leaseNotes
string or null
entryInstructions
string or null
vendorEntryInstructions
string or null
maintenanceNotes
string or null

Response samples

Content type
application/json
[
  • {
    }
]

Create Unit

Creates a new unit under the specified property. On success, returns the full unit record (same shape as GET /properties/{propertyID}/units/{unitID}).

Use Cases

  • Add a rentable unit to an existing property

Business Rules

  • Requires the Update Property permission.
  • rent (Market Rent Amount) is the only required field. All other fields are optional.
  • propertyID is taken from the URL path; any propertyID value in the request body is ignored.
  • GET /properties/{propertyID}/units — list all units for the property
  • GET /properties/{propertyID}/units/{unitID} — retrieve the created unit with includes
  • DELETE /properties/{propertyID}/units/{unitID} — delete a unit
Authorizations:
basicAuth
path Parameters
propertyID
required
integer
Example: 548
Request Body schema: application/json
rent
required
string

Market Rent Amount (decimal as string). Required.

name
string or null

Display name for the unit (e.g. "Unit A", "1B").

address
string or null

Street address of the unit.

streetNumber
string or null

Street number parsed from the address.

streetName
string or null

Street name parsed from the address.

address2
string or null

Secondary address line (suite, floor, etc.).

city
string or null
stateID
string or null

Two-letter state/province code.

countryID
string or null

Two-letter ISO country code.

postalCode
string or null
deposit
string or null

Security deposit amount (decimal as string).

size
integer or null

Unit size in square feet. An empty string is treated as null.

beds
string or null

Number of bedrooms.

fullBaths
string or null

Number of full bathrooms.

halfBaths
string or null

Number of half bathrooms.

commercialSpaceTypeID
integer or null

Commercial space type identifier, if this is a commercial unit.

isNonRevenue
integer
Enum: 0 1

Whether this unit is a non-revenue unit.

  • 0 - Revenue unit (default)
  • 1 - Non-revenue unit
nonRevenueTypeID
integer or null

Non-revenue type identifier. Only applicable when isNonRevenue is 1.

nonRevenueStartDate
string or null <date>

Date the unit became non-revenue. Only applicable when isNonRevenue is 1.

leaseNotes
string or null

Internal notes about the lease for this unit.

entryInstructions
string or null

Entry instructions for residents and maintenance staff.

vendorEntryInstructions
string or null

Entry instructions specific to vendors.

maintenanceNotes
string or null

Internal maintenance notes for this unit.

attachments
Array of integers

Array of existing fileID integers to link to the new unit.

Responses

Response Schema: application/json
required
object (unit)

Request samples

Content type
application/json
Example
{
  • "rent": "1500.00"
}

Response samples

Content type
application/json
{
  • "unit": {
    }
}

View

Authorizations:
basicAuth
path Parameters
propertyID
required
integer
Example: 707
unitID
required
integer
Example: 585

Responses

Response Schema: application/json
unitID
required
string
propertyID
required
string
isActive
required
string

Whether the unit is active.

  • 0 - Inactive
  • 1 - Active
address
required
string
stateID
required
string

The ID of the state the unit is in. Uses the 2-letter state code.

city
required
string
rent
required
string <double>
propertyImageID
string
name
string or null
streetNumber
string or null
streetName
string or null
address2
string or null
postalCode
string or null
latitude
string <double>
longitude
string <double>
deposit
string or null <double>
size
string or null
beds
string or null
fullBaths
string or null
halfBaths
string or null
leaseID
string or null
dateTimeCreated
string <date-time>
propertyManagerID
integer or null
commercialSpaceTypeID
string or null
isNonRevenue
string

Whether the unit is a non-revenue unit.

  • 0 - Revenue unit
  • 1 - Non-revenue unit
nonRevenueTypeID
string or null
nonRevenueStartDate
string or null <date>
isFromImport
integer
importSourceKey
string or null
dateTimeModified
string <date-time>
dateTimeDeactivated
string or null <date-time>
isUtilityBillingEnabled
string

Whether utility billing is enabled for this unit.

  • 0 - Disabled
  • 1 - Enabled
leaseNotes
string or null
entryInstructions
string or null
vendorEntryInstructions
string or null
maintenanceNotes
string or null

Response samples

Content type
application/json
{
  • "unitID": "string",
  • "propertyID": "string",
  • "propertyImageID": "string",
  • "isActive": "string",
  • "name": "string",
  • "address": "string",
  • "streetNumber": "string",
  • "streetName": "string",
  • "address2": "string",
  • "stateID": "string",
  • "city": "string",
  • "postalCode": "string",
  • "latitude": "string",
  • "longitude": "string",
  • "rent": "string",
  • "deposit": "string",
  • "size": "string",
  • "beds": "string",
  • "fullBaths": "string",
  • "halfBaths": "string",
  • "leaseID": "string",
  • "dateTimeCreated": "2019-08-24T14:15:22Z",
  • "propertyManagerID": 0,
  • "commercialSpaceTypeID": "string",
  • "isNonRevenue": "string",
  • "nonRevenueTypeID": "string",
  • "nonRevenueStartDate": "2019-08-24",
  • "isFromImport": 0,
  • "importSourceKey": "string",
  • "dateTimeModified": "2019-08-24T14:15:22Z",
  • "dateTimeDeactivated": "2019-08-24T14:15:22Z",
  • "isUtilityBillingEnabled": "string",
  • "leaseNotes": "string",
  • "entryInstructions": "string",
  • "vendorEntryInstructions": "string",
  • "maintenanceNotes": "string"
}

Update Unit

Updates an existing unit. On success, returns the full unit record (same shape as GET /properties/{propertyID}/units/{unitID}).

Use Cases

  • Edit unit details such as rent, deposit, address, or bedroom/bathroom counts
  • Mark a unit as non-revenue (e.g. model unit, common area)
  • Assigning a property manager to the unit

Business Rules

  • Requires the Update Property permission.
  • Only the fields listed in the request body schema are written; all other fields on the request (e.g. unitID, isActive, dateTimeCreated, latitude, longitude) are ignored.
  • nonRevenueStartDate accepts MM/DD/YYYY on input; the response returns it in YYYY-MM-DD format.
  • Access is restricted to properties the authenticated account can reach (portfolio-level restrictions apply).
  • GET /properties/{propertyID}/units/{unitID} — retrieve the unit with optional includes
  • POST /properties/{propertyID}/units — create a new unit
  • DELETE /properties/{propertyID}/units/{unitID} — delete a unit
Authorizations:
basicAuth
path Parameters
propertyID
required
integer
Example: 548
unitID
required
integer
Example: 716
Request Body schema: application/json
name
string or null

Display name for the unit.

address
string or null

Street address of the unit.

address2
string or null

Secondary address line (suite, floor, etc.).

city
string or null
stateID
string or null

Two-letter state/province code.

postalCode
string or null
rent
string

Market Rent Amount (decimal as string).

deposit
string or null

Security deposit amount (decimal as string).

size
string or null

Unit size in square feet. An empty string is treated as null.

beds
string or null

Number of bedrooms.

fullBaths
string or null

Number of full bathrooms.

halfBaths
string or null

Number of half bathrooms.

propertyManagerID
integer or null

ID of the property manager assigned to this unit.

commercialSpaceTypeID
string or null

Commercial space type identifier, if this is a commercial unit.

isNonRevenue
string

Whether this unit is a non-revenue unit.

  • 0 - Revenue unit
  • 1 - Non-revenue unit
nonRevenueTypeID
string or null

Non-revenue type identifier. Only applicable when isNonRevenue is 1.

nonRevenueStartDate
string or null

Date the unit became non-revenue. Accepts MM/DD/YYYY on input; response returns YYYY-MM-DD. Only applicable when isNonRevenue is 1.

isUtilityBillingEnabled
string

Whether utility billing is enabled for this unit.

  • 0 - Disabled
  • 1 - Enabled
leaseNotes
string or null

Internal notes about the lease for this unit.

entryInstructions
string or null

Entry instructions for residents and maintenance staff.

vendorEntryInstructions
string or null

Entry instructions specific to vendors.

maintenanceNotes
string or null

Internal maintenance notes for this unit.

Responses

Response Schema: application/json
required
object (unit)
propertyManager
any or null

Property manager record (if includes=propertyManager), or false if the unit has no assigned manager.

Request samples

Content type
application/json
Example
{
  • "rent": "1750.00"
}

Response samples

Content type
application/json
{
  • "unit": {
    },
  • "propertyManager": false
}

Delete Unit

Permanently deletes a unit from a property. The unit is physically removed from the system along with its associated work orders, recurring work orders, appliances, features, images, listings, and leads.

Use Cases

  • Remove a unit that was created in error before any activity has been recorded against it
  • Clean up unused units on a property that have no financial or tenancy history

Business Rules

  • Requires the Update Property permission.
  • The unit cannot be deleted if any of the following exist — even in a voided or closed state:
    • Accounting transactions linked to the unit
    • Accounting transaction entries linked to the unit
    • Leases (active, pending, or closed) tied to the unit
  • Portfolio-level access restrictions apply — the authenticated account must be able to reach the property.
  • On success, the deleted unit record is returned as it existed at the moment of deletion.
  • GET /properties/{propertyID}/units/{unitID} — retrieve the unit before deleting
  • POST /properties/units/{unitID}/deactivate — deactivate instead of permanently deleting
  • DELETE /properties/{propertyID} — delete the parent property (requires all units deleted first)
Authorizations:
basicAuth
path Parameters
propertyID
required
integer
Example: 548
unitID
required
integer
Example: 716

Responses

Response Schema: application/json
unitID
required
string
propertyID
required
string
isActive
required
string

Whether the unit is active.

  • 0 - Inactive
  • 1 - Active
address
required
string
stateID
required
string

The ID of the state the unit is in. Uses the 2-letter state code.

city
required
string
rent
required
string <double>
propertyImageID
string
name
string or null
streetNumber
string or null
streetName
string or null
address2
string or null
postalCode
string or null
latitude
string <double>
longitude
string <double>
deposit
string or null <double>
size
string or null
beds
string or null
fullBaths
string or null
halfBaths
string or null
leaseID
string or null
dateTimeCreated
string <date-time>
propertyManagerID
integer or null
commercialSpaceTypeID
string or null
isNonRevenue
string

Whether the unit is a non-revenue unit.

  • 0 - Revenue unit
  • 1 - Non-revenue unit
nonRevenueTypeID
string or null
nonRevenueStartDate
string or null <date>
isFromImport
integer
importSourceKey
string or null
dateTimeModified
string <date-time>
dateTimeDeactivated
string or null <date-time>
isUtilityBillingEnabled
string

Whether utility billing is enabled for this unit.

  • 0 - Disabled
  • 1 - Enabled
leaseNotes
string or null
entryInstructions
string or null
vendorEntryInstructions
string or null
maintenanceNotes
string or null

Response samples

Content type
application/json
{
  • "unitID": "716",
  • "propertyID": "548",
  • "propertyImageID": "1",
  • "isActive": "1",
  • "name": "Unit Name",
  • "address": "9470 Corkscrew Palms Circle 1",
  • "streetNumber": "9470",
  • "streetName": "Corkscrew Palms Circle 1",
  • "address2": null,
  • "stateID": "FL",
  • "city": "Cape",
  • "postalCode": "33928",
  • "latitude": "26.43072180",
  • "longitude": "-81.79698570",
  • "rent": "1500.00",
  • "deposit": "800.00",
  • "size": "1200",
  • "beds": "3",
  • "fullBaths": "2",
  • "halfBaths": "1",
  • "leaseID": null,
  • "dateTimeCreated": "2026-04-22 20:09:17",
  • "dateTimeModified": "2026-04-22 20:15:24",
  • "dateTimeDeactivated": null,
  • "propertyManagerID": null,
  • "commercialSpaceTypeID": null,
  • "isNonRevenue": "1",
  • "nonRevenueTypeID": "4",
  • "nonRevenueStartDate": "2026-04-23",
  • "isUtilityBillingEnabled": "1",
  • "isFromImport": "0",
  • "importSourceKey": null,
  • "leaseNotes": null,
  • "entryInstructions": null,
  • "vendorEntryInstructions": null,
  • "maintenanceNotes": null
}

Activate Unit

Activates a previously deactivated unit, making it available for leasing and reporting. For multi-unit properties, the parent property must already be active before the unit can be activated.

Use Cases

  • Re-enable a unit that was deactivated seasonally or for renovation

Business Rules

  • Requires the Change Property Status permission.
  • For multi-unit properties: the parent property must be active (isActive = 1). Returns 400 if the property is inactive.
  • Portfolio-level access restrictions apply — the authenticated account must be able to reach the property.
  • On success, returns the full unit record (same shape as GET /properties/{propertyID}/units/{unitID}).
  • POST /properties/units/{unitID}/deactivate — deactivate a unit
  • GET /properties/{propertyID}/units/{unitID} — retrieve the current unit state
  • POST /properties/{propertyID}/activate — activate the parent property
Authorizations:
basicAuth
path Parameters
unitID
required
integer
Example: 528

Responses

Response Schema: application/json
required
object (unit)

Response samples

Content type
application/json
{
  • "unit": {
    }
}

Deactivate Unit

Deactivates an existing unit, removing it from active availability for leasing and reporting. The unit cannot be deactivated if it has an active lease — the lease must be closed first.

Use Cases

  • Mark a unit as unavailable while undergoing renovation or seasonal closure

Business Rules

  • Requires the Change Property Status permission.
  • The unit cannot be deactivated if it has an active lease (leaseID is set). Returns 400 with a leaseID error.
  • Portfolio-level access restrictions apply — the authenticated account must be able to reach the property.
  • On success, returns the full unit record with isActive: "0" and dateTimeDeactivated populated.
  • POST /properties/units/{unitID}/activate — re-activate a deactivated unit
  • GET /properties/{propertyID}/units/{unitID} — retrieve the current unit state
  • POST /properties/{propertyID}/deactivate — deactivate the parent property
Authorizations:
basicAuth
path Parameters
unitID
required
integer
Example: 528

Responses

Response Schema: application/json
required
object (unit)

Response samples

Content type
application/json
{
  • "unit": {
    }
}

Listings

Search Listings

Performs a filtered, paginated search across all property listings. Returns denormalized result rows combining the listing, its unit, property, portfolio, property groups, property manager, and primary image in a single response — ideal for building vacancy boards, syndication feeds, and listing portals without additional lookups.

Use Cases

  • Power a vacancy board filtered by beds, baths, rent range, pet policy, and location
  • Feed listing data to syndication partners (Zillow, Rentals.com, Zumper, etc.) filtered by activation flag
  • Map-based searches using latitudeMin, latitudeMax, longitudeMin, longitudeMax bounding box
  • Filter by portfolio, portfolio group, property group, or property manager to scope results by ownership or management assignments
  • Detect recently changed listings for differential sync via dateTimeModifiedMin / dateTimeModifiedMax

Business Rules

  • Results are scoped to the authenticated account; cross-account data is never returned
  • image.small and image.large are null when no primary property image has been uploaded
  • image.small and image.large are absolute CDN URLs when an image exists (e.g. https://cdn.rentvine.com/{account}/properties/{propertyID}/images/{hash}/small.jpeg)
  • propertyManager.propertyManagerID and propertyManager.name are null when no property manager is assigned to the unit
  • propertyGroups.names is null when the property does not belong to any group
  • portfolio.contacts is a JSON-encoded string containing the array of owner contacts with ownership and distribution percentages
  • unit.leaseID reflects the current active lease on the unit, or null if vacant
  • Listing activation flags (isWebsiteActive, isZillowActive, etc.) are stored on the listing model but are NOT returned in this search response; use GET /properties/{propertyID}/listings/{unitID} to retrieve activation flags for a specific listing

Getting Listing Images

Each result includes a image object with small and large CDN URLs for the primary property image. To retrieve all uploaded listing photos and media files tied to a specific listing, use:

  • GET /listings/{propertyListingID}/files — lists all files (photos, documents) attached to a listing
  • GET /listings/files/{id}/preview — returns the file inline (for browser rendering)
  • GET /listings/files/{id}/download — downloads the file
  • GET /properties/listings - Basic paginated listing index with fewer filters
  • GET /properties/{propertyID}/listings/{unitID} - Full listing detail including activation flags and includes
  • GET /listings/{propertyListingID}/files - All files (photos) attached to a specific listing
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25
Example: pageSize=25

Number of results per page. Defaults to 25.

orderBy
string
Example: orderBy=dateTimeModified

Field to sort results by.

search
string
Example: search=Main St

Free-text search across listing and unit address fields.

isActive
integer
Enum: 0 1
Example: isActive=1

Filter by listing active status. 1 returns active listings, 0 returns deactivated listings.

isWebsiteActive
integer
Enum: 0 1
Example: isWebsiteActive=1

Filter by website syndication status. 1 returns listings actively published to the website.

isZillowActive
integer
Enum: 0 1
Example: isZillowActive=1

Filter by Zillow syndication status.

isRentalSourceActive
integer
Enum: 0 1
Example: isRentalSourceActive=1

Filter by RentalSource syndication status.

isRentalscomActive
integer
Enum: 0 1
Example: isRentalscomActive=1

Filter by Rentals.com syndication status.

isZumperActive
integer
Enum: 0 1
Example: isZumperActive=1

Filter by Zumper syndication status.

isApartmentsActive
integer
Enum: 0 1
Example: isApartmentsActive=1

Filter by Apartments.com syndication status.

isVacant
integer
Enum: 0 1
Example: isVacant=1

Filter by vacancy status. 1 returns vacant units, 0 returns occupied units.

rentMin
number
Example: rentMin=1000

Minimum rent amount (inclusive).

rentMax
number
Example: rentMax=3500

Maximum rent amount (inclusive).

bedsMin
integer
Example: bedsMin=2

Minimum number of bedrooms (inclusive).

bedsMax
integer
Example: bedsMax=4

Maximum number of bedrooms (inclusive).

bathsMin
number
Example: bathsMin=1

Minimum number of bathrooms (inclusive).

bathsMax
number
Example: bathsMax=3

Maximum number of bathrooms (inclusive).

petFilterOptionID
integer
Enum: 1 2 3 4
Example: petFilterOptionID=3

Filter by pet policy.

  • 1 - Dogs Allowed
  • 2 - Cats Allowed
  • 3 - Dogs and Cats Allowed
  • 4 - No Pets Allowed
city
string
Example: city=Fort Myers

Filter by city name (exact match).

stateID
string <= 2 characters
Example: stateID=FL

Filter by 2-character state or province code.

postalCode
string
Example: postalCode=33908

Filter by postal/ZIP code.

latitudeMin
number <float>
Example: latitudeMin=26.3

Southern boundary of a geographic bounding box (decimal degrees).

latitudeMax
number <float>
Example: latitudeMax=26.7

Northern boundary of a geographic bounding box (decimal degrees).

longitudeMin
number <float>
Example: longitudeMin=-82.1

Western boundary of a geographic bounding box (decimal degrees).

longitudeMax
number <float>
Example: longitudeMax=-81.7

Eastern boundary of a geographic bounding box (decimal degrees).

propertyTypeIDs[]
Array of integers
Items Enum: 1 2 3 4 5 6 7 8 9 10
Example: propertyTypeIDs[]=1&propertyTypeIDs[]=4

Filter by one or more property types. Pass multiple values as propertyTypeIDs[0]=1&propertyTypeIDs[1]=4.

  • 1 - Single Family Home
  • 2 - Apartment
  • 3 - Condo
  • 4 - Townhouse
  • 5 - Duplex
  • 6 - Multiplex
  • 7 - Loft
  • 8 - Mobile Home
  • 9 - Commercial
  • 10 - Garage
notPropertyTypeIDs[]
Array of integers
Items Enum: 1 2 3 4 5 6 7 8 9 10
Example: notPropertyTypeIDs[]=9

Exclude one or more property types. Pass multiple values as notPropertyTypeID[0]=9&notPropertyTypeID[1]=10. Uses the same type IDs as propertyTypeIDs[].

portfolioIDs[]
Array of integers
Example: portfolioIDs[]=338

Filter to listings belonging to one or more portfolios. Pass multiple values as portfolioIDs[0]=338&portfolioIDs[1]=249.

portfolioGroupIDs[]
Array of integers
Example: portfolioGroupIDs[]=12

Filter to listings in portfolios belonging to one or more portfolio groups.

propertyGroupIDs[]
Array of integers
Example: propertyGroupIDs[]=5

Filter to listings belonging to one or more property groups.

propertyManagerIDs[]
Array of integers
Example: propertyManagerIDs[]=101

Filter to listings managed by one or more property managers. Pass multiple values as propertyManagerIDs[0]=101&propertyManagerIDs[1]=102.

assignedToUserIDs[]
Array of integers
Example: assignedToUserIDs[]=891861

Filter to listings on properties assigned to one or more users.

showingProviderID
integer
Example: showingProviderID=1

Filter by showing provider ID.

dateTimeModifiedMin
date-time

Filter by minimum dateTimeModified

dateTimeModifiedMax
date-time

Filter by maximum dateTimeModified

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 529

Total number of matching listings across all pages

pagination-total-pages
integer
Example: 22

Total number of pages

pagination-current-page
integer
Example: 1

The current page number

pagination-next-page
integer or null
Example: 2

The next page number, or null if on the last page

pagination-before-page
integer or null

The previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

Always 1

pagination-last-page
integer
Example: 22

The last page number

Response Schema: application/json
Array
required
object
required
object
required
object
required
object
required
object
required
object
required
object

Primary property image with pre-signed CDN URLs. Both small and large are null when no image has been uploaded. To retrieve all listing photos and media, use GET /listings/{propertyListingID}/files.

Response samples

Content type
application/json
Example
[
  • {
    }
]

Get Property Image

Fetches a resized property image directly from the Rentvine CDN. The URL components are provided by the image.small and image.large fields returned from GET /properties/listings/search and similar listing endpoints — no separate lookup is required.

This endpoint does not use the /api/manager base URL and requires no authentication. Images are publicly accessible once you have the CDN URL.

Constructing the URL

The image object in each listing search result contains pre-built absolute URLs:

{
  "image": {
    "propertyImageID": "1664",
    "small": "https://cdn.rentvine.com/123pm/properties/707/images/e66a65f69d53ff3a19265b69efe9/small.jpeg",
    "large": "https://cdn.rentvine.com/123pm/properties/707/images/e66a65f69d53ff3a19265b69efe9/large.jpeg"
  }
}

You can use image.small and image.large directly without constructing the URL manually. Both values are null when no image has been uploaded for the property.

Size Variants

{size} Dimensions Use Case
small Thumbnail List views, vacancy boards, map pins
large Full size Detail pages, syndication feeds, lightboxes

Listing Photos

To retrieve all uploaded photos and media files attached to a specific listing (not just the primary property image), use:

  • GET /listings/{propertyListingID}/files — lists all files (photos, documents) attached to the listing
  • GET /listings/files/{id}/preview — returns a file inline (for browser display)
  • GET /listings/files/{id}/download — downloads a file as an attachment
  • GET /properties/listings/search - Returns image.small and image.large for each result
  • GET /listings/{propertyListingID}/files - All uploaded listing photos and media
path Parameters
account
required
string
Example: 123pm

Your account subdomain (e.g. 123pm). This is the subdomain of your Rentvine dashboard URL.

propertyID
required
integer
Example: 707

The propertyID from the listing search result.

imageHash
required
string
Example: e66a65f69d53ff3a19265b69efe9

The image hash component from the image.small or image.large URL (the segment between /images/ and /small.jpeg or /large.jpeg).

size
required
string
Enum: "small" "large"
Example: small

small for the thumbnail version, large for the full-size version.

Responses

Response Schema: image/jpeg
string <binary>

Response samples

Content type
application/json
{
  • "error": "Not found"
}

Email Conversations

List Email Conversations

Returns a paginated list of email conversations for a specific object (e.g. a lease, property, or contact). Each item includes metadata about the conversation thread and a count of its messages.

Use Cases

  • Display a list of email threads associated with a lease or property in the manager portal
  • Show inbox-style conversation history for a contact or vendor
  • Sync email conversations to an external CRM or ticketing system

Business Rules

  • Both objectTypeID and objectID are required. The request will return 400 if either is missing.
  • Access is restricted via verifyAccessToObjectType — the authenticated account must have access to the given object.
  • Results are ordered by dateTimeUpdated descending (most recently active conversations first).
  • Default page size is 25.
  • GET /contacts/conversations/{id} — retrieve a single conversation with its messages
  • POST /contacts/conversations — send a new email message (creates or extends a conversation)
Authorizations:
basicAuth
query Parameters
objectTypeID
required
integer
Example: objectTypeID=4

The object type the conversations belong to. See the Object Types reference for valid values.

Common values:

  • 3 - Contact
  • 4 - Lease
  • 6 - Property
  • 7 - Unit
objectID
required
integer
Example: objectID=1050

The primary key of the object identified by objectTypeID.

page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 12

Total number of items across all pages

pagination-total-pages
integer
Example: 1

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 1

Last page number

Response Schema: application/json
Array
emailConversationID
required
integer

Unique identifier for the email conversation.

objectTypeID
required
integer

Object type the conversation is associated with.

objectID
required
integer

Primary key of the associated object.

subject
required
string

Subject line of the email conversation thread.

dateTimeCreated
required
string <date-time>

When the conversation was first created.

dateTimeUpdated
required
string <date-time>

When the conversation was last updated (e.g. a new message was sent or received).

emailMessageCount
required
integer

Number of email messages within the conversation thread.

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Send Email

Sends an outbound email message, creating a new conversation thread or adding a reply to an existing one. On success, the response is the created or updated conversation record (identical to GET /contacts/conversations/{id} without includes).

Supply objectTypeID + objectID to start a new conversation, or emailConversationID to reply within an existing thread.

Use Cases

  • Send a move-in welcome email to all tenants on a lease
  • Reply to an existing email thread with additional documentation
  • Send a templated email to an owner using an email template

Business Rules

  • Requires the Contacts: Send Messages permission.
  • At least one entry in recipients is required. Addresses matching the system mail domain or noreply are silently filtered out.
  • When creating a new conversation, both objectTypeID and objectID are required. Omitting either returns a 400.
  • emailTemplateID (in the email object) causes the system to look up the template and populate templateObjectTypeID automatically.
  • copySender: "1" sends a copy of the email to the authenticated user.
  • File IDs supplied in attachments must already exist in the system.
  • GET /contacts/conversations — list conversations for an object
  • GET /contacts/conversations/{id} — retrieve a conversation with its message history
Authorizations:
basicAuth
Request Body schema: application/json
recipients
required
Array of strings <email>

Primary To recipients — array of email address strings.

message
required
string

HTML body of the email.

subject
required
string <= 300 characters

Email subject line. Required when creating a new conversation.

objectTypeID
required
integer

Object type the conversation belongs to. Required when creating a new conversation.

Common values:

  • 3 - Contact
  • 4 - Lease
  • 6 - Property
  • 7 - Unit
objectID
required
integer

Primary key of the object identified by objectTypeID. Required when creating a new conversation.

additionalRecipients
Array of strings <email>

Additional To recipients to include alongside recipients.

bcc
Array of strings <email>

BCC recipients — array of email address strings.

object

Email template options. emailTemplateID causes the system to resolve templateObjectTypeID automatically.

attachments
Array of integers

Array of fileID integers for files to attach to the email.

copySender
string
Enum: "0" "1"

Pass "1" to send a copy of the email to the authenticated manager user.

inputs
object

Optional key/value pairs passed to template rendering.

templateObjectTypeID
integer

Template object type used when rendering template variables in the email body.

emailConversationID
integer

Supply to reply within an existing conversation thread. If omitted, a new conversation is created.

Responses

Response Schema: application/json
required
object

Request samples

Content type
application/json
{
  • "additionalRecipients": [
    ],
  • "bcc": [
    ],
  • "message": "<p>Hi Tenants,</p><p>Mackenzie Walker</p><p>We are excited to welcome you as new tenants!</p>",
  • "subject": "Your Florida Lease Template",
  • "email": {
    },
  • "attachments": [ ],
  • "copySender": "1",
  • "inputs": { },
  • "recipients": [
    ],
  • "templateObjectTypeID": 2,
  • "objectTypeID": 4,
  • "objectID": "2982"
}

Response samples

Content type
application/json
{
  • "emailConversation": {
    }
}

Get Email Conversation

Retrieves a single email conversation by its ID. When the messages include is requested, the response also contains the full message history, all recipients, and any file attachments on each message.

Use Cases

  • Render a full email thread view in the manager portal for a lease or property
  • Export a conversation with attachments for compliance or record-keeping
  • Load recipient list and message history before composing a reply

Business Rules

  • Returns 400 if the conversation is not found.
  • Access is restricted via verifyAccessToObjectType using the conversation's objectTypeID and objectID — the authenticated account must have access to the associated object.
  • Without the messages include, only the base conversation record is returned.
  • With messages, all email messages in the thread are returned in descending order (most recent first). Each message includes an isPrimary flag (true for the first/latest message).

Available Includes (1)

  • messages — full message history with sender recipient details and file attachments per message. Also adds recipients (all conversation participants) to the response.
  • GET /contacts/conversations — list all conversations for an object
  • POST /contacts/conversations — send a new email message / create a conversation
Authorizations:
basicAuth
path Parameters
id
required
integer
Example: 301

The unique identifier of the email conversation (emailConversationID).

query Parameters
includes
string
Example: includes=messages

Comma-separated list of related data to include in the response.

Available values: messages

Responses

Response Schema: application/json
required
object
Array of objects

All participants in this conversation (if includes=messages).

Array of objects

Full message history (if includes=messages), ordered most recent first.

Response samples

Content type
application/json
Example
{
  • "emailConversation": {
    }
}

Chat Messages

List Chat Messages

Returns a paginated list of chat messages. Messages are returned in descending order (most recent first) and are automatically marked as read by the manager role upon retrieval.

Chat messages are associated with a specific object via chatObjectTypeID and objectID. The chatObjectTypeID identifies the type of object the chat thread belongs to (e.g. a Work Order, Lease, Portfolio, or Vendor).

Use Cases

  • Render the chat thread for a specific lease or work order in the manager portal
  • List all recent messages across a portfolio for an owner communication view
  • Filter messages shared with a specific party (tenant, vendor, owner) for audit or compliance purposes

Business Rules

  • For accounts with access restrictions, both chatObjectTypeID and objectID are required. Restricted accounts that omit these will receive a 400 error.
  • Unrestricted accounts may omit chatObjectTypeID and objectID to retrieve messages across all objects.
  • Messages are marked as read by the manager role automatically upon retrieval.
  • Default page size is 20.
  • search performs a full-text match against the message body.
  • Each result row is structured as a flat dot-notation object with message.*, user.*, and contact.* keys.

chatObjectTypeID Values

  • 1 - Work Order
  • 2 - Lease
  • 3 - Portfolio
  • 4 - Vendor
  • 5 - Applicant
  • GET /chat/messages/{id} — retrieve a single message with file attachments
  • POST /chat/messages — create a new chat message
  • GET /chat/messages/stats — get unread message count for a specific object
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 20
Example: pageSize=20

Number of results per page. Defaults to 20.

chatObjectTypeID
integer
Enum: 1 2 3 4 5
Example: chatObjectTypeID=2

The chat object type identifying what kind of object the chat thread belongs to. Required for restricted accounts.

  • 1 - Work Order
  • 2 - Lease
  • 3 - Portfolio
  • 4 - Vendor
  • 5 - Applicant
objectID
integer
Example: objectID=1050

Primary key of the object identified by chatObjectTypeID. Required for restricted accounts.

search
string
Example: search=maintenance request

Full-text search against the message body.

isSharedWithTenant
integer
Enum: 0 1
Example: isSharedWithTenant=1

Filter by whether messages are shared with the tenant. Pass 1 for shared, 0 for not shared.

isSharedWithCosigner
integer
Enum: 0 1

Filter by whether messages are shared with the cosigner.

isSharedWithVendor
integer
Enum: 0 1

Filter by whether messages are shared with the vendor.

isSharedWithOwner
integer
Enum: 0 1

Filter by whether messages are shared with the owner.

Responses

Response Headers
pagination-page-size
integer
Example: 20

Number of items per page

pagination-total-items
integer
Example: 34

Total number of items across all pages

pagination-total-pages
integer
Example: 2

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 2

Last page number

Response Schema: application/json
Array
message.messageID
required
integer

Unique identifier of the chat message.

message.chatObjectTypeID
required
integer

Chat object type identifier (1=Work Order, 2=Lease, 3=Portfolio, 4=Vendor, 5=Applicant).

message.objectID
required
integer

Primary key of the associated object.

message.roleTypeID
required
integer

Role type of the message sender (1=Manager, 2=Tenant, etc.).

message.message
required
string

Text body of the chat message.

message.dateTimeCreated
required
string <date-time>

When the message was created.

message.userID
integer or null

ID of the user who sent the message (manager-originated messages).

message.contactID
integer or null

ID of the contact who sent the message (tenant/vendor/owner-originated messages).

message.messageLinkPreviewMeta
object or null

Parsed JSON metadata for a URL link preview embedded in the message, if any.

message.isSharedWithTenant
integer

Whether the message is visible to the tenant (0 or 1).

message.isSharedWithCosigner
integer

Whether the message is visible to the cosigner (0 or 1).

message.isSharedWithVendor
integer

Whether the message is visible to the vendor (0 or 1).

message.isSharedWithOwner
integer

Whether the message is visible to the owner (0 or 1).

message.isReadByManager
integer

Whether the message has been read by the manager (0 or 1).

message.isReadByTenant
integer

Whether the message has been read by the tenant (0 or 1).

message.isReadByVendor
integer

Whether the message has been read by the vendor (0 or 1).

message.isReadByOwner
integer

Whether the message has been read by the owner (0 or 1).

message.isRead
integer

Whether the message has been read by the requesting role (derived). Always 1 for manager after this endpoint is called (messages are marked read on retrieval).

Array of objects

File attachments on the message.

user.userID
integer or null

User ID of the sender (populated for manager-originated messages).

user.firstName
string or null

First name of the sending user.

user.lastName
string or null

Last name of the sending user.

user.email
string or null <email>

Email address of the sending user.

contact.contactID
integer or null

Contact ID of the sender (populated for tenant/vendor/owner-originated messages).

contact.contactTypeID
integer or null

Type of the sending contact.

contact.name
string or null

Display name of the sending contact.

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Create Chat Message

Creates a new chat message on a specific object (lease, work order, portfolio, vendor, or applicant). On success, the response is identical to GET /chat/messages/{id} — the full message record with file attachments.

Use Cases

  • Post a manager note on a lease that the tenant can see in the resident portal
  • Send an internal-only note on a work order
  • Attach a file to a chat thread for a vendor

Business Rules

  • roleTypeID is always set to Manager (1) server-side and cannot be overridden by the client.
  • The authenticated account must have access to the object identified by chatObjectTypeID and objectID.
  • attachments is an array of fileID integers referencing files that already exist in the system.
  • Sharing flags (isSharedWithTenant, isSharedWithVendor, isSharedWithOwner, isSharedWithCosigner) default to 0 if omitted.
  • GET /chat/messages — list messages for an object
  • GET /chat/messages/{id} — retrieve a single message
Authorizations:
basicAuth
Request Body schema: application/json
chatObjectTypeID
required
integer
Enum: 1 2 3 4 5

The chat object type identifying what kind of object the message belongs to.

  • 1 - Work Order
  • 2 - Lease
  • 3 - Portfolio
  • 4 - Vendor
  • 5 - Applicant
objectID
required
integer

Primary key of the object identified by chatObjectTypeID.

message
required
string

HTML body of the chat message.

isSharedWithTenant
integer
Default: 0
Enum: 0 1

Whether the message is visible to the tenant (0 or 1).

isSharedWithVendor
integer
Default: 0
Enum: 0 1

Whether the message is visible to the vendor (0 or 1).

isSharedWithOwner
integer
Default: 0
Enum: 0 1

Whether the message is visible to the owner (0 or 1).

isSharedWithCosigner
integer
Default: 0
Enum: 0 1

Whether the message is visible to the cosigner (0 or 1).

attachments
Array of integers

Array of fileID integers for files to attach to the message.

Responses

Response Schema: application/json
required
object
required
Array of objects

File attachments on the created message (empty if none were supplied).

Request samples

Content type
application/json
{
  • "attachments": [ ],
  • "message": "<p>test</p>",
  • "chatObjectTypeID": 2,
  • "objectID": 2982,
  • "isSharedWithTenant": "1",
  • "isSharedWithCosigner": "1"
}

Response samples

Content type
application/json
{
  • "message": {
    },
  • "fileAttachments": [ ]
}

Text Messages

Send Text Message

Sends an outbound SMS text message to a phone number. On success, the response returns the created text message record (identical to GET /messages/texts/{id}).

Use Cases

  • Send a reminder text to a tenant about an upcoming payment
  • Notify a vendor of a new work order via SMS
  • Send a quick update to a contact from the manager portal

Business Rules

  • Requires the Contacts: Send Messages permission.
  • to must be a valid phone number in E.164 format (e.g. +14436420607).
  • attachments is an optional array of fileID integers referencing files that already exist in the system (MMS attachments).
  • contactID is accepted in the payload but is not stored on the text message record — it is used for UI context only.
  • GET /messages/texts/phone/{phoneNumber} — list the full thread for a phone number
  • GET /messages/texts/{id} — retrieve a single text message
Authorizations:
basicAuth
Request Body schema: application/json
to
required
string

Recipient phone number in E.164 format.

message
required
string

Text body of the SMS message.

attachments
Array of integers

Optional array of fileID integers for MMS file attachments.

contactID
integer

Optional contact ID for UI context. Not stored on the text message record.

Responses

Response Schema: application/json
required
object

Request samples

Content type
application/json
{
  • "contactID": "3816",
  • "to": "+14436420607",
  • "message": "test"
}

Response samples

Content type
application/json
{
  • "textMessage": {
    }
}

List Text Messages by Phone

Returns a paginated list of text messages (both inbound and outbound) for a given phone number. Messages are ordered by dateTimeSent descending (most recent first).

The phoneNumber path parameter should contain only the digits of the phone number including country code (e.g. 14436420607 for +1 443-642-0607). The system automatically prepends + before querying.

Use Cases

  • Display a full SMS conversation thread with a tenant or vendor
  • Retrieve message history for a specific phone number for audit or compliance
  • Load messages before a known message ID for infinite-scroll pagination (use load endpoint instead)

Business Rules

  • phoneNumber must be provided as digits only (no +, dashes, or spaces).
  • Both inbound and outbound messages for the phone number are returned.
  • Default page size is 15.
  • POST /messages/texts/send — send a new text message
  • GET /messages/texts/{id} — retrieve a single text message
Authorizations:
basicAuth
path Parameters
phoneNumber
required
integer
Example: 14436420607

Phone number digits including country code, without + prefix (e.g. 14436420607).

query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 15
Example: pageSize=15

Number of results per page. Defaults to 15.

search
string
Example: search=maintenance

Filter results to messages whose body contains this string.

Responses

Response Headers
pagination-page-size
integer
Example: 15

Number of items per page

pagination-total-items
integer
Example: 42

Total number of items across all pages

pagination-total-pages
integer
Example: 3

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 3

Last page number

Response Schema: application/json
Array
textMessageID
required
integer

Unique identifier of the text message.

isInbound
required
integer

Whether the message was received (1) or sent (0) by the manager.

from
required
string

Sender phone number in E.164 format.

to
required
string

Recipient phone number in E.164 format.

message
required
string

Text body of the message.

dateTimeSent
required
string <date-time>

When the message was sent or received.

fileAttachments
string or null

JSON-encoded array of file attachment metadata stored with the message, if any.

sentByUserID
integer or null

ID of the manager user who sent the message (null for inbound messages).

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Screening

Get Screening Settings

Returns the screening and application settings configured for the account. This includes whether online applications are enabled, which application template is used by default, and automation preferences.

Use Cases

  • Determine whether the application portal is active before directing prospects to apply
  • Check which generic application template is assigned for use in portals that do not have a property-specific template
  • Inspect automation flags to understand when confirmation emails and auto-assignment are triggered

Business Rules

  • Returns a single settings object scoped to the authenticated account — there is no pagination.
  • isApplicationEnabled controls whether the resident-facing application portal is accessible.
  • isGenericApplicationEnabled controls whether a generic (non-property-specific) application link is active.
  • isAvailableUnitsOnly restricts the application portal to units that are marked as available.
  • autoAssignApplicationFromProperty causes incoming applications to automatically inherit the assigned manager from the property.
  • autoSendProspectConfirmationEmail sends a confirmation email to the applicant upon submission.
  • GET /screening/applications — list submitted applications
  • GET /screening/applications/{applicationID} — retrieve a single application
Authorizations:
basicAuth

Responses

Response Schema: application/json
screeningSettingID
required
string

Unique identifier for the screening settings record.

applicationProviderID
required
string

ID of the third-party screening provider integrated with this account.

isApplicationEnabled
required
string
Enum: "0" "1"

Whether the resident-facing application portal is enabled. 1 = enabled, 0 = disabled.

isGenericApplicationEnabled
required
string
Enum: "0" "1"

Whether a generic (non-property-specific) application link is active. 1 = enabled, 0 = disabled.

isAvailableUnitsOnly
required
string
Enum: "0" "1"

Restricts the application portal to units marked as available. 1 = available units only, 0 = all units.

autoAssignApplicationFromProperty
required
string
Enum: "0" "1"

Automatically assigns the property's manager to incoming applications. 1 = enabled, 0 = disabled.

autoSendProspectConfirmationEmail
required
string
Enum: "0" "1"

Sends a confirmation email to applicants upon submission. 1 = enabled, 0 = disabled.

applicationUrl
string or null

Custom application URL override. Empty string if not set.

genericApplicationTemplateID
string or null

ID of the application template used for generic (non-property-specific) applications.

genericApplicationTemplateName
string or null

Display name of the generic application template.

Response samples

Content type
application/json
{
  • "screeningSettingID": "1",
  • "applicationProviderID": "1",
  • "isApplicationEnabled": "1",
  • "applicationUrl": "",
  • "isGenericApplicationEnabled": "1",
  • "genericApplicationTemplateID": "2",
  • "isAvailableUnitsOnly": "1",
  • "autoAssignApplicationFromProperty": "1",
  • "autoSendProspectConfirmationEmail": "1",
  • "genericApplicationTemplateName": "Commercial Application"
}

List Applications

Returns a paginated list of rental applications submitted to the account. Each item includes the application record, current status, associated unit and property details, and linked lease information when a lease has been created.

Use Cases

  • Display a queue of pending applications for review
  • Filter applications by status or unit to find relevant submissions
  • Sync application data with an external leasing workflow

Business Rules

  • Results are scoped to the portfolios accessible to the authenticated account.
  • Default page size is 25. Use page and pageSize to paginate through results.
  • Applications are returned in descending order by applicationID (most recent first).
  • The lease object will have null values when no lease has been created from the application yet.
  • GET /screening/applications/{applicationID} — retrieve a single application's details
  • GET /screening/applications/{applicationID}/summary — retrieve a full summary with applicant data
  • POST /screening/applications/{applicationID}/status — update an application's status
Authorizations:
basicAuth
query Parameters
page
integer
Default: 1

The page number for pagination

pageSize
integer
Default: 25

Number of items per page

search
string
Example: search=Walter

Search against applicant names, address, or application number.

applicationStatusID
integer
Example: applicationStatusID=2

Filter by application status ID.

unitID
integer
Example: unitID=709

Filter applications by a specific unit ID.

Responses

Response Headers
pagination-page-size
integer
Example: 25

Number of items per page

pagination-total-items
integer
Example: 1608

Total number of items across all pages

pagination-total-pages
integer
Example: 65

Total number of pages

pagination-current-page
integer
Example: 1

Current page number

pagination-next-page
integer or null
Example: 2

Next page number, or null if on the last page

pagination-before-page
integer or null

Previous page number, or null if on the first page

pagination-first-page
integer
Example: 1

First page number (always 1)

pagination-last-page
integer
Example: 65

Last page number

Response Schema: application/json
Array
required
object
required
object
required
object
required
object
required
object

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Get Application

Returns the core details of a single rental application by its ID, including the application record and its current status.

Use Cases

  • Retrieve the current status and metadata of a specific application
  • Display application details in a manager review view

Business Rules

  • Returns a 404 if the application does not exist or is not accessible to the authenticated account.
  • The status object reflects both the custom sub-status (applicationStatusID) and the underlying system-level status (primaryApplicationStatusID).
  • GET /screening/applications — list all applications
  • GET /screening/applications/{applicationID}/summary — full summary with applicant details and screening data
  • POST /screening/applications/{applicationID}/status — update the application status
Authorizations:
basicAuth
path Parameters
applicationID
required
integer
Example: 1702

The unique identifier of the application.

Responses

Response Schema: application/json
required
object
required
object

Response samples

Content type
application/json
{
  • "application": {
    },
  • "status": {
    }
}

Get Application Summary

Returns an enriched summary of a rental application, including applicant qualification data (income ratio, combined income, occupants, animals), individual applicant records with screening field statuses, pending applicant slots, legacy screening reports, and the screening report mode.

This endpoint provides significantly more detail than GET /screening/applications/{applicationID} and is intended for the application review screen.

Use Cases

  • Render the full application review page with income ratios, bedroom counts, and applicant screening statuses
  • Display individual applicant data tabs (credit, criminal, eviction, income, identity, rental history)
  • Determine whether legacy screening reports are available for an application

Business Rules

  • Returns a 404 if the application does not exist or is not accessible to the authenticated account.
  • summary.incomeRatio is calculated as combinedIncome / rent. A ratio meeting or exceeding expectedRatio indicates the applicant qualifies by income.
  • applicants[].data is an array of screening field status objects, one per field type (application, animals, identity, income, credit, criminal, eviction, landlord).
  • screeningReportModeID indicates how screening reports are processed: 1 = integrated provider, 2 = manual/legacy.
  • pendingApplicants contains applicant slots that have been invited but have not yet submitted their portion of the application.
  • GET /screening/applications/{applicationID} — lightweight application record without summary data
  • GET /screening/applicants/{applicantID}/tab/application — full applicant form data for a specific applicant
  • POST /screening/reports — order screening reports for applicants
  • POST /screening/applications/{applicationID}/status — update the application status
Authorizations:
basicAuth
path Parameters
applicationID
required
integer
Example: 1702

The unique identifier of the application.

Responses

Response Schema: application/json
required
object

Response samples

Content type
application/json
{
  • "application": {
    }
}

Update Application Status

Updates the status of a rental application and optionally sends a notification email to the applicant and/or additional recipients. This is the primary action used to move an application through the review pipeline (e.g. from Submitted → Under Review → Approved or Declined).

Use Cases

  • Approve or decline an application after review
  • Move an application to a custom sub-status (e.g. "Contingent", "Pending Documents")
  • Send a templated notification email to the applicant upon status change
  • BCC additional recipients (e.g. owner, team member) on the notification

Business Rules

  • applicationStatusID must reference a valid system or custom status ID.
  • When sendEmail is true, the email object is required and must include at least one entry in recipients.
  • emailTemplateID references an email template configured in the account. The template may include Liquid variables such as {{ application.applicantNames | list }} and {{ application.address }}.
  • bcc and additionalRecipients accept arrays of email address strings.
  • attachments accepts an array of file attachment references (empty array if none).
  • copySender is treated as a string boolean: "1" = copy the sending user, "0" = do not copy.
  • Returns a 400 if applicationStatusID is missing or invalid.
  • Returns a 404 if the application does not exist or is not accessible.
  • GET /screening/applications/{applicationID} — retrieve current application status
  • GET /screening/applications/{applicationID}/summary — full application review data
Authorizations:
basicAuth
path Parameters
applicationID
required
integer
Example: 1702

The unique identifier of the application.

Request Body schema: application/json
applicationStatusID
required
string

ID of the status to set on the application.

Common system status IDs:

  • 1 - Incomplete
  • 2 - Submitted
  • 3 - In Progress
  • 4 - On Hold
  • 5 - In Review
  • 6 - Approved
  • 7 - Declined
sendEmail
boolean
Default: false

Whether to send a notification email to the applicant on status change.

object

Email configuration. Required when sendEmail is true.

Responses

Response Schema: application/json
required
object

The updated application record.

required
object

The application status record set by this action.

Request samples

Content type
application/json
Example
{
  • "applicationStatusID": "6",
  • "sendEmail": true,
  • "email": {
    }
}

Response samples

Content type
application/json
{
  • "application": {
    },
  • "status": {
    }
}

Get Applicant Application Tab

Returns the full application form data for a specific applicant, including personal details, employment history, address history, vehicles, occupants, SSN (last 4 digits), and the dynamic form builder structure used to render the application. This endpoint powers the applicant detail tab in the application review screen.

Use Cases

  • Render a read-only view of a specific applicant's submitted application form
  • Extract structured employment and address history for underwriting review
  • Access the dynamic builder field structure to display custom application sections and fields

Business Rules

  • Returns a 404 if the applicant does not exist or is not accessible to the authenticated account.
  • ssn returns only the last 4 digits of the social security number — the full value is never exposed via the API.
  • builder.sections contains the dynamic form structure including all active sections and field definitions. includedForView = 1 means the section is visible in the review view.
  • employmentHistory and vehicles use an items + maxID structure where maxID tracks the highest auto-incremented ID for client-side additions.
  • addressHistory may be null if the applicant did not provide prior addresses.
  • GET /screening/applications/{applicationID}/summary — application-level summary with all applicants
  • GET /screening/applications/{applicationID} — application core record
  • POST /screening/reports — order screening reports for this applicant
Authorizations:
basicAuth
path Parameters
applicantID
required
integer
Example: 1664

The unique identifier of the applicant.

Responses

Response Schema: application/json
applicantID
required
string
applicationID
required
string
number
required
string

Application reference number.

unitID
required
string
countryID
required
string
address
required
string
city
required
string
stateID
required
string
postalCode
required
string
firstName
required
string
lastName
required
string
email
required
string <email>
userID
string or null

Linked Rentvine user account ID, if the applicant has a portal account.

applicantContactID
string or null

ID of the contact record created for this applicant.

address2
string or null
moveInDate
string or null <date>

Requested move-in date.

leaseMonths
string or null

Requested lease duration as a human-readable string.

middleName
string or null
homePhone
string or null
cellPhone
string or null
workPhone
string or null
birthDate
string or null <date>
licenseNumber
string or null
licenseState
string or null
applicantType
string or null

Type of applicant (e.g. primary, co-applicant). Null when not specified.

ssn
string or null

Last 4 digits of the applicant's Social Security Number.

addressHistory
object or null

Prior address history entries in items + maxID structure.

object

Employment history entries.

occupants
object or null

Additional occupants in items + maxID structure.

object

Vehicle information entries.

object

Dynamic form builder structure defining the application sections and fields.

Response samples

Content type
application/json
{
  • "applicantID": "1664",
  • "applicationID": "1702",
  • "number": "101635",
  • "userID": null,
  • "applicantContactID": "5231",
  • "unitID": "709",
  • "countryID": "US",
  • "address": "9470 Corkscrew Palms Circle",
  • "address2": "315",
  • "city": "Estero",
  • "stateID": "FL",
  • "postalCode": "33928",
  • "moveInDate": null,
  • "leaseMonths": "1 year",
  • "firstName": "Walter",
  • "middleName": "William",
  • "lastName": "DeVeas",
  • "email": "applicant@example.com",
  • "homePhone": null,
  • "cellPhone": null,
  • "workPhone": null,
  • "birthDate": "2001-01-01",
  • "licenseNumber": null,
  • "licenseState": null,
  • "applicantType": null,
  • "ssn": "3333",
  • "addressHistory": null,
  • "employmentHistory": {
    },
  • "occupants": null,
  • "vehicles": {
    }
}

Order Screening Reports

Orders one or more screening reports (credit, criminal, eviction) for specified applicants on a rental application. Reports are requested from the integrated screening provider and results are associated with the applicant records.

Use Cases

  • Trigger credit, criminal, and/or eviction checks for all applicants on an application
  • Order only specific report types (e.g. eviction only) for a subset of applicants
  • Re-run screening reports after an initial error

Business Rules

  • applicationID must reference an existing, accessible application.
  • applicantIDs must contain at least one applicant ID. All provided applicants must belong to the specified application.
  • reportTypeIDs must contain at least one valid report type. Supported report type IDs:
    • 1 — Credit
    • 2 — Criminal
    • 3 — Eviction
  • The account must have an active screening provider integration configured (applicationProviderID in screening settings).
  • Returns a 400 if any applicant ID does not belong to the specified application or if reportTypeIDs is empty.
  • Report results are returned asynchronously by the provider — this endpoint initiates the request but does not return the report data. Poll GET /screening/applications/{applicationID}/summary to check report status.
  • GET /screening/settings — verify screening provider is configured
  • GET /screening/applications/{applicationID}/summary — check report status after ordering
  • GET /screening/applicants/{applicantID}/tab/application — view applicant details before ordering
Authorizations:
basicAuth
Request Body schema: application/json
applicationID
required
string

ID of the application to order reports for.

applicantIDs
required
Array of integers non-empty

List of applicant IDs to run reports for. All must belong to the specified application.

reportTypeIDs
required
Array of integers non-empty
Items Enum: 1 2 3

List of report type IDs to order.

  • 1 — Credit
  • 2 — Criminal
  • 3 — Eviction

Responses

Response Schema: application/json
object

Confirmation that screening report requests were submitted.

Request samples

Content type
application/json
Example
{
  • "applicationID": "1702",
  • "applicantIDs": [
    ],
  • "reportTypeIDs": [
    ]
}

Response samples

Content type
application/json
{
  • "success": true,
  • "message": "Screening reports have been ordered"
}

Custom Fields

List Custom Field Object Types

Returns all available custom field category object types. Each entry represents a distinct type of object in the system (e.g., Owner, Lease, Property) that can have custom field categories and fields assigned to it. Object types are static and preset — they cannot be created or deleted via the API.

Use Cases

  • Enumerate all object types before populating a dropdown for selecting which object type a new custom field category should apply to
  • Display a summary of how many custom field categories and fields are configured per object type
  • Determine valid customFieldCategoryObjectTypeID values for use in POST /custom-field-categories and GET /custom-field-category-object-types/{customFieldCategoryObjectTypeID}

Business Rules

  • Object types are system-defined and static — this list does not change between requests
  • categoryCount reflects the total number of custom field categories assigned to this object type
  • fieldCount reflects the total number of individual custom fields across all categories for this object type
  • No pagination — the full list is returned in a single response
  • GET /custom-field-category-object-types/{customFieldCategoryObjectTypeID} — list all categories and fields for a specific object type
  • POST /custom-field-categories — create a new custom field category under one of these object types
  • GET /custom-fields/values/{objectTypeID}/{objectID} — retrieve field values for an object
Authorizations:
basicAuth

Responses

Response Schema: application/json
Array
customFieldCategoryObjectTypeID
required
integer

Unique identifier for the object type. Use this value as customFieldCategoryObjectTypeID when creating categories or fetching fields.

categoryCount
required
string

Total number of custom field categories configured for this object type.

fieldCount
required
string

Total number of individual custom fields across all categories for this object type.

Response samples

Content type
application/json
[
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    }
]

Get Custom Field Categories by Object Type

Returns all custom field categories and their associated fields for a given object type. Unlike GET /custom-fields/values/{objectTypeID}/{objectID}, this endpoint returns the field definitions only — it does not include any values saved for a specific object.

Use this endpoint to discover which categories and fields exist for an object type before reading or writing values via the values endpoints.

Use Cases

  • Build a custom field editor UI by first loading all available categories and fields for a given object type
  • Determine valid customFieldID keys when constructing a payload for POST /custom-fields/values/{objectTypeID}/{objectID}
  • Inspect field settings (e.g., dropdown options) to render appropriate input controls

Business Rules

  • customFieldCategoryObjectTypeID must be a valid ID from GET /custom-field-category-object-types
  • Categories are returned ordered by orderIndex
  • Each category includes a customFields array listing all fields in that category, ordered by their own orderIndex
  • The settings property is a JSON-encoded string that may contain a description and an options array for dropdown (fieldTypeID: 3) fields
  • This endpoint does not return current field values — use GET /custom-fields/values/{objectTypeID}/{objectID} for that
  • GET /custom-field-category-object-types — list all available object types
  • GET /custom-fields/values/{objectTypeID}/{objectID} — retrieve field values for a specific object
  • POST /custom-fields/values/{objectTypeID}/{objectID} — save field values for a specific object
  • POST /custom-field-categories — create a new category under this object type
Authorizations:
basicAuth
path Parameters
customFieldCategoryObjectTypeID
required
integer
Example: 1

The ID of the object type whose categories and fields should be returned. Obtain valid IDs from GET /custom-field-category-object-types.

Responses

Response Schema: application/json
Array
customFieldCategoryID
required
string

Unique identifier for the custom field category.

customFieldCategoryObjectTypeID
required
string

The object type this category belongs to.

name
required
string

Display name of the category.

orderIndex
required
string

Sort position of the category relative to others for this object type.

required
Array of objects

Ordered list of custom field definitions in this category. Empty array if no fields have been added yet.

Response samples

Content type
application/json
[
  • {
    },
  • {
    },
  • {
    }
]

Create Custom Field Category

Creates a new custom field category under the specified object type. A category acts as a named grouping for related custom fields. After creating a category, custom fields can be added to it via the Rentvine UI or subsequent API calls.

Use Cases

  • Programmatically provision a new group of custom fields for a specific object type during account setup
  • Create a structured category (e.g., "Lease Terms", "Inspection Details") before adding fields to it

Business Rules

  • name and customFieldCategoryObjectTypeID together must be unique — a category with the same name cannot be created more than once for the same object type
  • customFieldCategoryObjectTypeID must reference a valid object type from GET /custom-field-category-object-types
  • The new category is created with no custom fields; fields must be added separately via the Rentvine interface
  • GET /custom-field-category-object-types — list available object types to find a valid customFieldCategoryObjectTypeID
  • GET /custom-field-category-object-types/{customFieldCategoryObjectTypeID} — verify the new category appears in the list after creation
  • GET /custom-fields/values/{objectTypeID}/{objectID} — retrieve field values for objects in this category's object type
Authorizations:
basicAuth
Request Body schema: application/json
name
required
string

Display name for the new custom field. Must be unique within the given category.

customFieldCategoryObjectTypeID
required
string

ID of the object type this category belongs to. Obtain valid values from GET /custom-field-category-object-types.

customFieldCategoryID
required
string

ID of the category this field will be added to.

fieldTypeID
required
integer
Enum: 1 2 3 4 5 6 7 8

Controls the input type rendered for this field.

  • 1 - Short Text
  • 2 - Paragraph
  • 3 - Dropdown
  • 4 - Toggle
  • 5 - Date
  • 6 - Number
  • 7 - Decimal
  • 8 - Integer
options
string

JSON-encoded array of options for Dropdown fields. Use "[]" for non-dropdown field types.

Responses

Response Schema: application/json
required
object

Request samples

Content type
application/json
Example
{
  • "name": "test-docs",
  • "fieldTypeID": 1,
  • "options": "[]",
  • "customFieldCategoryID": "43",
  • "customFieldCategoryObjectTypeID": "1"
}

Response samples

Content type
application/json
{
  • "customField": {
    }
}

Get Custom Field Values

Returns all custom field categories and their field values for a given object type and object. Each category contains an ordered list of fields with their current values for the specified object.

Use Cases

  • Display custom field data on a property, lease, owner, tenant, or vendor detail page
  • Retrieve all custom fields associated with an applicant or screening record before displaying them
  • Audit which custom field values have been filled in for a specific object

Business Rules

  • objectTypeID identifies the type of object (e.g., 1 = Owner, 2 = Lease, 5 = Property)
  • objectID is the unique identifier of the specific object within that type
  • Fields with no value saved will return null for the value property
  • Fields are grouped by customFieldCategoryID and ordered by orderIndex
  • The settings property is a JSON-encoded string containing field metadata such as dropdown options and description
  • POST /custom-fields/values/{objectTypeID}/{objectID} — save or update field values for the object
  • GET /custom-field-category-object-types — list all object types and their category counts
  • GET /custom-field-category-object-types/{customFieldCategoryObjectTypeID} — list categories and fields for an object type
Authorizations:
basicAuth
path Parameters
objectTypeID
required
integer
Example: 5

The ID of the object type (e.g., 1 = Owner, 2 = Lease, 5 = Property).

objectID
required
integer
Example: 577

The unique ID of the specific object whose custom field values are being retrieved.

Responses

Response Schema: application/json
Array
customFieldCategoryID
required
string

Unique identifier for the custom field category.

customFieldCategoryObjectTypeID
required
string

The object type this category belongs to.

name
required
string

Display name of the custom field category.

orderIndex
required
string

Sort order of the category relative to other categories for this object type.

required
Array of objects

Ordered list of custom fields within this category, each including the current value for the object.

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Save Custom Field Values

Saves or updates the custom field values for a specific object. The request body is a flat map where each key is a customFieldID (as a string) and the value is the new value to save. A customFieldCategoryID key must be included to scope the update to the correct category.

Only the fields provided in the payload are updated. Fields not included in the payload retain their existing values.

Use Cases

  • Save filled-in custom field data after a user edits a property, lease, or contact record
  • Programmatically populate custom fields during an import or onboarding flow
  • Clear a field value by setting it to null

Business Rules

  • objectTypeID and objectID in the path must match a valid object
  • Keys in the request body are customFieldID values cast to strings
  • customFieldCategoryID is required in the payload to scope the write to the correct category
  • Setting a field value to null clears any previously stored value
  • The response returns the full updated set of categories and fields for the object (same shape as GET /custom-fields/values/{objectTypeID}/{objectID})
  • GET /custom-fields/values/{objectTypeID}/{objectID} — retrieve current field values for the object
  • GET /custom-field-category-object-types/{customFieldCategoryObjectTypeID} — list categories and fields to know which customFieldID keys are valid
Authorizations:
basicAuth
path Parameters
objectTypeID
required
integer
Example: 5

The ID of the object type (e.g., 1 = Owner, 2 = Lease, 5 = Property).

objectID
required
integer
Example: 577

The unique ID of the specific object whose custom field values are being saved.

Request Body schema: application/json
customFieldCategoryID
required
string

The ID of the category being updated. All field IDs in the payload must belong to this category.

property name*
additional property
string or null

A custom field value keyed by its customFieldID. Set to null to clear the value.

Responses

Response Schema: application/json
Array
customFieldCategoryID
required
string

Unique identifier for the custom field category.

customFieldCategoryObjectTypeID
required
string

The object type this category belongs to.

name
required
string

Display name of the custom field category.

orderIndex
required
string

Sort order of the category.

required
Array of objects

Updated list of custom fields with their latest values.

Request samples

Content type
application/json
Example
{
  • "364": null,
  • "469": "test",
  • "customFieldCategoryID": "96"
}

Response samples

Content type
application/json
[
  • {
    }
]

Object Types

Rentvine uses Object Types to label different objects in the system. Object types, along with the primary key of the object given as objectID, are commonly used to identify objects that use a shared resource.

For example, when uploading a file for a unit, the unitID would be used for the objectID and an objectTypeID of 7 would given with the file when uploading a file to the files endpoint.

ID Object Type
1Account
2User
3Contact
4Lease
5Bill
6Property
7Unit
8Deposit
9Accounting Transaction
10Accounting Transaction Entry
11Portfolio
12Payout
13Bank Adjustment
14Company
15Statement
16Work Order
17Inspection
18Inspection Area
19Inspection Item
20Application
21Applicant
22Bank Transfer
23Listing
24Appliance
25Text Message
26Email Message
27Work Order Estimate
28Settlement
29Lease Tenant
30Email Template
31Note
32File Attachment
33Vendor Bill
34Document Transaction
35Document Envelope
36Application Template
37Recurring Bill
38Chat Message
39Reconciliation
40Path
41Payout Return
42Management Fee Setting
43Additional Management Fee Setting
44Accounting Setting
45Posting Setting
46Late Fee Setting
47Statement Setting
48Payout Batch
49Letter
50Reminder
51Review