Download OpenAPI specification:Download
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
Settings > Users, Roles and API > APINew API KeyName field and select a predefined role in the Role dropdownℹ️ Roles need to be setup before creating an API key. Create Roles via the
Rolestab.
List Leases for Export
The Last Modified Timestamp on Leases is updated by multiple actions including, but not limited to, the following.
| 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 |
object (lease_export) | |
object (balances) | |
object (unpaid_charges) | |
object (property_export) | |
object (unit_export) | |
object (portfolio_export) |
[- {
- "lease": {
- "leaseID": 0,
- "code": "string",
- "propertyID": 0,
- "unitID": 0,
- "primaryLeaseStatusID": 1,
- "leaseStatusID": 0,
- "moveInDate": "2019-08-24",
- "moveOutDate": "2019-08-24",
- "startDate": "2019-08-24",
- "endDate": "2019-08-24",
- "closedDate": "2019-08-24",
- "expectedMoveOutDate": "2019-08-24",
- "increaseEligibilityDate": "2019-08-24",
- "tenants": [
- {
- "name": "string",
- "email": "string",
- "phone": "string",
- "isActive": true,
- "contactID": 0
}
], - "dateTimeCreated": "2019-08-24T14:15:22Z",
- "dateTimeModified": "2019-08-24T14:15:22Z"
}, - "balances": {
- "unpaidTotalAmount": 0,
- "unpaidRentAmount": 0,
- "pastDueTotalAmount": 0,
- "pastDueRentAmount": 0
}, - "unpaidCharges": {
- "amount": 0,
- "isRent": true,
- "amountPaid": 0,
- "datePosted": "2019-08-24",
- "accountName": "string",
- "description": "string",
- "transactionID": 0,
- "isOverdue": true
}, - "property": {
- "propertyID": 0,
- "propertyTypeID": 1,
- "isMultiUnit": true,
- "isActive": true,
- "name": "string",
- "countryID": "US",
- "address": "string",
- "streetNumber": 0,
- "streetName": "string",
- "address2": "string",
- "city": "string",
- "stateID": "string",
- "postalCode": "string",
- "latitude": 0,
- "longitude": 0,
- "reserveAmount": 0
}, - "unit": {
- "unitID": 0,
- "isActive": true,
- "name": "string",
- "address": "string",
- "streetNumber": "string",
- "streetName": "string",
- "address2": "string",
- "city": "string",
- "stateID": "string",
- "postalCode": "string",
- "latitude": 0,
- "longitude": 0,
- "rent": 0,
- "deposit": 0,
- "size": 0,
- "beds": 0,
- "fullBaths": 0,
- "halfBaths": 0
}, - "portfolio": {
- "portfolioID": 0,
- "name": "string",
- "isActive": true,
- "reserveAmount": 0,
- "additionalReserveAmount": 0,
- "owners": [
- {
- "name": "string",
- "email": "string",
- "isActive": true,
- "contactID": 0
}
]
}
}
]List Properties for Export
The Last Modified Timestamp on Properties is updated by multiple actions including, but not limited to, the following.
| 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 |
object | |
object (portfolio_export) |
[- {
- "property": {
- "propertyID": 0,
- "propertyTypeID": 1,
- "isMultiUnit": true,
- "isActive": true,
- "name": "string",
- "countryID": "US",
- "address": "string",
- "streetNumber": 0,
- "streetName": "string",
- "address2": "string",
- "city": "string",
- "stateID": "string",
- "postalCode": "string",
- "latitude": 0,
- "longitude": 0,
- "reserveAmount": 0,
- "groups": [
- {
- "name": "string",
- "propertyGroupID": 0
}
], - "dateTimeCreated": "2019-08-24T14:15:22Z",
- "dateTimeModified": "2019-08-24T14:15:22Z"
}, - "portfolio": {
- "portfolioID": 0,
- "name": "string",
- "isActive": true,
- "reserveAmount": 0,
- "additionalReserveAmount": 0,
- "owners": [
- {
- "name": "string",
- "email": "string",
- "isActive": true,
- "contactID": 0
}
]
}
}
]List Units for Export
The Last Modified Timestamp on Units is updated by multiple actions including, but not limited to, the following.
| 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 |
object (property_export) | |
object |
[- {
- "property": {
- "propertyID": 0,
- "propertyTypeID": 1,
- "isMultiUnit": true,
- "isActive": true,
- "name": "string",
- "countryID": "US",
- "address": "string",
- "streetNumber": 0,
- "streetName": "string",
- "address2": "string",
- "city": "string",
- "stateID": "string",
- "postalCode": "string",
- "latitude": 0,
- "longitude": 0,
- "reserveAmount": 0
}, - "unit": {
- "unitID": 0,
- "isActive": true,
- "name": "string",
- "address": "string",
- "streetNumber": "string",
- "streetName": "string",
- "address2": "string",
- "city": "string",
- "stateID": "string",
- "postalCode": "string",
- "latitude": 0,
- "longitude": 0,
- "rent": 0,
- "deposit": 0,
- "size": 0,
- "beds": 0,
- "fullBaths": 0,
- "halfBaths": 0,
- "dateTimeCreated": "2019-08-24T14:15:22Z",
- "dateTimeModified": "2019-08-24T14:15:22Z"
}
}
]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.
| 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 |
object (application_export) | |
object (unit_export) | |
object |
[- {
- "application": {
- "applicationID": 0,
- "number": "string",
- "primaryApplicationStatusID": 1,
- "applicationStatusID": 0,
- "unitID": 0,
- "address": "string",
- "address2": "string",
- "city": "string",
- "stateID": "string",
- "postalCode": "string",
- "applicants": [
- {
- "applicantID": 0,
- "name": "string",
- "email": "string",
- "phone": "string"
}
], - "dateTimeCreated": "2019-08-24T14:15:22Z",
- "dateTimeModified": "2019-08-24T14:15:22Z"
}, - "unit": {
- "unitID": 0,
- "isActive": true,
- "name": "string",
- "address": "string",
- "streetNumber": "string",
- "streetName": "string",
- "address2": "string",
- "city": "string",
- "stateID": "string",
- "postalCode": "string",
- "latitude": 0,
- "longitude": 0,
- "rent": 0,
- "deposit": 0,
- "size": 0,
- "beds": 0,
- "fullBaths": 0,
- "halfBaths": 0
}, - "lease": {
- "leaseID": 0,
- "startDate": "2019-08-24",
- "endDate": "2019-08-24",
- "tenants": [
- {
- "name": "string",
- "email": "string",
- "phone": "string",
- "isActive": true,
- "contactID": 0
}
]
}
}
]Returns a paginated list of chart-of-accounts records. Each item contains a full account
object.
accountTypeID or accountTypeIDs.isActive and isEscrow.GET /accounting/accounts/search - Search with additional filters (accountID, dateTimeModified range).GET /accounting/accounts/{accountID} - Retrieve a single account with optional includes.| 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.
|
| accountTypeIDs | Array of integers Example: accountTypeIDs=3&accountTypeIDs=7 Array form of the account type filter. Takes precedence over |
| isActive | boolean Example: isActive=true Filter by active status. |
| isEscrow | boolean Filter to accounts flagged as escrow accounts. |
| 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. |
required | object (account) |
| token required | string Session token associated with this response. |
[- {
- "account": {
- "accountID": 31,
- "parentAccountID": null,
- "accountTypeID": 3,
- "accountCategoryID": null,
- "number": "1010",
- "name": "Operating Account",
- "isActive": "1",
- "isSubjectToManagementFees": "0",
- "isSubjectToLateFees": "0",
- "isDeposit": "0",
- "depositTypeID": null,
- "isEscrow": "0",
- "isRent": "0",
- "isSubsidized": "0",
- "isTaxable": "0",
- "isSubjectToSalesTax": "0",
- "isSubjectToMarkup": "0",
- "isPrepayment": "0",
- "isManagementFee": "0",
- "isBudgetEnabled": "0",
- "isHeld": "0",
- "bankName": "First National Bank",
- "bankAccountTypeID": 1,
- "bankAccountCiphertextID": 142,
- "bankAccountNumberTruncated": "4321",
- "bankAccountAddress": "100 Commerce Blvd",
- "bankAccountAddress2": null,
- "bankAccountCity": "Miami",
- "bankAccountStateID": "FL",
- "bankAccountPostalCode": "33101",
- "bankAccountCountryID": "US",
- "isCheckingEnabled": "1",
- "checkCompanyName": "Sunset Property Management",
- "checkSignatory": "Jane Doe",
- "checkAddress": "500 Brickell Ave",
- "checkAddress2": "Suite 200",
- "checkCity": "Miami",
- "checkStateID": "FL",
- "checkPostalCode": "33131",
- "checkCountryID": "US",
- "bankAccountNextCheckNumber": "1042",
- "bankAccountNextDepositNumber": "88",
- "checkTemplateID": 3,
- "creditCardGatewayID": null,
- "achGatewayID": 5,
- "cashCardGatewayID": null,
- "remoteCheckGatewayID": null,
- "isFromImport": "0",
- "importSourceKey": null,
- "isNachaEnabled": "1",
- "isNachaFileBalanced": "0",
- "nachaOriginName": "Sunset PM",
- "nachaOriginNumber": "0123456789",
- "nachaDestinationName": "First National Bank",
- "nachaDestinationNumber": "021000021",
- "nachaCompanyIdentification": "1234567890",
- "nachaCompanyName": "Sunset Property Mgmt",
- "nachaOriginatingFinancialInstitutionID": "021000021",
- "nachaAdapterID": 1,
- "isBillApprovalExempt": "0",
- "exportInvoiceServiceName": null,
- "dateTimeCreated": "2023-01-14 18:39:10",
- "dateTimeModified": "2026-04-10 09:22:44",
- "dateTimeDeactivated": null
}, - "token": "1777146894"
}
]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.
accountID.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.| 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. |
| 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).
|
| 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 |
| 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. |
required | object (account) |
required | object or null Account category associated with this account, or null fields when uncategorized. |
[- {
- "account": {
- "accountID": 31,
- "parentAccountID": null,
- "accountTypeID": 3,
- "accountCategoryID": null,
- "number": "1010",
- "name": "Operating Account",
- "isActive": "1",
- "isSubjectToManagementFees": "0",
- "isSubjectToLateFees": "0",
- "isDeposit": "0",
- "depositTypeID": null,
- "isEscrow": "0",
- "isRent": "0",
- "isSubsidized": "0",
- "isTaxable": "0",
- "isSubjectToSalesTax": "0",
- "isSubjectToMarkup": "0",
- "isPrepayment": "0",
- "isManagementFee": "0",
- "isBudgetEnabled": "0",
- "isHeld": "0",
- "bankName": "First National Bank",
- "bankAccountTypeID": 1,
- "bankAccountCiphertextID": 142,
- "bankAccountNumberTruncated": "4321",
- "bankAccountAddress": "100 Commerce Blvd",
- "bankAccountAddress2": null,
- "bankAccountCity": "Miami",
- "bankAccountStateID": "FL",
- "bankAccountPostalCode": "33101",
- "bankAccountCountryID": "US",
- "isCheckingEnabled": "1",
- "checkCompanyName": "Sunset Property Management",
- "checkSignatory": "Jane Doe",
- "checkAddress": "500 Brickell Ave",
- "checkAddress2": "Suite 200",
- "checkCity": "Miami",
- "checkStateID": "FL",
- "checkPostalCode": "33131",
- "checkCountryID": "US",
- "bankAccountNextCheckNumber": "1042",
- "bankAccountNextDepositNumber": "88",
- "checkTemplateID": 3,
- "creditCardGatewayID": null,
- "achGatewayID": 5,
- "cashCardGatewayID": null,
- "remoteCheckGatewayID": null,
- "isFromImport": "0",
- "importSourceKey": null,
- "isNachaEnabled": "1",
- "isNachaFileBalanced": "0",
- "nachaOriginName": "Sunset PM",
- "nachaOriginNumber": "0123456789",
- "nachaDestinationName": "First National Bank",
- "nachaDestinationNumber": "021000021",
- "nachaCompanyIdentification": "1234567890",
- "nachaCompanyName": "Sunset Property Mgmt",
- "nachaOriginatingFinancialInstitutionID": "021000021",
- "nachaAdapterID": 1,
- "isBillApprovalExempt": "0",
- "exportInvoiceServiceName": null,
- "dateTimeCreated": "2023-01-14 18:39:10",
- "dateTimeModified": "2026-04-10 09:22:44",
- "dateTimeDeactivated": null
}, - "accountCategory": {
- "accountCategoryID": null,
- "accountTypeID": null,
- "name": null
}
}
]Returns a paginated list of bills. Each item in the response includes the bill record and its associated payee contact.
contact object is always returned alongside each bill — it is not opt-in.page and pageSize query parameters to navigate pages.GET /bills/{billID} - Retrieve a single bill with full includes support.POST /bills - Create a bill.| page | integer Default: 1 The page number for pagination |
| pageSize | integer Default: 25 Number of items per page |
| 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. |
required | object (bill) |
required | object The payee contact associated with this bill. |
[- {
- "bill": {
- "billID": "14201",
- "billBatchID": null,
- "parentBillID": "14200",
- "payeeContactID": "1",
- "billTypeID": "2",
- "bankAccountID": null,
- "billDate": "2027-11-11",
- "dateDue": "2027-11-11",
- "reference": "515151",
- "paymentMemo": null,
- "serviceAccountNumber": null,
- "description": null,
- "workOrderID": "4772",
- "discountPercent": "0.0000",
- "markupPercent": "0.0000",
- "isVoided": "0",
- "isApproved": "1",
- "approvedByUserID": "381140",
- "managementFeeBatchID": null,
- "isDiscount": "0",
- "isMarkup": "1",
- "managementFeeMode": "2",
- "propertyID": null,
- "utilityID": null,
- "utilityPeriodStartDate": null,
- "utilityPeriodEndDate": null,
- "importAccountCommitID": null
}, - "contact": {
- "contactID": "1",
- "contactTypeID": "4",
- "vendorTypeID": null,
- "code": null,
- "name": "123 PM",
- "firstName": null,
- "middleName": null,
- "lastName": null,
- "suffix": null,
- "email": "jimmy@rentvine.com",
- "phone": "+18883034711",
- "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": "3",
- "otherPayoutTypeID": "1",
- "achDetailsCiphertextID": "101",
- "achAccountNumberTruncated": "7337",
- "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": "50",
- "preventConsolidatedPayments": "0",
- "isFromImport": "0",
- "importSourceKey": null,
- "websiteUrl": null,
- "applicantID": null,
- "ownerPortalNameOverride": null,
- "isBillApprovalExempt": "0",
- "isBillingSalesTaxEnabled": "0",
- "isQuickbooksExportEnabled": "1",
- "quickbooksCustomerName": "123 PM Company",
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2023-01-14 18:39:10",
- "dateTimeModified": "2026-03-30 16:07:14",
- "dateTimeDeactivated": null,
- "contactType": "Manager"
}
}
]Creates a new bill in the system.
leaseCharges.payeeContactID, billDate, and dateDue are required.workOrderID on
this request. Optionally set workOrderStatusID to update the work order's status at the
same time the bill is created.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.charges must include ledgerID, chargeAccountID, and amount.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.| 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 |
| bankAccountID | integer or null The bank account to use for this bill. Only applicable when |
| 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 |
required | object (bill) |
{- "payeeContactID": "67",
- "billDate": "2026-04-22",
- "dateDue": "2026-04-22",
- "reference": "12345",
- "paymentMemo": "Plumbing invoice April",
- "description": "Bathroom plumbing repair",
- "charges": [
- {
- "ledgerID": "960",
- "description": "Plumbing repair labor",
- "chargeAccountID": "37",
- "amount": "100.00",
- "salesTaxAmount": "0.00",
- "leaseID": null
}
], - "leaseCharges": [ ],
- "overrideBankAccount": false
}{- "bill": {
- "billID": "15106",
- "billBatchID": null,
- "parentBillID": null,
- "payeeContactID": "67",
- "billTypeID": "1",
- "bankAccountID": null,
- "billDate": "2026-04-22",
- "dateDue": "2026-04-22",
- "reference": "12345",
- "paymentMemo": "Plumbing invoice April",
- "serviceAccountNumber": null,
- "description": "Bathroom plumbing repair",
- "workOrderID": null,
- "discountPercent": "0.0000",
- "markupPercent": "0.0000",
- "isVoided": "0",
- "isApproved": "1",
- "approvedByUserID": "512915",
- "managementFeeBatchID": null,
- "isDiscount": "0",
- "isMarkup": "0",
- "managementFeeMode": "2",
- "propertyID": null,
- "utilityID": null,
- "utilityPeriodStartDate": null,
- "utilityPeriodEndDate": null,
- "importAccountCommitID": null
}
}Retrieves a single bill by ID, with optional related data via includes.
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.| billID required | integer Example: 15054 |
| 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: |
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. |
{- "bill": {
- "billID": "15054",
- "billBatchID": null,
- "parentBillID": null,
- "payeeContactID": "67",
- "billTypeID": "1",
- "bankAccountID": null,
- "billDate": "2026-04-22",
- "dateDue": "2026-04-22",
- "reference": "123456",
- "paymentMemo": "test memo",
- "serviceAccountNumber": null,
- "description": "test description",
- "workOrderID": "5758",
- "discountPercent": "0.0000",
- "markupPercent": "0.0000",
- "isVoided": "0",
- "isApproved": "1",
- "approvedByUserID": "501195",
- "managementFeeBatchID": null,
- "isDiscount": "0",
- "isMarkup": "0",
- "managementFeeMode": "2",
- "propertyID": null,
- "utilityID": null,
- "utilityPeriodStartDate": null,
- "utilityPeriodEndDate": null,
- "importAccountCommitID": null
}, - "contact": {
- "contactID": "67",
- "contactTypeID": "3",
- "vendorTypeID": "9",
- "code": null,
- "name": "Walter's Windows",
- "firstName": null,
- "middleName": null,
- "lastName": null,
- "suffix": null,
- "email": "walter@rentvine.com",
- "phone": "+14436420607",
- "countryID": "US",
- "address": "9470 Corkscrew Palms Cir",
- "address2": null,
- "city": "Naples",
- "stateID": "FL",
- "postalCode": "33928",
- "birthDate": null,
- "defaultBillChargeAccountID": "37",
- "payeeName": null,
- "taxPayerName": "Walter's Windows",
- "taxFormTypeID": "1",
- "identificationTypeID": null,
- "identificationNumber": null,
- "identificationCountryID": null,
- "identificationIssuingLocation": null,
- "identificationExpirationDate": null,
- "payoutTypeID": "4",
- "otherPayoutTypeID": null,
- "achDetailsCiphertextID": "353",
- "achAccountNumberTruncated": "7324",
- "achAccountTypeID": "2",
- "achIsCorporateAccount": "0",
- "holdPayments": "0",
- "liabilityInsuranceName": "walker",
- "liabilityInsurancePolicyNumber": "232315-154852145-23",
- "liabilityInsuranceExpiresDate": "2024-02-18",
- "workersCompInsuranceName": "walter",
- "workersCompInsurancePolicyNumber": "1524458855",
- "workersCompInsuranceExpiresDate": "2024-03-27",
- "discountPercent": "10.0000",
- "discountAmount": null,
- "discountAmountMin": null,
- "discountAmountMax": null,
- "discountGraceDays": null,
- "isActive": "1",
- "isInsuranceRequiredForPayment": "1",
- "maxLineItemsOnPayment": null,
- "preventConsolidatedPayments": "0",
- "isFromImport": "0",
- "importSourceKey": null,
- "websiteUrl": null,
- "applicantID": null,
- "ownerPortalNameOverride": null,
- "isBillApprovalExempt": "0",
- "isBillingSalesTaxEnabled": "0",
- "isQuickbooksExportEnabled": "1",
- "quickbooksCustomerName": "Walter's Windows",
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2023-01-14 18:39:10",
- "dateTimeModified": "2025-11-07 21:37:00",
- "dateTimeDeactivated": null,
- "contactType": "Vendor"
}, - "charges": [
- {
- "transaction": {
- "transactionID": "80853",
- "transactionTypeID": "7",
- "managementFeeMode": "2",
- "primaryLedgerID": "976",
- "portfolioID": "338",
- "propertyID": null,
- "unitID": null,
- "leaseID": null,
- "billID": "15054",
- "contactID": null,
- "bankAccountID": null,
- "chargeAccountID": "37",
- "equityAccountID": null,
- "destinationBankAccountID": null,
- "managementFeeIncomeAccountID": null,
- "prepaymentAccountFilterTypeID": null,
- "prepaymentAccountID": null,
- "unallocatedAccountID": null,
- "payoutID": null,
- "payoutReturnID": null,
- "amount": "90.00",
- "amountPaid": "0.00",
- "amountAllocated": null,
- "processingFee": null,
- "convenienceFee": null,
- "convenienceFeeTransactionID": null,
- "description": "test description",
- "reference": null,
- "receivedFrom": null,
- "returnTransactionID": null,
- "returnTypeID": null,
- "returnDescription": null,
- "bulkPaymentID": null,
- "paymentTypeID": null,
- "billChargeTransactionID": null,
- "billCreditTransactionID": null,
- "discountAmount": "0.00",
- "markupAmount": "0.00",
- "managementFeeAmountPaid": null,
- "isAdditionalManagementFee": null,
- "managementFeePercent": null,
- "isSuppressed": "0",
- "managementFeeExpenseAccountID": null,
- "managementFeePeriodDate": null,
- "managementFeeSalesTaxSettingID": null,
- "managementFeeSalesTaxAmountPaid": null,
- "managementFeeSalesTaxPercent": null,
- "managementFeeSalesTaxIncomeAccountID": null,
- "managementFeeSalesTaxExpenseAccountID": null,
- "managementFeeBatchID": null,
- "isSalesTaxCharge": null,
- "salesTaxSettingID": null,
- "salesTaxInitiatedFromTransactionID": null,
- "isVoided": "0",
- "bankAccountGatewayID": null,
- "bankAccountGatewayTransactionID": null,
- "settlementID": null,
- "paymentAccountName": null,
- "paymentAccountNumberTruncated": null,
- "depositID": null,
- "reconciliationID": null,
- "previousReconciliationID": null,
- "achStatusID": null,
- "bankTransferID": null,
- "lateFeePeriod": null,
- "isFromManager": null,
- "isMoveInCharge": null,
- "isProrated": null,
- "isMoveOutTransaction": null,
- "moveOutAmount": null,
- "discountMarkupBillChargeTransactionID": null,
- "recurringObjectID": null,
- "withholdingTaxAgencyID": null,
- "withholdingTaxContactID": null,
- "datePosted": "2026-04-22",
- "dateTimeCreated": "2026-04-22 23:29:16",
- "dateTimeModified": "2026-04-22 23:29:16"
}, - "property": {
- "propertyID": null,
- "propertyImageID": null,
- "propertyTypeID": null,
- "isMultiUnit": null,
- "isActive": null,
- "portfolioID": null,
- "managementFeeSettingID": null,
- "name": null,
- "countryID": null,
- "address": null,
- "streetNumber": null,
- "streetName": null,
- "address2": null,
- "stateID": null,
- "city": null,
- "postalCode": null,
- "latitude": null,
- "longitude": null,
- "county": null,
- "assignedToUserID": null,
- "legalDescription": null,
- "maintenanceLimitAmount": null,
- "yearBuilt": null,
- "dateTimeModified": null,
- "dateTimeDeactivated": null,
- "isFromImport": null,
- "dateInsuranceExpires": null,
- "dateWarrantyExpires": null,
- "maintenanceNotes": null,
- "applicationTemplateID": null,
- "reserveAmount": null,
- "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": null,
- "importSourceKey": null
}, - "unit": {
- "unitID": null,
- "propertyID": null,
- "propertyImageID": null,
- "isActive": null,
- "name": null,
- "address": null,
- "streetNumber": null,
- "streetName": null,
- "address2": null,
- "stateID": null,
- "city": null,
- "postalCode": null,
- "latitude": null,
- "longitude": null,
- "rent": null,
- "deposit": null,
- "size": null,
- "beds": null,
- "fullBaths": null,
- "halfBaths": null,
- "leaseID": null,
- "dateTimeCreated": null,
- "dateTimeModified": null,
- "dateTimeDeactivated": null,
- "propertyManagerID": null,
- "commercialSpaceTypeID": null,
- "isNonRevenue": null,
- "nonRevenueTypeID": null,
- "nonRevenueStartDate": null,
- "isUtilityBillingEnabled": null,
- "isFromImport": null,
- "importSourceKey": null,
- "leaseNotes": null,
- "entryInstructions": null,
- "vendorEntryInstructions": null,
- "maintenanceNotes": null
}, - "portfolio": {
- "portfolioID": "338",
- "code": null,
- "name": "123 test",
- "contacts": [
- {
- "contactID": "4330",
- "percentOwned": "100.0000",
- "percentDistributed": "100.0000",
- "name": "Shaina Kwiatkowsk"
}, - {
- "contactID": "4266",
- "percentOwned": "0.0000",
- "percentDistributed": "0.0000",
- "name": "07112025 Test Owner"
}
], - "postingSettingID": "1",
- "assignedToUserID": "501195",
- "minimumDistributionAmount": "0.00",
- "maximumDistributionAmount": "5000.00",
- "reserveAmount": "2500.00",
- "additionalReserveAmount": "1200.00",
- "additionalReserveDescription": null,
- "overdraftOverrideAmount": "1000.00",
- "fiscalYearEndMonth": "12",
- "statementSettingID": "62",
- "sendStatements": "1",
- "holdDistributions": "1",
- "holdDistributionsDescription": null,
- "isActive": "1",
- "isLiveLedgerEnabled": "1",
- "isBalanceNoticeDisabled": "1",
- "dateTimeCreated": "2025-07-16 20:42:22",
- "dateTimeModified": "2026-04-07 17:33:25",
- "dateTimeDeactivated": null,
- "isFromImport": "0",
- "importSourceKey": null,
- "isPublicStatementEnabled": "1",
- "dateClosed": null
}, - "postingSetting": {
- "postingSettingID": "1",
- "name": "My Preferred Settings",
- "operatingAccountID": "31",
- "escrowAccountID": "32",
- "leaseRefundAccountID": "31",
- "isActive": "1"
}, - "ledger": {
- "ledgerID": "976",
- "ledgerTypeID": "2",
- "objectID": "338",
- "name": "123 test",
- "isActive": "1",
- "dateTimeCreated": "2025-07-16 20:42:22",
- "dateTimeModified": "2026-04-07 17:33:25"
}, - "restricted": "0",
- "payeeLedger": {
- "ledgerID": "976",
- "ledgerTypeID": "2",
- "objectID": "338",
- "name": "123 test",
- "isActive": "1",
- "dateTimeCreated": "2025-07-16 20:42:22",
- "dateTimeModified": "2026-04-07 17:33:25"
}
}
], - "bankAccount": {
- "bankAccountID": "31"
}, - "leaseCharges": [
- {
- "transaction": {
- "transactionID": "80856",
- "transactionTypeID": "1",
- "managementFeeMode": "2",
- "primaryLedgerID": "866",
- "portfolioID": "297",
- "propertyID": "601",
- "unitID": "583",
- "leaseID": "2991",
- "billID": "15054",
- "contactID": null,
- "bankAccountID": null,
- "chargeAccountID": "37",
- "equityAccountID": null,
- "destinationBankAccountID": null,
- "managementFeeIncomeAccountID": null,
- "prepaymentAccountFilterTypeID": null,
- "prepaymentAccountID": null,
- "unallocatedAccountID": null,
- "payoutID": null,
- "payoutReturnID": null,
- "amount": "100.00",
- "amountPaid": "0.00",
- "amountAllocated": null,
- "processingFee": null,
- "convenienceFee": null,
- "convenienceFeeTransactionID": null,
- "description": "test description",
- "reference": null,
- "receivedFrom": null,
- "returnTransactionID": null,
- "returnTypeID": null,
- "returnDescription": null,
- "bulkPaymentID": null,
- "paymentTypeID": null,
- "billChargeTransactionID": null,
- "billCreditTransactionID": null,
- "discountAmount": null,
- "markupAmount": null,
- "managementFeeAmountPaid": "0.00",
- "isAdditionalManagementFee": "0",
- "managementFeePercent": null,
- "isSuppressed": "0",
- "managementFeeExpenseAccountID": null,
- "managementFeePeriodDate": null,
- "managementFeeSalesTaxSettingID": null,
- "managementFeeSalesTaxAmountPaid": null,
- "managementFeeSalesTaxPercent": null,
- "managementFeeSalesTaxIncomeAccountID": null,
- "managementFeeSalesTaxExpenseAccountID": null,
- "managementFeeBatchID": null,
- "isSalesTaxCharge": null,
- "salesTaxSettingID": null,
- "salesTaxInitiatedFromTransactionID": null,
- "isVoided": "0",
- "bankAccountGatewayID": null,
- "bankAccountGatewayTransactionID": null,
- "settlementID": null,
- "paymentAccountName": null,
- "paymentAccountNumberTruncated": null,
- "depositID": null,
- "reconciliationID": null,
- "previousReconciliationID": null,
- "achStatusID": null,
- "bankTransferID": null,
- "lateFeePeriod": null,
- "isFromManager": null,
- "isMoveInCharge": "0",
- "isProrated": "0",
- "isMoveOutTransaction": "0",
- "moveOutAmount": null,
- "discountMarkupBillChargeTransactionID": null,
- "recurringObjectID": null,
- "withholdingTaxAgencyID": null,
- "withholdingTaxContactID": null,
- "datePosted": "2026-04-22",
- "dateTimeCreated": "2026-04-22 23:29:16",
- "dateTimeModified": "2026-04-22 23:29:16"
}, - "property": {
- "propertyID": "601",
- "propertyImageID": "1",
- "propertyTypeID": "1",
- "isMultiUnit": "0",
- "isActive": "1",
- "portfolioID": "297",
- "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": "539498",
- "legalDescription": null,
- "maintenanceLimitAmount": "500.00",
- "yearBuilt": null,
- "dateTimeModified": "2025-07-26 16:02:03",
- "dateTimeDeactivated": null,
- "isFromImport": "0",
- "dateInsuranceExpires": null,
- "dateWarrantyExpires": null,
- "maintenanceNotes": null,
- "applicationTemplateID": null,
- "reserveAmount": "500.00",
- "markupPercent": null,
- "markupAmount": null,
- "markupAmountMin": null,
- "markupAmountMax": null,
- "dateContractBegins": "2025-07-18",
- "dateContractEnds": "2025-07-19",
- "commercialClassTypeID": null,
- "salesTaxSettingID": null,
- "withholdingTaxAgencyID": null,
- "insuranceCompany": null,
- "insuranceAgent": null,
- "insurancePolicyNumber": null,
- "insuranceContactDetails": null,
- "leaseReturnChargeAmount": null,
- "propertyShowingProviderID": null,
- "dateTimeCreated": "2025-07-26 15:58:44",
- "importSourceKey": null
}, - "unit": {
- "unitID": "583",
- "propertyID": "601",
- "propertyImageID": "1",
- "isActive": "1",
- "name": null,
- "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",
- "rent": "12.00",
- "deposit": "13.00",
- "size": "1500",
- "beds": "5",
- "fullBaths": "6",
- "halfBaths": "0",
- "leaseID": "2776",
- "dateTimeCreated": "2025-07-26 15:58:44",
- "dateTimeModified": "2025-12-08 17:40:53",
- "dateTimeDeactivated": null,
- "propertyManagerID": null,
- "commercialSpaceTypeID": null,
- "isNonRevenue": "0",
- "nonRevenueTypeID": null,
- "nonRevenueStartDate": null,
- "isUtilityBillingEnabled": "1",
- "isFromImport": "0",
- "importSourceKey": null,
- "leaseNotes": null,
- "entryInstructions": null,
- "vendorEntryInstructions": null,
- "maintenanceNotes": null
}, - "ledger": {
- "ledgerID": "866",
- "ledgerTypeID": "2",
- "objectID": "297",
- "name": "WalterDeVeasTestPortfolio",
- "isActive": "1",
- "dateTimeCreated": "2025-04-14 20:49:15",
- "dateTimeModified": "2025-09-25 21:06:37"
}, - "restricted": "0"
}
], - "payouts": [ ],
- "workOrder": {
- "workOrderID": "5758",
- "workOrderNumber": "105585",
- "workOrderProjectID": null,
- "recurringWorkOrderID": "48",
- "isInternal": "0",
- "propertyID": "565",
- "unitID": "546",
- "leaseID": "2554",
- "vendorContactID": null,
- "primaryWorkOrderStatusID": "4",
- "workOrderStatusID": "27",
- "vendorWorkOrderStatusID": "1",
- "portalVendorWorkOrderStatusID": "1",
- "vendorWorkOrderStatusUpdated": null,
- "priorityID": "2",
- "sourceTypeID": "6",
- "isOwnerApproved": "0",
- "isVacant": "0",
- "description": "<p>sfgsf</p>",
- "diagnosticSummary": null,
- "aiSessionID": null,
- "isResolvedByRequestor": "0",
- "vendorInstructions": null,
- "dateClosed": null,
- "closingDescription": null,
- "isSharedWithTenant": "0",
- "isSharedWithOwner": "0",
- "isNew": "1",
- "createdByUserID": "1",
- "closedByUserID": null,
- "cancelledByUserID": null,
- "dateTimeCreated": "2026-02-20 05:20:00",
- "modifiedByUserID": "501195",
- "dateTimeModified": "2026-04-22 23:29:16",
- "inspectionID": null,
- "incidentLocation": null,
- "appointmentWindowStartDateTime": null,
- "appointmentWindowEndDateTime": null,
- "isTenantPresenceRequired": "0",
- "rejectedByVendorContactID": null,
- "vendorRejectReason": null,
- "vendorClosingComments": null,
- "orderIndex": "0",
- "dateDue": null,
- "reviewID": null,
- "vendorAccessTypeID": "3",
- "residentProvidedEntryInstructions": null,
- "entryInstructions": null,
- "isTenantFinanciallyResponsible": "0",
- "portfolioID": "312",
- "vendorTradeID": null,
- "assignedToUserID": null,
- "requestedByContactID": null,
- "estimatedAmount": null,
- "scheduledStartDate": null,
- "actualStartDate": null,
- "scheduledEndDate": null,
- "actualEndDate": null
}, - "parentBill": null,
- "discountBill": {
- "billID": "15055",
- "billBatchID": null,
- "parentBillID": "15054",
- "payeeContactID": "1",
- "billTypeID": "2",
- "bankAccountID": null,
- "billDate": "2026-04-22",
- "dateDue": "2026-04-22",
- "reference": "123456",
- "paymentMemo": "test memo",
- "serviceAccountNumber": null,
- "description": null,
- "workOrderID": "5758",
- "discountPercent": "0.0000",
- "markupPercent": "0.0000",
- "isVoided": "0",
- "isApproved": "1",
- "approvedByUserID": "501195",
- "managementFeeBatchID": null,
- "isDiscount": "1",
- "isMarkup": "0",
- "managementFeeMode": "2",
- "propertyID": null,
- "utilityID": null,
- "utilityPeriodStartDate": null,
- "utilityPeriodEndDate": null,
- "importAccountCommitID": null
}, - "markupBill": {
- "billID": "15056",
- "billBatchID": null,
- "parentBillID": "15054",
- "payeeContactID": "1",
- "billTypeID": "2",
- "bankAccountID": null,
- "billDate": "2026-04-22",
- "dateDue": "2026-04-22",
- "reference": "123456",
- "paymentMemo": "test memo",
- "serviceAccountNumber": null,
- "description": null,
- "workOrderID": "5758",
- "discountPercent": "0.0000",
- "markupPercent": "0.0000",
- "isVoided": "0",
- "isApproved": "1",
- "approvedByUserID": "501195",
- "managementFeeBatchID": null,
- "isDiscount": "0",
- "isMarkup": "1",
- "managementFeeMode": "2",
- "propertyID": null,
- "utilityID": null,
- "utilityPeriodStartDate": null,
- "utilityPeriodEndDate": null,
- "importAccountCommitID": null
}, - "markupDiscount": {
- "discountAmount": 10,
- "markupAmount": 10
}, - "utility": null,
- "property": null,
- "restrictions": {
- "access": "full"
}, - "approvalRequirementType": null
}Updates an existing bill. All fields are optional — only the fields provided in the
request body are changed. Charges are matched by transactionID.
charges must include transactionID to identify the charge being updated.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.| billID required | integer Example: 15026 |
| includes | string Example: includes=charges,contact,payouts,workOrder Comma-separated list of related data to include in the response.
Available values: |
| 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 | |
| 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. |
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). |
{- "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": [
- {
- "transactionID": 80486,
- "amount": "2.00",
- "discountAmount": "0.00",
- "markupAmount": "0.00",
- "ledgerID": 297,
- "chargeAccountID": 66,
- "description": "test description"
}
], - "serviceAccountNumber": "0001",
- "utilityPeriodStartDate": "2026-04-22",
- "utilityPeriodEndDate": "2027-04-22"
}{- "bill": {
- "billID": "15106",
- "billBatchID": null,
- "parentBillID": null,
- "payeeContactID": "67",
- "billTypeID": "1",
- "bankAccountID": null,
- "billDate": "2026-04-22",
- "dateDue": "2026-04-22",
- "reference": "12345",
- "paymentMemo": "Plumbing invoice April",
- "serviceAccountNumber": null,
- "description": "Bathroom plumbing repair",
- "workOrderID": null,
- "discountPercent": "0.0000",
- "markupPercent": "0.0000",
- "isVoided": "0",
- "isApproved": "1",
- "approvedByUserID": "512915",
- "managementFeeBatchID": null,
- "isDiscount": "0",
- "isMarkup": "0",
- "managementFeeMode": "2",
- "propertyID": null,
- "utilityID": null,
- "utilityPeriodStartDate": null,
- "utilityPeriodEndDate": null,
- "importAccountCommitID": null
}, - "contact": {
- "contactID": 21,
- "contactTypeID": 3,
- "vendorTypeID": 10,
- "code": "Water",
- "name": "1st General Contractor",
- "firstName": null,
- "middleName": null,
- "lastName": null,
- "suffix": null,
- "email": "vasco@rentvine.com",
- "phone": null,
- "countryID": "US",
- "address": "70 Hillcroft St",
- "address2": null,
- "city": "Spring",
- "stateID": "FL",
- "postalCode": "33928",
- "birthDate": null,
- "defaultBillChargeAccountID": 71,
- "payeeName": null,
- "taxPayerName": null,
- "taxFormTypeID": null,
- "identificationTypeID": null,
- "identificationNumber": null,
- "identificationCountryID": null,
- "identificationIssuingLocation": null,
- "identificationExpirationDate": null,
- "payoutTypeID": 4,
- "otherPayoutTypeID": null,
- "achDetailsCiphertextID": 69,
- "achAccountNumberTruncated": "3587",
- "achAccountTypeID": 2,
- "achIsCorporateAccount": "1",
- "holdPayments": "0",
- "liabilityInsuranceName": "Progressive",
- "liabilityInsurancePolicyNumber": "u213ffhsicr",
- "liabilityInsuranceExpiresDate": "2025-07-23",
- "workersCompInsuranceName": "None on File",
- "workersCompInsurancePolicyNumber": null,
- "workersCompInsuranceExpiresDate": "2024-07-02",
- "discountPercent": "20.0000",
- "discountAmount": null,
- "discountAmountMin": null,
- "discountAmountMax": null,
- "discountGraceDays": "10",
- "isActive": "1",
- "isInsuranceRequiredForPayment": "1",
- "maxLineItemsOnPayment": "10",
- "preventConsolidatedPayments": "0",
- "isFromImport": "1",
- "importSourceKey": "11",
- "websiteUrl": null,
- "applicantID": null,
- "ownerPortalNameOverride": "TT",
- "isBillApprovalExempt": "0",
- "isBillingSalesTaxEnabled": "1",
- "isQuickbooksExportEnabled": "1",
- "quickbooksCustomerName": "1st General",
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2023-01-14 18:39:10",
- "dateTimeModified": "2026-04-10 14:36:47",
- "dateTimeDeactivated": null,
- "contactType": "Vendor"
}, - "charges": [
- {
- "transaction": {
- "transactionID": 80486,
- "transactionTypeID": 7,
- "managementFeeMode": 2,
- "primaryLedgerID": 2,
- "portfolioID": 1,
- "propertyID": 170,
- "unitID": null,
- "leaseID": null,
- "billID": 15026,
- "contactID": null,
- "bankAccountID": null,
- "chargeAccountID": 66,
- "amount": "2.00",
- "amountPaid": "0.00",
- "amountAllocated": null,
- "description": "test description",
- "discountAmount": "0.00",
- "markupAmount": "0.00",
- "isSuppressed": "0",
- "isVoided": "0",
- "datePosted": "2026-04-22",
- "dateTimeCreated": "2026-04-22 04:15:16",
- "dateTimeModified": "2026-04-22 22:51:52"
}, - "property": {
- "propertyID": 170,
- "propertyTypeID": 6,
- "isMultiUnit": "1",
- "isActive": "1",
- "portfolioID": 1,
- "address": "2001 Blake Street",
- "city": "Denver",
- "stateID": "CO",
- "postalCode": "80205"
}, - "unit": {
- "unitID": null,
- "propertyID": null,
- "isActive": null,
- "name": null,
- "address": null
}, - "portfolio": {
- "portfolioID": 1,
- "name": "Amanda LLC",
- "contacts": [
- {
- "contactID": 2,
- "percentOwned": "75.0000",
- "percentDistributed": "100.0000",
- "name": "Amanda H. Wilson"
}, - {
- "contactID": 4471,
- "percentOwned": "25.0000",
- "percentDistributed": "0.0000",
- "name": "chris"
}
], - "isActive": "1"
}, - "postingSetting": {
- "postingSettingID": 1,
- "name": "My Preferred Settings",
- "operatingAccountID": 31,
- "escrowAccountID": 32,
- "leaseRefundAccountID": 31,
- "isActive": "1"
}, - "ledger": {
- "ledgerID": 2,
- "ledgerTypeID": 2,
- "objectID": 1,
- "name": "Amanda LLC",
- "isActive": "1",
- "dateTimeCreated": "2023-09-29 23:46:23",
- "dateTimeModified": "2026-03-26 13:49:41"
}, - "restricted": "0",
- "payeeLedger": {
- "ledgerID": 297,
- "ledgerTypeID": 3,
- "objectID": 170,
- "name": "2001 Blake Street, Denver, CO 80205",
- "isActive": "1",
- "dateTimeCreated": "2023-09-29 23:46:23",
- "dateTimeModified": "2024-06-10 14:31:36"
}
}
], - "payouts": [ ],
- "workOrder": {
- "workOrderID": 5954,
- "workOrderNumber": "105781",
- "workOrderProjectID": null,
- "recurringWorkOrderID": null,
- "isInternal": "0",
- "propertyID": 630,
- "unitID": 607,
- "leaseID": 2746,
- "vendorContactID": 3381,
- "primaryWorkOrderStatusID": 2,
- "workOrderStatusID": 1,
- "vendorWorkOrderStatusID": 2,
- "priorityID": 2,
- "description": "<p> c</p>",
- "isOwnerApproved": "0",
- "isVacant": "0",
- "isSharedWithTenant": "1",
- "isSharedWithOwner": "1",
- "createdByUserID": 1,
- "dateTimeCreated": "2026-04-22 17:39:33",
- "dateTimeModified": "2026-04-22 17:39:49",
- "portfolioID": 359,
- "assignedToUserID": 381140
}
}Voids a bill, reversing its accounting impact. The bill remains in the system with
isVoided: "1" and cannot be deleted.
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.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.| billID required | integer Example: 15051 |
| includes | string Example: includes=contact,charges,workOrder,discountBill,markupBill,leaseCharges Comma-separated list of related data to include in the response.
Available values: |
| voidLinkedBills | boolean When |
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 | |
object or null (bill) The companion markup bill linked to this bill, if any.
Voided alongside the parent when | |
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). |
{- "voidLinkedBills": true
}{- "bill": {
- "billID": "15051",
- "billBatchID": null,
- "parentBillID": null,
- "payeeContactID": "67",
- "billTypeID": "1",
- "bankAccountID": "146",
- "billDate": "2026-04-22",
- "dateDue": "2026-04-22",
- "reference": "12345",
- "paymentMemo": "test",
- "serviceAccountNumber": null,
- "description": "test description",
- "workOrderID": "5815",
- "discountPercent": "0.0000",
- "markupPercent": "0.0000",
- "isVoided": "1",
- "isApproved": "1",
- "approvedByUserID": "501195",
- "managementFeeBatchID": null,
- "isDiscount": "0",
- "isMarkup": "0",
- "managementFeeMode": "2",
- "propertyID": null,
- "utilityID": null,
- "utilityPeriodStartDate": null,
- "utilityPeriodEndDate": null,
- "importAccountCommitID": null
}, - "contact": {
- "contactID": "67",
- "contactTypeID": "3",
- "vendorTypeID": "9",
- "name": "Walter's Windows",
- "firstName": null,
- "lastName": null,
- "email": "walter@rentvine.com",
- "phone": "+14436420607",
- "countryID": "US",
- "address": "9470 Corkscrew Palms Cir",
- "address2": null,
- "city": "Naples",
- "stateID": "FL",
- "postalCode": "33928",
- "payoutTypeID": "4",
- "isActive": "1",
- "holdPayments": "0",
- "discountPercent": "10.0000",
- "isBillApprovalExempt": "0",
- "dateTimeCreated": "2023-01-14 18:39:10",
- "dateTimeModified": "2025-11-07 21:37:00",
- "contactType": "Vendor"
}, - "charges": [ ],
- "bankAccount": {
- "bankAccountID": null
}, - "leaseCharges": [
- {
- "transaction": {
- "transactionID": "80842",
- "transactionTypeID": "1",
- "leaseID": "2963",
- "billID": "15051",
- "chargeAccountID": "37",
- "amount": "100.00",
- "amountPaid": "0.00",
- "description": "test description",
- "isVoided": "0",
- "datePosted": "2026-04-22",
- "dateTimeCreated": "2026-04-22 21:59:34",
- "dateTimeModified": "2026-04-22 21:59:34"
}, - "property": {
- "propertyID": "601",
- "address": "9910 Estero Oaks Drive",
- "city": "Fort Myers",
- "stateID": "FL",
- "postalCode": "33967",
- "isActive": "1"
}, - "unit": {
- "unitID": "583",
- "propertyID": "601",
- "address": "9910 Estero Oaks Drive",
- "city": "Fort Myers",
- "stateID": "FL",
- "isActive": "1"
}, - "ledger": {
- "ledgerID": "866",
- "ledgerTypeID": "2",
- "objectID": "297",
- "name": "WalterDeVeasTestPortfolio",
- "isActive": "1"
}, - "restricted": "0"
}
], - "payouts": [ ],
- "workOrder": {
- "workOrderID": "5815",
- "workOrderNumber": "105642",
- "propertyID": "495",
- "unitID": "474",
- "leaseID": "2162",
- "vendorContactID": null,
- "workOrderStatusID": "27",
- "primaryWorkOrderStatusID": "4",
- "priorityID": "2",
- "description": "<p>test</p>",
- "isVacant": "0",
- "isSharedWithTenant": "1",
- "isSharedWithOwner": "1",
- "dateTimeCreated": "2026-03-17 18:26:08",
- "dateTimeModified": "2026-04-22 21:59:34"
}, - "parentBill": null,
- "discountBill": {
- "billID": "15052",
- "billBatchID": null,
- "parentBillID": "15051",
- "payeeContactID": "1",
- "billTypeID": "2",
- "bankAccountID": null,
- "billDate": "2026-04-22",
- "dateDue": "2026-04-22",
- "reference": "12345",
- "paymentMemo": "test",
- "serviceAccountNumber": null,
- "description": null,
- "workOrderID": "5815",
- "discountPercent": "0.0000",
- "markupPercent": "0.0000",
- "isVoided": "1",
- "isApproved": "1",
- "approvedByUserID": "501195",
- "managementFeeBatchID": null,
- "isDiscount": "1",
- "isMarkup": "0",
- "managementFeeMode": "2",
- "propertyID": null,
- "utilityID": null,
- "utilityPeriodStartDate": null,
- "utilityPeriodEndDate": null,
- "importAccountCommitID": null
}, - "markupBill": {
- "billID": "15053",
- "billBatchID": null,
- "parentBillID": "15051",
- "payeeContactID": "1",
- "billTypeID": "2",
- "bankAccountID": null,
- "billDate": "2026-04-22",
- "dateDue": "2026-04-22",
- "reference": "12345",
- "paymentMemo": "test",
- "serviceAccountNumber": null,
- "description": null,
- "workOrderID": "5815",
- "discountPercent": "0.0000",
- "markupPercent": "0.0000",
- "isVoided": "1",
- "isApproved": "1",
- "approvedByUserID": "501195",
- "managementFeeBatchID": null,
- "isDiscount": "0",
- "isMarkup": "1",
- "managementFeeMode": "2",
- "propertyID": null,
- "utilityID": null,
- "utilityPeriodStartDate": null,
- "utilityPeriodEndDate": null,
- "importAccountCommitID": null
}, - "markupDiscount": {
- "discountAmount": 0,
- "markupAmount": 0
}, - "utility": null,
- "property": null
}Approves a bill, marking it as authorized for payment. Once approved, the bill's
isApproved flag is set to 1 and approvedByUserID is recorded.
Accounting component).400 is returned if the billID is not found.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.| billID required | integer Example: 14973 |
| includes | string Example: includes=contact,charges,workOrder Comma-separated list of related data to include in the response.
Available values: |
required | object (bill) |
{- "bill": {
- "billID": "14973",
- "billBatchID": null,
- "parentBillID": null,
- "payeeContactID": "1",
- "billTypeID": "1",
- "bankAccountID": "170",
- "billDate": "2026-04-22",
- "dateDue": "2026-04-22",
- "reference": "12345",
- "paymentMemo": "test memo",
- "serviceAccountNumber": "0001",
- "description": "test description",
- "workOrderID": "5954",
- "discountPercent": "0.0000",
- "markupPercent": "0.0000",
- "isVoided": "0",
- "isApproved": "1",
- "approvedByUserID": "501195",
- "managementFeeBatchID": null,
- "isDiscount": "0",
- "isMarkup": "0",
- "managementFeeMode": "2",
- "propertyID": null,
- "utilityID": null,
- "utilityPeriodStartDate": "2026-04-22",
- "utilityPeriodEndDate": "2027-04-22",
- "importAccountCommitID": null
}
}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.
{billID} does not match any bill, a 400 error is returned.portfolioID query parameter is optional. When omitted, the PDF is rendered without
portfolio-specific branding.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.| billID required | integer Example: 15054 Unique identifier of the bill to print. |
| portfolioID | integer Example: portfolioID=42 Portfolio ID used to apply branded letterhead/styling to the rendered PDF. |
| Cache-Control | string Example: "no-cache" Cache directive set to |
Raw PDF binary data of the bill.
{- "error": "Bill 15054 not found"
}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.
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).payeeContactID / payeeContactIDs, portfolioID / portfolioIDs,
propertyID / propertyIDs, unitID / unitIDs). Pass multiple values as a
comma-separated string: propertyIDs=101,102,103.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.| 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:
Also matches rows where |
| isVoided | boolean Filter by voided status of the transaction.
Omit to return both. |
| isApproved | boolean Filter by the bill's approval status.
Omit to return both. |
| isPaid | boolean Filter by payment status of the transaction.
Omit to return both paid and unpaid. |
| amountMin | number <double> Example: amountMin=100 Return only transactions where |
| amountMax | number <double> Example: amountMax=5000 Return only transactions where |
| datePostedMin | string <date> Example: datePostedMin=2026-01-01 Return only transactions posted on or after this date ( |
| datePostedMax | string <date> Example: datePostedMax=2026-04-30 Return only transactions posted on or before this date ( |
| billDateMin | string <date> Example: billDateMin=2026-01-01 Return only transactions whose bill date ( |
| billDateMax | string <date> Example: billDateMax=2026-04-30 Return only transactions whose bill date ( |
| dateDueMin | string <date> Example: dateDueMin=2026-04-01 Return only transactions whose bill due date ( |
| dateDueMax | string <date> Example: dateDueMax=2026-04-30 Return only transactions whose bill due date ( |
| 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
Example: |
| portfolioIDs | string Example: portfolioIDs=50,51 Comma-separated list of portfolio IDs to filter by. Also accepted as singular
Example: |
| propertyIDs | string Example: propertyIDs=101,102 Comma-separated list of property IDs to filter by. Also accepted as singular
Example: |
| unitIDs | string Example: unitIDs=310,311 Comma-separated list of unit IDs to filter by. Also accepted as singular Example: |
| requiresMasterApproval | boolean Example: requiresMasterApproval=true When |
| orderBy | string Example: orderBy=transaction.amount|asc Sort the results by a specific column. Append Sortable columns:
|
| 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. |
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. |
[- {
- "bill": {
- "billID": 14201,
- "parentBillID": null,
- "billDate": "2026-03-15",
- "dateDue": "2026-04-15",
- "reference": "INV-20260315",
- "isVoided": 0,
- "description": "HVAC repair - Unit 4B",
- "payeeContactID": 200,
- "isApproved": 0,
- "requiresMasterApproval": 1
}, - "transaction": {
- "transactionID": 88432,
- "transactionTypeID": 5,
- "billID": 14201,
- "primaryLedgerID": 960,
- "chargeAccountID": 37,
- "amount": "350.00",
- "amountPaid": "0.00",
- "description": "HVAC compressor replacement",
- "discountAmount": "0.00",
- "markupAmount": "0.00",
- "isVoided": 0,
- "datePosted": "2026-03-15"
}, - "ledger": {
- "ledgerID": 960,
- "name": "123 Main St Operating",
- "ledgerTypeID": 3
}, - "portfolio": {
- "portfolioID": 50,
- "name": "Sunset Properties LLC",
- "contacts": null
}, - "property": {
- "propertyID": 101,
- "name": "Sunset Apartments",
- "propertyTypeID": 1,
- "isMultiUnit": 1,
- "address": "123 Main St",
- "address2": null,
- "city": "Austin",
- "stateID": "TX",
- "postalCode": "78701"
}, - "unit": {
- "unitID": 310,
- "unitName": "Unit 4B",
- "unitAddress": "123 Main St",
- "unitAddress2": "Apt 4B",
- "unitCity": "Austin",
- "unitStateID": "TX",
- "unitPostalCode": "78701"
}, - "contact": {
- "contactID": 200,
- "contactTypeID": 4,
- "name": "Austin HVAC Services"
}
}
]Returns a paginated list of bank deposits. Each item in the response includes the deposit record and its associated bank account.
account object is always included in each list item.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.| 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. |
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 |
| token required | string Session token associated with this response. |
{- "deposit": {
- "depositID": 4210,
- "bankAccountID": 31,
- "reconciliationID": 3,
- "previousReconciliationID": null,
- "depositNumber": "28",
- "description": "Rent Payments",
- "amount": "24225.00",
- "isVoided": 0,
- "dateDeposited": "2021-04-14",
- "dateTimeCreated": "2021-04-14T13:40:48Z"
}, - "token": "1777036078"
}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}).
Accounting > ModifyDeposit permission.transactionID in transactions must exist and pass portfolio restrictions.bulkPaymentID in bulkPayments must exist.attachments array contains fileID values for pre-uploaded files.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.| 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. |
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 |
| transactions | Array of objects Deposited transactions (if includes=transactions). |
{- "bankAccountID": 146,
- "depositNumber": "27",
- "description": null,
- "dateDeposited": "2026-04-24",
- "attachments": [ ],
- "transactions": [
- {
- "transactionID": 80911
}, - {
- "transactionID": 78052
}
], - "bulkPayments": [ ],
- "amount": "1400.00"
}{- "deposit": {
- "depositID": 589,
- "bankAccountID": 146,
- "reconciliationID": null,
- "previousReconciliationID": null,
- "depositNumber": "27",
- "description": null,
- "amount": "1400.00",
- "isVoided": 0,
- "dateDeposited": "2026-04-24",
- "dateTimeCreated": "2026-04-24T13:11:51Z"
}
}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).
isReconciled=false to find deposits pending reconciliation.bankAccountIDs to scope results to specific bank accounts.search.bankAccountIDs (comma-separated) and bankAccountID (single integer) are
accepted; bankAccountIDs takes precedence.reconciliationIDs takes precedence over reconciliationID.dateDeposited DESC, then depositID DESC.GET /accounting/deposits - Simple list with basic filters.GET /accounting/deposits/{depositID} - Retrieve a single deposit with includes support.| 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 |
| isVoided | boolean Filter by voided state. |
| showVoided | boolean When |
| isReconciled | boolean Filter by reconciliation state. |
| 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 |
| page | integer Default: 1 The page number for pagination |
| pageSize | integer Default: 25 Number of items per page |
| 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. |
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 |
required | object The bank account associated with this deposit. |
required | object The reconciliation this deposit is linked to. All fields are |
[- {
- "deposit": {
- "depositID": 552,
- "bankAccountID": 31,
- "reconciliationID": 88,
- "previousReconciliationID": 87,
- "depositNumber": "2024-0165",
- "description": "March 2026 Rent Deposits",
- "amount": "2330.00",
- "isVoided": 0,
- "dateDeposited": "2026-06-25",
- "dateTimeCreated": "2026-03-24T20:55:56Z"
}, - "account": {
- "accountID": 31,
- "parentAccountID": 5,
- "accountTypeID": 3,
- "accountCategoryID": 2,
- "number": "1150",
- "name": "Client Trust Account",
- "isActive": true,
- "isSubjectToManagementFees": false,
- "isSubjectToLateFees": false,
- "isDeposit": false,
- "depositTypeID": 1,
- "isEscrow": false,
- "isRent": false,
- "isSubsidized": 0,
- "isTaxable": false,
- "isSubjectToSalesTax": false,
- "isSubjectToMarkup": 1,
- "isPrepayment": false,
- "isManagementFee": false,
- "isBudgetEnabled": false,
- "isHeld": false,
- "bankName": "Bank of America",
- "bankAccountTypeID": 2,
- "bankAccountCiphertextID": 24,
- "bankAccountNumberTruncated": "2846",
- "bankAccountAddress": "1234 Bank Way",
- "bankAccountAddress2": "Suite 100",
- "bankAccountCity": "Naples",
- "bankAccountStateID": "FL",
- "bankAccountPostalCode": "34135",
- "bankAccountCountryID": "US",
- "isCheckingEnabled": true,
- "checkCompanyName": "123 PM LLC",
- "checkSignatory": "Michael Maxwell",
- "checkAddress": "23190 Fashion Drive",
- "checkAddress2": "Suite 200",
- "checkCity": "Dr Estero",
- "checkStateID": "FL",
- "checkPostalCode": "33928",
- "checkCountryID": "US",
- "bankAccountNextCheckNumber": "529",
- "bankAccountNextDepositNumber": "2024-0179",
- "checkTemplateID": 2,
- "creditCardGatewayID": 3,
- "achGatewayID": 1,
- "cashCardGatewayID": 5,
- "remoteCheckGatewayID": 4,
- "isFromImport": false,
- "importSourceKey": "import-src-2023-001",
- "isNachaEnabled": true,
- "isNachaFileBalanced": false,
- "nachaOriginName": "123 PM LLC",
- "nachaOriginNumber": "23466998",
- "nachaDestinationName": "World Bank",
- "nachaDestinationNumber": "77879288",
- "nachaCompanyIdentification": "23466998",
- "nachaCompanyName": "123 PM LLC",
- "nachaOriginatingFinancialInstitutionID": "77879288",
- "nachaAdapterID": 2,
- "isBillApprovalExempt": 0,
- "exportInvoiceServiceName": "QuickBooks",
- "dateTimeCreated": "2023-01-14T18:39:10Z",
- "dateTimeModified": "2026-04-23T15:31:05Z",
- "dateTimeDeactivated": "2027-01-01T00:00:00Z"
}, - "reconciliation": {
- "reconciliationID": 88,
- "reconciliationVersionID": 1,
- "bankAccountID": 31,
- "statementStartDate": "2026-03-01",
- "statementEndDate": "2026-03-31",
- "statementEndingBalance": "24500.00",
- "isCurrent": 1,
- "isVoided": 0,
- "previousStatementEndingBalance": "21000.00",
- "moneyInTotal": "35000.00",
- "moneyOutTotal": "31500.00",
- "reconciledMoneyInTotal": "33500.00",
- "reconciledMoneyOutTotal": "30000.00",
- "unreconciledMoneyInTotal": "1500.00",
- "unreconciledMoneyOutTotal": "1500.00",
- "reconciledBalance": "3500.00",
- "adjustedCashBalance": "24500.00",
- "bankAccountBalance": "24500.00",
- "undepositedPaymentsBalance": "0.00",
- "paymentsDepositedAfterStatementEndDateBalance": "0.00",
- "unsettledElectronicTransactionsBalance": "250.00",
- "electronicTransactionsSettledAfterStatementEndDateBalance": "0.00",
- "adjustmentsTotal": "0.00",
- "reconciledAdjustmentsTotal": "0.00",
- "unreconciledAdjustmentsTotal": "0.00",
- "bankAdjustmentBalance": "0.00",
- "bankAccountUndepositedBalance": "0.00",
- "unsettledPaymentBalance": "250.00",
- "unsettledPaymentReturnBalance": "0.00",
- "unsettledPayoutBalance": "0.00",
- "unsettledPayoutReturnBalance": "0.00",
- "createdByUserID": 42,
- "dateTimeCreated": "2026-04-01T10:00:00Z"
}
}
]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:
depositTransactionTypeID: 1, objectTypeID: 9) — lease
payments, owner payments, and other payments that have not been deposited and are
not routed through a bank gateway.depositTransactionTypeID: 2, objectTypeID: 84) — undeposited
bulk payment batches. For bulk payments the ledger, property, and unit objects
will be null.transactionTypeID to show only specific payment types (e.g. lease payments only).createdByUserID to show transactions entered by a specific user.bankAccountID is required and must refer to an account of type Bank.depositID IS NOT NULL) are excluded.bankAccountGatewayID IS NOT NULL) are excluded.datePosted DESC.POST /accounting/deposits - Create a deposit using transactions from this list.POST /accounting/deposits/{depositID}/transactions - Add transactions to an existing deposit.| 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. |
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 |
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. |
[- {
- "transaction": {
- "depositTransactionTypeID": 1,
- "objectTypeID": 9,
- "objectID": 80923,
- "transactionID": 80923,
- "transactionTypeID": 2,
- "bulkPaymentID": null,
- "bulkPaymentTypeID": null,
- "primaryLedgerID": 2,
- "amount": "1200.00",
- "datePosted": "2026-04-23",
- "description": "April rent",
- "reference": "156163516"
}, - "ledger": {
- "ledgerID": 2,
- "ledgerTypeID": 2,
- "name": "Amanda LLC"
}, - "payer": {
- "name": "Zach Blaylock"
}, - "property": {
- "propertyID": 157,
- "name": "Amour Court",
- "address": "8686 Armour Court",
- "address2": null,
- "city": "Naples",
- "stateID": "FL",
- "postalCode": "34119",
- "countryID": "US"
}, - "unit": {
- "unitID": 165,
- "name": "Amour Court",
- "address": "8686 Armour Court",
- "address2": null,
- "city": "Naples",
- "stateID": "FL",
- "postalCode": "34119",
- "countryID": "US"
}, - "createdByUser": {
- "userID": 901735
}
}
]Retrieves a single deposit by ID. The base response always includes the deposit
record. Additional data can be requested via the includes query parameter.
restrictions include adds access-control metadata (read/write/void permissions)
derived from the user's license for this deposit.Use ?includes=transactions,reconciliation to request additional data.
null
if unreconciled).null).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.| depositID required | integer Example: 4210 The ID of the deposit to retrieve. |
| includes | string Example: includes=transactions,reconciliation Comma-separated list of additional data to include. Available values:
|
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 |
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). |
{- "deposit": {
- "depositID": "1",
- "bankAccountID": "31",
- "reconciliationID": "3",
- "previousReconciliationID": null,
- "depositNumber": "28",
- "description": "Rent Payments",
- "amount": "24225.00",
- "isVoided": "0",
- "dateDeposited": "2021-04-14",
- "dateTimeCreated": "2021-04-14 13:40:48"
}
}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}).
Accounting > ModifyDeposit permission.bankAccountID and amount cannot be changed after creation.POST /accounting/deposits/{depositID}/transactions - Add/remove transactions.DELETE /accounting/deposits/{depositID} - Void the deposit.| depositID required | integer Example: 4210 The ID of the deposit to update. |
| depositNumber | integer or null Updated reference number. |
| description | string or null Updated description. |
| dateDeposited | string <date> Updated deposit date. |
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 |
{- "depositNumber": 29,
- "description": "October rent deposits (revised)",
- "dateDeposited": "2024-10-23"
}{- "deposit": {
- "depositID": "33",
- "bankAccountID": "31",
- "reconciliationID": null,
- "previousReconciliationID": "22",
- "depositNumber": 29,
- "description": "October rent deposits (revised)",
- "amount": "11781.00",
- "isVoided": "0",
- "dateDeposited": "2021-12-14",
- "dateTimeCreated": "2021-12-14 20:35:15"
}
}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.
Accounting > VoidDeposit permission.POST /accounting/deposits/{depositID}/reconcile - Reconcile a deposit instead of voiding.GET /accounting/deposits/{depositID} - Check deposit state before voiding.| depositID required | integer Example: 4210 The ID of the deposit to void. |
| 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
|
| 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. |
{- "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"
}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.
Accounting > ModifyDeposit permission.transactionID in transactions must exist and pass portfolio access checks.bulkPaymentID in bulkPayments must exist.{ "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.| depositID required | integer Example: 4210 The ID of the deposit to add transactions to. |
| 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. |
| success required | boolean |
{- "transactions": [
- 9903,
- 9904
]
}{- "success": true
}Renders a printable PDF for the given deposit and streams it as the response body.
The response Content-Type is application/pdf.
GET /accounting/deposits/{depositID} - Retrieve deposit data in JSON format.| depositID required | integer Example: 4210 The ID of the deposit to print. |
| Cache-Control | string Example: "no-cache" |
{- "error": "Deposit 9999 not found"
}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.
reconciliationID.Accounting > ModifyDeposit and Accounting > ModifyReconciliations
permissions.reconciliationID is provided and the reconciliation exists, the deposit is
linked to it. If no ID is provided, a new reconciliation record is created.isSingleTransaction flag is set internally — this action reconciles this
deposit only, not all items in a reconciliation batch.GET /accounting/deposits/{depositID}.POST /accounting/deposits/{depositID}/unreconcile - Reverse this reconciliation.GET /accounting/deposits/{depositID}?includes=reconciliation - Check reconciliation state.| depositID required | integer Example: 4210 The ID of the deposit to reconcile. |
| 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. |
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": 88
}{- "deposit": {
- "depositID": 4210,
- "bankAccountID": 12,
- "reconciliationID": 88,
- "previousReconciliationID": null,
- "depositNumber": "DEP-2024-001",
- "description": "October rent deposits",
- "amount": "5250.00",
- "isVoided": 0,
- "dateDeposited": "2024-10-22",
- "dateTimeCreated": "2024-10-22T14:00:00Z"
}
}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.
Accounting > ModifyDeposit and Accounting > ModifyReconciliations
permissions.previousReconciliationID field on the deposit will record the reconciliation
that was removed.GET /accounting/deposits/{depositID}.POST /accounting/deposits/{depositID}/reconcile - Reconcile the deposit again.GET /accounting/deposits/{depositID}?includes=reconciliation - Check current reconciliation state.| depositID required | integer Example: 4210 The ID of the deposit to unreconcile. |
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 |
{- "deposit": {
- "depositID": 4210,
- "bankAccountID": 12,
- "reconciliationID": null,
- "previousReconciliationID": 88,
- "depositNumber": "DEP-2024-001",
- "description": "October rent deposits",
- "amount": "5250.00",
- "isVoided": 0,
- "dateDeposited": "2024-10-22",
- "dateTimeCreated": "2024-10-22T14:00:00Z"
}
}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.
invoiceStatusID=2).invoiceStatusID
and invoiceStatusIDs); the plural form takes precedence.GET /accounting/invoices/{invoiceID} - Retrieve a single invoice with full detail.POST /accounting/invoices/upload - Upload a new invoice PDF.| 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. |
| 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. |
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). |
[- {
- "invoice": {
- "invoiceID": 1296,
- "invoiceTypeID": 1,
- "invoiceStatusID": 3,
- "invoiceSourceID": 2,
- "invoiceFileID": 9704,
- "payeeContactID": null,
- "billID": 15077,
- "workOrderID": null,
- "reference": null,
- "declinedMessage": null,
- "predictedFields": {
- "amount": {
- "value": null
}, - "ledger": {
- "value": null
}, - "dueDate": {
- "value": "2026-03-31",
- "source": "predicted",
- "confidence": 0.563
}, - "billDate": {
- "value": "2026-03-31",
- "source": "predicted",
- "confidence": 0.563
}, - "accountID": {
- "value": null
}, - "lineItems": [ ],
- "reference": {
- "value": null
}, - "workOrderID": {
- "value": null
}, - "payeeContact": {
- "value": null
}, - "serviceEndDate": {
- "value": "2026-02-20",
- "source": "predicted",
- "confidence": 0.657
}, - "defaultDiscount": {
- "value": null
}, - "serviceStartDate": {
- "value": "2026-01-21",
- "source": "predicted",
- "confidence": 0.646
}, - "serviceAccountNumber": {
- "value": "in 4100:",
- "source": "predicted",
- "confidence": 0.449
}
}, - "datePosted": null,
- "dateTimeCreated": "2026-04-23 20:35:37",
- "predictedReference": null,
- "predictedServiceAccountNumber": "in 4100:"
}, - "invoiceFile": {
- "fileID": 9704,
- "title": "Image 3-31-26 at 5.43 PM.png",
- "fileType": "png",
- "isImage": 1
}, - "contact": {
- "contactID": null,
- "name": null,
- "contactTypeID": null
}, - "property": {
- "assignedToUserID": null
}, - "workOrder": {
- "workOrderID": null,
- "workOrderNumber": null,
- "assignedToUserID": null
}, - "bill": {
- "billID": 15077,
- "reference": null
}, - "submittedBy": {
- "userID": 782351,
- "firstName": "Jake",
- "lastName": "Parrish",
- "email": null
}, - "createdInvoice": {
- "address": null,
- "address2": null,
- "city": null,
- "stateID": null,
- "ledgerID": null,
- "total": null,
- "addressFull": ""
}
}
]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.
multipart/form-data with the file as the first upload.invoiceStatusID=1 (Processing) and
invoiceSourceID=2 (Upload).GET /accounting/invoices/{invoiceID} and returns the
full invoice detail.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.| file required | string <binary> The invoice PDF or image file to upload. |
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 |
| lineItems required | Array of objects Line items (empty until AI extraction completes). |
{- "invoice": {
- "invoiceID": 1299,
- "receivedInvoiceEmailID": 5001,
- "invoiceTypeID": 1,
- "invoiceStatusID": 1,
- "invoiceSourceID": 2,
- "invoiceFileID": 9753,
- "payeeContactID": 150,
- "billID": 201,
- "workOrderID": 301,
- "reference": "INV-2026-001",
- "submittedByUserID": 501195,
- "submittedByEmail": "manager@example.com",
- "declinedMessage": "Invoice requires additional review.",
- "predictedFields": {
- "amount": {
- "value": "375.00"
}, - "ledger": {
- "value": "Operating Account"
}, - "dueDate": {
- "value": "2026-05-15"
}, - "billDate": {
- "value": "2026-04-27"
}, - "accountID": {
- "value": 50
}, - "lineItems": [ ],
- "reference": {
- "value": "INV-4421"
}, - "workOrderID": {
- "value": 301
}, - "payeeContact": {
- "value": 210
}, - "serviceEndDate": {
- "value": "2026-04-30"
}, - "defaultDiscount": {
- "value": "5.00"
}, - "serviceStartDate": {
- "value": "2026-04-01"
}, - "serviceAccountNumber": {
- "value": "SVC-001"
}
}, - "predictedPayeeContactID": 210,
- "predictedPayeeContactName": "Acme Plumbing",
- "predictedDefaultDiscount": "5.00",
- "predictedWorkOrderID": 301,
- "predictedLedgerID": 401,
- "predictedLedgerAddress": "123 Main St",
- "predictedAccountID": 50,
- "predictedBillDate": "2026-04-27",
- "predictedDueDate": "2026-05-15",
- "predictedReference": "INV-4421",
- "predictedServiceAccountNumber": "SVC-001",
- "predictedAmount": "375.00",
- "predictedServiceStartDate": "2026-04-01",
- "predictedServiceEndDate": "2026-04-30",
- "datePosted": "2026-04-27",
- "dateTimeCreated": "2026-04-27 12:38:52"
}, - "lineItems": [ ]
}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.
lineItems are always returned — for invoiceTypeID=2 (Created) these come from
InvoiceLineItems; for uploaded invoices they come from the AI prediction data.workOrder, unit, property, lease, and ledger includes are nested:
unit, property, lease, and ledger require workOrder to also be included.Use ?includes=contact,workOrder,property to request additional data.
workOrder).workOrder).workOrder).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.| invoiceID required | integer Example: 8850 The ID of the invoice to retrieve. |
| includes | string Example: includes=contact,workOrder,property Comma-separated list of additional data to include. Available values:
|
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 |
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). |
{- "invoice": {
- "invoiceID": 1285,
- "receivedInvoiceEmailID": 23,
- "invoiceTypeID": 1,
- "invoiceStatusID": 2,
- "invoiceSourceID": 3,
- "invoiceFileID": 9511,
- "payeeContactID": 415,
- "billID": null,
- "workOrderID": null,
- "reference": "INV-2026-0406",
- "submittedByUserID": 782351,
- "submittedByEmail": "parker.biggs@example.com",
- "declinedMessage": null,
- "predictedFields": {
- "amount": {
- "value": -400,
- "source": "predicted",
- "confidence": 0.332
}, - "ledger": {
- "value": null
}, - "dueDate": {
- "value": "2026-04-06"
}, - "billDate": {
- "value": "2026-04-06"
}, - "accountID": {
- "value": null
}, - "lineItems": [ ],
- "reference": {
- "value": "INV-2026-0406",
- "source": "predicted",
- "confidence": 0.712
}, - "workOrderID": {
- "value": null
}, - "payeeContact": {
- "value": null
}, - "serviceEndDate": {
- "value": "2026-04-30",
- "source": "predicted",
- "confidence": 0.501
}, - "defaultDiscount": {
- "value": null
}, - "serviceStartDate": {
- "value": "2026-04-01",
- "source": "predicted",
- "confidence": 0.481
}, - "serviceAccountNumber": {
- "value": "ACCT-9811",
- "source": "predicted",
- "confidence": 0.39
}
}, - "predictedPayeeContactID": 415,
- "predictedPayeeContactName": "Pacific Gas & Electric",
- "predictedDefaultDiscount": null,
- "predictedWorkOrderID": null,
- "predictedLedgerID": 3201,
- "predictedLedgerAddress": "456 Oak Ave, Portland, OR",
- "predictedAccountID": 1105,
- "predictedBillDate": "2026-04-06",
- "predictedDueDate": "2026-04-06",
- "predictedReference": "INV-2026-0406",
- "predictedServiceAccountNumber": "ACCT-9811",
- "predictedAmount": "-400.00",
- "predictedServiceStartDate": "2026-04-01",
- "predictedServiceEndDate": "2026-04-30",
- "datePosted": null,
- "dateTimeCreated": "2026-04-06 13:39:22"
}, - "lineItems": [ ]
}Renders a printable PDF for the given invoice and streams it as the response body.
The response Content-Type is application/pdf.
GET /accounting/invoices/{invoiceID} - Retrieve invoice data in JSON format.| invoiceID required | integer Example: 8850 The ID of the invoice to print. |
| Cache-Control | string Example: "no-cache" |
{- "error": "Invoice not found"
}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.
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.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.| invoiceID required | integer Example: 8850 The ID of the invoice to decline. |
| declinedMessage | string or null Message explaining why the invoice was declined. Sent to the vendor if |
| sendNotification | boolean Default: true Whether to send a decline notification email to the vendor. |
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 |
| lineItems required | Array of objects |
{- "declinedMessage": "Invoice amount does not match the approved work order estimate.",
- "sendNotification": true
}{- "invoice": {
- "invoiceID": 1299,
- "receivedInvoiceEmailID": 5001,
- "invoiceTypeID": 1,
- "invoiceStatusID": 4,
- "invoiceSourceID": 2,
- "invoiceFileID": 9753,
- "payeeContactID": 150,
- "billID": 201,
- "workOrderID": 301,
- "reference": "INV-2026-001",
- "submittedByUserID": 501195,
- "submittedByEmail": "manager@example.com",
- "declinedMessage": "test",
- "predictedFields": {
- "amount": {
- "value": "375.00"
}, - "ledger": {
- "value": "Operating Account"
}, - "dueDate": {
- "value": "2026-04-27"
}, - "billDate": {
- "value": "2026-04-27"
}, - "accountID": {
- "value": 50
}, - "lineItems": [ ],
- "reference": {
- "value": "INV-4421"
}, - "workOrderID": {
- "value": 301
}, - "payeeContact": {
- "value": 210
}, - "serviceEndDate": {
- "value": "2026-04-30"
}, - "defaultDiscount": {
- "value": "5.00"
}, - "serviceStartDate": {
- "value": "2026-04-01"
}, - "serviceAccountNumber": {
- "value": "SVC-001"
}
}, - "predictedPayeeContactID": 210,
- "predictedPayeeContactName": "Acme Plumbing",
- "predictedDefaultDiscount": "5.00",
- "predictedWorkOrderID": 301,
- "predictedLedgerID": 401,
- "predictedLedgerAddress": "123 Main St",
- "predictedAccountID": 50,
- "predictedBillDate": "2026-04-27",
- "predictedDueDate": "2026-04-27",
- "predictedReference": "INV-4421",
- "predictedServiceAccountNumber": "SVC-001",
- "predictedAmount": "375.00",
- "predictedServiceStartDate": "2026-04-01",
- "predictedServiceEndDate": "2026-04-30",
- "datePosted": "2026-04-27",
- "dateTimeCreated": "2026-04-27 12:38:52"
}, - "lineItems": [ ]
}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.
search to find ledgers by name.ledgerIDs to fetch a known set of ledgers by ID.ledgerTypeID with search to narrow results to
a specific ledger type (e.g. only property operating accounts).GET /accounting/ledgers/search — Paginated ledger search with extended filters.GET /accounting/ledgers/{ledgerID} — Retrieve a single ledger with optional includes.| 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.
|
| ledgerIDs[] | Array of integers Example: ledgerIDs[]=100&ledgerIDs[]=101 Filter by one or more ledger IDs. Pass each value as a separate
query parameter: |
required | object (ledger) |
[- {
- "ledger": {
- "ledgerID": 100,
- "ledgerTypeID": 2,
- "name": "Operating Account",
- "objectID": 500,
- "isActive": 1
}
}, - {
- "ledger": {
- "ledgerID": 101,
- "ledgerTypeID": 2,
- "name": "Security Deposit Account",
- "objectID": 501,
- "isActive": 1
}
}
]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).
ledgerID to confirm its current state.search + ledgerTypeIDs to power a filtered autocomplete when exact IDs are not known.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.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.| 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 |
| 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. |
required | object |
required | object or null Unit details joined from |
[- {
- "ledger": {
- "ledgerID": 100,
- "ledgerTypeID": 3,
- "objectID": 500,
- "name": "Operating Account",
- "isActive": 1,
- "dateTimeCreated": "2023-01-15T09:00:00Z",
- "dateTimeModified": "2024-06-01T14:22:00Z"
}, - "unit": {
- "unitID": null,
- "propertyID": null,
- "name": null,
- "address": null,
- "address2": null,
- "leaseID": null
}
}
]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.
transactionTypeIDs to show only specific payment types (e.g. rent payments).primaryLedgerIDs to scope results to a specific bank account ledger.propertyIDs (comma-separated) and propertyID (single integer) are accepted;
propertyIDs takes precedence.transactionTypeIDs takes precedence over transactionTypeID.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.| 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 |
| 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. |
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. |
[- {
- "transaction": {
- "transactionID": 9901,
- "transactionTypeID": 1,
- "primaryLedgerID": 401,
- "billID": null,
- "bulkPaymentID": null,
- "payoutID": null,
- "payoutReturnID": null,
- "contactID": null,
- "amount": "1500.00",
- "description": "Rent Income",
- "reference": null,
- "isVoided": 0,
- "datePosted": "2024-10-01",
- "dateTimeCreated": "2024-10-01 08:00:00",
- "dateTimeModified": "2024-10-01 08:00:00"
}, - "ledger": {
- "ledgerID": 401,
- "name": "Smith Portfolio Trust"
}, - "property": {
- "propertyID": 100,
- "name": "123 Main St",
- "address": "123 Main St",
- "address2": null,
- "city": "Springfield",
- "stateID": "IL",
- "postalCode": "62701",
- "isMultiUnit": 0
}, - "portfolio": {
- "portfolioID": 50,
- "name": "Smith Portfolio"
}, - "unit": {
- "unitID": 200,
- "name": null,
- "address": "123 Main St",
- "address2": null,
- "city": "Springfield",
- "stateID": "IL",
- "postalCode": "62701"
}, - "transactionEntries": {
- "ledgerNames": "Smith Portfolio Trust"
}
}
]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.
attachments (array of fileID values).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).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.| 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
|
| 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 |
| depositID | integer or null Deposit ID to associate this payment with, if applicable. |
required | object |
{- "ledgerID": 1165,
- "receivedFrom": "123pm",
- "amount": 1000,
- "chargeAccountID": 106,
- "datePosted": "2026-05-15",
- "reference": "Test Reference",
- "description": "Test Description",
- "bankAccountID": 31,
- "attachments": [ ],
- "paymentTypeID": 4
}{- "transaction": {
- "transactionID": "83657",
- "transactionTypeID": "12",
- "managementFeeMode": "2",
- "primaryLedgerID": "1165",
- "portfolioID": "416",
- "propertyID": null,
- "unitID": null,
- "leaseID": null,
- "billID": null,
- "contactID": null,
- "bankAccountID": "31",
- "chargeAccountID": "106",
- "equityAccountID": null,
- "destinationBankAccountID": null,
- "managementFeeIncomeAccountID": null,
- "prepaymentAccountFilterTypeID": null,
- "prepaymentAccountID": null,
- "unallocatedAccountID": null,
- "payoutID": null,
- "payoutReturnID": null,
- "amount": "1000.00",
- "amountPaid": null,
- "amountAllocated": null,
- "processingFee": null,
- "convenienceFee": null,
- "convenienceFeeTransactionID": null,
- "description": "Test Description",
- "reference": "Test Reference",
- "receivedFrom": "123pm",
- "returnTransactionID": null,
- "returnTypeID": null,
- "returnDescription": null,
- "bulkPaymentID": null,
- "paymentTypeID": "4",
- "billChargeTransactionID": null,
- "billCreditTransactionID": null,
- "discountAmount": null,
- "markupAmount": null,
- "managementFeeAmountPaid": null,
- "isAdditionalManagementFee": null,
- "managementFeePercent": null,
- "isSuppressed": "0",
- "managementFeeExpenseAccountID": null,
- "managementFeePeriodDate": null,
- "managementFeeSalesTaxSettingID": null,
- "managementFeeSalesTaxAmountPaid": null,
- "managementFeeSalesTaxPercent": null,
- "managementFeeSalesTaxIncomeAccountID": null,
- "managementFeeSalesTaxExpenseAccountID": null,
- "managementFeeBatchID": null,
- "isSalesTaxCharge": null,
- "salesTaxSettingID": null,
- "salesTaxInitiatedFromTransactionID": null,
- "isVoided": "0",
- "bankAccountGatewayID": null,
- "bankAccountGatewayTransactionID": null,
- "settlementID": null,
- "paymentAccountName": null,
- "paymentAccountNumberTruncated": null,
- "depositID": null,
- "reconciliationID": null,
- "previousReconciliationID": null,
- "achStatusID": null,
- "bankTransferID": null,
- "lateFeePeriod": null,
- "isFromManager": null,
- "isMoveInCharge": null,
- "isProrated": null,
- "isMoveOutTransaction": null,
- "moveOutAmount": null,
- "discountMarkupBillChargeTransactionID": null,
- "recurringObjectID": null,
- "withholdingTaxAgencyID": null,
- "withholdingTaxContactID": null,
- "datePosted": "2026-05-15",
- "dateTimeCreated": "2026-05-15 18:34:26",
- "dateTimeModified": "2026-05-15 18:34:26"
}
}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.
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").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.| leaseID required | integer Example: 2982 ID of the lease to post the charge against. |
| datePosted required | string <date> Date the charge should be posted to the ledger ( |
| 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. |
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. |
{- "datePosted": "2026-04-25",
- "amount": "1500.00",
- "chargeAccountID": "9",
- "description": "April Rent"
}{- "transaction": {
- "transactionID": 80980,
- "transactionTypeID": 1,
- "managementFeeMode": "2",
- "primaryLedgerID": 1212,
- "portfolioID": "435",
- "propertyID": "708",
- "unitID": "687",
- "leaseID": "2982",
- "billID": null,
- "contactID": null,
- "bankAccountID": null,
- "chargeAccountID": "9",
- "equityAccountID": null,
- "destinationBankAccountID": null,
- "managementFeeIncomeAccountID": null,
- "prepaymentAccountFilterTypeID": null,
- "prepaymentAccountID": null,
- "unallocatedAccountID": null,
- "payoutID": null,
- "payoutReturnID": null,
- "amount": "1000.00",
- "amountPaid": "0.00",
- "amountAllocated": null,
- "processingFee": null,
- "convenienceFee": null,
- "convenienceFeeTransactionID": null,
- "description": "Rent Income",
- "reference": null,
- "receivedFrom": null,
- "returnTransactionID": null,
- "returnTypeID": null,
- "returnDescription": null,
- "bulkPaymentID": null,
- "paymentTypeID": null,
- "billChargeTransactionID": null,
- "billCreditTransactionID": null,
- "discountAmount": null,
- "markupAmount": null,
- "managementFeeAmountPaid": "0.00",
- "isAdditionalManagementFee": "0",
- "managementFeePercent": "0.01",
- "isSuppressed": "0",
- "managementFeeExpenseAccountID": null,
- "managementFeePeriodDate": null,
- "managementFeeSalesTaxSettingID": "10",
- "managementFeeSalesTaxAmountPaid": "0.00",
- "managementFeeSalesTaxPercent": "7.0000",
- "managementFeeSalesTaxIncomeAccountID": "9",
- "managementFeeSalesTaxExpenseAccountID": "38",
- "managementFeeBatchID": null,
- "isSalesTaxCharge": null,
- "salesTaxSettingID": null,
- "salesTaxInitiatedFromTransactionID": null,
- "isVoided": 0,
- "bankAccountGatewayID": null,
- "bankAccountGatewayTransactionID": null,
- "settlementID": null,
- "paymentAccountName": null,
- "paymentAccountNumberTruncated": null,
- "depositID": null,
- "reconciliationID": null,
- "previousReconciliationID": null,
- "achStatusID": null,
- "bankTransferID": null,
- "lateFeePeriod": null,
- "isFromManager": null,
- "isMoveInCharge": "0",
- "isProrated": "0",
- "isMoveOutTransaction": "0",
- "moveOutAmount": null,
- "discountMarkupBillChargeTransactionID": null,
- "recurringObjectID": null,
- "withholdingTaxAgencyID": null,
- "withholdingTaxContactID": null,
- "datePosted": "2026-04-25",
- "dateTimeCreated": "2026-04-25 20:08:26",
- "dateTimeModified": "2026-04-25 20:08:26"
}
}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.
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.applyAutomatically is true, the server allocates the payment to outstanding charges
from oldest to newest, ignoring the receipts array.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.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.| leaseID required | integer Example: 2982 ID of the lease to record the payment against. |
| amount required | string Total payment amount as a decimal string. |
| datePosted required | string <date> Date the payment should be posted to the ledger ( |
| leaseTenantID required | string ID of the lease-tenant record identifying the paying tenant. Controls |
| bankAccountID | string or null ID of the bank account to deposit the payment into. Pass |
| emailReceipt | boolean Default: false Whether to send a payment receipt email to the tenant identified by |
| leaseID | string ID of the lease (must match the |
| prepaymentAccountID | string or null Account to hold unallocated (prepayment) funds. Use |
| prepaymentAmount | number or null Portion of |
| 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 |
Array of objects List of charge transactions to apply this payment to. Required when
| |
| hasPrepayment | boolean Default: false Whether any portion of this payment should be held as a prepayment.
When |
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. |
{- "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": [
- {
- "chargeTransactionID": "80976",
- "amount": 1500
}
], - "hasPrepayment": false
}{- "transaction": {
- "transactionID": 80977,
- "transactionTypeID": 2,
- "managementFeeMode": "2",
- "primaryLedgerID": 1212,
- "portfolioID": "435",
- "propertyID": "708",
- "unitID": "687",
- "leaseID": "2982",
- "billID": null,
- "contactID": 5194,
- "bankAccountID": "46",
- "chargeAccountID": null,
- "equityAccountID": null,
- "destinationBankAccountID": null,
- "managementFeeIncomeAccountID": null,
- "prepaymentAccountFilterTypeID": "1",
- "prepaymentAccountID": null,
- "unallocatedAccountID": "3",
- "payoutID": null,
- "payoutReturnID": null,
- "amount": "1000.00",
- "amountPaid": null,
- "amountAllocated": "500.00",
- "processingFee": null,
- "convenienceFee": "0.00",
- "convenienceFeeTransactionID": null,
- "description": "April rent payment",
- "reference": "1234",
- "receivedFrom": null,
- "returnTransactionID": null,
- "returnTypeID": null,
- "returnDescription": null,
- "bulkPaymentID": null,
- "paymentTypeID": "3",
- "billChargeTransactionID": null,
- "billCreditTransactionID": null,
- "discountAmount": null,
- "markupAmount": null,
- "managementFeeAmountPaid": null,
- "isAdditionalManagementFee": null,
- "managementFeePercent": null,
- "isSuppressed": "0",
- "managementFeeExpenseAccountID": null,
- "managementFeePeriodDate": null,
- "managementFeeSalesTaxSettingID": null,
- "managementFeeSalesTaxAmountPaid": null,
- "managementFeeSalesTaxPercent": null,
- "managementFeeSalesTaxIncomeAccountID": null,
- "managementFeeSalesTaxExpenseAccountID": null,
- "managementFeeBatchID": null,
- "isSalesTaxCharge": null,
- "salesTaxSettingID": null,
- "salesTaxInitiatedFromTransactionID": null,
- "isVoided": 0,
- "bankAccountGatewayID": null,
- "bankAccountGatewayTransactionID": null,
- "settlementID": null,
- "paymentAccountName": null,
- "paymentAccountNumberTruncated": null,
- "depositID": null,
- "reconciliationID": null,
- "previousReconciliationID": null,
- "achStatusID": null,
- "bankTransferID": null,
- "lateFeePeriod": null,
- "isFromManager": null,
- "isMoveInCharge": null,
- "isProrated": null,
- "isMoveOutTransaction": "0",
- "moveOutAmount": null,
- "discountMarkupBillChargeTransactionID": null,
- "recurringObjectID": null,
- "withholdingTaxAgencyID": null,
- "withholdingTaxContactID": null,
- "datePosted": "2026-04-25",
- "dateTimeCreated": "2026-04-25 20:01:18",
- "dateTimeModified": "2026-04-25 20:01:18"
}
}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.
propertyIDs to see transfers affecting specific properties.transactionEntriesLedgerIDs to find transfers that touched a given ledger.isVoided=1.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.| 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 |
| 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. |
required | object (transaction) |
required | object |
required | object |
required | object |
required | object |
required | object |
[- {
- "transaction": {
- "transactionID": 80943,
- "transactionTypeID": 15,
- "primaryLedgerID": null,
- "billID": null,
- "bulkPaymentID": null,
- "description": "Monthly ledger transfer",
- "isVoided": "0",
- "amount": "1.00",
- "datePosted": "2026-04-24",
- "reference": null,
- "payoutID": null,
- "payoutReturnID": null,
- "dateTimeCreated": "2026-04-24T04:30:11Z",
- "dateTimeModified": "2026-04-24T04:30:11Z",
- "contactID": null
}, - "ledger": {
- "ledgerID": null,
- "name": null
}, - "property": {
- "propertyID": null,
- "name": null,
- "address": null,
- "address2": null,
- "city": null,
- "stateID": null,
- "postalCode": null,
- "isMultiUnit": null
}, - "portfolio": {
- "portfolioID": null,
- "name": null
}, - "unit": {
- "unitID": null,
- "name": null,
- "address": null,
- "address2": null,
- "city": null,
- "stateID": null,
- "postalCode": null
}, - "transactionEntries": {
- "ledgerNames": "Aaron Ziggo, Day Off Investments LLC"
}
}
]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.
propertyIDs to find journal entries affecting a specific property.transactionEntriesLedgerIDs to find entries that touched a given ledger.isVoided=1.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.| 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 |
| 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. |
required | object (transaction) |
required | object |
required | object |
required | object |
required | object |
required | object |
[- {
- "transaction": {
- "transactionID": 50196,
- "transactionTypeID": 11,
- "primaryLedgerID": 728,
- "billID": null,
- "bulkPaymentID": null,
- "description": "Year-end adjustment",
- "isVoided": "0",
- "amount": "10000.00",
- "datePosted": "2026-01-01",
- "reference": null,
- "payoutID": null,
- "payoutReturnID": null,
- "dateTimeCreated": "2025-01-16T18:38:26Z",
- "dateTimeModified": "2026-01-05T20:55:59Z",
- "contactID": null
}, - "ledger": {
- "ledgerID": 728,
- "name": "Operating Reserve"
}, - "property": {
- "propertyID": null,
- "name": null,
- "address": null,
- "address2": null,
- "city": null,
- "stateID": null,
- "postalCode": null,
- "isMultiUnit": null
}, - "portfolio": {
- "portfolioID": 255,
- "name": "Main Portfolio"
}, - "unit": {
- "unitID": null,
- "name": null,
- "address": null,
- "address2": null,
- "city": null,
- "stateID": null,
- "postalCode": null
}, - "transactionEntries": {
- "ledgerNames": "Operating Account, Maintenance Reserve"
}
}
]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.
bankAccountIDs to find transfers associated with a specific bank account.nextRunDateMin/nextRunDateMax to see transfers running in the next N days.ledgerIDs to find transfers that involve a specific ledger.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.| 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 |
| 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. |
required | object |
[- {
- "recurringLedgerTransfer": {
- "recurringLedgerTransferID": 2,
- "amount": "1.00",
- "bankAccountID": 46,
- "description": "test",
- "endDate": null,
- "frequency": 1,
- "nextRunDate": "2026-04-25",
- "reference": null,
- "scheduleFrequencyID": 1,
- "ledgerNames": "Aaron Ziggo, Day Off Investments LLC"
}
}, - {
- "recurringLedgerTransfer": {
- "recurringLedgerTransferID": 1,
- "amount": "100.00",
- "bankAccountID": 31,
- "description": "Ledger Transfer",
- "endDate": null,
- "frequency": 2,
- "nextRunDate": "2026-06-11",
- "reference": "Ledger Transfer",
- "scheduleFrequencyID": 3,
- "ledgerNames": "Amanda LLC, Amanda LLC Trust"
}
}
]Paginated search for recurring journal entry schedules. Each result contains the recurring journal entry record alongside the full ledger object it is associated with.
ledgerIDs to find recurring entries associated with a specific ledger.nextRunDateMin/nextRunDateMax to see entries posting in the next N days.endDateMin/endDateMax to find schedules expiring in a given window.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.| 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 |
| 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. |
required | object |
required | object |
[- {
- "recurringJournalEntry": {
- "recurringJournalEntryID": 4,
- "ledgerID": 384,
- "description": "Monthly fee",
- "amount": "12.00",
- "endDate": null,
- "nextRunDate": "2026-04-25",
- "frequency": 1,
- "scheduleFrequencyID": 1
}, - "ledger": {
- "ledgerID": 384,
- "ledgerTypeID": 2,
- "objectID": 139,
- "name": "123 PM",
- "isActive": 1,
- "dateTimeCreated": "2023-09-29T23:46:23Z",
- "dateTimeModified": "2026-04-24T17:51:58Z"
}
}, - {
- "recurringJournalEntry": {
- "recurringJournalEntryID": 3,
- "ledgerID": 2,
- "description": "JE for Rent",
- "amount": "100.00",
- "endDate": null,
- "nextRunDate": "2026-05-11",
- "frequency": 1,
- "scheduleFrequencyID": 3
}, - "ledger": {
- "ledgerID": 2,
- "ledgerTypeID": 2,
- "objectID": 1,
- "name": "Amanda LLC",
- "isActive": 1,
- "dateTimeCreated": "2023-09-29T23:46:23Z",
- "dateTimeModified": "2026-03-26T13:49:41Z"
}
}
]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.
isCash or isAccrual for cash vs. accrual basis reporting.isSuppressed to show or exclude management-fee suppressed entries.propertyIDs (comma-separated) and propertyID (single integer) are accepted;
propertyIDs takes precedence.ledgerIDs takes precedence over ledgerID.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.ledger (the account being debited/credited) and
the primaryLedger (the bank account of the parent transaction).GET /accounting/transactions/search - Search parent transactions.| 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 |
| 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. |
required | object (transaction_entry) |
required | object (transaction) |
object or null | |
object or null | |
object or null | |
object or null | |
object or null |
[- {
- "transactionEntry": {
- "transactionEntryID": 14201,
- "transactionID": 9901,
- "ledgerID": 401,
- "accountID": 22,
- "portfolioID": 50,
- "amount": "1500.00",
- "isVoided": 0,
- "isSuppressed": 0,
- "isCash": 1,
- "isAccrual": 0,
- "datePosted": "2024-10-01",
- "dateTimeCreated": "2024-10-01T08:00:00Z",
- "dateTimeModified": "2024-10-01T08:00:00Z"
}, - "transaction": {
- "transactionID": 9901,
- "transactionTypeID": 4,
- "primaryLedgerID": 401,
- "billID": null,
- "payoutID": null,
- "payoutReturnID": null,
- "amount": "1500.00",
- "description": "Rent payment - Unit 101",
- "reference": null,
- "isVoided": 0,
- "datePosted": "2024-10-01",
- "dateTimeCreated": "2024-10-01T08:00:00Z",
- "dateTimeModified": "2024-10-01T08:00:00Z"
}, - "ledger": {
- "ledgerID": 401,
- "ledgerTypeID": 1,
- "name": "123 Main St Operating"
}, - "primaryLedger": {
- "ledgerID": 401,
- "ledgerTypeID": 1,
- "name": "123 Main St Operating"
}, - "property": {
- "propertyID": 100,
- "name": "123 Main St",
- "address": "123 Main St",
- "address2": null,
- "city": "Springfield",
- "stateID": "IL",
- "postalCode": "62701",
- "isMultiUnit": 1
}, - "portfolio": {
- "portfolioID": 50,
- "name": "Smith Portfolio"
}, - "unit": {
- "unitID": 200,
- "name": "Unit 101",
- "address": "123 Main St",
- "address2": "Unit 101",
- "city": "Springfield",
- "stateID": "IL",
- "postalCode": "62701"
}
}
]| 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
|
| contactName | string |
| amount | number <double> |
| amountAllocated | number <double> |
| description | string |
| isSuppressed | integer |
| datePosted | string <date> |
[- {
- "transactionID": 0,
- "primaryLedgerID": 0,
- "portfolioID": 0,
- "ledgerName": "string",
- "propertyID": 0,
- "propertyAddress": "string",
- "propertyAddress2": "string",
- "propertyCity": "string",
- "propertyStateID": "string",
- "propertyPostalCode": "string",
- "chargeAccountID": 0,
- "contactID": 0,
- "contactTypeID": 1,
- "contactName": "string",
- "amount": 0,
- "amountAllocated": 0,
- "description": "string",
- "isSuppressed": 0,
- "datePosted": "2019-08-24"
}
]| 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 |
[- {
- "propertyID": 0,
- "propertyName": "string",
- "propertyStreetName": "string",
- "propertyStreetNumber": "string",
- "propertyAddress": "string",
- "propertyAddress2": "string",
- "propertyCity": "string",
- "propertyStateID": "string",
- "propertyPostalCode": "string",
- "accountID": 0,
- "balance": 0,
- "managerLedgerID": 0
}
]| ledgerID | integer |
| ledgerName | string |
| ledgerTypeID | integer (ledger_types) Enum: 1 2 3 4
|
| ledgerObjectID | integer |
| accountID | integer |
| accountName | string |
| accountNumber | string |
| balance | number <double> |
[- {
- "ledgerID": 0,
- "ledgerName": "string",
- "ledgerTypeID": 1,
- "ledgerObjectID": 0,
- "accountID": 0,
- "accountName": "string",
- "accountNumber": "string",
- "balance": 0
}
]| ledgerID | integer |
| ledgerName | string |
| ledgerTypeID | integer (ledger_types) Enum: 1 2 3 4
|
| ledgerObjectID | integer |
| operatingBalance | number <double> |
| reserveAmount | number <double> |
[- {
- "ledgerID": 0,
- "ledgerName": "string",
- "ledgerTypeID": 1,
- "ledgerObjectID": 0,
- "operatingBalance": 0,
- "reserveAmount": 0
}
]| ledgerID | integer |
| ledgerName | string |
| ledgerTypeID | integer (ledger_types) Enum: 1 2 3 4
|
| ledgerObjectID | integer |
| depositBalance | number <double> |
| escrowBalance | number <double> |
[- {
- "ledgerID": 0,
- "ledgerName": "string",
- "ledgerTypeID": 1,
- "ledgerObjectID": 0,
- "depositBalance": 0,
- "escrowBalance": 0
}
]| ledgerID | integer |
| ledgerName | string |
| ledgerTypeID | integer (ledger_types) Enum: 1 2 3 4
|
| ledgerObjectID | integer |
| operatingBalance | number <double> |
| prepaymentBalance | number <double> |
[- {
- "ledgerID": 0,
- "ledgerName": "string",
- "ledgerTypeID": 1,
- "ledgerObjectID": 0,
- "operatingBalance": 0,
- "prepaymentBalance": 0
}
]| 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> |
[- {
- "leaseID": 0,
- "tenants": [
- "string"
], - "unitID": 0,
- "unitAddress": "string",
- "unitAddress2": "string",
- "unitCity": "string",
- "unitStateID": "string",
- "unitPostalCode": "string",
- "unitName": "string",
- "propertyID": 0,
- "propertyAddress": "string",
- "propertyAddress2": "string",
- "propertyCity": "string",
- "propertyStateID": "string",
- "propertyPostalCode": "string",
- "propertyName": "string",
- "prepaymentBalance": 0
}
]| accountID | integer |
| name | string |
| number | string |
| lastReconciliationDate | string <date> |
[- {
- "accountID": 0,
- "name": "string",
- "number": "string",
- "lastReconciliationDate": "2019-08-24"
}
]| contactID | integer |
| name | string |
| contactTypeID | integer (contact_types) Enum: 1 2 3 4 5 6
|
| liabilityInsuranceExpiresDate | string <date> |
| workersCompInsuranceExpiresDate | string <date> |
[- {
- "contactID": 0,
- "name": "string",
- "contactTypeID": 1,
- "liabilityInsuranceExpiresDate": "2019-08-24",
- "workersCompInsuranceExpiresDate": "2019-08-24"
}
]| 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> |
[- {
- "transactionID": 0,
- "transactionTypeID": 0,
- "primaryLedgerID": 0,
- "primaryLedgerName": "string",
- "portfolioID": 0,
- "propertyID": 0,
- "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": 0,
- "leaseID": 0,
- "billID": 0,
- "datePosted": "2019-08-24",
- "cashCredits": 0,
- "cashDebits": 0,
- "accrualCredits": 0,
- "accrualDebits": 0
}
]| ledgerID | integer |
| ledgerName | string |
| ledgerTypeID | integer (ledger_types) Enum: 1 2 3 4
|
| 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> |
[- {
- "ledgerID": 0,
- "ledgerName": "string",
- "ledgerTypeID": 1,
- "objectID": 0,
- "reserveAmount": 0,
- "additionalReserveAmount": 0,
- "overdraftOverrideAmount": 0,
- "cashBalance": 0,
- "escrowBalance": 0,
- "prepaymentBalance": 0,
- "depositBalance": 0,
- "nonHeldDepositBalance": 0,
- "accountsReceivableBalance": 0,
- "accountsPayableBalance": 0,
- "creditBalance": 0,
- "currentCreditBalance": 0,
- "currentAccountsPayableBalance": 0,
- "liabilityBalance": 0,
- "nonHeldLiabilityBalance": 0,
- "undepositedReceiptsBalance": 0,
- "undepositedEscrowReceiptsBalance": 0,
- "workOrderEstimateBalance": 0,
- "operatingBalance": 0,
- "availableFunds": 0
}
]Returns a paginated list of owner contacts visible to the authenticated account.
isActive filterisActive defaults to 1 (active owners only). Pass isActive=0 for inactive owners.search matches against name and code.GET /owners/search — advanced filtered search with insurance, payout, and date filtersGET /owners/{contactID} — retrieve a single owner with full detail and includesPOST /owners — create a new owner| 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 |
| 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 |
| contactID required | integer |
| contactTypeID required | integer (contact_types) Enum: 1 2 3 4 5 6
|
| name required | string |
| payoutTypeID required | integer (payout_types) Enum: 1 2 3 4
|
| 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
|
| 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 |
[- {
- "contactID": "3513",
- "contactTypeID": "1",
- "vendorTypeID": null,
- "code": null,
- "name": "Chris Campos",
- "firstName": "Chris",
- "middleName": null,
- "lastName": "Campos",
- "suffix": null,
- "email": null,
- "phone": null,
- "payoutTypeID": "2",
- "achIsCorporateAccount": "0",
- "holdPayments": "0",
- "isActive": "1",
- "preventConsolidatedPayments": "0",
- "isFromImport": "0",
- "dateTimeCreated": "2025-02-28 18:17:58",
- "dateTimeModified": "2026-03-16 23:10:48",
- "dateTimeDeactivated": null
}
]Creates a new owner contact and returns the full owner detail (same shape as GET /owners/{contactID}).
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.taxPayerName, taxFormTypeID, taxIdentifier) require the Contacts.ManageTaxInfo permission.routingNumber, accountNumber) are stored encrypted; only the last 4 digits of accountNumber are returned in responses.GET /owners/{contactID} — retrieve the created ownerPOST /owners/{contactID} — update owner fields after creationPOST /owners/{contactID}/ach-details — update payout/ACH settings| 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 |
required | object (contact) |
{- "name": "New User"
}{- "contact": {
- "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",
- "hasTaxIdentifier": 0
}
}Advanced paginated search for owner contacts with rich filter support.
isActive defaults to showing all owners when omitted. Pass true/false to filter.contact object containing all contact fields plus computed fields (daysUntilLiabilityInsuranceExpires, daysUntilWorkersCompInsuranceExpires, daysUntilInsuranceExpires, insuranceExpiresDate, propertyCount, hasTaxIdentifier).GET /owners — basic paginated list with name search onlyGET /owners/{contactID} — full owner detail with includes| 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 |
| 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 Available values: |
| 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 |
required | object Owner contact with all fields plus computed insurance and portfolio data |
[- {
- "contact": {
- "contactID": "3513",
- "contactTypeID": "1",
- "vendorTypeID": null,
- "name": "Chris Campos",
- "email": null,
- "phone": null,
- "address": null,
- "address2": null,
- "city": null,
- "stateID": null,
- "postalCode": null,
- "countryID": null,
- "birthDate": null,
- "defaultBillChargeAccountID": null,
- "payeeName": null,
- "taxPayerName": null,
- "taxFormTypeID": null,
- "payoutTypeID": "2",
- "achDetailsCiphertextID": null,
- "achAccountNumberTruncated": null,
- "achAccountTypeID": null,
- "holdPayments": "0",
- "liabilityInsuranceName": null,
- "liabilityInsurancePolicyNumber": null,
- "liabilityInsuranceExpiresDate": null,
- "isBillingSalesTaxEnabled": "0",
- "daysUntilLiabilityInsuranceExpires": null,
- "workersCompInsuranceName": null,
- "workersCompInsurancePolicyNumber": null,
- "workersCompInsuranceExpiresDate": null,
- "daysUntilWorkersCompInsuranceExpires": null,
- "insuranceExpiresDate": null,
- "daysUntilInsuranceExpires": null,
- "discountPercent": null,
- "discountGraceDays": null,
- "isActive": "1",
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2025-02-28 18:17:58",
- "dateTimeModified": "2026-03-16 23:10:48",
- "dateTimeDeactivated": null,
- "isInsuranceRequiredForPayment": null,
- "identificationTypeID": null,
- "identificationNumber": null,
- "identificationIssuingLocation": null,
- "identificationExpirationDate": null,
- "identificationCountryID": null,
- "hasTaxIdentifier": 0,
- "propertyCount": 3
}
}
]Retrieves a single owner contact by ID, including all stored attributes and any optionally requested related data via the includes parameter.
verifyAccessToContact.400 if the contact is not found or does not have contactTypeID matching Owner.emails — array of email records for the ownerphones — array of phone records for the owneraddresses — array of address records for the ownerportfolios — array of portfolio memberships, each containing an owner (portfolioOwner record) and a portfolio object with contacts arrayportalAccounts — array of active owner portal accounts linked to this contactportalInvitations — array of pending owner portal invitationstaxAdjustments — array of 1099 tax adjustment records for the ownerGET /owners — list all ownersGET /owners/search — search owners with filtersPOST /owners — create a new ownerPOST /owners/{contactID} — update an ownerDELETE /owners/{contactID} — delete an ownerPOST /owners/{contactID}/activate — activate an ownerPOST /owners/{contactID}/deactivate — deactivate an owner| contactID required | integer Example: 3513 The unique owner contact ID |
| includes | string Example: includes=portfolios,portalAccounts,portalInvitations,taxAdjustments Comma-separated list of related data to include in the response. Available values: |
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) |
{- "contact": {
- "contactID": "3513",
- "contactTypeID": "1",
- "vendorTypeID": null,
- "code": null,
- "name": "Chris Campos",
- "firstName": "Chris",
- "middleName": null,
- "lastName": "Campos",
- "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",
- "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": "2025-02-28 18:17:58",
- "dateTimeModified": "2026-03-16 23:10:48",
- "dateTimeDeactivated": null,
- "contactType": "Owner",
- "hasTaxIdentifier": 0
}, - "portfolios": [
- {
- "owner": {
- "portfolioOwnerID": "422",
- "portfolioID": "276",
- "contactID": "3513",
- "percentOwned": "100.0000",
- "percentDistributed": "100.0000",
- "overrideContactPayoutSettings": "0",
- "payeeName": null,
- "payoutTypeID": "2",
- "achDetailsCiphertextID": null,
- "achAccountNumberTruncated": null,
- "achAccountTypeID": null,
- "achIsCorporateAccount": "0"
}, - "portfolio": {
- "portfolioID": "276",
- "code": null,
- "name": "Chris Campos test portfolio 1",
- "contacts": [
- {
- "contactID": "3513",
- "percentOwned": "100.0000",
- "percentDistributed": "100.0000",
- "name": "Chris Campos"
}
], - "isActive": "0",
- "dateTimeCreated": "2025-02-28 18:18:09",
- "dateTimeModified": "2026-01-14 19:59:46",
- "dateTimeDeactivated": "2026-01-14 19:59:46"
}
}
], - "portalAccounts": [
- {
- "userPortalAccountID": "562571",
- "userID": "491060",
- "accountID": "30",
- "portalTypeID": "2",
- "portalID": "3513",
- "email": "owner@example.com",
- "isActive": "1",
- "firstName": "Mario",
- "lastName": "Sefa",
- "phone": null,
- "timeZone": "America/New_York"
}
], - "portalInvitations": [ ],
- "taxAdjustments": [ ]
}Updates editable fields on an existing owner contact and returns the full owner detail (same shape as GET /owners/{contactID}).
UpdateBillApprovalExemption permission)Update Owner Details permission.400 if the contact is not found or is not an owner.name, code, websiteUrl, birthDate, and isBillApprovalExempt (permission-gated).includes query params to include related data in the response.GET /owners/{contactID} — retrieve current owner detail| contactID required | integer Example: 3513 The unique owner contact ID |
| includes | string Example: includes=portfolios Comma-separated list of related data to include in the response. Available values: |
| 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) |
required | object (contact) |
{- "name": "Chris Campos",
- "isBillApprovalExempt": "0",
- "birthDate": null,
- "code": null
}{- "contact": {
- "contactID": "3513",
- "contactTypeID": "1",
- "vendorTypeID": null,
- "code": null,
- "name": "Chris Campos",
- "firstName": "Chris",
- "middleName": null,
- "lastName": "Campos",
- "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": "2025-02-28 18:17:58",
- "dateTimeModified": "2026-04-24 17:47:53",
- "dateTimeDeactivated": null,
- "contactType": "Owner",
- "hasTaxIdentifier": 0
}
}Permanently deletes an owner contact. Returns the deleted contact as a flat object (not wrapped in a contact key).
Update Owner Details permission.400 if the contact is not found or is not an owner.contact wrapper).POST /owners/{contactID}/deactivate — soft-deactivate instead of permanently deletingGET /owners/{contactID} — verify owner state before deletion| contactID required | integer Example: 5258 The unique owner contact ID to delete |
| contactID required | integer |
| contactTypeID required | integer (contact_types) Enum: 1 2 3 4 5 6
|
| name required | string |
| payoutTypeID required | integer (payout_types) Enum: 1 2 3 4
|
| 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
|
| 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 |
{- "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"
}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}).
Contacts.UpdateOwner permission.400 if the contact is not found or is not an owner.verifyAccessToContact.isActive = 1 and clears dateTimeDeactivated on the contact record.includes query params to include related data.GET /owners/{contactID} — retrieve owner detailsPOST /owners/{contactID}/deactivate — deactivate an active ownerPOST /owners/{contactID} — update owner fields| contactID required | integer Example: 3513 The unique owner contact ID to activate |
| includes | string Example: includes=portfolios Comma-separated list of related data to include in the response. Available values: |
required | object |
{- "contact": {
- "contactID": "3513",
- "contactTypeID": "1",
- "vendorTypeID": null,
- "code": null,
- "name": "Chris Campos",
- "firstName": "Chris",
- "middleName": null,
- "lastName": "Campos",
- "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",
- "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": "2025-02-28 18:17:58",
- "dateTimeModified": "2026-04-24 16:05:00",
- "dateTimeDeactivated": null,
- "contactType": "Owner",
- "hasTaxIdentifier": 0
}
}Sets an owner's isActive flag to 0, marking them as inactive. Returns the updated owner detail (same shape as GET /owners/{contactID}).
Contacts.UpdateOwner permission.400 if the contact is not found or is not an owner.verifyAccessToContact.isActive = 0 and updates dateTimeModified and dateTimeDeactivated on the contact record.includes query params to include related data.GET /owners/{contactID} — retrieve owner detailsPOST /owners/{contactID}/activate — re-activate a deactivated ownerPOST /owners/{contactID} — update owner fields| contactID required | integer Example: 3513 The unique owner contact ID to deactivate |
| includes | string Example: includes=portfolios Comma-separated list of related data to include in the response. Available values: |
required | object |
{- "contact": {
- "contactID": "3513",
- "contactTypeID": "1",
- "vendorTypeID": null,
- "code": null,
- "name": "Chris Campos",
- "firstName": "Chris",
- "middleName": null,
- "lastName": "Campos",
- "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",
- "liabilityInsuranceName": null,
- "liabilityInsurancePolicyNumber": null,
- "liabilityInsuranceExpiresDate": null,
- "workersCompInsuranceName": null,
- "workersCompInsurancePolicyNumber": null,
- "workersCompInsuranceExpiresDate": null,
- "discountPercent": null,
- "discountAmount": null,
- "discountAmountMin": null,
- "discountAmountMax": null,
- "discountGraceDays": null,
- "isActive": "0",
- "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": "2025-02-28 18:17:58",
- "dateTimeModified": "2026-04-24 15:50:53",
- "dateTimeDeactivated": "2026-04-24 15:50:53",
- "contactType": "Owner",
- "hasTaxIdentifier": 0
}
}Returns a paginated list of tenant contacts visible to the authenticated account.
isActive filterisActive defaults to 1 (active tenants only). Pass 0 for inactive tenants.search matches against name.GET /tenants/search — advanced filtered search with payout and date filtersGET /tenants/{contactID} — retrieve a single tenant with full detail and includesPOST /tenants — create a new tenant| 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 |
| 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 |
required | object (contact) |
[- {
- "contact": {
- "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",
- "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": "907",
- "ownerPortalNameOverride": null,
- "isBillApprovalExempt": "0",
- "isBillingSalesTaxEnabled": "0",
- "isQuickbooksExportEnabled": "0",
- "quickbooksCustomerName": null,
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2024-10-31 17:32:50",
- "dateTimeModified": "2025-04-25 21:06:37",
- "dateTimeDeactivated": null,
- "contactType": "Tenant"
}
}
]Creates a new tenant contact and returns the full tenant detail (same shape as GET /tenants/{contactID}).
Contacts.UpdateTenant permission.name is required.code, name, websiteUrl, birthDate, identificationTypeID, identificationNumber, identificationCountryID, identificationIssuingLocation, and identificationExpirationDate. Any other fields in the request body are silently ignored.taxPayerName, taxFormTypeID, taxIdentifier) require the Contacts.ManageTaxInfo permission.GET /tenants/{contactID} — retrieve the created tenantPOST /tenants/{contactID} — update tenant fields after creation| 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 |
required | object (contact) |
{- "name": "Aaron Boone"
}{- "contact": {
- "contactID": "5261",
- "contactTypeID": "2",
- "vendorTypeID": null,
- "code": null,
- "name": "TestAPI docs",
- "firstName": "TestAPI",
- "middleName": null,
- "lastName": "docs",
- "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",
- "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 18:44:58",
- "dateTimeModified": "2026-04-24 18:44:58",
- "dateTimeDeactivated": null,
- "contactType": "Tenant",
- "hasTaxIdentifier": 0
}
}Advanced paginated search for tenant contacts with rich filter support.
isActive shows all tenants when omitted. Pass true/false to filter.emails — array of email records for each tenantphones — array of phone records for each tenantaddresses — array of address records for each tenantleases — array of lease memberships with lease, property, and unit dataportalAccounts — array of active tenant portal accountsportalInvitations — array of pending tenant portal invitationsGET /tenants — basic paginated list with name search onlyGET /tenants/{contactID} — full tenant detail with includes| 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 |
| 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 Available values: |
| includes | string Example: includes=leases,portalAccounts Comma-separated list of related data to include in each result. Available values: |
| 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 |
required | object Tenant contact with all fields plus computed data |
[- {
- "contact": {
- "contactID": "2793",
- "contactTypeID": "2",
- "vendorTypeID": null,
- "name": "Aaron Boone",
- "email": "tenant@example.com",
- "phone": "+12395370474",
- "address": null,
- "address2": null,
- "city": null,
- "stateID": null,
- "postalCode": null,
- "countryID": null,
- "birthDate": "1981-10-22",
- "defaultBillChargeAccountID": null,
- "payeeName": null,
- "taxPayerName": null,
- "taxFormTypeID": null,
- "payoutTypeID": "2",
- "achDetailsCiphertextID": null,
- "achAccountNumberTruncated": null,
- "achAccountTypeID": null,
- "holdPayments": "0",
- "liabilityInsuranceName": null,
- "liabilityInsurancePolicyNumber": null,
- "liabilityInsuranceExpiresDate": null,
- "workersCompInsuranceName": null,
- "workersCompInsurancePolicyNumber": null,
- "workersCompInsuranceExpiresDate": null,
- "discountPercent": null,
- "discountGraceDays": null,
- "isActive": "1",
- "invoiceAutofillTemplateID": null,
- "isInsuranceRequiredForPayment": null,
- "identificationTypeID": null,
- "identificationNumber": null,
- "identificationIssuingLocation": null,
- "identificationExpirationDate": null,
- "identificationCountryID": null,
- "applicantID": "907",
- "dateTimeCreated": "2024-10-31 17:32:50",
- "dateTimeModified": "2025-04-25 21:06:37",
- "dateTimeDeactivated": null,
- "hasTaxIdentifier": 1
}
}
]Retrieves a single tenant contact by ID, including all stored attributes and any optionally requested related data via the includes parameter.
verifyAccessToContact.400 if the contact is not found or does not have contactTypeID matching Tenant (2).emails — array of email records for the tenantphones — array of phone records for the tenantaddresses — array of address records for the tenantleases — array of lease memberships, each containing leaseTenant, contact, lease, property, and unit objectsportalAccounts — array of active tenant portal accounts linked to this contactportalInvitations — array of pending tenant portal invitationsGET /tenants — list all tenantsGET /tenants/search — search tenants with filtersPOST /tenants — create a new tenantPOST /tenants/{contactID} — update a tenantDELETE /tenants/{contactID} — delete a tenantPOST /tenants/{contactID}/activate — activate a tenantPOST /tenants/{contactID}/deactivate — deactivate a tenant| contactID required | integer Example: 2793 The unique tenant contact ID |
| includes | string Example: includes=leases,portalAccounts,portalInvitations Comma-separated list of related data to include in the response. Available values: |
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) |
{- "contact": {
- "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",
- "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": "907",
- "ownerPortalNameOverride": null,
- "isBillApprovalExempt": "0",
- "isBillingSalesTaxEnabled": "0",
- "isQuickbooksExportEnabled": "0",
- "quickbooksCustomerName": null,
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2024-10-31 17:32:50",
- "dateTimeModified": "2025-04-25 21:06:37",
- "dateTimeDeactivated": null,
- "contactType": "Tenant",
- "hasTaxIdentifier": 1
}, - "leases": [
- {
- "leaseTenant": {
- "leaseTenantID": "3265",
- "leaseID": "2915",
- "contactID": "2793",
- "isPrimary": "1",
- "isActive": "1",
- "moveInDate": "2026-03-04",
- "moveOutDate": null
}, - "contact": {
- "contactID": "2793",
- "contactTypeID": "2",
- "name": "Aaron Boone",
- "email": "tenant@example.com",
- "phone": "+12395370474"
}, - "lease": {
- "leaseID": "2915",
- "propertyID": "596",
- "unitID": "577",
- "startDate": "2026-03-04",
- "endDate": null,
- "primaryLeaseStatusID": "3",
- "leaseStatusID": "6"
}, - "property": {
- "propertyID": "596",
- "isMultiUnit": "0",
- "propertyTypeID": "2",
- "name": null,
- "address": "18908 170th Pl NE",
- "address2": null,
- "city": "Woodinville",
- "stateID": "WA",
- "postalCode": "98072",
- "countryID": "US"
}, - "unit": {
- "unitID": "577",
- "name": null,
- "address": "18908 170th Pl NE",
- "address2": null,
- "city": "Woodinville",
- "stateID": "WA",
- "postalCode": "98072"
}
}
], - "portalAccounts": [ ],
- "portalInvitations": [ ]
}Updates editable fields on an existing tenant contact and returns the full tenant detail (same shape as GET /tenants/{contactID}).
Update Tenant Details permission.400 if the contact is not found or is not a tenant.code, name, birthDate, identificationTypeID, identificationNumber, identificationCountryID, identificationIssuingLocation, identificationExpirationDate. All other fields in the request body are silently ignored.includes query params to include related data in the response.GET /tenants/{contactID} — retrieve current tenant detailPOST /tenants/{contactID}/activate — activate an inactive tenantPOST /tenants/{contactID}/deactivate — deactivate an active tenant| contactID required | integer Example: 4976 The unique tenant contact ID |
| includes | string Example: includes=leases Comma-separated list of related data to include in the response. Available values: |
| 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 |
required | object (contact) |
{- "name": "Aaron Boone"
}{- "contact": {
- "contactID": "4976",
- "contactTypeID": "2",
- "vendorTypeID": null,
- "code": null,
- "name": "testing api",
- "firstName": "testing",
- "middleName": null,
- "lastName": "apii",
- "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",
- "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-02-03 16:47:21",
- "dateTimeModified": "2026-04-24 19:00:00",
- "dateTimeDeactivated": null,
- "contactType": "Tenant",
- "hasTaxIdentifier": 0
}
}Permanently deletes a tenant contact. Returns the deleted contact as a flat object (not wrapped in a contact key).
Contacts.UpdateTenant permission.400 if the contact is not found or is not a tenant.contact wrapper).POST /tenants/{contactID}/deactivate — soft-deactivate instead of permanently deletingGET /tenants/{contactID} — verify tenant state before deletion| contactID required | integer Example: 2793 The unique tenant contact ID to delete |
| contactID required | integer |
| contactTypeID required | integer (contact_types) Enum: 1 2 3 4 5 6
|
| name required | string |
| payoutTypeID required | integer (payout_types) Enum: 1 2 3 4
|
| 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
|
| 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 |
{- "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"
}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}).
Update Tenant Details permission.400 if the contact is not found or is not a tenant.isActive = 1GET /tenants/{contactID} — retrieve tenant detailsPOST /tenants/{contactID}/deactivate — deactivate an active tenantPOST /tenants/{contactID} — update tenant fields| contactID required | integer Example: 2793 The unique tenant contact ID to activate |
| includes | string Example: includes=leases Comma-separated list of related data to include in the response. Available values: |
required | object |
{- "contact": {
- "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",
- "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": "907",
- "ownerPortalNameOverride": null,
- "isBillApprovalExempt": "0",
- "isBillingSalesTaxEnabled": "0",
- "isQuickbooksExportEnabled": "0",
- "quickbooksCustomerName": null,
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2024-10-31 17:32:50",
- "dateTimeModified": "2026-04-24 18:00:00",
- "dateTimeDeactivated": null,
- "contactType": "Tenant",
- "hasTaxIdentifier": 0
}
}Sets a tenant's isActive flag to 0, marking them as inactive. Returns the updated tenant detail (same shape as GET /tenants/{contactID}).
Update Tenant Details permission.400 if the contact is not found or is not a tenant.isActive = 0 and updates dateTimeModified and dateTimeDeactivated on the contact record.includes query params to include related data.GET /tenants/{contactID} — retrieve tenant detailsPOST /tenants/{contactID}/activate — re-activate a deactivated tenantPOST /tenants/{contactID} — update tenant fields| contactID required | integer Example: 2793 The unique tenant contact ID to deactivate |
| includes | string Example: includes=leases Comma-separated list of related data to include in the response. Available values: |
required | object |
{- "contact": {
- "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",
- "liabilityInsuranceName": null,
- "liabilityInsurancePolicyNumber": null,
- "liabilityInsuranceExpiresDate": null,
- "workersCompInsuranceName": null,
- "workersCompInsurancePolicyNumber": null,
- "workersCompInsuranceExpiresDate": null,
- "discountPercent": null,
- "discountAmount": null,
- "discountAmountMin": null,
- "discountAmountMax": null,
- "discountGraceDays": null,
- "isActive": "0",
- "isInsuranceRequiredForPayment": null,
- "maxLineItemsOnPayment": null,
- "preventConsolidatedPayments": "0",
- "isFromImport": "0",
- "importSourceKey": null,
- "websiteUrl": null,
- "applicantID": "907",
- "ownerPortalNameOverride": null,
- "isBillApprovalExempt": "0",
- "isBillingSalesTaxEnabled": "0",
- "isQuickbooksExportEnabled": "0",
- "quickbooksCustomerName": null,
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2024-10-31 17:32:50",
- "dateTimeModified": "2026-04-24 18:15:00",
- "dateTimeDeactivated": "2026-04-24 18:15:00",
- "contactType": "Tenant",
- "hasTaxIdentifier": 0
}
}Returns a paginated list of vendor contacts visible to the authenticated account.
isActive filterisActive defaults to 1 (active vendors only). Pass isActive=0 for inactive vendors.search matches against vendor name and code.GET /vendors/search — advanced filtered searchGET /vendors/{contactID} — retrieve a single vendor with full detail and includesPOST /vendors — create a new vendor| 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 |
| 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 |
| 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 |
required | object |
[- {
- "contact": {
- "contactID": "2965",
- "contactTypeID": "3",
- "vendorTypeID": null,
- "code": null,
- "name": "#1",
- "firstName": null,
- "middleName": null,
- "lastName": null,
- "suffix": null,
- "email": "vendor@example.com",
- "phone": "+19547343566",
- "countryID": null,
- "address": null,
- "address2": null,
- "city": null,
- "stateID": null,
- "postalCode": null,
- "birthDate": null,
- "defaultBillChargeAccountID": "26",
- "payeeName": null,
- "taxPayerName": null,
- "taxFormTypeID": null,
- "identificationTypeID": null,
- "identificationNumber": null,
- "identificationCountryID": null,
- "identificationIssuingLocation": null,
- "identificationExpirationDate": null,
- "payoutTypeID": "2",
- "otherPayoutTypeID": null,
- "achDetailsCiphertextID": "1564",
- "achAccountNumberTruncated": "5213",
- "achAccountTypeID": "2",
- "achIsCorporateAccount": "0",
- "holdPayments": "0",
- "liabilityInsuranceName": null,
- "liabilityInsurancePolicyNumber": null,
- "liabilityInsuranceExpiresDate": "2025-12-26",
- "workersCompInsuranceName": null,
- "workersCompInsurancePolicyNumber": null,
- "workersCompInsuranceExpiresDate": null,
- "discountPercent": "10.0000",
- "discountAmount": null,
- "discountAmountMin": null,
- "discountAmountMax": null,
- "discountGraceDays": null,
- "isActive": "1",
- "isInsuranceRequiredForPayment": "0",
- "maxLineItemsOnPayment": null,
- "preventConsolidatedPayments": "0",
- "isFromImport": "0",
- "importSourceKey": null,
- "websiteUrl": null,
- "applicantID": null,
- "ownerPortalNameOverride": "Testing 123",
- "isBillApprovalExempt": "0",
- "isBillingSalesTaxEnabled": "0",
- "isQuickbooksExportEnabled": "1",
- "quickbooksCustomerName": "test",
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2024-11-21 21:54:43",
- "dateTimeModified": "2026-04-07 17:45:01",
- "dateTimeDeactivated": null,
- "contactType": "Vendor"
}
}
]Creates a new vendor contact and returns the full vendor detail (same shape as GET /vendors/{contactID}).
Update Vendor Details permission.name is the only required field.GET /vendors/{contactID} — retrieve the created vendorPOST /vendors/{contactID} — update vendor fields after creation| 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 |
required | object (contact) |
{- "name": "New Vendor"
}{- "contact": {
- "contactID": "5263",
- "contactTypeID": "3",
- "vendorTypeID": null,
- "code": null,
- "name": "New Vendor",
- "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:26:47",
- "dateTimeDeactivated": null,
- "contactType": "Vendor",
- "hasTaxIdentifier": 0
}
}Advanced paginated search for vendor contacts
isActive defaults to showing all vendors when omitted. Pass true/false to filter.contact object containing all contact fields plus computed insurance fields.emails — array of email records for each vendorphones — array of phone records for each vendoraddresses — array of address records for each vendorGET /vendors — basic paginated list with name search onlyGET /vendors/{contactID} — full vendor detail with all includes| 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 |
| includeManager | integer Default: 0 Enum: 0 1 When |
| 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 Available values: |
| includes | string Example: includes=emails,phones Comma-separated list of related data to include in each result item. Available values: |
| 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 |
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) |
[- {
- "contact": {
- "contactID": "743",
- "contactTypeID": "3",
- "vendorTypeID": "1",
- "name": "#1 Services",
- "code": "Aaron Jones",
- "email": null,
- "phone": "+18442828580",
- "address": "9470 Corkscrew Palms Cir",
- "address2": null,
- "city": "Naples",
- "stateID": "FL",
- "postalCode": "33928",
- "countryID": "US",
- "defaultBillChargeAccountID": null,
- "payeeName": null,
- "taxPayerName": "#1 Services",
- "taxFormTypeID": "1",
- "payoutTypeID": "3",
- "achDetailsCiphertextID": "1071",
- "achAccountNumberTruncated": "7623",
- "achAccountTypeID": "2",
- "holdPayments": "0",
- "liabilityInsuranceName": null,
- "liabilityInsurancePolicyNumber": null,
- "liabilityInsuranceExpiresDate": "2023-05-26",
- "daysUntilLiabilityInsuranceExpires": null,
- "workersCompInsuranceName": null,
- "workersCompInsurancePolicyNumber": null,
- "workersCompInsuranceExpiresDate": null,
- "daysUntilWorkersCompInsuranceExpires": null,
- "insuranceExpiresDate": "2023-05-26",
- "daysUntilInsuranceExpires": null,
- "discountPercent": null,
- "discountGraceDays": "65535",
- "isActive": "1",
- "isInsuranceRequiredForPayment": "0",
- "maxLineItemsOnPayment": "10",
- "isBillingSalesTaxEnabled": "0",
- "isQuickbooksExportEnabled": "1",
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2023-07-13 17:41:35",
- "dateTimeModified": "2026-03-10 16:52:59",
- "dateTimeDeactivated": null,
- "hasTaxIdentifier": 0
}
}
]Retrieves a single vendor contact by ID, including all stored attributes and any optionally requested related data via the includes parameter.
400 if the contact is not found or does not have contactTypeID matching Vendor.emails — array of email records for the vendorphones — array of phone records for the vendoraddresses — array of address records for the vendorportalAccounts — array of active vendor portal accounts linked to this contactportalInvitations — array of pending vendor portal invitationsvendorTrades — array of trade associations with nested vendorTrade objectscontactPersons — array of contact person records linked to the vendorreviewStats — review statistics (average rating, count) for the vendorinvoiceAutofillTemplate — the linked invoice autofill template object, or nullGET /vendors — list all vendorsGET /vendors/search — search vendors with filtersPOST /vendors — create a new vendorPOST /vendors/{contactID} — update a vendorDELETE /vendors/{contactID} — delete a vendorPOST /vendors/{contactID}/activate — activate a vendorPOST /vendors/{contactID}/deactivate — deactivate a vendor| contactID required | integer Example: 2888 The unique vendor contact ID |
| includes | string Example: includes=emails,phones,addresses,vendorTrades Comma-separated list of related data to include in the response. Available values: |
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) |
{- "contact": {
- "contactID": "2888",
- "contactTypeID": "3",
- "vendorTypeID": null,
- "code": "help",
- "name": "Acme Plumbing",
- "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": "1",
- "identificationTypeID": null,
- "identificationNumber": null,
- "identificationCountryID": null,
- "identificationIssuingLocation": null,
- "identificationExpirationDate": null,
- "payoutTypeID": "2",
- "otherPayoutTypeID": null,
- "achDetailsCiphertextID": null,
- "achAccountNumberTruncated": null,
- "achAccountTypeID": null,
- "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-11-12 21:41:35",
- "dateTimeModified": "2025-03-27 15:12:01",
- "dateTimeDeactivated": null,
- "contactType": "Vendor",
- "hasTaxIdentifier": 0
}
}Updates editable fields on an existing vendor contact and returns the full vendor detail (same shape as GET /vendors/{contactID}).
Update Vendor Details permission.400 if the contact is not found or is not a vendor.isBillApprovalExempt requires the Update Bill Approval Exemption permission to take effect.includes query params to include related data in the response.GET /vendors/{contactID} — retrieve current vendor detail| contactID required | integer Example: 5263 The unique vendor contact ID |
| includes | string Example: includes=vendorTrades Comma-separated list of related data to include in the response. Available values: |
| 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) |
required | object (contact) |
{- "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
}{- "contact": {
- "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",
- "hasTaxIdentifier": 0
}
}Permanently deletes a vendor contact. Returns the deleted contact as a flat object.
Update Vendor Details permission.400 if the contact is not found or is not a vendor.POST /vendors/{contactID}/deactivate — soft-deactivate instead of permanently deletingGET /vendors/{contactID} — verify vendor state before deletion| contactID required | integer Example: 5263 The unique vendor contact ID to delete |
| contactID required | integer |
| contactTypeID required | integer (contact_types) Enum: 1 2 3 4 5 6
|
| name required | string |
| payoutTypeID required | integer (payout_types) Enum: 1 2 3 4
|
| 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
|
| 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 |
{- "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"
}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}).
Update Vendor Details permission.400 if the contact is not found or is not a vendor.isActive = 1 and clears dateTimeDeactivated on the contact record.includes query params to include related data.GET /vendors/{contactID} — retrieve vendor detailsPOST /vendors/{contactID}/deactivate — deactivate an active vendorPOST /vendors/{contactID} — update vendor fields| contactID required | integer Example: 2888 The unique vendor contact ID to activate |
| includes | string Example: includes=vendorTrades Comma-separated list of related data to include in the response. Available values: |
required | object |
{- "contact": {
- "contactID": "2888",
- "contactTypeID": "3",
- "vendorTypeID": null,
- "code": "help",
- "name": "Acme Plumbing",
- "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": "1",
- "identificationTypeID": null,
- "identificationNumber": null,
- "identificationCountryID": null,
- "identificationIssuingLocation": null,
- "identificationExpirationDate": null,
- "payoutTypeID": "2",
- "otherPayoutTypeID": null,
- "achDetailsCiphertextID": null,
- "achAccountNumberTruncated": null,
- "achAccountTypeID": null,
- "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-11-12 21:41:35",
- "dateTimeModified": "2026-04-24 19:25:39",
- "dateTimeDeactivated": null,
- "contactType": "Vendor",
- "hasTaxIdentifier": 0
}
}Sets a vendor's isActive flag to 0, soft-deactivating them. Returns the updated vendor detail (same shape as GET /vendors/{contactID}).
Update Vendor Details permission.400 if the contact is not found or is not a vendor.includes query params to include related data.GET /vendors/{contactID} — retrieve vendor detailsPOST /vendors/{contactID}/activate — re-activate a deactivated vendorDELETE /vendors/{contactID} — permanently delete a vendor| contactID required | integer Example: 2888 The unique vendor contact ID to deactivate |
| includes | string Example: includes=vendorTrades Comma-separated list of related data to include in the response. Available values: |
required | object |
{- "contact": {
- "contactID": "2888",
- "contactTypeID": "3",
- "vendorTypeID": null,
- "code": "help",
- "name": "Acme Plumbing",
- "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": "1",
- "identificationTypeID": null,
- "identificationNumber": null,
- "identificationCountryID": null,
- "identificationIssuingLocation": null,
- "identificationExpirationDate": null,
- "payoutTypeID": "2",
- "otherPayoutTypeID": null,
- "achDetailsCiphertextID": null,
- "achAccountNumberTruncated": null,
- "achAccountTypeID": null,
- "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": "0",
- "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-11-12 21:41:35",
- "dateTimeModified": "2026-04-24 19:25:39",
- "dateTimeDeactivated": "2026-04-24 19:25:39",
- "contactType": "Vendor",
- "hasTaxIdentifier": 0
}
}Returns a list of association contacts visible to the authenticated account.
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 filtersGET /associations/{contactID} — retrieve a single association with full detail and includesPOST /associations — create a new association| 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 |
| 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 |
| 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 |
required | object |
[- {
- "contact": {
- "contactID": "1281",
- "contactTypeID": "5",
- "vendorTypeID": null,
- "code": null,
- "name": "Sunset Heights HOA",
- "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"
}
}
]Creates a new association contact and returns the full association detail
(same shape as GET /associations/{contactID}).
Update Association Details permission.name is the only required field.taxPayerName, taxIdentifier, taxFormTypeID) require the ManageTaxInfo permission.routingNumber, accountNumber) are stored encrypted; only the last 4 digits of the account number are returned.GET /associations/{contactID} — retrieve a created associationPOST /associations/{contactID} — update association fields after creation| 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 |
required | object (contact) |
{- "name": "New Association"
}{- "contact": {
- "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": "2026-04-24 19:26:47",
- "dateTimeModified": "2026-04-24 19:26:47",
- "dateTimeDeactivated": null,
- "contactType": "Association",
- "hasTaxIdentifier": 0
}
}Advanced paginated search for association contacts.
isActive when omitted returns all associations regardless of status.GET /associations — basic paginated list with name search onlyGET /associations/{contactID} — full association detail with all includes| 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 |
| 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 Available values: |
| 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 |
required | object Association contact with all fields |
[- {
- "contact": {
- "contactID": "1281",
- "contactTypeID": "5",
- "name": "Sunset Heights HOA",
- "code": null,
- "email": null,
- "phone": null,
- "address": null,
- "address2": null,
- "city": null,
- "stateID": null,
- "postalCode": null,
- "countryID": null,
- "defaultBillChargeAccountID": null,
- "payeeName": null,
- "taxPayerName": null,
- "taxFormTypeID": null,
- "payoutTypeID": "2",
- "achDetailsCiphertextID": null,
- "achAccountNumberTruncated": null,
- "achAccountTypeID": "2",
- "holdPayments": "0",
- "websiteUrl": null,
- "isActive": "1",
- "isBillingSalesTaxEnabled": "0",
- "isQuickbooksExportEnabled": "0",
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2024-01-04 15:45:47",
- "dateTimeModified": "2024-01-04 15:45:47",
- "dateTimeDeactivated": null,
- "hasTaxIdentifier": 0
}
}
]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).
400 if the contact is not found or does not have contactTypeID matching Association.emails — array of email records for the associationphones — array of phone records for the associationaddresses — array of address records for the associationproperties — array of property associations linked to this contact (with nested property object)contactPersons — array of contact person records linked to the associationinvoiceAutofillTemplate — the linked invoice autofill template object, or nullGET /associations — list all associationsGET /associations/search — search associations with filtersPOST /associations — create a new associationPOST /associations/{contactID} — update an associationDELETE /associations/{contactID} — delete an associationPOST /associations/{contactID}/activate — activate an associationPOST /associations/{contactID}/deactivate — deactivate an association| contactID required | integer Example: 2305 The unique association contact ID |
| includes | string Example: includes=emails,phones,addresses,properties Comma-separated list of related data to include in the response. Available values: |
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) |
{- "contact": {
- "contactID": "2305",
- "contactTypeID": "5",
- "vendorTypeID": null,
- "code": null,
- "name": "Sunset Heights HOA",
- "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",
- "hasTaxIdentifier": 0
}
}Updates editable fields on an existing association contact and returns the full association
detail (same shape as GET /associations/{contactID}).
Update Association Details permission.400 if the contact is not found or is not an association.isBillApprovalExempt requires the Update Bill Approval Exemption permission to take effect.includes query params to include related data in the response.GET /associations/{contactID} — retrieve current association detail| contactID required | integer Example: 2305 The unique association contact ID |
| includes | string Example: includes=emails,properties Comma-separated list of related data to include in the response. Available values: |
| 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) |
required | object (contact) |
{- "name": "Sunset Heights HOA Updated",
- "code": null,
- "defaultBillChargeAccountID": null,
- "discountPercent": null,
- "discountGraceDays": null,
- "isBillingSalesTaxEnabled": "0",
- "invoiceAutofillTemplateID": null
}{- "contact": {
- "contactID": "2305",
- "contactTypeID": "5",
- "vendorTypeID": null,
- "code": null,
- "name": "Sunset Heights HOA Updated",
- "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,
- "applicantID": null,
- "ownerPortalNameOverride": null,
- "isBillApprovalExempt": "0",
- "isBillingSalesTaxEnabled": "0",
- "isQuickbooksExportEnabled": "0",
- "quickbooksCustomerName": null,
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2024-01-04 15:45:47",
- "dateTimeModified": "2026-04-24 19:28:00",
- "dateTimeDeactivated": null,
- "contactType": "Association",
- "hasTaxIdentifier": 0
}
}Permanently deletes an association contact. Returns the deleted contact as a flat object.
Update Association Details permission.400 if the contact is not found or is not an association.400 if contactID is not provided in the path.POST /associations/{contactID}/deactivate — soft-deactivate instead of permanently deletingGET /associations/{contactID} — verify association state before deletion| contactID required | integer Example: 2305 The unique association contact ID to delete |
| contactID required | integer |
| contactTypeID required | integer (contact_types) Enum: 1 2 3 4 5 6
|
| name required | string |
| payoutTypeID required | integer (payout_types) Enum: 1 2 3 4
|
| 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
|
| 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 |
{- "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"
}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}).
Update Association Details permission.400 if the contact is not found or is not an association.isActive = 1includes query params to include related data.GET /associations/{contactID} — retrieve association detailsPOST /associations/{contactID}/deactivate — deactivate an active associationPOST /associations/{contactID} — update association fields| contactID required | integer Example: 2305 The unique association contact ID to activate |
| includes | string Example: includes=emails,properties Comma-separated list of related data to include in the response. Available values: |
required | object |
{- "contact": {
- "contactID": "2305",
- "contactTypeID": "5",
- "vendorTypeID": null,
- "code": null,
- "name": "Sunset Heights HOA",
- "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": "2026-04-24 19:25:39",
- "dateTimeDeactivated": null,
- "contactType": "Association",
- "hasTaxIdentifier": 0
}
}Sets an association's isActive flag to 0, soft-deactivating it. Returns the updated
association detail (same shape as GET /associations/{contactID}).
Update Association Details permission.400 if the contact is not found or is not an association.includes query params to include related data.GET /associations/{contactID} — retrieve association detailsPOST /associations/{contactID}/activate — re-activate a deactivated associationDELETE /associations/{contactID} — permanently delete an association| contactID required | integer Example: 2305 The unique association contact ID to deactivate |
| includes | string Example: includes=emails,properties Comma-separated list of related data to include in the response. Available values: |
required | object |
{- "contact": {
- "contactID": "2305",
- "contactTypeID": "5",
- "vendorTypeID": null,
- "code": null,
- "name": "Sunset Heights HOA",
- "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": "0",
- "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": "2026-04-24 19:25:39",
- "dateTimeDeactivated": "2026-04-24 19:25:39",
- "contactType": "Association",
- "hasTaxIdentifier": 0
}
}Returns a paginated list of maintenance technician contacts visible to the authenticated account.
isActive filterisActive defaults to 1 (active technicians only). Pass isActive=0 for inactive technicians.search matches against technician name and code.contactTypeID = 8 (Internal Technician).GET /maintenance-technicians/search — advanced filtered searchGET /maintenance-technicians/{contactID} — retrieve a single technician with full detail and includesPOST /maintenance-technicians — create a new maintenance technician| 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 |
| contactIDs | Array of integers Example: contactIDs=4808&contactIDs=5021 Filter to a specific set of contact IDs (comma-separated or array) |
| 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 |
required | object |
[- {
- "contact": {
- "contactID": "4808",
- "contactTypeID": "8",
- "vendorTypeID": null,
- "code": "6526",
- "name": "Adrian Soler",
- "firstName": null,
- "middleName": null,
- "lastName": null,
- "suffix": null,
- "email": "test@main.com",
- "phone": "+14436420608",
- "countryID": "US",
- "address": "3140 Seasons Wa",
- "address2": "Unit 503",
- "city": "Estero",
- "stateID": "AK",
- "postalCode": "33928",
- "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",
- "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": "2025-12-11 15:25:54",
- "dateTimeModified": "2026-01-06 19:35:29",
- "dateTimeDeactivated": null,
- "contactType": "Internal Technician"
}
}
]Creates a new maintenance technician contact and returns the full technician detail (same shape as GET /maintenance-technicians/{contactID}).
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.GET /maintenance-technicians/{contactID} — retrieve the created technicianPOST /maintenance-technicians/{contactID} — update technician fields after creation| 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 |
required | object (contact) |
{- "name": "New Tech Name"
}{- "contact": {
- "contactID": "5267",
- "contactTypeID": "8",
- "vendorTypeID": null,
- "code": null,
- "name": "new tech 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 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:15:55",
- "dateTimeDeactivated": null,
- "contactType": "Internal Technician",
- "hasTaxIdentifier": 0
}
}Advanced paginated search for maintenance technician contacts
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 onlyGET /maintenance-technicians/{contactID} — full technician detail with all includes| 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 |
| 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 Available values: |
| 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 |
required | object Maintenance technician contact with all fields plus computed data |
[- {
- "contact": {
- "contactID": "4808",
- "contactTypeID": "8",
- "name": "Adrian Soler",
- "code": "6526",
- "email": "test@main.com",
- "phone": "+14436420608",
- "address": "3140 Seasons Wa",
- "address2": "Unit 503",
- "city": "Estero",
- "stateID": "AK",
- "postalCode": "33928",
- "countryID": "US",
- "defaultBillChargeAccountID": null,
- "payeeName": null,
- "taxPayerName": null,
- "taxFormTypeID": null,
- "payoutTypeID": "2",
- "achDetailsCiphertextID": null,
- "achAccountNumberTruncated": null,
- "achAccountTypeID": null,
- "holdPayments": "0",
- "discountPercent": null,
- "discountGraceDays": null,
- "isActive": "1",
- "isInsuranceRequiredForPayment": null,
- "maxLineItemsOnPayment": null,
- "isBillingSalesTaxEnabled": "0",
- "isQuickbooksExportEnabled": "0",
- "invoiceAutofillTemplateID": null,
- "dateTimeCreated": "2025-12-11 15:25:54",
- "dateTimeModified": "2026-01-06 19:35:29",
- "dateTimeDeactivated": null,
- "hasTaxIdentifier": 0
}
}
]Retrieves a single maintenance technician contact by ID, including all stored attributes and any optionally requested related data via the includes parameter.
400 if the contact is not found or does not have contactTypeID = 8 (Internal Technician).emails — array of email records for the technicianphones — array of phone records for the technicianaddresses — array of address records for the technicianportalAccounts — array of active maintenance portal accounts linked to this contactportalInvitations — array of pending maintenance portal invitationsvendorTrades — array of trade associations with nested vendorTrade objectscontactPersons — array of contact person records linked to the technicianreviewStats — review statistics (average rating, count) for the technicianinvoiceAutofillTemplate — the linked invoice autofill template object, or nullGET /maintenance-technicians — list all maintenance techniciansGET /maintenance-technicians/search — search with filtersPOST /maintenance-technicians — create a new technicianPOST /maintenance-technicians/{contactID} — update a technicianDELETE /maintenance-technicians/{contactID} — delete a technicianPOST /maintenance-technicians/{contactID}/activate — activate a technicianPOST /maintenance-technicians/{contactID}/deactivate — deactivate a technician| contactID required | integer Example: 4808 The unique maintenance technician contact ID |
| includes | string Example: includes=emails,phones,addresses Comma-separated list of related data to include in the response. Available values: |
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) |
{- "contact": {
- "contactID": "4808",
- "contactTypeID": "8",
- "vendorTypeID": null,
- "code": "6526",
- "name": "Adrian Soler",
- "firstName": null,
- "middleName": null,
- "lastName": null,
- "suffix": null,
- "email": "test@main.com",
- "phone": "+14436420608",
- "countryID": "US",
- "address": "3140 Seasons Wa",
- "address2": "Unit 503",
- "city": "Estero",
- "stateID": "AK",
- "postalCode": "33928",
- "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",
- "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": "2025-12-11 15:25:54",
- "dateTimeModified": "2026-01-06 19:35:29",
- "dateTimeDeactivated": null,
- "contactType": "Internal Technician",
- "hasTaxIdentifier": 0
}
}Updates editable fields on an existing maintenance technician contact and returns the full technician detail (same shape as GET /maintenance-technicians/{contactID}).
Update Internal Technician Details permission.400 if the contact is not found or is not a maintenance technician.name, code, and birthDate are writable via this endpoint. All other fields in the request body are silently ignored.includes query params to include related data in the response.GET /maintenance-technicians/{contactID} — retrieve current technician detail| contactID required | integer Example: 5267 The unique maintenance technician contact ID |
| includes | string Example: includes=emails,phones Comma-separated list of related data to include in the response. Available values: |
| 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 |
required | object (contact) |
{- "name": "new tech names",
- "code": null,
- "birthDate": null
}{- "contact": {
- "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",
- "hasTaxIdentifier": 0
}
}Permanently deletes a maintenance technician contact. Returns the deleted contact as a flat object.
Update Maintenance Technician permission.400 if the contact is not found or is not a maintenance technician.POST /maintenance-technicians/{contactID}/deactivate — soft-deactivate instead of permanently deletingGET /maintenance-technicians/{contactID} — verify technician state before deletion| contactID required | integer Example: 5267 The unique maintenance technician contact ID to delete |
| contactID required | integer |
| contactTypeID required | integer (contact_types) Enum: 1 2 3 4 5 6
|
| name required | string |
| payoutTypeID required | integer (payout_types) Enum: 1 2 3 4
|
| 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
|
| 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 |
{- "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"
}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}).
Update Internal Technician Details permission.400 if the contact is not found or is not a maintenance technician.isActive = 1 includes query params to include related data.GET /maintenance-technicians/{contactID} — retrieve technician detailsPOST /maintenance-technicians/{contactID}/deactivate — deactivate an active technicianPOST /maintenance-technicians/{contactID} — update technician fields| contactID required | integer Example: 5267 The unique maintenance technician contact ID to activate |
| includes | string Example: includes=emails,phones Comma-separated list of related data to include in the response. Available values: |
required | object |
{- "contact": {
- "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:25:00",
- "dateTimeDeactivated": null,
- "contactType": "Internal Technician",
- "hasTaxIdentifier": 0
}
}Sets a maintenance technician's isActive flag to 0, soft-deactivating them. Returns the updated technician detail (same shape as GET /maintenance-technicians/{contactID}).
Update Internal Technician Details permission.400 if the contact is not found or is not a maintenance technician.includes query params to include related data.GET /maintenance-technicians/{contactID} — retrieve technician detailsPOST /maintenance-technicians/{contactID}/activate — re-activate a deactivated technicianDELETE /maintenance-technicians/{contactID} — permanently delete a technician| contactID required | integer Example: 5267 The unique maintenance technician contact ID to deactivate |
| includes | string Example: includes=emails,phones Comma-separated list of related data to include in the response. Available values: |
required | object |
{- "contact": {
- "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": "0",
- "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:30:00",
- "dateTimeDeactivated": "2026-04-24 22:30:00",
- "contactType": "Internal Technician",
- "hasTaxIdentifier": 0
}
}Uploading a file in Rentvine is generally a 2-step process.
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.
| objectID | integer The primary key of the object |
| objectTypeID | integer The id of the Object Type |
| includes | string Value: "attachment"
|
| file | string <binary> |
required | object (file) |
object (attachment) Included if |
{- "file": {
- "fileID": 0,
- "fileName": "string",
- "fileSize": 0,
- "fileSourceID": 1,
- "fileType": "string",
- "isAttachable": true,
- "isImage": true,
- "previewFileName": "string",
- "title": "string",
- "userID": 0
}, - "attachment": {
- "fileAttachmentID": 0,
- "fileID": 0,
- "isSharedWithOwner": true,
- "isSharedWithTenant": true,
- "isSharedWithVendor": true,
- "objectID": 0,
- "objectTypeID": 0,
- "pathID": 0,
- "portalTypeID": 0,
- "subObjectTypeID": 0
}
}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.
orderIndex ascendingprimaryLeaseStatusID 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 leaserequired | object |
[- {
- "leaseStatus": {
- "leaseStatusID": "2",
- "primaryLeaseStatusID": "2",
- "isSystemStatus": "1",
- "name": "Active",
- "isPendingMoveInStatus": "0",
- "isPendingMoveOutStatus": "0",
- "isCompletedMoveOutStatus": "0",
- "orderIndex": "0"
}
}, - {
- "leaseStatus": {
- "leaseStatusID": "1",
- "primaryLeaseStatusID": "1",
- "isSystemStatus": "1",
- "name": "Pending",
- "isPendingMoveInStatus": "1",
- "isPendingMoveOutStatus": "0",
- "isCompletedMoveOutStatus": "0",
- "orderIndex": "1"
}
}, - {
- "leaseStatus": {
- "leaseStatusID": "5",
- "primaryLeaseStatusID": "2",
- "isSystemStatus": "0",
- "name": "Active - Evicting",
- "isPendingMoveInStatus": "0",
- "isPendingMoveOutStatus": "1",
- "isCompletedMoveOutStatus": "0",
- "orderIndex": "4"
}
}, - {
- "leaseStatus": {
- "leaseStatusID": "6",
- "primaryLeaseStatusID": "3",
- "isSystemStatus": "1",
- "name": "Closed",
- "isPendingMoveInStatus": "0",
- "isPendingMoveOutStatus": "0",
- "isCompletedMoveOutStatus": "0",
- "orderIndex": "7"
}
}, - {
- "leaseStatus": {
- "leaseStatusID": "7",
- "primaryLeaseStatusID": "3",
- "isSystemStatus": "0",
- "name": "Closed - Moved Out",
- "isPendingMoveInStatus": "0",
- "isPendingMoveOutStatus": "0",
- "isCompletedMoveOutStatus": "1",
- "orderIndex": "8"
}
}
]Lists leases
object (lease) | |
object (unit) |
[- {
- "lease": {
- "leaseID": 0,
- "propertyID": 0,
- "unitID": 0,
- "primaryLeaseStatusID": 1,
- "leaseStatusID": 0,
- "moveOutStatusID": 1,
- "assignedToUserID": 0,
- "applicationID": 0,
- "leaseDocumentTransactionID": 0,
- "code": "string",
- "tenants": [
- "string"
], - "moveInDate": "2019-08-24",
- "startDate": "2019-08-24",
- "endDate": "2019-08-24",
- "tenantLiabilityInsuranceProviderID": 0,
- "tenantLiabilityInsuranceEffectiveDate": "2019-08-24",
- "rentersInsuranceCompany": "string",
- "rentersInsurancePolicyNumber": "string",
- "rentersInsuranceExpirationDate": "2019-08-24",
- "rentersInsuranceFileID": 0,
- "leaseFeeTransactionID": 0,
- "leaseFeeBillID": 0,
- "dateTimeCreated": "2019-08-24T14:15:22Z",
- "lateFeeSettingID": 0,
- "isPortalDisabled": 0,
- "isPortalPaymentDisabled": 0,
- "isLateFeesActive": 0,
- "allowedPaymentAmountTypeID": 0,
- "isAchDisabled": 0,
- "isCreditCardDisabled": 0,
- "closedDate": "2019-08-24",
- "closedDescription": "string",
- "noticeDate": "2019-08-24",
- "expectedMoveOutDate": "2019-08-24",
- "moveOutDate": "2019-08-24",
- "depositRefundDueDate": "2019-08-24",
- "leaseReturnChargeAmount": 0,
- "moveOutReasonID": 0,
- "moveOutUnitAvailabilityDate": "2019-08-24",
- "moveOutTenantRemarks": "string",
- "moveOutLeaseTenantID": 0,
- "isLeaseAgreementViolated": 0,
- "forwardingName": "string",
- "forwardingCountryID": "string",
- "forwardingAddress": "string",
- "forwardingAddress2": "string",
- "forwardingCity": "string",
- "forwardingStateID": "string",
- "forwardingPostalCode": "string",
- "forwardingEmail": "string",
- "forwardingPhone": "string",
- "moveOutTenantReason": "string",
- "tenantRefundPayoutTypeID": 1,
- "isFromImport": 0,
- "importSourceKey": "string",
- "isTenantPastDueNoticeEnabled": 0,
- "rentvineInsuranceEnrollmentID": 0,
- "rentvineInsuranceEnrollmentStatusID": 0,
- "rentvineInsurancePackageID": 0,
- "rentvineInsuranceRecurringChargeID": 0,
- "rentvineInsuranceChargeID": 0,
- "isCertifiedFundsRequired": 0,
- "isCashDisabled": 0,
- "statementSettingID": 0,
- "sendStatements": 0,
- "leaseActivationOptionID": 0,
- "increaseEligibilityDate": "2019-08-24",
- "dateTimeModified": "2019-08-24T14:15:22Z",
- "isAutoClosed": 0,
- "isPublicStatementEnabled": 0,
- "isMarkedToVacate": 0,
- "rentAmount": 1500
}, - "unit": {
- "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"
}
}
]Creates a new lease with all associated entities: tenants, recurring charges, move-in charges, occupants, pets, emergency contacts, and vehicles.
Update Lease permission in RolesunitID must exist and be activetenants array is requiredapplicationID is provided, the application must exist and be in a compatible statechargeLeaseFee is true, both leaseFeeAmount and leaseFeeDatePosted must be providedGET /leases/{leaseID} and returns the full lease detailGET /leases - List leasesGET /leases/{leaseID} - Get lease detail (same shape as the response here)PUT /leases/{leaseID} - Update leaserequired | 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 | |
Array of objects Co-signer applicants from the linked application. Only processed when | |
Array of objects Non-tenant occupants (minors, roommates, etc.) listed on the lease. | |
| processPetsFromApplication | boolean Default: true When |
Array of objects Pets on the lease. Only used when | |
| processEmergencyContactsFromApplication | boolean Default: true When |
Array of objects Emergency contacts for the tenant. Only used when | |
| processVehiclesFromApplication | boolean Default: true When |
Array of objects Vehicles registered to the lease. Only used when | |
| sendPortalInvitations | boolean Default: false When |
| deactivateListing | boolean Default: false When |
| chargeLeaseFee | boolean Default: false When |
| leaseFeeAmount | string Lease fee amount. Required when |
| leaseFeeDatePosted | string <date> Date to post the lease fee. Required when |
required | object |
{- "lease": {
- "unitID": "585",
- "startDate": "04/29/2026",
- "endDate": "2027-04-30",
- "moveInDate": "04/29/2026",
- "lateFeeSettingID": "87",
- "leaseReturnChargeAmount": "15.00",
- "assignedToUserID": "51",
- "rentersInsuranceCompany": null,
- "rentersInsurancePolicyNumber": null,
- "rentersInsuranceExpirationDate": null,
- "tenantLiabilityInsuranceEffectiveDate": "2026-04-29",
- "tenantLiabilityInsuranceProviderID": null,
- "tenantLiabilityInsuranceRentvinePackageID": null,
- "rvInsuranceEnabled": false,
- "leaseActivationOptionID": "1"
}, - "application": {
- "applicationStatusID": "6"
}, - "applicants": [ ],
- "tenants": [
- {
- "contactID": "1352"
}
], - "cosignerTenants": [ ],
- "cosignerApplicants": [ ],
- "occupants": [ ],
- "processEmergencyContactsFromApplication": false,
- "emergencyContacts": [ ],
- "processPetsFromApplication": false,
- "pets": [ ],
- "processVehiclesFromApplication": false,
- "vehicles": [ ],
- "recurringCharges": [
- {
- "recurringChargeTempID": "recurring-rc_1776731117586_scxwgmuph",
- "accountID": "9",
- "amount": "1500.00",
- "startDate": "04/29/2026",
- "description": "Rent",
- "escalations": [ ],
- "nextChargeDate": "2026-06-01",
- "dayDue": 1,
- "frequency": 1,
- "isMoveInCharge": 1,
- "isForTLL": 0
}, - {
- "recurringChargeTempID": "recurring-rc_1776731117586_tn3v4xkmd",
- "accountID": "4",
- "amount": "100.00",
- "startDate": "04/29/2026",
- "description": "Open Credit",
- "escalations": [ ],
- "nextChargeDate": "2026-06-01",
- "dayDue": 1,
- "frequency": 1,
- "isMoveInCharge": 1,
- "isForTLL": 0
}, - {
- "recurringChargeTempID": "recurring-rc_1776731117586_t6dq0uo2h",
- "accountID": "16",
- "amount": "100.00",
- "startDate": "04/29/2026",
- "description": "Pet Rent",
- "escalations": [ ],
- "nextChargeDate": "2026-06-01",
- "dayDue": 1,
- "frequency": 1,
- "isMoveInCharge": 1,
- "isForTLL": 0
}, - {
- "recurringChargeTempID": "recurring-rc_1776731117586_u3cewsy1o",
- "accountID": "45",
- "amount": "30.00",
- "startDate": "04/29/2026",
- "description": "Resident Benefit Package",
- "escalations": [ ],
- "nextChargeDate": "2026-06-01",
- "dayDue": 1,
- "frequency": 1,
- "isMoveInCharge": 1,
- "isForTLL": 0
}
], - "otherRecurringCharges": [
- {
- "accountID": "117",
- "amount": "120.00",
- "startDate": "10/21/2026",
- "description": "Pet Rent",
- "dayDue": 21,
- "frequency": 1
}
], - "charges": [
- {
- "recurringChargeTempID": "security-deposit",
- "chargeAccountID": "2",
- "description": "Security Deposit",
- "datePosted": "2026-04-20",
- "isMoveInCharge": 1,
- "isProrated": false,
- "amount": "1500.00",
- "isForTLL": 0
}, - {
- "recurringChargeTempID": "default-movein-2",
- "chargeAccountID": "43",
- "description": "Move In Admin Fee",
- "datePosted": "04/29/2026",
- "isMoveInCharge": 1,
- "isProrated": false,
- "amount": "150.00",
- "isForTLL": 0
}, - {
- "recurringChargeTempID": "recurring-rc_1776731117586_t6dq0uo2h",
- "chargeAccountID": "16",
- "description": "Pet Rent",
- "datePosted": "2026-05-01",
- "isMoveInCharge": 0,
- "isProrated": true,
- "amount": "6.67",
- "isForTLL": 0
}, - {
- "recurringChargeTempID": "recurring-rc_1776731117586_u3cewsy1o",
- "chargeAccountID": "45",
- "description": "Resident Benefit Package",
- "datePosted": "2026-05-01",
- "isMoveInCharge": 0,
- "isProrated": true,
- "amount": "2.00",
- "isForTLL": 0
}
], - "sendPortalInvitations": false,
- "deactivateListing": false,
- "chargeLeaseFee": true,
- "leaseFeeAmount": "1500.00",
- "leaseFeeDatePosted": "04/29/2026"
}{- "lease": {
- "leaseID": "3002",
- "propertyID": "603",
- "unitID": "585",
- "primaryLeaseStatusID": "1",
- "leaseStatusID": "13",
- "moveOutStatusID": "1",
- "assignedToUserID": "51",
- "applicationID": null,
- "leaseDocumentTransactionID": null,
- "code": null,
- "tenants": [
- "Valencia , Arthur"
], - "moveInDate": "2026-04-29",
- "startDate": "2026-04-29",
- "endDate": "2027-04-30",
- "tenantLiabilityInsuranceProviderID": null,
- "tenantLiabilityInsuranceEffectiveDate": "2026-04-29",
- "rentersInsuranceCompany": null,
- "rentersInsurancePolicyNumber": null,
- "rentersInsuranceExpirationDate": null,
- "rentersInsuranceFileID": null,
- "leaseFeeTransactionID": null,
- "leaseFeeBillID": "15017",
- "dateTimeCreated": "2026-04-21 00:26:41",
- "dateTimeModified": "2026-04-21 00:26:41",
- "lateFeeSettingID": "87",
- "isPortalDisabled": "0",
- "isPortalPaymentDisabled": "0",
- "isCertifiedFundsRequired": "0",
- "isLateFeesActive": "1",
- "allowedPaymentAmountTypeID": null,
- "isAchDisabled": "0",
- "isCreditCardDisabled": "0",
- "isCashDisabled": "0",
- "closedDate": null,
- "closedDescription": null,
- "noticeDate": null,
- "expectedMoveOutDate": null,
- "moveOutDate": null,
- "depositRefundDueDate": null,
- "leaseReturnChargeAmount": "15.00",
- "moveOutReasonID": null,
- "moveOutUnitAvailabilityDate": null,
- "moveOutTenantRemarks": null,
- "moveOutLeaseTenantID": null,
- "isLeaseAgreementViolated": "0",
- "forwardingName": null,
- "forwardingCountryID": null,
- "forwardingAddress": null,
- "forwardingAddress2": null,
- "forwardingCity": null,
- "forwardingStateID": null,
- "forwardingPostalCode": null,
- "forwardingEmail": null,
- "forwardingPhone": null,
- "moveOutTenantReason": null,
- "tenantRefundPayoutTypeID": "1",
- "statementSettingID": null,
- "sendStatements": "1",
- "isFromImport": "0",
- "importSourceKey": null,
- "isTenantPastDueNoticeEnabled": "1",
- "rentvineInsuranceEnrollmentID": null,
- "rentvineInsuranceEnrollmentStatusID": null,
- "rentvineInsurancePackageID": null,
- "rentvineInsuranceRecurringChargeID": null,
- "rentvineInsuranceChargeID": null,
- "leaseActivationOptionID": "1",
- "increaseEligibilityDate": "2027-05-01",
- "isAutoClosed": "0",
- "isPublicStatementEnabled": "1",
- "isMarkedToVacate": "0",
- "rentAmount": 1600
}
}| leaseID required | integer Example: 2213 |
required | object (lease) |
{- "lease": {
- "leaseID": 0,
- "propertyID": 0,
- "unitID": 0,
- "primaryLeaseStatusID": 1,
- "leaseStatusID": 0,
- "moveOutStatusID": 1,
- "assignedToUserID": 0,
- "applicationID": 0,
- "leaseDocumentTransactionID": 0,
- "code": "string",
- "tenants": [
- "string"
], - "moveInDate": "2019-08-24",
- "startDate": "2019-08-24",
- "endDate": "2019-08-24",
- "tenantLiabilityInsuranceProviderID": 0,
- "tenantLiabilityInsuranceEffectiveDate": "2019-08-24",
- "rentersInsuranceCompany": "string",
- "rentersInsurancePolicyNumber": "string",
- "rentersInsuranceExpirationDate": "2019-08-24",
- "rentersInsuranceFileID": 0,
- "leaseFeeTransactionID": 0,
- "leaseFeeBillID": 0,
- "dateTimeCreated": "2019-08-24T14:15:22Z",
- "lateFeeSettingID": 0,
- "isPortalDisabled": 0,
- "isPortalPaymentDisabled": 0,
- "isLateFeesActive": 0,
- "allowedPaymentAmountTypeID": 0,
- "isAchDisabled": 0,
- "isCreditCardDisabled": 0,
- "closedDate": "2019-08-24",
- "closedDescription": "string",
- "noticeDate": "2019-08-24",
- "expectedMoveOutDate": "2019-08-24",
- "moveOutDate": "2019-08-24",
- "depositRefundDueDate": "2019-08-24",
- "leaseReturnChargeAmount": 0,
- "moveOutReasonID": 0,
- "moveOutUnitAvailabilityDate": "2019-08-24",
- "moveOutTenantRemarks": "string",
- "moveOutLeaseTenantID": 0,
- "isLeaseAgreementViolated": 0,
- "forwardingName": "string",
- "forwardingCountryID": "string",
- "forwardingAddress": "string",
- "forwardingAddress2": "string",
- "forwardingCity": "string",
- "forwardingStateID": "string",
- "forwardingPostalCode": "string",
- "forwardingEmail": "string",
- "forwardingPhone": "string",
- "moveOutTenantReason": "string",
- "tenantRefundPayoutTypeID": 1,
- "isFromImport": 0,
- "importSourceKey": "string",
- "isTenantPastDueNoticeEnabled": 0,
- "rentvineInsuranceEnrollmentID": 0,
- "rentvineInsuranceEnrollmentStatusID": 0,
- "rentvineInsurancePackageID": 0,
- "rentvineInsuranceRecurringChargeID": 0,
- "rentvineInsuranceChargeID": 0,
- "isCertifiedFundsRequired": 0,
- "isCashDisabled": 0,
- "statementSettingID": 0,
- "sendStatements": 0,
- "leaseActivationOptionID": 0,
- "increaseEligibilityDate": "2019-08-24",
- "dateTimeModified": "2019-08-24T14:15:22Z",
- "isAutoClosed": 0,
- "isPublicStatementEnabled": 0,
- "isMarkedToVacate": 0,
- "rentAmount": 1500
}
}Updates an existing lease's details. On success the endpoint internally forwards to GET /leases/{leaseID} and returns the full lease detail.
assignedToUserID)closedDate and closedDescription within the lease detailsUpdate Lease permission under the Leasing component400 is returned if not foundleaseStatusID is not updated by this endpoint; use POST /leases/{leaseID}/status to change statusGET /leases/{leaseID} - Get full lease detail (same response shape as returned here)POST /leases/{leaseID}/status - Update lease status onlyPOST /leases - Create a new lease| leaseID required | integer Example: 2213 |
| 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 |
| 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 | 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. |
required | object (lease) |
{- "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"
}{- "lease": {
- "leaseID": "2213",
- "propertyID": "406",
- "unitID": "391",
- "primaryLeaseStatusID": "2",
- "leaseStatusID": "21",
- "moveOutStatusID": "1",
- "assignedToUserID": "122188",
- "applicationID": null,
- "leaseDocumentTransactionID": null,
- "code": null,
- "tenants": [
- "John Tester",
- "Joe Michael"
], - "moveInDate": "2025-03-05",
- "startDate": "2026-04-17",
- "endDate": "2026-10-25",
- "tenantLiabilityInsuranceProviderID": null,
- "tenantLiabilityInsuranceEffectiveDate": null,
- "rentersInsuranceCompany": "rentersInsuranceCompany",
- "rentersInsurancePolicyNumber": "111222333-4",
- "rentersInsuranceExpirationDate": "2028-02-03",
- "rentersInsuranceFileID": null,
- "leaseFeeTransactionID": null,
- "leaseFeeBillID": null,
- "dateTimeCreated": "2025-03-06 17:04:46",
- "dateTimeModified": "2026-04-21 15:03:58",
- "lateFeeSettingID": "87",
- "isPortalDisabled": "0",
- "isPortalPaymentDisabled": "0",
- "isCertifiedFundsRequired": "0",
- "isLateFeesActive": "1",
- "allowedPaymentAmountTypeID": null,
- "isAchDisabled": "0",
- "isCreditCardDisabled": "1",
- "isCashDisabled": "0",
- "closedDate": null,
- "closedDescription": null,
- "noticeDate": "2025-03-21",
- "expectedMoveOutDate": "2025-08-05",
- "moveOutDate": "2025-08-05",
- "depositRefundDueDate": null,
- "leaseReturnChargeAmount": "35.00",
- "moveOutReasonID": "8",
- "moveOutUnitAvailabilityDate": null,
- "moveOutTenantRemarks": null,
- "moveOutLeaseTenantID": null,
- "isLeaseAgreementViolated": "0",
- "forwardingName": null,
- "forwardingCountryID": "US",
- "forwardingAddress": null,
- "forwardingAddress2": null,
- "forwardingCity": null,
- "forwardingStateID": "FL",
- "forwardingPostalCode": null,
- "forwardingEmail": null,
- "forwardingPhone": null,
- "moveOutTenantReason": null,
- "tenantRefundPayoutTypeID": "1",
- "statementSettingID": null,
- "sendStatements": "1",
- "isFromImport": "0",
- "importSourceKey": null,
- "isTenantPastDueNoticeEnabled": "0",
- "rentvineInsuranceEnrollmentID": null,
- "rentvineInsuranceEnrollmentStatusID": null,
- "rentvineInsurancePackageID": null,
- "rentvineInsuranceRecurringChargeID": null,
- "rentvineInsuranceChargeID": null,
- "leaseActivationOptionID": "3",
- "increaseEligibilityDate": "2028-03-05",
- "isAutoClosed": "0",
- "isPublicStatementEnabled": "1",
- "isMarkedToVacate": "0",
- "rentAmount": 100
}
}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.
Update Lease permission under the Leasing component400 is returned if not found400 is returned with "Cannot delete a lease that has accounting transactions" if any existGET /leases/{leaseID} - Get the lease detail before deletingPOST /leases/{leaseID}/status - Close or change lease status (for leases with transaction history)| leaseID required | integer Example: 2213 |
required | object (lease) |
{- "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"
}Updates the status of an existing lease. On success the endpoint internally forwards to GET /leases/{leaseID} and returns the full lease detail.
Update Lease permission under the Leasing component400 is returned if not foundleaseStatusID is the only required field; all other fields are optional and will be updated only when providedleaseStatusID 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| leaseID required | integer Example: 2213 |
| leaseStatusID required | integer ID of the custom lease status to assign. References the account-configured statuses from |
| 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). |
required | object (lease) |
{- "leaseStatusID": 2
}{- "lease": {
- "leaseID": 2213,
- "propertyID": 406,
- "unitID": 391,
- "primaryLeaseStatusID": 2,
- "leaseStatusID": 2,
- "moveOutStatusID": 1,
- "assignedToUserID": 122188,
- "applicationID": null,
- "leaseDocumentTransactionID": null,
- "code": "test",
- "tenants": [
- "John Tester",
- "Joe Michael"
], - "moveInDate": "2025-03-05",
- "startDate": "2026-04-17",
- "endDate": "2026-10-17",
- "tenantLiabilityInsuranceProviderID": null,
- "tenantLiabilityInsuranceEffectiveDate": null,
- "rentersInsuranceCompany": "rentersInsuranceCompany",
- "rentersInsurancePolicyNumber": "111222333-4",
- "rentersInsuranceExpirationDate": "2028-02-03",
- "rentersInsuranceFileID": null,
- "leaseFeeTransactionID": null,
- "leaseFeeBillID": null,
- "dateTimeCreated": "2025-03-06 17:04:46",
- "dateTimeModified": "2026-04-21 20:44:34",
- "lateFeeSettingID": 87,
- "isPortalDisabled": "0",
- "isPortalPaymentDisabled": "0",
- "isCertifiedFundsRequired": "0",
- "isLateFeesActive": "1",
- "allowedPaymentAmountTypeID": "1",
- "isAchDisabled": "0",
- "isCreditCardDisabled": "1",
- "isCashDisabled": "0",
- "closedDate": "2026-04-21",
- "closedDescription": "test 1",
- "noticeDate": "2025-03-21",
- "expectedMoveOutDate": "2025-08-05",
- "moveOutDate": "2025-08-05",
- "depositRefundDueDate": "2026-04-21",
- "leaseReturnChargeAmount": "35.00",
- "moveOutReasonID": 8,
- "moveOutUnitAvailabilityDate": null,
- "moveOutTenantRemarks": null,
- "moveOutLeaseTenantID": null,
- "isLeaseAgreementViolated": "0",
- "forwardingName": null,
- "forwardingCountryID": "US",
- "forwardingAddress": null,
- "forwardingAddress2": null,
- "forwardingCity": null,
- "forwardingStateID": "FL",
- "forwardingPostalCode": null,
- "forwardingEmail": null,
- "forwardingPhone": null,
- "moveOutTenantReason": null,
- "tenantRefundPayoutTypeID": "1",
- "statementSettingID": "1",
- "sendStatements": "1",
- "isFromImport": "0",
- "importSourceKey": null,
- "isTenantPastDueNoticeEnabled": "1",
- "rentvineInsuranceEnrollmentID": null,
- "rentvineInsuranceEnrollmentStatusID": null,
- "rentvineInsurancePackageID": null,
- "rentvineInsuranceRecurringChargeID": null,
- "rentvineInsuranceChargeID": null,
- "leaseActivationOptionID": "3",
- "increaseEligibilityDate": "2028-03-05",
- "isAutoClosed": "0",
- "isPublicStatementEnabled": "1",
- "isMarkedToVacate": "0",
- "rentAmount": 100
}
}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.
400 is returned otherwiseorderIndex, then by leaseTenantIDisActive is omitted, both active and inactive tenants are returnedPOST /leases/{leaseID}/tenants - Add a tenant to the leaseDELETE /leases/{leaseID}/tenants/{leaseTenantID} - Remove a tenant from the lease| leaseID required | integer Example: 2213 |
| isActive | integer Enum: 0 1 Example: isActive=1 Filter by active status. |
required | object |
required | object |
[- {
- "leaseTenant": {
- "leaseTenantID": "2375",
- "leaseID": "2213",
- "contactID": "338",
- "isPrimary": "1",
- "isCosigner": "0",
- "isActive": "1",
- "moveInDate": "2025-03-05",
- "moveOutDate": null,
- "leaseTenantCashCardID": null
}, - "contact": {
- "contactID": "338",
- "contactTypeID": "2",
- "name": "John Tester",
- "email": "john.tester@email.com",
- "phone": "+12398877354",
- "birthDate": null,
- "applicantID": null,
- "identificationTypeID": null,
- "identificationNumber": null,
- "identificationIssuingLocation": null,
- "identificationExpirationDate": null,
- "identificationCountryID": null,
- "taxIdentifierTruncated": null,
- "hasPortalAccess": 1,
- "hasPortalInvitation": 0,
- "invitationDateTimeCreated": null,
- "hasApplicantUser": 0
}
}, - {
- "leaseTenant": {
- "leaseTenantID": "3013",
- "leaseID": "2213",
- "contactID": "988",
- "isPrimary": "0",
- "isCosigner": "0",
- "isActive": "1",
- "moveInDate": "2025-10-08",
- "moveOutDate": null,
- "leaseTenantCashCardID": null
}, - "contact": {
- "contactID": "988",
- "contactTypeID": "2",
- "name": "Joe Michael",
- "email": "joe2@yahoo.com",
- "phone": null,
- "birthDate": "1990-03-05",
- "applicantID": "195",
- "identificationTypeID": null,
- "identificationNumber": null,
- "identificationIssuingLocation": null,
- "identificationExpirationDate": null,
- "identificationCountryID": null,
- "taxIdentifierTruncated": "4444",
- "hasPortalAccess": 0,
- "hasPortalInvitation": 0,
- "invitationDateTimeCreated": null,
- "hasApplicantUser": 0
}
}
]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.
Update Lease permission under the Leasing component400 is returned otherwiseClosed status (primaryLeaseStatusID = 3)contactID is omitted or empty, a new contact is created using name (required), plus optional emails, phones, and addressescontactID is provided, the existing contact is linked directly — name, emails, phones, and addresses are ignoredTenant (contactTypeID = 2) and must be active400moveInDate is requiredGET /leases/{leaseID}/tenants - List all tenants on the leaseGET /leases/{leaseID}/tenants/{leaseTenantID} - Get a single tenant (same response shape returned here)DELETE /leases/{leaseID}/tenants/{leaseTenantID} - Remove a tenant from the lease| leaseID required | integer Example: 2213 |
| moveInDate required | string <date> Date the tenant moves in. Required. |
| name required | string Full name of the new tenant contact. Required when |
| 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 |
Array of objects Email addresses to attach to the new tenant contact. Ignored when | |
Array of objects Phone numbers to attach to the new tenant contact. Ignored when | |
Array of objects Addresses to attach to the new tenant contact. Ignored when |
required | object The newly created lease tenant record. |
required | object The contact record for the tenant. |
{- "moveInDate": "2026-04-21",
- "isCosigner": 0,
- "name": "Testing Doc",
- "emails": [
- {
- "email": "testingdoc@email.com"
}
], - "phones": [
- {
- "phone": "+12399995555",
- "phoneTypeID": "1"
}
]
}{- "leaseTenant": {
- "leaseTenantID": "3389",
- "leaseID": "2213",
- "contactID": "5244",
- "isPrimary": "0",
- "isCosigner": "0",
- "isActive": "1",
- "moveInDate": "2026-04-21",
- "moveOutDate": null,
- "leaseTenantCashCardID": null
}, - "contact": {
- "contactID": "5244",
- "contactTypeID": "2",
- "name": "Testing Doc",
- "email": "testingdoc@email.com",
- "phone": "+12399995555",
- "birthDate": null,
- "applicantID": null,
- "identificationTypeID": null,
- "identificationNumber": null,
- "identificationIssuingLocation": null,
- "identificationExpirationDate": null,
- "identificationCountryID": null,
- "taxIdentifierTruncated": null
}
}Removes a tenant from a lease. On success, returns the deleted lease tenant record as it existed at time of deletion.
Update Lease permission under the Leasing component400 is returned otherwiseleaseTenantID must belong to the specified leaseID; a 400 is returned if the lease tenant is not found400 is returned if the lease has no active tenantsGET /leases/{leaseID}/tenants - List all tenants on the leaseGET /leases/{leaseID}/tenants/{leaseTenantID} - Get a single tenant detailPOST /leases/{leaseID}/tenants - Add a tenant to the lease| leaseID required | integer Example: 2213 |
| leaseTenantID required | integer Example: 3391 The |
| 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 ( |
| isCosigner required | string Whether this tenant was a co-signer ( |
| isActive required | string Active status at time of deletion ( |
| 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. |
{- "leaseTenantID": "3391",
- "leaseID": "2213",
- "contactID": "5246",
- "isPrimary": "0",
- "isCosigner": "0",
- "isActive": "1",
- "moveInDate": "2026-05-01",
- "moveOutDate": null,
- "orderIndex": "4"
}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.
400 is returned otherwiseaccount is always present in each list item — it cannot be excludedrecurringStatusID is not included in list items — use GET /leases/{leaseID}/recurring-charges/{chargeID} to get the computed status for a specific chargeGET /leases/{leaseID}/recurring-charges/{chargeID} - Get a single recurring charge with computed statusPOST /leases/{leaseID}/recurring-charges - Create a new recurring chargerequired | 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. |
[- {
- "recurringCharge": {
- "leaseRecurringChargeID": "11546",
- "leaseID": "2213",
- "rentIncreaseID": null,
- "accountID": "9",
- "amount": "100.00",
- "description": "Monthly Rent",
- "dayDue": "1",
- "frequency": "1",
- "startDate": "2026-01-01",
- "endDate": "2027-03-04",
- "nextChargeDate": "2026-05-01",
- "isMoveInCharge": "0",
- "isFromImport": "0",
- "importSourceKey": null
}, - "account": {
- "accountID": "9",
- "parentAccountID": null,
- "accountTypeID": "7",
- "accountCategoryID": "7",
- "number": "4000",
- "name": "Rent Income",
- "isActive": "1",
- "isSubjectToManagementFees": "1",
- "isSubjectToLateFees": "1",
- "isDeposit": "0",
- "depositTypeID": null,
- "isEscrow": "0",
- "isRent": "1",
- "isSubsidized": "0",
- "isTaxable": "1",
- "isSubjectToSalesTax": "0",
- "isSubjectToMarkup": "0",
- "isPrepayment": "0",
- "isManagementFee": "0",
- "isBudgetEnabled": "1",
- "isHeld": "0",
- "bankName": null,
- "bankAccountTypeID": null,
- "bankAccountCiphertextID": null,
- "bankAccountNumberTruncated": null,
- "bankAccountAddress": null,
- "bankAccountAddress2": null,
- "bankAccountCity": null,
- "bankAccountStateID": null,
- "bankAccountPostalCode": null,
- "bankAccountCountryID": null,
- "isCheckingEnabled": "0",
- "checkCompanyName": null,
- "checkSignatory": null,
- "checkAddress": null,
- "checkAddress2": null,
- "checkCity": null,
- "checkStateID": null,
- "checkPostalCode": null,
- "checkCountryID": null,
- "bankAccountNextCheckNumber": null,
- "bankAccountNextDepositNumber": null,
- "checkTemplateID": null,
- "creditCardGatewayID": null,
- "achGatewayID": null,
- "cashCardGatewayID": null,
- "remoteCheckGatewayID": null,
- "isFromImport": "1",
- "importSourceKey": "4100",
- "isNachaEnabled": "0",
- "isNachaFileBalanced": "0",
- "nachaOriginName": null,
- "nachaOriginNumber": null,
- "nachaDestinationName": null,
- "nachaDestinationNumber": null,
- "nachaCompanyIdentification": null,
- "nachaCompanyName": null,
- "nachaOriginatingFinancialInstitutionID": null,
- "nachaAdapterID": null,
- "isBillApprovalExempt": "0",
- "exportInvoiceServiceName": null,
- "dateTimeCreated": "2023-01-14 18:39:10",
- "dateTimeModified": "2026-02-19 16:14:12",
- "dateTimeDeactivated": null
}
}, - {
- "recurringCharge": {
- "leaseRecurringChargeID": "11547",
- "leaseID": "2213",
- "rentIncreaseID": null,
- "accountID": "122",
- "amount": "10.00",
- "description": "RBP Fee",
- "dayDue": "1",
- "frequency": "1",
- "startDate": "2026-01-01",
- "endDate": null,
- "nextChargeDate": "2026-05-01",
- "isMoveInCharge": "0",
- "isFromImport": "0",
- "importSourceKey": null
}, - "account": {
- "accountID": "122",
- "parentAccountID": null,
- "accountTypeID": "7",
- "accountCategoryID": null,
- "number": "4800",
- "name": "RBP Income",
- "isActive": "1",
- "isSubjectToManagementFees": "0",
- "isSubjectToLateFees": "0",
- "isDeposit": "0",
- "depositTypeID": null,
- "isEscrow": "0",
- "isRent": "0",
- "isSubsidized": "0",
- "isTaxable": "1",
- "isSubjectToSalesTax": "0",
- "isSubjectToMarkup": "1",
- "isPrepayment": "0",
- "isManagementFee": "0",
- "isBudgetEnabled": "0",
- "isHeld": "0",
- "bankName": null,
- "bankAccountTypeID": null,
- "bankAccountCiphertextID": null,
- "bankAccountNumberTruncated": null,
- "bankAccountAddress": null,
- "bankAccountAddress2": null,
- "bankAccountCity": null,
- "bankAccountStateID": null,
- "bankAccountPostalCode": null,
- "bankAccountCountryID": null,
- "isCheckingEnabled": "0",
- "checkCompanyName": null,
- "checkSignatory": null,
- "checkAddress": null,
- "checkAddress2": null,
- "checkCity": null,
- "checkStateID": null,
- "checkPostalCode": null,
- "checkCountryID": null,
- "bankAccountNextCheckNumber": null,
- "bankAccountNextDepositNumber": null,
- "checkTemplateID": null,
- "creditCardGatewayID": null,
- "achGatewayID": null,
- "cashCardGatewayID": null,
- "remoteCheckGatewayID": null,
- "isFromImport": "0",
- "importSourceKey": null,
- "isNachaEnabled": "0",
- "isNachaFileBalanced": "0",
- "nachaOriginName": null,
- "nachaOriginNumber": null,
- "nachaDestinationName": null,
- "nachaDestinationNumber": null,
- "nachaCompanyIdentification": null,
- "nachaCompanyName": null,
- "nachaOriginatingFinancialInstitutionID": null,
- "nachaAdapterID": null,
- "isBillApprovalExempt": "0",
- "exportInvoiceServiceName": null,
- "dateTimeCreated": "2024-02-22 19:10:02",
- "dateTimeModified": "2024-02-22 19:10:02",
- "dateTimeDeactivated": null
}
}
]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.
Update Lease permission under the Leasing component400 is returned otherwiseaccountID must reference a valid chart-of-account entry of a charge typestartDate is the date the charge appears on reports such as the Rent Roll; accepted as MM/DD/YYYYdayDue is the day of the month (1–31) on which recurring charge transactions are generatedfrequency 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 StatusGET /leases/{leaseID}/recurring-charges - List all recurring charges for the leaseGET /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 chargeDELETE /leases/{leaseID}/recurring-charges/{chargeID} - Delete a recurring charge| leaseID required | integer Example: 2213 |
| 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 |
| 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 |
| endDate | string or null Date the charge stops being generated. Accepted format is |
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 |
{- "dayDue": 1,
- "frequency": 1,
- "accountID": "16",
- "amount": "1500.00",
- "description": "Monthly Rent",
- "startDate": "04/20/2027",
- "endDate": "04/12/2028"
}{- "recurringCharge": {
- "leaseRecurringChargeID": "12012",
- "leaseID": "2213",
- "rentIncreaseID": null,
- "accountID": "16",
- "amount": "100.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,
- "recurringStatusID": 2
}, - "previousCharge": {
- "leaseRecurringChargeID": "11950",
- "leaseID": "2213",
- "rentIncreaseID": null,
- "accountID": "9",
- "amount": "200.00",
- "description": "Base Rent",
- "dayDue": "1",
- "frequency": "1",
- "startDate": "2027-03-05",
- "endDate": null,
- "nextChargeDate": "2027-04-01",
- "isMoveInCharge": "0",
- "isFromImport": "0",
- "importSourceKey": null
}
}Returns a single recurring charge with its computed recurringStatusID and the previous charge on the lease (if one exists).
400 is returned otherwise400 is returnedaccount is only included when includes=account is passedGET /leases/{leaseID}/recurring-charges - List all recurring charges for the leasePOST /leases/{leaseID}/recurring-charges/{chargeID} - Update this recurring chargeDELETE /leases/{leaseID}/recurring-charges/{chargeID} - Delete this recurring charge| leaseID required | integer Example: 2213 |
| chargeID required | integer Example: 11546 The |
| includes | string Example: includes=account Comma-separated list of related data to include in the response.
|
required | object |
required | object or null The previous recurring charge on this lease (highest |
object (account-2) The chart-of-accounts entry for this charge (if |
{- "recurringCharge": {
- "leaseRecurringChargeID": "11546",
- "leaseID": "2213",
- "rentIncreaseID": null,
- "accountID": "9",
- "amount": "100.00",
- "description": "Monthly Rent",
- "dayDue": "1",
- "frequency": "1",
- "startDate": "2026-01-01",
- "endDate": "2027-03-04",
- "nextChargeDate": "2026-05-01",
- "isMoveInCharge": "0",
- "isFromImport": "0",
- "importSourceKey": null,
- "recurringStatusID": 1
}, - "previousCharge": null
}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.
Update Lease permission under the Leasing component400 is returned if either is not foundnull; omit a field to leave it unchangedstartDate and endDate are accepted as MM/DD/YYYY in the requestPOST /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 leaseDELETE /leases/{leaseID}/recurring-charges/{chargeID} - Delete this recurring charge| leaseID required | integer Example: 2213 |
| chargeID required | integer Example: 12012 The |
| 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 |
| startDate | string Date the charge begins appearing on reports such as the Rent Roll. Accepted format is |
| endDate | string Date the charge stops being generated. Accepted format is |
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 |
{- "amount": "120.00"
}{- "recurringCharge": {
- "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,
- "recurringStatusID": 2
}, - "previousCharge": {
- "leaseRecurringChargeID": "11950",
- "leaseID": "2213",
- "rentIncreaseID": null,
- "accountID": "9",
- "amount": "200.00",
- "description": "Base Rent",
- "dayDue": "1",
- "frequency": "1",
- "startDate": "2027-03-05",
- "endDate": null,
- "nextChargeDate": "2027-04-01",
- "isMoveInCharge": "0",
- "isFromImport": "0",
- "importSourceKey": null
}
}Permanently deletes a recurring charge from a lease. On success, returns the deleted recurring charge record as it existed at time of deletion.
Update Lease permission under the Leasing component400 is returned if not foundPOST /leases/{leaseID}/recurring-charges/{chargeID} to set an endDate instead if you want to stop future postings while preserving historyGET /leases/{leaseID}/recurring-charges/{chargeID} - Get the charge detail before deletingGET /leases/{leaseID}/recurring-charges - List all recurring charges for the leasePOST /leases/{leaseID}/recurring-charges/{chargeID} - Update the charge (e.g. set an end date)| leaseID required | integer Example: 2213 |
| chargeID required | integer Example: 12012 The |
| 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 ( |
| isFromImport required | string Whether this charge was created via import ( |
| 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. |
{- "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
}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}).
workOrderTemplateIDpropertyID is required; unitID and leaseID are optionaltechnicianContactIDs assigns one or more technician contacts to the work ordersendVendorNotification is true and a vendor is assigned, a notification email is dispatchedworkOrderTemplateID pre-populates fields from an existing template when suppliedMM/DD/YYYY or ISO 8601 YYYY-MM-DD formatGET /maintenance/work-orders/{workOrderID} - Get the created work orderGET /maintenance/work-orders - List all work ordersPOST /maintenance/work-orders/{workOrderID} - Update a work order| propertyID required | string Property the work order is attached to |
| workOrderStatusID required | string Initial status ID for the work order |
| priorityID required | string
|
| 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
|
| 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
|
| 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. |
| scheduledStartDate | string or null Scheduled start date ( |
| scheduledEndDate | string or null Scheduled end date ( |
| actualStartDate | string or null <date> |
| actualEndDate | string or null <date> |
| dateDue | string or null Due date ( |
| 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
|
| 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
|
| 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) |
required | object (work_order) |
| schedulingStatusID required | integer or null |
{- "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": [
- "5150"
], - "sendVendorNotification": true,
- "vendorAccessTypeID": "1",
- "attachments": [ ],
- "issueImages": [ ]
}{- "workOrder": {
- "workOrderID": "5960",
- "workOrderNumber": "105787",
- "workOrderProjectID": "156",
- "recurringWorkOrderID": null,
- "isInternal": "1",
- "propertyID": "172",
- "unitID": null,
- "leaseID": null,
- "vendorContactID": "5150",
- "primaryWorkOrderStatusID": "2",
- "workOrderStatusID": "1",
- "vendorWorkOrderStatusID": "1",
- "portalVendorWorkOrderStatusID": "1",
- "vendorWorkOrderStatusUpdated": null,
- "priorityID": "1",
- "sourceTypeID": null,
- "isOwnerApproved": "1",
- "isVacant": "1",
- "description": "Clean carpet",
- "diagnosticSummary": null,
- "aiSessionID": null,
- "isResolvedByRequestor": "0",
- "vendorInstructions": "<p>Instructions</p>",
- "dateClosed": null,
- "closingDescription": null,
- "isSharedWithTenant": "1",
- "isSharedWithOwner": "1",
- "isNew": "1",
- "createdByUserID": "1",
- "closedByUserID": null,
- "cancelledByUserID": null,
- "dateTimeCreated": "2026-04-26 10:00:00",
- "modifiedByUserID": "501195",
- "dateTimeModified": "2026-04-26 10:00:01",
- "inspectionID": null,
- "incidentLocation": null,
- "appointmentWindowStartDateTime": null,
- "appointmentWindowEndDateTime": null,
- "isTenantPresenceRequired": "0",
- "rejectedByVendorContactID": null,
- "vendorRejectReason": null,
- "vendorClosingComments": null,
- "orderIndex": "0",
- "dateDue": "2026-04-30",
- "reviewID": null,
- "vendorAccessTypeID": "3",
- "residentProvidedEntryInstructions": null,
- "entryInstructions": null,
- "isTenantFinanciallyResponsible": "0",
- "portfolioID": "85",
- "vendorTradeID": "5",
- "assignedToUserID": "501195",
- "requestedByContactID": null,
- "estimatedAmount": "12.00",
- "scheduledStartDate": "2026-04-26",
- "actualStartDate": null,
- "scheduledEndDate": "2026-04-28",
- "actualEndDate": null,
- "daysOverdue": 0,
- "isOverdue": 0,
- "technicianContactIDs": [
- 5150
], - "technicianData": [
- {
- "technicianID": 5150,
- "name": "ABC Plumbing",
- "phone": "+15551234567",
- "contactTypeID": 3,
- "appointmentWindowStartDateTime": null,
- "appointmentWindowEndDateTime": null
}
]
}, - "schedulingStatusID": 1
}Retrieve a paginated list of work orders with their assigned vendor contact. Supports filtering by property, unit, status, vendor, date range, and more.
GET /maintenance/work-orders/{workOrderID} - Get full work order details with includesPOST /maintenance/work-orders - Create a work orderGET /maintenance/work-order/statuses - Get available work order statuses| 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 ( |
| 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 ( |
| endDate | string <date> Example: endDate=2024-12-31 Filter work orders created on or before this date ( |
| leaseID | integer Example: leaseID=1500 Filter by associated lease ID |
| isNew | integer Enum: 0 1 Example: isNew=1 Filter to only unacknowledged ( |
| 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 |
required | object (work_order) |
required | object or null (contact) Vendor contact assigned to the work order. All fields are |
[- {
- "workOrder": {
- "workOrderID": 5954,
- "workOrderNumber": "105781",
- "workOrderProjectID": null,
- "recurringWorkOrderID": null,
- "isInternal": "1",
- "propertyID": "630",
- "unitID": "607",
- "leaseID": null,
- "vendorContactID": null,
- "primaryWorkOrderStatusID": "2",
- "workOrderStatusID": "1",
- "vendorWorkOrderStatusID": "1",
- "portalVendorWorkOrderStatusID": "1",
- "vendorWorkOrderStatusUpdated": "2026-04-23 13:41:59",
- "priorityID": "2",
- "sourceTypeID": null,
- "isOwnerApproved": "0",
- "isVacant": "1",
- "description": "<p>Water damage on ceiling in living room</p>",
- "diagnosticSummary": null,
- "aiSessionID": null,
- "isResolvedByRequestor": "0",
- "vendorInstructions": "<p>Call before arriving</p>",
- "dateClosed": null,
- "closingDescription": null,
- "isSharedWithTenant": "1",
- "isSharedWithOwner": "1",
- "isNew": "1",
- "createdByUserID": "1",
- "closedByUserID": null,
- "cancelledByUserID": null,
- "dateTimeCreated": "2026-04-22 17:39:33",
- "modifiedByUserID": "381140",
- "dateTimeModified": "2026-04-23 15:30:58",
- "inspectionID": null,
- "incidentLocation": null,
- "appointmentWindowStartDateTime": null,
- "appointmentWindowEndDateTime": null,
- "isTenantPresenceRequired": "0",
- "rejectedByVendorContactID": null,
- "vendorRejectReason": null,
- "vendorClosingComments": null,
- "orderIndex": "0",
- "dateDue": null,
- "reviewID": null,
- "vendorAccessTypeID": "3",
- "residentProvidedEntryInstructions": null,
- "entryInstructions": null,
- "isTenantFinanciallyResponsible": "0",
- "portfolioID": "359",
- "vendorTradeID": null,
- "assignedToUserID": "381140",
- "requestedByContactID": null,
- "estimatedAmount": null,
- "scheduledStartDate": null,
- "actualStartDate": null,
- "scheduledEndDate": null,
- "actualEndDate": null
}, - "contact": {
- "contactID": null,
- "name": null,
- "firstName": null,
- "lastName": null,
- "email": null,
- "phone": null,
- "isActive": null
}
}
]Retrieve detailed information about a specific work order by ID, including computed overdue status and assigned technician data.
400 with "Work Order {id} not found" if the work order does not exist403 "Work Order Access Not Allowed"daysOverdue and isOverdue are calculated dynamically from dateDue and today's dateGET /maintenance/work-orders - List work ordersPOST /maintenance/work-orders/{workOrderID} - Update work orderDELETE /maintenance/work-orders/{workOrderID} - Delete work orderGET /maintenance/work-orders/{workOrderID}/print - Print work order PDF| workOrderID required | integer Example: 2314 The unique work order ID |
required | object |
| schedulingStatusID required | integer or null |
{- "workOrder": {
- "workOrderID": "2314",
- "workOrderNumber": "102161",
- "workOrderProjectID": null,
- "recurringWorkOrderID": null,
- "isInternal": "0",
- "propertyID": "84",
- "unitID": "96",
- "leaseID": "154",
- "vendorContactID": "125",
- "primaryWorkOrderStatusID": "1",
- "workOrderStatusID": "11",
- "vendorWorkOrderStatusID": "1",
- "portalVendorWorkOrderStatusID": "1",
- "vendorWorkOrderStatusUpdated": null,
- "priorityID": "3",
- "sourceTypeID": "1",
- "isOwnerApproved": "0",
- "isVacant": "0",
- "description": "<p>leaky faucet</p>",
- "diagnosticSummary": null,
- "aiSessionID": null,
- "isResolvedByRequestor": "0",
- "vendorInstructions": null,
- "dateClosed": null,
- "closingDescription": null,
- "isSharedWithTenant": "1",
- "isSharedWithOwner": "0",
- "isNew": "0",
- "createdByUserID": "1",
- "closedByUserID": null,
- "cancelledByUserID": null,
- "dateTimeCreated": "2023-10-19 20:12:01",
- "modifiedByUserID": "94827",
- "dateTimeModified": "2023-10-19 20:15:19",
- "inspectionID": null,
- "incidentLocation": null,
- "appointmentWindowStartDateTime": null,
- "appointmentWindowEndDateTime": null,
- "isTenantPresenceRequired": "0",
- "rejectedByVendorContactID": null,
- "vendorRejectReason": null,
- "vendorClosingComments": null,
- "orderIndex": "0",
- "dateDue": "2023-10-26",
- "reviewID": null,
- "vendorAccessTypeID": "2",
- "residentProvidedEntryInstructions": null,
- "entryInstructions": null,
- "isTenantFinanciallyResponsible": "0",
- "portfolioID": "59",
- "vendorTradeID": "7",
- "assignedToUserID": "2079",
- "requestedByContactID": "268",
- "estimatedAmount": "500.00",
- "scheduledStartDate": "2023-10-19",
- "actualStartDate": null,
- "scheduledEndDate": "2023-10-26",
- "actualEndDate": null,
- "daysOverdue": 910,
- "isOverdue": 1,
- "technicianContactIDs": [ ],
- "technicianData": [
- {
- "technicianID": 125,
- "name": "Best View Windows",
- "phone": "+17193301649",
- "contactTypeID": 3,
- "appointmentWindowStartDateTime": null,
- "appointmentWindowEndDateTime": null
}
]
}, - "schedulingStatusID": 1
}Update an existing work order. Supports updating all work order fields including status, assignment, scheduling, and shared visibility settings.
GET /maintenance/work-orders/{workOrderID} - View work orderDELETE /maintenance/work-orders/{workOrderID} - Delete work order| workOrderID required | integer Example: 12345 The unique work order ID to update |
| 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 |
| workOrder | object Updated work order details (same structure as GET response) |
{- "workOrderStatusID": 2,
- "sendVendorNotification": false
}{- "workOrder": {
- "workOrderID": 12345,
- "workOrderNumber": "WO-2024-12345",
- "workOrderStatusID": 2,
- "priorityID": 4,
- "description": "Kitchen sink is leaking under the cabinet - URGENT: Water damage spreading",
- "dateTimeModified": "2024-10-23T10:30:00Z"
}
}Delete a work order. This operation removes the work order and all associated data including attachments, messages, and timeline events.
GET /maintenance/work-orders/{workOrderID} - View work orderGET /maintenance/work-orders - View work orders| workOrderID required | string Example: 12345 The unique work order ID to delete |
| workOrderID | string |
| workOrderNumber | string |
| description | string |
| dateTimeCreated | string <date-time> |
| dateTimeModified | string <date-time> |
{- "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"
}Generate and download a PDF version of the specified work order. The response is a binary PDF document suitable for printing or archiving.
400 with "Work Order not found" if the work order does not existGET /maintenance/work-orders/{workOrderID} - Get work order details as JSON| workOrderID required | integer Example: 2314 The unique work order ID to print |
| Cache-Control | string Example: "no-cache" Cache directive (always |
| Content-Type | string Example: "application/pdf" MIME type of the response body |
{- "error": "Work Order not found"
}| primaryWorkOrderStatusID required | string (primary_statuses) Enum: 1 2 3 4
|
| name required | string The name of the status |
| primaryWorkOrderStatusID required | string (primary_statuses) Enum: 1 2 3 4
|
| 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 ( |
| orderIndex | string |
{- "primaryWorkOrderStatusID": 1,
- "name": "string"
}{- "primaryWorkOrderStatusID": 1,
- "name": "string",
- "workOrderStatusID": "string",
- "isSystemStatus": "string",
- "orderIndex": "string"
}Retrieve all work order statuses available in the account, including both system statuses and any custom statuses created by the account.
isSystemStatus = 1) and custom account statuses (isSystemStatus = 0)Open, Completed, Cancelled, Requested, On Hold, Estimating, RejectedGET /maintenance/work-order/statuses/{workOrderStatusID} - Get a specific status by IDPOST /maintenance/work-order/statuses - Create or update a custom status| search | string Example: search=open Free-text search on status name |
| isSystemStatus | integer Enum: 0 1 Example: isSystemStatus=1 Filter to system statuses only ( |
required | object (work_order_status) |
[- {
- "workOrderStatus": {
- "workOrderStatusID": "1",
- "primaryWorkOrderStatusID": "2",
- "isSystemStatus": "1",
- "name": "Open",
- "orderIndex": "0"
}
}, - {
- "workOrderStatus": {
- "workOrderStatusID": "9",
- "primaryWorkOrderStatusID": "2",
- "isSystemStatus": "0",
- "name": "Tech Completed",
- "orderIndex": "1"
}
}, - {
- "workOrderStatus": {
- "workOrderStatusID": "2",
- "primaryWorkOrderStatusID": "3",
- "isSystemStatus": "1",
- "name": "Completed",
- "orderIndex": "10"
}
}, - {
- "workOrderStatus": {
- "workOrderStatusID": "3",
- "primaryWorkOrderStatusID": "5",
- "isSystemStatus": "1",
- "name": "Cancelled",
- "orderIndex": "12"
}
}, - {
- "workOrderStatus": {
- "workOrderStatusID": "5",
- "primaryWorkOrderStatusID": "4",
- "isSystemStatus": "1",
- "name": "On Hold",
- "orderIndex": "14"
}
}
]Retrieve a single work order status by its ID. Returns both system statuses and custom account statuses.
400 with "Work Order Status {id} not found" if the status does not existGET /maintenance/work-order/statuses - List all work order statusesPOST /maintenance/work-order/statuses/{workOrderStatusID} - Update a custom statusDELETE /maintenance/work-order/statuses/{workOrderStatusID} - Delete a custom status| workOrderStatusID required | integer Example: 5 The unique work order status ID |
required | object (work_order_status) |
{- "workOrderStatus": {
- "workOrderStatusID": "5",
- "primaryWorkOrderStatusID": "4",
- "isSystemStatus": "1",
- "name": "On Hold",
- "orderIndex": "14"
}
}Delete a custom work order status. Only custom statuses (those with isSystemStatus = 0) can be deleted; system statuses are protected.
Manage Work Order Statuses permission400 with "Work Order Status {id} not found" if the status does not existisSystemStatus = 1) cannot be deleted via this endpointGET /maintenance/work-order/statuses - List all statusesGET /maintenance/work-order/statuses/{workOrderStatusID} - Get a status by ID| workOrderStatusID required | integer Example: 9 The unique work order status ID to delete |
| workOrderStatusID required | string |
| primaryWorkOrderStatusID required | string |
| isSystemStatus required | string |
| name required | string |
| orderIndex required | string |
{- "workOrderStatusID": "9",
- "primaryWorkOrderStatusID": "2",
- "isSystemStatus": "0",
- "name": "Tech Completed",
- "orderIndex": "1"
}Update an existing custom work order status by ID.
400 with "Work Order Status {id} not found" if the status does not existworkOrderStatusprimaryWorkOrderStatusID cannot be modifiedGET /maintenance/work-order/statuses/{workOrderStatusID} - Get status by IDDELETE /maintenance/work-order/statuses/{workOrderStatusID} - Delete a custom statusGET /maintenance/work-order/statuses - List all statuses| workOrderStatusID required | integer Example: 9 The unique work order status ID to update |
| 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.
|
required | object (work_order_status) |
{- "name": "Tech Completed",
- "primaryWorkOrderStatusID": 2
}{- "workOrderStatus": {
- "workOrderStatusID": "9",
- "primaryWorkOrderStatusID": "2",
- "isSystemStatus": "0",
- "name": "Tech Completed",
- "orderIndex": "1"
}
}| 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. |
| 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. |
{- "name": "string",
- "isVisibleTenantPortal": true
}{- "vendorTradeID": 0,
- "name": "string",
- "isVisibleTenantPortal": true
}List vendor trades
| 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. |
[- {
- "vendorTradeID": 0,
- "name": "string",
- "isVisibleTenantPortal": true
}
]Retrieve a single vendor trade (maintenance category) by ID.
vendors includecontact)GET /maintenance/vendor-trades - List all vendor tradesPOST /maintenance/vendor-trades/{vendorTradeID} - Update a vendor trade| vendorTradeID required | integer Example: 5 The unique vendor trade ID |
| includes | string Example: includes=vendors Comma-separated list of related objects. Available values: |
required | object (vendor_trade) |
| vendors | Array of objects Vendor contacts assigned to this trade (if |
{- "vendorTrade": {
- "vendorTradeID": 5,
- "name": "Plumbing",
- "isVisibleTenantPortal": true
}
}Update an existing vendor trade (maintenance category). Requires the ManageMaintenanceCategories permission.
400 with "Maintenance Category {id} not found" if the trade does not existvendorTradeGET /maintenance/vendor-trades/{vendorTradeID} - Get vendor trade detailsDELETE /maintenance/vendor-trades/{vendorTradeID} - Delete a vendor tradeGET /maintenance/vendor-trades - List all vendor trades| vendorTradeID required | integer Example: 5 The unique vendor trade ID to update |
| 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 |
required | object (vendor_trade) |
{- "name": "Plumbing",
- "isVisibleTenantPortal": true
}{- "vendorTrade": {
- "vendorTradeID": 5,
- "name": "Plumbing",
- "isVisibleTenantPortal": true
}
}| 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
|
| inspectionStatusID required | integer (inspection_statuses) Enum: 1 2 3 4
|
| description | string or null |
| scheduledDate | string or null <date> |
| inspectionDate | string or null <date> |
| 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
|
| inspectionStatusID required | integer (inspection_statuses) Enum: 1 2 3 4
|
| 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> |
{- "unitID": 0,
- "inspectionTypeID": 1,
- "inspectionStatusID": 1,
- "description": "string",
- "scheduledDate": "2019-08-24",
- "inspectionDate": "2019-08-24"
}{- "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 of inspections
| page | integer Default: 1 The page number for pagination |
| pageSize | integer Default: 15 Number of items per page |
| 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
|
| inspectionStatusID required | integer (inspection_statuses) Enum: 1 2 3 4
|
| 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> |
[- {
- "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"
}
]View inspection
| inspectionID required | integer |
| 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
|
| inspectionStatusID required | integer (inspection_statuses) Enum: 1 2 3 4
|
| 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> |
{- "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"
}Returns a paginated list of inventory materials available for use on work orders.
search matches against name, description, and upc fieldsisActive defaults to all active materials when omittedGET /maintenance/materials/{materialID} — retrieve a single material with file detailPOST /maintenance/materials — create a new materialPOST /maintenance/materials/{materialID} — update an existing materialDELETE /maintenance/materials/{materialID} — delete a material| 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. |
| 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 |
| 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 |
required | object (material) Fields accepted when creating or updating a maintenance material (inventory item).
Only |
[- {
- "material": {
- "materialID": "5",
- "name": "AC Vent",
- "description": "10 AC Vents for replacement",
- "isActive": "1",
- "upc": null,
- "purchasePrice": "8.00",
- "sellPrice": "20.00",
- "imageFileID": null,
- "dateTimeCreated": "2026-01-26 20:55:33",
- "dateTimeModified": "2026-01-26 20:55:33",
- "isDeleted": "0"
}, - "file": {
- "fileID": null,
- "title": null,
- "fileName": null,
- "fileType": null,
- "fileSize": null
}
}, - {
- "material": {
- "materialID": "7",
- "name": "Batteries AAA",
- "description": null,
- "isActive": "1",
- "upc": null,
- "purchasePrice": "5.00",
- "sellPrice": "6.00",
- "imageFileID": null,
- "dateTimeCreated": "2026-02-12 13:09:36",
- "dateTimeModified": "2026-02-12 13:09:36",
- "isDeleted": "0"
}, - "file": {
- "fileID": null,
- "title": null,
- "fileName": null,
- "fileType": null,
- "fileSize": null
}
}
]Creates a new maintenance material in the inventory catalog. On success, returns the full material
detail (same shape as GET /maintenance/materials/{materialID}).
name and sellPrice are the only required fieldsisActive defaults to 1 (active) when not suppliedname must be unique among non-deleted materials (max 200 characters)purchasePrice and sellPrice must be valid decimal amountsGET /maintenance/materials — list all materialsGET /maintenance/materials/{materialID} — retrieve the created materialPOST /maintenance/materials/{materialID} — update an existing material| 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. |
| upc | string or null Universal Product Code |
| purchasePrice | string or null Cost to purchase the material (decimal as string) |
required | object (material) Fields accepted when creating or updating a maintenance material (inventory item).
Only |
{- "name": "New Item Name",
- "sellPrice": "12.00"
}{- "material": {
- "materialID": "13",
- "name": "New Item Name",
- "description": null,
- "isActive": "1",
- "upc": null,
- "purchasePrice": null,
- "sellPrice": "12.00",
- "imageFileID": null,
- "dateTimeCreated": "2026-04-24 22:41:08",
- "dateTimeModified": "2026-04-24 22:41:08",
- "isDeleted": "0"
}
}Retrieves a single maintenance material by ID
400 with "Material {id} not found" if the material does not exist or has been deletedGET /maintenance/materials — list all materialsPOST /maintenance/materials/{materialID} — update this materialDELETE /maintenance/materials/{materialID} — delete this material| materialID required | integer Example: 8 The unique material ID |
required | object (material) Fields accepted when creating or updating a maintenance material (inventory item).
Only |
required | object Image file associated with the material, if any |
{- "material": {
- "materialID": "8",
- "name": "Drywall",
- "description": "Home Depot",
- "isActive": "1",
- "upc": null,
- "purchasePrice": "200.00",
- "sellPrice": "300.00",
- "imageFileID": null,
- "dateTimeCreated": "2026-02-27 16:19:22",
- "dateTimeModified": "2026-02-27 16:19:22",
- "isDeleted": "0"
}, - "file": {
- "fileID": null,
- "title": null,
- "fileName": null,
- "fileType": null,
- "fileSize": null
}
}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.
400 with "Material {id} not found" if the material does not existname must remain unique among non-deleted materials if changedpurchasePrice and sellPrice must be valid decimal amounts when suppliedGET /maintenance/materials/{materialID} — retrieve current material stateGET /maintenance/materials — list all materialsDELETE /maintenance/materials/{materialID} — delete this material| materialID required | integer Example: 13 The unique material ID |
| 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. |
| 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 |
required | object (material) Fields accepted when creating or updating a maintenance material (inventory item).
Only |
{- "sellPrice": "10.00"
}{- "material": {
- "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:43:00",
- "isDeleted": "0"
}
}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.
400 with "Material {id} not found" if the material does not exist\GET /maintenance/materials list resultsGET /maintenance/materials — list active materialsPOST /maintenance/materials — create a replacement material| materialID required | integer Example: 13 The unique material ID to delete |
| materialID required | string Unique identifier for the material |
| name required | string Display name of the material |
| isDeleted required | integer Soft-delete flag. Always |
| 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 |
{- "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
}Returns a paginated list of maintenance labor rates. Supports full-text search and rate-range filtering. Results exclude soft-deleted records by default.
search matches against the name fieldGET /maintenance/labor-rates/{laborRateID} — retrieve a single labor ratePOST /maintenance/labor-rates — create a new labor ratePOST /maintenance/labor-rates/{laborRateID} — update an existing labor rateDELETE /maintenance/labor-rates/{laborRateID} — delete a labor rate| 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 |
| orderBy | string Example: orderBy=laborRate.name Sort field in dot-notation. Prefix with |
| 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 |
required | object (labor_rate) Fields accepted when creating or updating a maintenance labor rate.
|
[- {
- "laborRate": {
- "laborRateID": "2",
- "name": "Company Labor Rate",
- "description": null,
- "rate": "75.00",
- "hourlyRate": "55.00",
- "isDeleted": "0",
- "dateTimeCreated": "2025-08-07 14:16:24",
- "dateTimeModified": "2026-02-12 12:56:16"
}
}, - {
- "laborRate": {
- "laborRateID": "3",
- "name": "Trip Charge",
- "description": null,
- "rate": "75.00",
- "hourlyRate": null,
- "isDeleted": "0",
- "dateTimeCreated": "2025-08-07 20:45:22",
- "dateTimeModified": "2025-08-07 20:45:22"
}
}, - {
- "laborRate": {
- "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"
}
}
]Creates a new maintenance labor rate. On success, returns the created labor rate as a flat object.
name, rate, and hourlyRate are required; description is optionalname must be unique among non-deleted labor ratesrate and hourlyRate must be non-negative decimal amounts; zero is allowedGET /maintenance/labor-rates — list all labor ratesGET /maintenance/labor-rates/{laborRateID} — retrieve the created labor ratePOST /maintenance/labor-rates/{laborRateID} — update an existing labor rate| 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 |
| 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 |
{- "name": "New Labor Item",
- "rate": "5.00"
}{- "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"
}Retrieves a single maintenance labor rate by ID. Returns a flat object (no wrapper key).
400 with "Labor Rate {id} not found" if the labor rate does not existGET /maintenance/labor-rates — list all labor ratesPOST /maintenance/labor-rates/{laborRateID} — update this labor rateDELETE /maintenance/labor-rates/{laborRateID} — delete this labor rate| laborRateID required | integer Example: 7 The unique labor rate ID |
| 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 |
{- "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"
}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.
400 with "Labor Rate {id} not found" if the labor rate does not existname must remain unique among non-deleted labor rates if changedrate and hourlyRate must be non-negative decimal amounts when supplied; zero is allowedlaborRateID, dateTimeCreated, and dateTimeModified in the request body are accepted but ignoredGET /maintenance/labor-rates/{laborRateID} — retrieve current labor rate stateGET /maintenance/labor-rates — list all labor ratesDELETE /maintenance/labor-rates/{laborRateID} — delete this labor rate| laborRateID required | integer Example: 7 The unique labor rate ID |
| 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. |
| 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 |
{- "rate": "0.00"
}{- "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"
}Deletes a labor rate from the catalog. The record is removed from the database. Returns a success confirmation.
400 with "Labor Rate {id} not found" if the labor rate does not existGET /maintenance/labor-rates by defaultGET /maintenance/labor-rates — list active labor ratesPOST /maintenance/labor-rates — create a replacement labor rate| laborRateID required | integer Example: 7 The unique labor rate ID to delete |
| success required | boolean Always |
| message required | string Confirmation message |
{- "success": true,
- "message": "Labor rate deleted successfully"
}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.
isActive defaults to 1 — only active portfolios are returned unless explicitly set to 0GET /portfolios/search - Advanced filtered search with denormalized columns and additional filtersGET /portfolios/{portfolioID} - Full portfolio detail with optional includes| 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 ( |
| excludePortfolioID | integer Example: excludePortfolioID=150 Exclude a specific portfolio from results by its ID. |
| 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 |
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. |
[- {
- "portfolio": {
- "portfolioID": "279",
- "code": null,
- "name": "123 Main St",
- "contacts": [
- {
- "contactID": "4679",
- "percentOwned": "100.0000",
- "percentDistributed": "85.0000",
- "name": "Test holder"
}, - {
- "contactID": "3444",
- "percentOwned": "0.0000",
- "percentDistributed": "5.0000",
- "name": "Johnson and Smith"
}, - {
- "contactID": "2992",
- "percentOwned": "0.0000",
- "percentDistributed": "10.0000",
- "name": "Angel Deca Test"
}
], - "postingSettingID": "13",
- "assignedToUserID": "491061",
- "minimumDistributionAmount": "0.00",
- "maximumDistributionAmount": "5000.00",
- "reserveAmount": "500.00",
- "additionalReserveAmount": "0.00",
- "additionalReserveDescription": null,
- "overdraftOverrideAmount": "100.00",
- "fiscalYearEndMonth": "12",
- "statementSettingID": "1",
- "sendStatements": "1",
- "holdDistributions": "0",
- "holdDistributionsDescription": null,
- "isActive": "1",
- "isLiveLedgerEnabled": null,
- "isBalanceNoticeDisabled": "0",
- "dateTimeCreated": "2025-03-20 19:51:20",
- "dateTimeModified": "2026-04-22 18:00:15",
- "dateTimeDeactivated": null,
- "isFromImport": "0",
- "importSourceKey": null,
- "isPublicStatementEnabled": "1",
- "dateClosed": null
}, - "token": "1776988961"
}
]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}.
attachments file IDsUpdatePortfolio permissionowners must be supplied as an array; each entry requires contactID, percentOwned, and percentDistributedisLiveLedgerEnabled accepts -1 to reset the value to null (account default); any other value is stored as-isportfolioGroupIDs assigns the new portfolio to one or more portfolio groupsattachments is an array of existing file IDs to attach to the portfolio on creationGET /portfolios/{portfolioID} - Retrieve the created portfolioPOST /portfolios/{portfolioID} - Update portfolio settingsPOST /portfolios/{portfolioID}/owners - Sync owner list after creation| 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. |
| 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. |
| isLiveLedgerEnabled | integer or null Real-time ledger updates. Pass |
| isBalanceNoticeDisabled | integer Enum: 0 1 Whether to suppress balance notice emails. |
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. |
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. |
{- "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": [
- {
- "contactID": 4679,
- "percentOwned": "100.00",
- "percentDistributed": "100.00"
}
]
}{- "portfolio": {
- "portfolioID": "312",
- "code": "OAK-456",
- "name": "456 Oak Ave - Johnson",
- "contacts": [
- {
- "contactID": "4679",
- "percentOwned": "100.0000",
- "percentDistributed": "100.0000",
- "name": "Robert Johnson"
}
], - "postingSettingID": "3",
- "assignedToUserID": null,
- "minimumDistributionAmount": "0.00",
- "maximumDistributionAmount": "5000.00",
- "reserveAmount": "500.00",
- "additionalReserveAmount": "0.00",
- "additionalReserveDescription": null,
- "overdraftOverrideAmount": "100.00",
- "fiscalYearEndMonth": "12",
- "statementSettingID": "1",
- "sendStatements": "1",
- "holdDistributions": "0",
- "holdDistributionsDescription": null,
- "isActive": "1",
- "isLiveLedgerEnabled": null,
- "isBalanceNoticeDisabled": "0",
- "dateTimeCreated": "2026-04-23 10:15:00",
- "dateTimeModified": "2026-04-23 10:15:00",
- "dateTimeDeactivated": null,
- "isFromImport": "0",
- "importSourceKey": null,
- "isPublicStatementEnabled": "1",
- "dateClosed": null
}
}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.
propertyCount is a derived column counting properties currently assigned to the portfoliocontactNames is a derived comma-separated string of owner contact namesGET /portfolios - Basic paginated list (fewer filters, lighter payload)GET /portfolios/{portfolioID} - Full portfolio detail with optional includes| 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 |
| portfolioIDs[] | Array of integers Example: portfolioIDs[]=150 Filter to specific portfolios by ID. Pass multiple values as |
| 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. |
| 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. |
| 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 |
required | object |
required | object |
required | object or null Most recent statement for this portfolio, or |
[- {
- "portfolio": {
- "isActive": "0",
- "portfolioID": "210",
- "code": "2447",
- "name": "(NEW) Adrians Portfolio test",
- "contacts": "[{\"contactID\":\"2086\",\"percentOwned\":\"100.0000\",\"percentDistributed\":\"100.0000\",\"name\":\"(NEW) Adrians Portfolio test\"},{\"contactID\":\"4115\",\"percentOwned\":\"0.0000\",\"percentDistributed\":\"0.0000\",\"name\":\"test man jones jr the third\"}]",
- "postingSettingID": "5",
- "minimumDistributionAmount": "0.00",
- "maximumDistributionAmount": null,
- "reserveAmount": "0.00",
- "additionalReserveAmount": "500.00",
- "additionalReserveDescription": null,
- "overdraftOverrideAmount": "1000000.00",
- "fiscalYearEndMonth": "12",
- "statementSettingID": "62",
- "sendStatements": "1",
- "holdDistributions": "0",
- "dateTimeCreated": "2024-06-23 21:38:02",
- "dateTimeModified": "2026-03-20 20:04:50",
- "dateTimeDeactivated": "2026-03-20 20:03:42",
- "dateClosed": "2026-03-20",
- "propertyCount": "0",
- "contactNames": "(NEW) Adrians Portfolio test, test man jones jr the third, Amber TEST, Vasco Lambert, Mario"
}, - "statementSetting": {
- "statementSettingID": "62",
- "name": "2023"
}, - "lastStatement": {
- "name": "02/14/2026 to 03/13/2026",
- "startDate": "2026-02-14",
- "endDate": "2026-03-13"
}
}
]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.
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 booleanowners — List of portfolio owners, each with contact data includedledger — The portfolio's accounting ledger recordposting — The posting setting template assigned to the portfoliostatementSetting — The statement setting template assigned to the portfolioGET /portfolios - Paginated portfolio listGET /portfolios/{portfolioID}/owners - List owners for the portfolioGET /portfolios/{portfolioID}/statements - List statements for the portfolio| portfolioID required | integer Example: 150 The ID of the portfolio to retrieve. |
| includes | string Example: includes=owners,statementSetting Comma-separated list of related data to include in the response.
Available values: |
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. |
{- "portfolio": {
- "portfolioID": "279",
- "code": null,
- "name": "123 Main St- Amber Negron",
- "contacts": [
- {
- "contactID": "4679",
- "percentOwned": "100.0000",
- "percentDistributed": "85.0000",
- "name": "Test holder"
}, - {
- "contactID": "3444",
- "percentOwned": "0.0000",
- "percentDistributed": "5.0000",
- "name": "(Redacted) and Miggy"
}, - {
- "contactID": "2992",
- "percentOwned": "0.0000",
- "percentDistributed": "10.0000",
- "name": "Angel Deca Test"
}
], - "postingSettingID": "13",
- "assignedToUserID": "491061",
- "minimumDistributionAmount": "0.00",
- "maximumDistributionAmount": "5000.00",
- "reserveAmount": "500.00",
- "additionalReserveAmount": "0.00",
- "additionalReserveDescription": null,
- "overdraftOverrideAmount": "100.00",
- "fiscalYearEndMonth": "12",
- "statementSettingID": "1",
- "sendStatements": "1",
- "holdDistributions": "0",
- "holdDistributionsDescription": null,
- "isActive": "1",
- "isLiveLedgerEnabled": null,
- "isBalanceNoticeDisabled": "0",
- "dateTimeCreated": "2025-03-20 19:51:20",
- "dateTimeModified": "2026-04-22 18:00:15",
- "dateTimeDeactivated": null,
- "isFromImport": "0",
- "importSourceKey": null,
- "isPublicStatementEnabled": "1",
- "dateClosed": null
}
}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}.
assignedToUserID)dateClosedUpdatePortfolio permissionisLiveLedgerEnabled accepts -1 to reset the value to null (account default)dateClosed accepts an ISO date string (YYYY-MM-DD); set to null to reopenGET /portfolios/{portfolioID} - Retrieve current portfolio statePOST /portfolios/{portfolioID}/activate - Reactivate a deactivated portfolioPOST /portfolios/{portfolioID}/deactivate - Deactivate a portfolioPOST /portfolios/{portfolioID}/owners - Sync the owner list independently| portfolioID required | integer Example: 279 The ID of the portfolio to update. |
| 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 |
| 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 |
| assignedToUserID | integer or null ID of the user assigned to manage this portfolio. |
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. |
{- "name": "456 Oak Ave - Johnson (Updated)",
- "reserveAmount": "750.00",
- "maximumDistributionAmount": "6000.00",
- "assignedToUserID": 491061,
- "holdDistributions": 0
}{- "portfolio": {
- "portfolioID": "279",
- "code": null,
- "name": "456 Oak Ave - Johnson (Updated)",
- "contacts": [
- {
- "contactID": "4679",
- "percentOwned": "100.0000",
- "percentDistributed": "85.0000",
- "name": "Test holder"
}
], - "postingSettingID": "13",
- "assignedToUserID": "491061",
- "minimumDistributionAmount": "0.00",
- "maximumDistributionAmount": "6000.00",
- "reserveAmount": "750.00",
- "additionalReserveAmount": "0.00",
- "additionalReserveDescription": null,
- "overdraftOverrideAmount": "100.00",
- "fiscalYearEndMonth": "12",
- "statementSettingID": "1",
- "sendStatements": "1",
- "holdDistributions": "0",
- "holdDistributionsDescription": null,
- "isActive": "1",
- "isLiveLedgerEnabled": null,
- "isBalanceNoticeDisabled": "0",
- "dateTimeCreated": "2025-03-20 19:51:20",
- "dateTimeModified": "2026-04-23 11:30:00",
- "dateTimeDeactivated": null,
- "isFromImport": "0",
- "importSourceKey": null,
- "isPublicStatementEnabled": "1",
- "dateClosed": null
}
}Reactivates a previously deactivated portfolio. On success the updated portfolio is returned in the
same shape as GET /portfolios/{portfolioID}.
UpdatePortfolio permissionisActive to "1" and clears dateTimeDeactivatedPOST /portfolios/{portfolioID}/deactivate - Deactivate a portfolioGET /portfolios/{portfolioID} - Retrieve current portfolio state| portfolioID required | integer Example: 279 The ID of the portfolio to activate. |
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. |
{- "portfolio": {
- "portfolioID": "279",
- "code": null,
- "name": "123 Main St - Amber Negron",
- "contacts": [
- {
- "contactID": "4679",
- "percentOwned": "100.0000",
- "percentDistributed": "85.0000",
- "name": "Test holder"
}
], - "postingSettingID": "13",
- "assignedToUserID": "491061",
- "minimumDistributionAmount": "0.00",
- "maximumDistributionAmount": "5000.00",
- "reserveAmount": "500.00",
- "additionalReserveAmount": "0.00",
- "additionalReserveDescription": null,
- "overdraftOverrideAmount": "100.00",
- "fiscalYearEndMonth": "12",
- "statementSettingID": "1",
- "sendStatements": "1",
- "holdDistributions": "0",
- "holdDistributionsDescription": null,
- "isActive": "1",
- "isLiveLedgerEnabled": null,
- "isBalanceNoticeDisabled": "0",
- "dateTimeCreated": "2025-03-20 19:51:20",
- "dateTimeModified": "2026-04-23 12:00:00",
- "dateTimeDeactivated": null,
- "isFromImport": "0",
- "importSourceKey": null,
- "isPublicStatementEnabled": "1",
- "dateClosed": null
}
}Deactivates an active portfolio, optionally recording a closure date. On success the updated portfolio
is returned in the same shape as GET /portfolios/{portfolioID}.
UpdatePortfolio permissiondateClosed is optional; when supplied it must be a valid date string (YYYY-MM-DD)isActive to "0" and records dateTimeDeactivatedPOST /portfolios/{portfolioID}/activate - Reactivate a deactivated portfolioGET /portfolios/{portfolioID} - Retrieve current portfolio state| portfolioID required | integer Example: 279 The ID of the portfolio to deactivate. |
| dateClosed | string or null Date the portfolio was officially closed (YYYY-MM-DD). |
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. |
{- "dateClosed": "2026-04-30"
}{- "portfolio": {
- "portfolioID": "279",
- "code": null,
- "name": "123 Main St - Amber Negron",
- "contacts": [
- {
- "contactID": "4679",
- "percentOwned": "100.0000",
- "percentDistributed": "85.0000",
- "name": "Test holder"
}
], - "postingSettingID": "13",
- "assignedToUserID": "491061",
- "minimumDistributionAmount": "0.00",
- "maximumDistributionAmount": "5000.00",
- "reserveAmount": "500.00",
- "additionalReserveAmount": "0.00",
- "additionalReserveDescription": null,
- "overdraftOverrideAmount": "100.00",
- "fiscalYearEndMonth": "12",
- "statementSettingID": "1",
- "sendStatements": "1",
- "holdDistributions": "0",
- "holdDistributionsDescription": null,
- "isActive": "0",
- "isLiveLedgerEnabled": null,
- "isBalanceNoticeDisabled": "0",
- "dateTimeCreated": "2025-03-20 19:51:20",
- "dateTimeModified": "2026-04-23 14:00:00",
- "dateTimeDeactivated": "2026-04-23 14:00:00",
- "isFromImport": "0",
- "importSourceKey": null,
- "isPublicStatementEnabled": "1",
- "dateClosed": "2026-04-30"
}
}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.
contact — The full contact record for the owner (name, email, address, phone numbers)GET /portfolios/{portfolioID}/owners/{portfolioOwnerID} - Single owner detail with includesGET /portfolios/{portfolioID}/owners/{portfolioOwnerID}/ach-details - Decrypted ACH bank account infoGET /portfolios/{portfolioID} - Portfolio detail (also supports owners include)| portfolioID required | integer Example: 279 The ID of the portfolio whose owners to retrieve. |
| 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: |
| 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 |
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. |
[- {
- "owner": {
- "portfolioOwnerID": "536",
- "portfolioID": "279",
- "contactID": "4679",
- "percentOwned": "100.0000",
- "percentDistributed": "85.0000",
- "overrideContactPayoutSettings": "0",
- "payeeName": "Robert Harmon",
- "payoutTypeID": "3",
- "achDetailsCiphertextID": "1021",
- "achAccountNumberTruncated": "8842",
- "achAccountTypeID": "2",
- "achIsCorporateAccount": "0"
}, - "token": "1776991733"
}, - {
- "owner": {
- "portfolioOwnerID": "556",
- "portfolioID": "279",
- "contactID": "3444",
- "percentOwned": "0.0000",
- "percentDistributed": "5.0000",
- "overrideContactPayoutSettings": "1",
- "payeeName": "Sandra Villanueva",
- "payoutTypeID": "2",
- "achDetailsCiphertextID": null,
- "achAccountNumberTruncated": null,
- "achAccountTypeID": null,
- "achIsCorporateAccount": "0"
}, - "token": "1776991733"
}, - {
- "owner": {
- "portfolioOwnerID": "641",
- "portfolioID": "279",
- "contactID": "2992",
- "percentOwned": "0.0000",
- "percentDistributed": "10.0000",
- "overrideContactPayoutSettings": "0",
- "payeeName": "Westfield Capital LLC",
- "payoutTypeID": "4",
- "achDetailsCiphertextID": "1087",
- "achAccountNumberTruncated": "3301",
- "achAccountTypeID": "1",
- "achIsCorporateAccount": "1"
}, - "token": "1776991733"
}
]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.
UpdatePortfolio permissionowners is required and must be a non-empty array; each entry requires contactID,
percentOwned, and percentDistributedGET /portfolios/{portfolioID}/owners - List current ownersGET /portfolios/{portfolioID}/owners/{portfolioOwnerID} - Single owner detailPOST /portfolios/{portfolioID} - Update portfolio settings (owners can also be set on create)| portfolioID required | integer Example: 279 The ID of the portfolio whose owners to replace. |
required | Array of objects Full replacement owner list. Each entry must include contactID, percentOwned, and percentDistributed. |
| 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 |
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. |
{- "owners": [
- {
- "contactID": 4679,
- "percentOwned": "100.00",
- "percentDistributed": "100.00"
}
]
}[- {
- "owner": {
- "portfolioOwnerID": "601",
- "portfolioID": "279",
- "contactID": "4679",
- "percentOwned": "60.0000",
- "percentDistributed": "60.0000",
- "overrideContactPayoutSettings": "0",
- "payeeName": "Robert Johnson",
- "payoutTypeID": "2",
- "achDetailsCiphertextID": null,
- "achAccountNumberTruncated": null,
- "achAccountTypeID": null,
- "achIsCorporateAccount": "0"
}, - "token": "1776991900"
}, - {
- "owner": {
- "portfolioOwnerID": "602",
- "portfolioID": "279",
- "contactID": "3444",
- "percentOwned": "40.0000",
- "percentDistributed": "40.0000",
- "overrideContactPayoutSettings": "0",
- "payeeName": "Sandra Villanueva",
- "payoutTypeID": "3",
- "achDetailsCiphertextID": "1021",
- "achAccountNumberTruncated": "8842",
- "achAccountTypeID": "2",
- "achIsCorporateAccount": "0"
}, - "token": "1776991900"
}
]Returns the detail for a single portfolio owner record. Use the includes parameter to attach the
full portfolio or contact record.
portfolioOwnerID does not belong to the specified portfolioIDportfolio — The portfolio this owner belongs tocontact — The full contact record for the owner (name, email, address, phone numbers)GET /portfolios/{portfolioID}/owners - List all owners for the portfolioGET /portfolios/{portfolioID}/owners/{portfolioOwnerID}/ach-details - Decrypted ACH bank account info| portfolioID required | integer Example: 150 The ID of the portfolio. |
| portfolioOwnerID required | integer Example: 201 The ID of the portfolio owner record. |
| includes | string Example: includes=contact Comma-separated list of related data to include in the response.
Available values: |
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). |
{- "portfolioOwner": {
- "portfolioOwnerID": "641",
- "portfolioID": "279",
- "contactID": "2992",
- "percentOwned": "0.0000",
- "percentDistributed": "10.0000",
- "overrideContactPayoutSettings": "0",
- "payeeName": null,
- "payoutTypeID": "2",
- "achDetailsCiphertextID": null,
- "achAccountNumberTruncated": null,
- "achAccountTypeID": null,
- "achIsCorporateAccount": "0"
}
}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.
portfolioOwnerID does not belong to the specified portfolioIDachDetails are returned as empty stringsGET /portfolios/{portfolioID}/owners/{portfolioOwnerID} - Owner detail (includes truncated account number)GET /portfolios/{portfolioID}/owners - List all portfolio owners| portfolioID required | integer Example: 150 The ID of the portfolio. |
| portfolioOwnerID required | integer Example: 201 The ID of the portfolio owner record. |
required | object |
{- "achDetails": {
- "nameOnAccount": "John Smith",
- "routingNumber": "021000021",
- "accountNumber": "123456784567"
}
}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.
statementBatchID)statementFileCount and statementAttachmentCount are derived counts, not arraysGET /portfolios/{portfolioID}/statements - Statements for a single portfolioGET /portfolios/statements/{statementID} - Single statement detail with includesGET /portfolios/statements/batches/search - Search statement batches| 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.
|
| 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. |
| 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 |
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. |
[- {
- "statement": {
- "statementID": "7787",
- "portfolioID": "377",
- "statementBatchID": "772",
- "startDate": "2026-04-14",
- "endDate": "2026-05-13",
- "statementPeriodTypeID": "1",
- "statementStatusID": "4",
- "name": "04/14/2026 to 05/13/2026",
- "statementFileCount": "8",
- "statementAttachmentCount": "0"
}, - "portfolio": {
- "portfolioID": "377",
- "name": "Andrew Luck LLC",
- "contacts": "[{\"contactID\":\"4845\",\"percentOwned\":\"100.0000\",\"percentDistributed\":\"100.0000\",\"name\":\"Andrew Luck\"},{\"contactID\":\"3983\",\"percentOwned\":\"0.0000\",\"percentDistributed\":\"0.0000\",\"name\":\"Alexander the Great\"}]"
}, - "statementSetting": {
- "statementSettingID": "62",
- "name": "2023"
}
}
]Returns a paginated list of owner statements for a specific portfolio. Use /portfolios/statements/search
for cross-portfolio queries with additional filters.
GET /portfolios/statements/search - Account-wide statement search with advanced filtersGET /portfolios/statements/{statementID} - Single statement detail with includesGET /portfolios/statements/{statementID}/download - Download statement as a ZIP archive| portfolioID required | integer Example: 150 The ID of the portfolio whose statements to list. |
| 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. |
| 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 |
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. |
[- {
- "statement": {
- "statementID": 7787,
- "statementBatchID": 772,
- "statementSettingID": 62,
- "portfolioID": 377,
- "name": "04/14/2026 to 05/13/2026",
- "startDate": "2026-04-14",
- "endDate": "2026-05-13",
- "statementPeriodTypeID": 1,
- "statementStatusID": 4,
- "beginningBalance": "14016.85",
- "endingBalance": "13997.10",
- "totalDistributionAmount": "0.00",
- "reserveAmount": "500.00",
- "additionalReserveAmount": "0.00",
- "unpaidBillAmount": "4969.50",
- "workOrderEstimateAmount": "11111.00",
- "totalIncomeAmount": "-18.75",
- "totalExpenseAmount": "1.00",
- "totalAdjustmentAmount": "0.00",
- "dateTimeCreated": "2026-04-23 00:08:03",
- "publicUUID": "96b998c8-719f-4c65-8de6-c8cc2775d336",
- "dateTimeAccessExpires": "2026-05-07 00:08:03",
- "publicVerificationCode": "652152",
- "message": "<p>YOYOYOYOYOYOYOYYOYOY</p>"
}, - "statementSetting": {
- "statementSettingID": 62,
- "name": "2023",
- "isActive": 1,
- "settings": {
- "statement": {
- "includeBills": true,
- "includeBillAttachments": false,
- "includeBillAttachmentsWithMarkup": false,
- "includeBillAttachmentsWithDiscount": false,
- "includeWorkOrders": true,
- "includeWorkOrderAttachments": false,
- "includeBalanceMessage": false,
- "combineDiscount": false,
- "combineMarkup": false,
- "includePrepayments": false
}, - "modules": {
- "summary": {
- "isActive": true,
- "pageBreak": true
}, - "taxSummary": {
- "isActive": true,
- "pageBreak": true,
- "includePrepayments": true
}, - "transactionSummary": {
- "isActive": true,
- "includeYearToDate": true,
- "excludeZeroBalanceAccounts": true,
- "pageBreak": true
}, - "transactionDetails": {
- "isActive": true,
- "pageBreak": true,
- "isMultiUnitConsolidated": false,
- "isTransactionConsolidated": false,
- "isIncomeConsolidated": false,
- "isManagementFeeConsolidated": false,
- "propertyTransactionsOrderField": 1,
- "includeTransactionRunningBalance": true,
- "includePayeePayer": true,
- "includePropertyReserveAmount": true,
- "includeNetValues": false,
- "propertyOrderType": 2
}, - "ledger": {
- "isActive": true,
- "pageBreak": true,
- "includePayeePayer": true
}, - "openWorkOrders": {
- "isActive": true,
- "pageBreak": true
}, - "closedWorkOrders": {
- "isActive": true,
- "pageBreak": true,
- "includeClosingComments": 0
}, - "unpaidBills": {
- "isActive": true,
- "pageBreak": true
}, - "notes": {
- "isActive": true,
- "pageBreak": true
}, - "units": {
- "isActive": true,
- "pageBreak": false,
- "showBalance": true,
- "showTenants": true,
- "showMoveInDate": 1
}
}
}
}
}
]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.
publicUUID and publicVerificationCode — these are unrelated to API authportfolio — The portfolio this statement belongs tostatementFiles — List of generated statement files (PDFs, HTML exports) attached to the statementfileAttachments — File attachments manually added to the statementGET /portfolios/statements/{statementID}/download - Download the statement as a ZIP archiveGET /portfolios/{portfolioID}/statements - All statements for the portfolioGET /portfolios/statements/search - Account-wide statement search| statementID required | integer Example: 4501 The ID of the statement to retrieve. |
| includes | string Example: includes=portfolio,statementFiles Comma-separated list of related data to include in the response.
Available values: |
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). |
{- "statement": {
- "statementID": 7787,
- "statementBatchID": 772,
- "statementSettingID": 62,
- "portfolioID": 377,
- "name": "04/14/2026 to 05/13/2026",
- "startDate": "2026-04-14",
- "endDate": "2026-05-13",
- "statementPeriodTypeID": 1,
- "statementStatusID": 4,
- "beginningBalance": "14016.85",
- "endingBalance": "13997.10",
- "totalDistributionAmount": "0.00",
- "reserveAmount": "500.00",
- "additionalReserveAmount": "0.00",
- "unpaidBillAmount": "4969.50",
- "workOrderEstimateAmount": "11111.00",
- "totalIncomeAmount": "-18.75",
- "totalExpenseAmount": "1.00",
- "totalAdjustmentAmount": "0.00",
- "dateTimeCreated": "2026-04-23 00:08:03",
- "publicUUID": "96b998c8-719f-4c65-8de6-c8cc2775d336",
- "dateTimeAccessExpires": "2026-05-07 00:08:03",
- "publicVerificationCode": "652152",
- "message": "<p>test</p>"
}
}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.
GET /portfolios/statements/{statementID} - Statement detail and metadata (includes statementFiles)GET /portfolios/{portfolioID}/statements - All statements for the portfolio| statementID required | integer Example: 4501 The ID of the statement to download. |
| 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. |
{- "error": "Statement 4501 not found"
}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.
statementCount is a derived count of statements in the batch (subquery)statementSetting fields are nullable — a batch may not have an associated setting templatestartFromLastStatement is 1, each portfolio's start date is calculated from its most recent statement end date, so startDate will be nullGET /portfolios/statements/batches/{statementBatchID} - Single batch detail with optional statement listGET /portfolios/statements/search - Search individual statements across all batches| 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.
|
| 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. |
| 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 |
required | object Batch summary fields projected by the search query. |
required | object Statement setting template linked to this batch, if any. |
[- {
- "statementBatch": {
- "statementBatchID": "773",
- "statementStatusID": "2",
- "statementPeriodTypeID": "1",
- "isAutoPublished": "0",
- "startFromLastStatement": "1",
- "startDate": null,
- "endDate": "2026-05-13",
- "message": "<p>YOYOYOYOYOYOYOYYOYOY</p>",
- "dateTimeCreated": "2026-04-23 18:14:49",
- "name": "Last Statement through 05/13/2026",
- "statementCount": "1"
}, - "statementSetting": {
- "statementSettingID": null,
- "name": null
}
}
]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.
verifyAccessToPortfolioBatch; users with restricted portfolio access see
the batch but individual statements may be flagged restricted: 1includes=statements, each statement item includes a restricted flag (0 or 1) indicating
whether the authenticated user can access that statement's portfoliostatements — All statements in the batch, each with portfolio data and a restricted access flagrestrictions — Adds a fullAccess boolean indicating whether the user has unrestricted batch accessGET /portfolios/statements/batches/search - Paginated batch list with advanced filtersGET /portfolios/statements/{statementID} - Single statement detailGET /portfolios/statements/search - Account-wide statement search (filter by statementBatchID)| statementBatchID required | integer Example: 88 The ID of the statement batch to retrieve. |
| includes | string Example: includes=statements,restrictions Comma-separated list of related data to include in the response.
Available values: |
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. |
Array of objects All statements in the batch (if includes=statements). |
{- "statementBatch": {
- "statementBatchID": "754",
- "statementSettingID": null,
- "statementStatusID": "4",
- "statementPeriodTypeID": "1",
- "name": "02/14/2026 to 03/13/2026",
- "startFromLastStatement": "0",
- "startDate": "2026-02-14",
- "endDate": "2026-03-13",
- "isAutoPublished": "0",
- "sendNotifications": "1",
- "message": "<p>This is February - March statement</p>",
- "statementBatchFileStatusID": "3",
- "fileID": "9157",
- "dateTimeCreated": "2026-02-18 20:22:38"
}
}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.
isActive and dateTimeModifiedMin filtersincludesisActive defaults to 1 (active properties only). Pass isActive=0 to retrieve inactive properties.search matches against name, address, address2, city, stateID, and postalCode.image — joins the property image record onto each result rowportfolio — joins the portfolio record onto each result rowGET /properties/search — advanced filtered search with more filter optionsGET /properties/{propertyID} — retrieve a single property with full include supportPOST /properties — create a new property| 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 |
| 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: |
| 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 |
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) |
[- {
- "property": {
- "propertyID": "1",
- "propertyImageID": "2",
- "propertyTypeID": "2",
- "isMultiUnit": "1",
- "isActive": "1",
- "portfolioID": "7",
- "managementFeeSettingID": "2",
- "name": null,
- "countryID": "US",
- "address": "998 Kings St",
- "streetNumber": "998",
- "streetName": "Kings St",
- "address2": null,
- "stateID": "FL",
- "city": "Fort Myers",
- "postalCode": "33912",
- "latitude": "26.54817200",
- "longitude": "-81.80203600",
- "county": null,
- "assignedToUserID": null,
- "legalDescription": null,
- "maintenanceLimitAmount": "500.00",
- "yearBuilt": "1989",
- "dateTimeModified": "2021-04-13 14:54:43",
- "dateTimeDeactivated": null,
- "isFromImport": "0",
- "dateInsuranceExpires": null,
- "dateWarrantyExpires": "2023-09-30",
- "maintenanceNotes": "HomeWarranty Company Name = Allstate, policy#87345hh334",
- "applicationTemplateID": null,
- "reserveAmount": "200.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": "2021-04-13 14:54:43",
- "importSourceKey": null
}, - "token": "1776856045"
}
]Creating a property will also create the associated Unit record.
object (property_create) | |
object (unit_for_property_create) |
object (property) |
{- "property": {
- "portfolioID": "416",
- "name": "Test Name",
- "address": "9910 Estero Oaks Drive",
- "address2": "115",
- "city": "Fort Myers",
- "stateID": "FL",
- "countryID": "US",
- "postalCode": "33967",
- "propertyTypeID": 1,
- "dateContractBegins": "01/01/2026",
- "dateContractEnds": null,
- "managementFeeSettingID": "93",
- "maintenanceLimitAmount": "375.00",
- "yearBuilt": "2001",
- "dateInsuranceExpires": null,
- "dateWarrantyExpires": null,
- "assignedToUserID": "501195",
- "reserveAmount": "500.00",
- "isMultiUnit": false,
- "county": "Lee",
- "legalDescription": "Legal description",
- "leaseReturnChargeAmount": "15.00"
}, - "unit": {
- "rent": "1000.00",
- "deposit": "1000.00",
- "beds": "1",
- "fullBaths": "1",
- "size": 917
}
}{- "property": {
- "propertyID": "732",
- "propertyImageID": "1",
- "propertyTypeID": "1",
- "isMultiUnit": "0",
- "isActive": "1",
- "portfolioID": "416",
- "managementFeeSettingID": "93",
- "name": "Test Name",
- "countryID": "US",
- "address": "9910 Estero Oaks Drive",
- "streetNumber": "9910",
- "streetName": "Estero Oaks Drive",
- "address2": "115",
- "stateID": "FL",
- "city": "Fort Myers",
- "postalCode": "33967",
- "latitude": "26.45128710",
- "longitude": "-81.79257720",
- "county": "Lee",
- "assignedToUserID": "501195",
- "legalDescription": "Legal description",
- "maintenanceLimitAmount": "375.00",
- "yearBuilt": "2001",
- "dateTimeModified": "2026-04-22 09:20:37",
- "dateTimeDeactivated": null,
- "isFromImport": "0",
- "dateInsuranceExpires": null,
- "dateWarrantyExpires": null,
- "maintenanceNotes": null,
- "applicationTemplateID": null,
- "reserveAmount": "500.00",
- "markupPercent": null,
- "markupAmount": null,
- "markupAmountMin": null,
- "markupAmountMax": null,
- "dateContractBegins": "2026-01-01",
- "dateContractEnds": null,
- "commercialClassTypeID": null,
- "salesTaxSettingID": null,
- "withholdingTaxAgencyID": null,
- "insuranceCompany": null,
- "insuranceAgent": null,
- "insurancePolicyNumber": null,
- "insuranceContactDetails": null,
- "leaseReturnChargeAmount": "15.00",
- "propertyShowingProviderID": null,
- "dateTimeCreated": "2026-04-22 09:20:37",
- "importSourceKey": null
}
}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.
portfolioIDs[]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 existspropertyGroup.propertyGroupNames is a comma-separated string of all group names the property belongs to, or null if the property is not in any groupportfolio.contacts is a JSON-encoded string containing the array of owner contacts and their ownership percentagesprimaryImage.filePath is "noimage" when no image has been uploadedGET /properties - Basic paginated list (no denormalized portfolio/lease/group data)GET /properties/{propertyID} - Full property detail with includesPOST /properties - Create a new property| 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. |
| isMultiUnit | integer Enum: 0 1 Filter by multi-unit flag. |
| isVacant | integer Enum: 0 1 Filter by vacancy status. |
| isNonRevenue | integer Enum: 0 1 Filter by non-revenue flag. |
| portfolioIDs[] | Array of integers Example: portfolioIDs[]=416 Filter to properties belonging to one or more portfolios. Pass multiple values as |
| portfolioGroupIDs[] | Array of integers Example: portfolioGroupIDs[]=32 Filter to properties in portfolios belonging to one or more portfolio groups. Pass multiple values as |
| propertyGroupIDs[] | Array of integers Example: propertyGroupIDs[]=1 Filter to properties belonging to one or more property groups. Pass multiple values as |
| 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
|
| assignedToUserIDs[] | Array of integers Example: assignedToUserIDs[]=501195 Filter to properties assigned to one or more users. Pass multiple values as |
| tagIDs[] | Array of integers Example: tagIDs[]=33 Filter to properties tagged with one or more tags. Pass multiple values as |
| 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 |
required | object |
required | object |
required | object |
required | object |
required | object |
[- {
- "property": {
- "isActive": "1",
- "propertyID": "150",
- "name": "Amanda LLC",
- "address": "3894 Afton Circle",
- "streetNumber": "3894",
- "streetName": "Afton Circle",
- "address2": null,
- "city": "Sarasota",
- "stateID": "FL",
- "postalCode": "34233",
- "portfolioID": "1",
- "propertyTypeID": "6",
- "assignedToUserID": "2052",
- "isMultiUnit": "0",
- "dateTimeCreated": "2022-08-26 15:27:39",
- "dateTimeModified": "2024-09-11 17:30:01",
- "dateTimeDeactivated": null,
- "unitCount": "1",
- "activeUnitCount": "1",
- "isVacant": "0"
}, - "portfolio": {
- "portfolioID": "1",
- "name": "Amanda LLC",
- "contacts": "[{\"contactID\":\"2\",\"percentOwned\":\"75.0000\",\"percentDistributed\":\"100.0000\",\"name\":\"Amanda H. Wilson\"},{\"contactID\":\"4471\",\"percentOwned\":\"25.0000\",\"percentDistributed\":\"0.0000\",\"name\":\"chris\"}]"
}, - "lease": {
- "leaseID": "436",
- "tenants": [
- "Timmy Smith",
- "new tenant test"
]
}, - "propertyGroup": {
- "propertyGroupNames": "Dallas, Adrians Group"
}, - "primaryImage": {
- "propertyImageID": "498",
- "filePath": "399075966618a901cbd60687adafd",
- "fileType": "jpg"
}
}
]Retrieves a single property by its ID, including all stored attributes and any optionally requested related data via the includes parameter.
verifyDirectAccess.400 if the property is not found.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.image — the property image recordunits — 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 unitunit — 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 toportfolioBalances — portfolio ledger balance details (requires portfolio)portfolios — array of portfolio history records for the propertyowners — array of portfolio owner records with associated contact datamanagementFeeSetting — management fee setting recordinspections — array of inspection records for the propertyassociations — array of association records with contact dataapplicationTemplate — application template record (if applicationTemplateID is set)propertyShowingProvider — showing provider record (if propertyShowingProviderID is set)GET /properties — list all propertiesGET /properties/search — search properties with filtersPOST /properties/{propertyID} — update a propertyDELETE /properties/{propertyID} — delete a propertyPOST /properties/{propertyID}/activate — activate a propertyPOST /properties/{propertyID}/deactivate — deactivate a property| propertyID required | integer Example: 732 The unique property ID |
| includes | string Example: includes=unit,lease,portfolio,owners Comma-separated list of related data to include in the response. Available values: |
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) |
{- "property": {
- "propertyID": "732",
- "propertyImageID": "1",
- "propertyTypeID": "1",
- "isMultiUnit": "0",
- "isActive": "1",
- "portfolioID": "416",
- "managementFeeSettingID": "93",
- "name": "Test Name",
- "countryID": "US",
- "address": "9910 Estero Oaks Drive",
- "streetNumber": "9910",
- "streetName": "Estero Oaks Drive",
- "address2": "215",
- "stateID": "FL",
- "city": "Fort Myers",
- "postalCode": "33967",
- "latitude": "26.45118010",
- "longitude": "-81.79250610",
- "county": "Lee",
- "assignedToUserID": "501195",
- "legalDescription": "Legal description",
- "maintenanceLimitAmount": "375.00",
- "yearBuilt": "2001",
- "dateTimeModified": "2026-04-22 10:46:19",
- "dateTimeDeactivated": null,
- "isFromImport": "0",
- "dateInsuranceExpires": null,
- "dateWarrantyExpires": null,
- "maintenanceNotes": null,
- "applicationTemplateID": null,
- "reserveAmount": "500.00",
- "markupPercent": null,
- "markupAmount": null,
- "markupAmountMin": null,
- "markupAmountMax": null,
- "dateContractBegins": "2026-01-01",
- "dateContractEnds": null,
- "commercialClassTypeID": null,
- "salesTaxSettingID": null,
- "withholdingTaxAgencyID": null,
- "insuranceCompany": null,
- "insuranceAgent": null,
- "insurancePolicyNumber": null,
- "insuranceContactDetails": null,
- "leaseReturnChargeAmount": "15.00",
- "propertyShowingProviderID": null,
- "dateTimeCreated": "2026-04-22 09:20:37",
- "importSourceKey": null
}
}| propertyID required | integer Example: 728 |
| propertyID required | integer |
| propertyTypeID | integer (property_types) Enum: 1 2 3 4 5 6 7 8 9 10
|
| 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. |
| address | string |
| address2 | string or null |
| stateID | string 2-digit state code for the property, ex. |
| 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 |
object (property) |
{- "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"
}{- "property": {
- "propertyID": "732",
- "propertyImageID": "1",
- "propertyTypeID": "1",
- "isMultiUnit": "0",
- "isActive": "1",
- "portfolioID": "416",
- "managementFeeSettingID": "93",
- "name": "Test Name",
- "countryID": "US",
- "address": "9910 Estero Oaks Drive",
- "streetNumber": "9910",
- "streetName": "Estero Oaks Drive",
- "address2": "215",
- "stateID": "FL",
- "city": "Fort Myers",
- "postalCode": "33967",
- "latitude": "26.45118010",
- "longitude": "-81.79250610",
- "county": "Lee",
- "assignedToUserID": "501195",
- "legalDescription": "Legal description",
- "maintenanceLimitAmount": "375.00",
- "yearBuilt": "2001",
- "dateTimeModified": "2026-04-22 10:39:55",
- "dateTimeDeactivated": null,
- "isFromImport": "0",
- "dateInsuranceExpires": null,
- "dateWarrantyExpires": null,
- "maintenanceNotes": null,
- "applicationTemplateID": null,
- "reserveAmount": "500.00",
- "markupPercent": null,
- "markupAmount": null,
- "markupAmountMin": null,
- "markupAmountMax": null,
- "dateContractBegins": "2026-01-01",
- "dateContractEnds": null,
- "commercialClassTypeID": null,
- "salesTaxSettingID": null,
- "withholdingTaxAgencyID": null,
- "insuranceCompany": null,
- "insuranceAgent": null,
- "insurancePolicyNumber": null,
- "insuranceContactDetails": null,
- "leaseReturnChargeAmount": "15.00",
- "propertyShowingProviderID": null,
- "dateTimeCreated": "2026-04-22 09:20:37",
- "importSourceKey": null
}
}Permanently deletes a property. The property cannot be deleted if it has any accounting transactions on record, including voided ones.
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.POST /properties/{propertyID}/deactivate — deactivate a property instead of deleting it| propertyID required | integer Example: 728 |
| propertyID required | integer |
| propertyImageID required | integer |
| propertyTypeID required | integer (property_types) Enum: 1 2 3 4 5 6 7 8 9 10
|
| 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. |
| address required | string |
| stateID required | string 2-digit state code for the property, ex. |
| 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> |
{- "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
}| propertyID required | integer Example: 707 |
| propertyID required | integer |
| propertyImageID required | integer |
| propertyTypeID required | integer (property_types) Enum: 1 2 3 4 5 6 7 8 9 10
|
| 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. |
| address required | string |
| stateID required | string 2-digit state code for the property, ex. |
| 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> |
{- "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"
}Activates a property, setting it to active status.
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.activateUnit has no effect.| propertyID required | integer Example: 707 |
| activateUnit | boolean Default: false Example: activateUnit=1 When |
| propertyID required | integer |
| propertyImageID required | integer |
| propertyTypeID required | integer (property_types) Enum: 1 2 3 4 5 6 7 8 9 10
|
| 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. |
| address required | string |
| stateID required | string 2-digit state code for the property, ex. |
| 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> |
{- "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"
}| propertyID required | integer Example: 707 |
| unitID required | string |
| propertyID required | string |
| isActive required | string Whether the unit is 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.
|
| 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.
|
| leaseNotes | string or null |
| entryInstructions | string or null |
| vendorEntryInstructions | string or null |
| maintenanceNotes | string or null |
[- {
- "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"
}
]Creates a new unit under the specified property. On success, returns the full unit record (same shape as GET /properties/{propertyID}/units/{unitID}).
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 propertyGET /properties/{propertyID}/units/{unitID} — retrieve the created unit with includesDELETE /properties/{propertyID}/units/{unitID} — delete a unit| propertyID required | integer Example: 548 |
| 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 |
| 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.
|
| nonRevenueTypeID | integer or null Non-revenue type identifier. Only applicable when |
| nonRevenueStartDate | string or null <date> Date the unit became non-revenue. Only applicable when |
| 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 |
required | object (unit) |
{- "rent": "1500.00"
}{- "unit": {
- "unitID": "715",
- "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": "Estero",
- "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:04:43",
- "dateTimeModified": "2026-04-22 20:04:43",
- "dateTimeDeactivated": null,
- "propertyManagerID": null,
- "commercialSpaceTypeID": null,
- "isNonRevenue": "0",
- "nonRevenueTypeID": null,
- "nonRevenueStartDate": null,
- "isUtilityBillingEnabled": "1",
- "isFromImport": "0",
- "importSourceKey": null,
- "leaseNotes": null,
- "entryInstructions": null,
- "vendorEntryInstructions": null,
- "maintenanceNotes": null
}
}| propertyID required | integer Example: 707 |
| unitID required | integer Example: 585 |
| unitID required | string |
| propertyID required | string |
| isActive required | string Whether the unit is 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.
|
| 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.
|
| leaseNotes | string or null |
| entryInstructions | string or null |
| vendorEntryInstructions | string or null |
| maintenanceNotes | string or null |
{- "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"
}Updates an existing unit. On success, returns the full unit record (same shape as GET /properties/{propertyID}/units/{unitID}).
unitID, isActive, dateTimeCreated, latitude, longitude) are ignored.nonRevenueStartDate accepts MM/DD/YYYY on input; the response returns it in YYYY-MM-DD format.GET /properties/{propertyID}/units/{unitID} — retrieve the unit with optional includesPOST /properties/{propertyID}/units — create a new unitDELETE /properties/{propertyID}/units/{unitID} — delete a unit| propertyID required | integer Example: 548 |
| unitID required | integer Example: 716 |
| 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 |
| 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.
|
| nonRevenueTypeID | string or null Non-revenue type identifier. Only applicable when |
| nonRevenueStartDate | string or null Date the unit became non-revenue. Accepts |
| isUtilityBillingEnabled | string Whether utility billing is enabled for this unit.
|
| 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. |
required | object (unit) |
| propertyManager | any or null Property manager record (if |
{- "rent": "1750.00"
}{- "unit": {
- "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 Coral",
- "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
}, - "propertyManager": false
}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.
GET /properties/{propertyID}/units/{unitID} — retrieve the unit before deletingPOST /properties/units/{unitID}/deactivate — deactivate instead of permanently deletingDELETE /properties/{propertyID} — delete the parent property (requires all units deleted first)| propertyID required | integer Example: 548 |
| unitID required | integer Example: 716 |
| unitID required | string |
| propertyID required | string |
| isActive required | string Whether the unit is 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.
|
| 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.
|
| leaseNotes | string or null |
| entryInstructions | string or null |
| vendorEntryInstructions | string or null |
| maintenanceNotes | string or null |
{- "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
}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.
isActive = 1). Returns 400 if the property is inactive.GET /properties/{propertyID}/units/{unitID}).POST /properties/units/{unitID}/deactivate — deactivate a unitGET /properties/{propertyID}/units/{unitID} — retrieve the current unit statePOST /properties/{propertyID}/activate — activate the parent property| unitID required | integer Example: 528 |
required | object (unit) |
{- "unit": {
- "unitID": "528",
- "propertyID": "548",
- "propertyImageID": "1582",
- "isActive": "1",
- "name": "Unit 2",
- "address": "9470 Corkscrew Palms Circle",
- "streetNumber": "9470",
- "streetName": "Corkscrew Palms Circle",
- "address2": null,
- "stateID": "FL",
- "city": "Estero",
- "postalCode": "33928",
- "latitude": "26.43062330",
- "longitude": "-81.79700870",
- "rent": "1500.00",
- "deposit": null,
- "size": null,
- "beds": "0",
- "fullBaths": "0",
- "halfBaths": "0",
- "leaseID": null,
- "dateTimeCreated": "2025-05-13 22:00:45",
- "dateTimeModified": "2026-04-22 20:55:44",
- "dateTimeDeactivated": null,
- "propertyManagerID": null,
- "commercialSpaceTypeID": null,
- "isNonRevenue": "0",
- "nonRevenueTypeID": null,
- "nonRevenueStartDate": null,
- "isUtilityBillingEnabled": "1",
- "isFromImport": "0",
- "importSourceKey": null,
- "leaseNotes": null,
- "entryInstructions": null,
- "vendorEntryInstructions": null,
- "maintenanceNotes": null
}
}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.
leaseID is set). Returns 400 with a leaseID error.isActive: "0" and dateTimeDeactivated populated.POST /properties/units/{unitID}/activate — re-activate a deactivated unitGET /properties/{propertyID}/units/{unitID} — retrieve the current unit statePOST /properties/{propertyID}/deactivate — deactivate the parent property| unitID required | integer Example: 528 |
required | object (unit) |
{- "unit": {
- "unitID": "528",
- "propertyID": "548",
- "propertyImageID": "1582",
- "isActive": "0",
- "name": "Unit 2",
- "address": "9470 Corkscrew Palms Circle",
- "streetNumber": "9470",
- "streetName": "Corkscrew Palms Circle",
- "address2": null,
- "stateID": "FL",
- "city": "Estero",
- "postalCode": "33928",
- "latitude": "26.43062330",
- "longitude": "-81.79700870",
- "rent": "1500.00",
- "deposit": null,
- "size": null,
- "beds": "0",
- "fullBaths": "0",
- "halfBaths": "0",
- "leaseID": null,
- "dateTimeCreated": "2025-05-13 22:00:45",
- "dateTimeModified": "2026-04-22 20:53:30",
- "dateTimeDeactivated": "2026-04-22 20:53:30",
- "propertyManagerID": null,
- "commercialSpaceTypeID": null,
- "isNonRevenue": "0",
- "nonRevenueTypeID": null,
- "nonRevenueStartDate": null,
- "isUtilityBillingEnabled": "1",
- "isFromImport": "0",
- "importSourceKey": null,
- "leaseNotes": null,
- "entryInstructions": null,
- "vendorEntryInstructions": null,
- "maintenanceNotes": null
}
}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.
latitudeMin, latitudeMax, longitudeMin, longitudeMax bounding boxdateTimeModifiedMin / dateTimeModifiedMaximage.small and image.large are null when no primary property image has been uploadedimage.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 unitpropertyGroups.names is null when the property does not belong to any groupportfolio.contacts is a JSON-encoded string containing the array of owner contacts with ownership and distribution percentagesunit.leaseID reflects the current active lease on the unit, or null if vacantisWebsiteActive, 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 listingEach 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 listingGET /listings/files/{id}/preview — returns the file inline (for browser rendering)GET /listings/files/{id}/download — downloads the fileGET /properties/listings - Basic paginated listing index with fewer filtersGET /properties/{propertyID}/listings/{unitID} - Full listing detail including activation flags and includesGET /listings/{propertyListingID}/files - All files (photos) attached to a specific listing| 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. |
| isWebsiteActive | integer Enum: 0 1 Example: isWebsiteActive=1 Filter by website syndication status. |
| 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. |
| 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.
|
| 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
|
| 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 |
| portfolioIDs[] | Array of integers Example: portfolioIDs[]=338 Filter to listings belonging to one or more portfolios. Pass multiple values as |
| 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 |
| 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 |
| 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 |
required | object |
required | object |
required | object |
required | object |
required | object |
required | object |
required | object Primary property image with pre-signed CDN URLs. Both |
[- {
- "listing": {
- "propertyListingID": "685",
- "isActive": "1",
- "propertyID": "707",
- "unitID": "686",
- "headline": "Beautiful Townhouse",
- "description": "Bright and spacious 3-bedroom townhouse in a quiet neighborhood.",
- "lotSize": "0.5",
- "depositDescription": "First month + security deposit required",
- "availabilityDate": "2026-04-07",
- "advertisedDate": "2026-04-07",
- "virtualTour": null,
- "lockboxNumber": null,
- "lockboxDescription": null,
- "parkingSpaces": "2",
- "parkingTypeID": "1",
- "areaInformation": "Walking distance to shops and restaurants",
- "schools": "Gateway Charter",
- "leaseDescription": "1 or 2 year leases available",
- "name": "Tilden Katz",
- "phone": "+17787878787",
- "phoneExtension": null,
- "email": "leasing@example.com",
- "secondaryName": null,
- "secondaryPhone": null,
- "secondaryPhoneExtension": null,
- "secondaryEmail": null,
- "size": "2000",
- "isFurnished": "1",
- "acceptDogs": "1",
- "acceptCats": "0",
- "petDescription": "Small dogs under 25 lbs only. Pet deposit required.",
- "acceptSmoking": "0",
- "acceptAssistance": "1",
- "isGasIncluded": "0",
- "isElectricIncluded": "1",
- "isWaterIncluded": "1",
- "isSewageIncluded": "1",
- "isGarbageIncluded": "1",
- "isLandscapingIncluded": "1",
- "isCableIncluded": "1",
- "isInternetIncluded": "1",
- "isSnowRemovalIncluded": "0",
- "isPoolServiceIncluded": "0",
- "heatType": null,
- "coolingSystemTypeID": "1",
- "heatingSystemTypeID": "7",
- "dateTimeCreated": "2026-04-07 17:33:25",
- "dateTimeModified": "2026-04-07 17:42:05",
- "dateTimeDeactivated": null
}, - "unit": {
- "unitID": "686",
- "name": "Townhouse in Salve Domino",
- "address": "1234 Test Road",
- "address2": null,
- "city": "Fort Myers",
- "stateID": "FL",
- "postalCode": "33908",
- "leaseID": null,
- "latitude": "26.51013730",
- "longitude": "-81.94257010",
- "marketRent": "2500.00",
- "rent": "2500.00",
- "marketDeposit": "1250.00",
- "deposit": "1250.00",
- "beds": "3",
- "fullBaths": "2",
- "halfBaths": "1",
- "baths": "3",
- "size": "2000",
- "propertyManagerID": null
}, - "property": {
- "propertyID": "707",
- "propertyTypeID": "4",
- "countryID": "US",
- "address": "1234 Test Road",
- "address2": null,
- "city": "Fort Myers",
- "stateID": "FL",
- "postalCode": "33908",
- "name": "Townhouse in Salve Domino",
- "yearBuilt": "2012",
- "assignedToUserID": "891861",
- "propertyShowingProviderID": null,
- "showingProviderID": null
}, - "propertyGroups": {
- "names": null
}, - "portfolio": {
- "portfolioID": "338",
- "name": "123 test",
- "contacts": "[{\"contactID\":\"4330\",\"percentOwned\":\"100.0000\",\"percentDistributed\":\"100.0000\",\"name\":\"Jane Smith\"}]"
}, - "propertyManager": {
- "propertyManagerID": null,
- "name": null
}, - "image": {
- "propertyImageID": "1664",
}
}
]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.
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} |
Dimensions | Use Case |
|---|---|---|
small |
Thumbnail | List views, vacancy boards, map pins |
large |
Full size | Detail pages, syndication feeds, lightboxes |
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 listingGET /listings/files/{id}/preview — returns a file inline (for browser display)GET /listings/files/{id}/download — downloads a file as an attachmentGET /properties/listings/search - Returns image.small and image.large for each resultGET /listings/{propertyListingID}/files - All uploaded listing photos and media| account required | string Example: 123pm Your account subdomain (e.g. |
| propertyID required | integer Example: 707 The |
| imageHash required | string Example: e66a65f69d53ff3a19265b69efe9 The image hash component from the |
| size required | string Enum: "small" "large" Example: small
|
{- "error": "Not found"
}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.
objectTypeID and objectID are required. The request will return 400 if either is missing.verifyAccessToObjectType — the authenticated account must have access to the given object.dateTimeUpdated descending (most recently active conversations first).GET /contacts/conversations/{id} — retrieve a single conversation with its messagesPOST /contacts/conversations — send a new email message (creates or extends a conversation)| objectTypeID required | integer Example: objectTypeID=4 The object type the conversations belong to. See the Object Types reference for valid values. Common values:
|
| objectID required | integer Example: objectID=1050 The primary key of the object identified by |
| page | integer Default: 1 The page number for pagination |
| pageSize | integer Default: 25 Number of items per page |
| 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 |
| 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. |
[- {
- "emailConversationID": 301,
- "objectTypeID": 4,
- "objectID": 1050,
- "subject": "Lease renewal - Unit 4B",
- "dateTimeCreated": "2024-08-15T10:30:00Z",
- "dateTimeUpdated": "2024-09-02T14:45:00Z",
- "emailMessageCount": 5
}, - {
- "emailConversationID": 287,
- "objectTypeID": 4,
- "objectID": 1050,
- "subject": "Move-in inspection follow up",
- "dateTimeCreated": "2024-07-01T09:00:00Z",
- "dateTimeUpdated": "2024-07-03T11:20:00Z",
- "emailMessageCount": 2
}
]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.
Contacts: Send Messages permission.recipients is required. Addresses matching the system mail domain or noreply are silently filtered out.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.attachments must already exist in the system.GET /contacts/conversations — list conversations for an objectGET /contacts/conversations/{id} — retrieve a conversation with its message history| 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:
|
| objectID required | integer Primary key of the object identified by |
| additionalRecipients | Array of strings <email> Additional To recipients to include alongside |
| bcc | Array of strings <email> BCC recipients — array of email address strings. |
object Email template options. | |
| attachments | Array of integers Array of |
| copySender | string Enum: "0" "1" Pass |
| 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. |
required | object |
{- "additionalRecipients": [
- "test@gmail.com"
], - "bcc": [
- "test@gmail.com"
], - "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": {
- "message": "",
- "emailTemplateID": "8"
}, - "attachments": [ ],
- "copySender": "1",
- "inputs": { },
- "recipients": [
- "mackenzie.walker@rentvine.com",
- "adriano@rentvine.com"
], - "templateObjectTypeID": 2,
- "objectTypeID": 4,
- "objectID": "2982"
}{- "emailConversation": {
- "emailConversationID": 301,
- "templateObjectTypeID": 2,
- "objectTypeID": 4,
- "objectID": 2982,
- "subject": "Your Florida Lease Template",
- "dateTimeCreated": "2024-10-22T14:00:00Z",
- "dateTimeUpdated": "2024-10-22T14:00:00Z"
}
}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.
400 if the conversation is not found.verifyAccessToObjectType using the conversation's objectTypeID and objectID — the authenticated account must have access to the associated object.messages include, only the base conversation record is returned.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).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 objectPOST /contacts/conversations — send a new email message / create a conversation| id required | integer Example: 301 The unique identifier of the email conversation ( |
| includes | string Example: includes=messages Comma-separated list of related data to include in the response. Available values: |
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. |
{- "emailConversation": {
- "emailConversationID": 301,
- "templateObjectTypeID": null,
- "objectTypeID": 4,
- "objectID": 1050,
- "subject": "Lease renewal - Unit 4B",
- "dateTimeCreated": "2024-08-15T10:30:00Z",
- "dateTimeUpdated": "2024-09-02T14:45:00Z"
}
}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).
chatObjectTypeID and objectID are required. Restricted accounts that omit these will receive a 400 error.chatObjectTypeID and objectID to retrieve messages across all objects.search performs a full-text match against the message body.message.*, user.*, and contact.* keys.1 - Work Order2 - Lease3 - Portfolio4 - Vendor5 - ApplicantGET /chat/messages/{id} — retrieve a single message with file attachmentsPOST /chat/messages — create a new chat messageGET /chat/messages/stats — get unread message count for a specific object| 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.
|
| objectID | integer Example: objectID=1050 Primary key of the object identified by |
| 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 |
| 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. |
| 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 |
| 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 |
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. |
[- {
- "message.messageID": 4201,
- "message.chatObjectTypeID": 2,
- "message.objectID": 1050,
- "message.roleTypeID": 1,
- "message.userID": 42,
- "message.contactID": null,
- "message.message": "Lease renewal documents have been sent to your email.",
- "message.messageLinkPreviewMeta": null,
- "message.isSharedWithTenant": 1,
- "message.isSharedWithCosigner": 0,
- "message.isSharedWithVendor": 0,
- "message.isSharedWithOwner": 0,
- "message.isReadByManager": 1,
- "message.isReadByTenant": 0,
- "message.isReadByVendor": 0,
- "message.isReadByOwner": 0,
- "message.isRead": 1,
- "message.dateTimeCreated": "2024-09-02T14:45:00Z",
- "message.fileAttachments": [ ],
- "user.userID": 42,
- "user.firstName": "Alex",
- "user.lastName": "Johnson",
- "user.email": "alex.johnson@123pm.com",
- "contact.contactID": null,
- "contact.contactTypeID": null,
- "contact.name": null
}, - {
- "message.messageID": 4185,
- "message.chatObjectTypeID": 2,
- "message.objectID": 1050,
- "message.roleTypeID": 2,
- "message.userID": null,
- "message.contactID": 620,
- "message.message": "Hi, I would like to renew for another 12 months.",
- "message.messageLinkPreviewMeta": null,
- "message.isSharedWithTenant": 1,
- "message.isSharedWithCosigner": 0,
- "message.isSharedWithVendor": 0,
- "message.isSharedWithOwner": 0,
- "message.isReadByManager": 1,
- "message.isReadByTenant": 1,
- "message.isReadByVendor": 0,
- "message.isReadByOwner": 0,
- "message.isRead": 1,
- "message.dateTimeCreated": "2024-09-01T09:10:00Z",
- "message.fileAttachments": [
- {
- "fileAttachmentID": 550,
- "fileID": 320,
- "title": "Signed Lease Draft.pdf",
- "fileName": "signed_lease_draft.pdf",
- "fileType": "application/pdf",
- "previewFileName": null
}
], - "user.userID": null,
- "user.firstName": null,
- "user.lastName": null,
- "user.email": null,
- "contact.contactID": 620,
- "contact.contactTypeID": 2,
- "contact.name": "Jane Smith"
}
]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.
roleTypeID is always set to Manager (1) server-side and cannot be overridden by the client.chatObjectTypeID and objectID.attachments is an array of fileID integers referencing files that already exist in the system.isSharedWithTenant, isSharedWithVendor, isSharedWithOwner, isSharedWithCosigner) default to 0 if omitted.GET /chat/messages — list messages for an objectGET /chat/messages/{id} — retrieve a single message| chatObjectTypeID required | integer Enum: 1 2 3 4 5 The chat object type identifying what kind of object the message belongs to.
|
| objectID required | integer Primary key of the object identified by |
| 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 |
required | object |
required | Array of objects File attachments on the created message (empty if none were supplied). |
{- "attachments": [ ],
- "message": "<p>test</p>",
- "chatObjectTypeID": 2,
- "objectID": 2982,
- "isSharedWithTenant": "1",
- "isSharedWithCosigner": "1"
}{- "message": {
- "messageID": 1026,
- "chatObjectTypeID": 2,
- "objectID": 2982,
- "roleTypeID": 1,
- "userID": 501195,
- "contactID": null,
- "shortUrlID": 808166,
- "message": "<p>test</p>",
- "messageLinkPreviewMeta": null,
- "isSharedWithTenant": 1,
- "isSharedWithCosigner": 0,
- "isSharedWithVendor": 0,
- "isSharedWithOwner": 0,
- "isSharedWithApplicant": 0,
- "isReadByManager": 1,
- "isReadByTenant": 0,
- "isReadByCosigner": 0,
- "isReadByVendor": 0,
- "isReadByOwner": 0,
- "isReadByApplicant": 0,
- "dateTimeCreated": "2026-04-27 12:50:14"
}, - "fileAttachments": [ ]
}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}).
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 numberGET /messages/texts/{id} — retrieve a single text message| 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 |
| contactID | integer Optional contact ID for UI context. Not stored on the text message record. |
required | object |
{- "contactID": "3816",
- "to": "+14436420607",
- "message": "test"
}{- "textMessage": {
- "textMessageID": 914,
- "isInbound": 0,
- "from": "+12393606531",
- "to": "+14436420607",
- "message": "\"test\"",
- "fileAttachments": null,
- "sentByUserID": 501195,
- "dateTimeSent": "2026-04-27 12:54:12"
}
}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.
load endpoint instead)phoneNumber must be provided as digits only (no +, dashes, or spaces).POST /messages/texts/send — send a new text messageGET /messages/texts/{id} — retrieve a single text message| phoneNumber required | integer Example: 14436420607 Phone number digits including country code, without |
| 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. |
| 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 |
| 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). |
[- {
- "textMessageID": 8801,
- "isInbound": 0,
- "from": "+19995550100",
- "to": "+14436420607",
- "message": "test",
- "fileAttachments": null,
- "sentByUserID": 42,
- "dateTimeSent": "2024-10-22T14:00:00Z"
}, - {
- "textMessageID": 8798,
- "isInbound": 1,
- "from": "+14436420607",
- "to": "+19995550100",
- "message": "Got it, thanks!",
- "fileAttachments": null,
- "sentByUserID": null,
- "dateTimeSent": "2024-10-22T13:55:00Z"
}
]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.
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 applicationsGET /screening/applications/{applicationID} — retrieve a single application| 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. |
| isGenericApplicationEnabled required | string Enum: "0" "1" Whether a generic (non-property-specific) application link is active. |
| isAvailableUnitsOnly required | string Enum: "0" "1" Restricts the application portal to units marked as available. |
| autoAssignApplicationFromProperty required | string Enum: "0" "1" Automatically assigns the property's manager to incoming applications. |
| autoSendProspectConfirmationEmail required | string Enum: "0" "1" Sends a confirmation email to applicants upon submission. |
| 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. |
{- "screeningSettingID": "1",
- "applicationProviderID": "1",
- "isApplicationEnabled": "1",
- "applicationUrl": "",
- "isGenericApplicationEnabled": "1",
- "genericApplicationTemplateID": "2",
- "isAvailableUnitsOnly": "1",
- "autoAssignApplicationFromProperty": "1",
- "autoSendProspectConfirmationEmail": "1",
- "genericApplicationTemplateName": "Commercial Application"
}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.
page and pageSize to paginate through results.applicationID (most recent first).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 detailsGET /screening/applications/{applicationID}/summary — retrieve a full summary with applicant dataPOST /screening/applications/{applicationID}/status — update an application's status| 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. |
| 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 |
required | object |
required | object |
required | object |
required | object |
required | object |
[- {
- "application": {
- "applicationID": "1702",
- "assignedToUserID": null,
- "number": "101653",
- "unitID": "709",
- "countryID": "US",
- "address": "9470 Corkscrew Palms Circle",
- "address2": "315",
- "city": "Estero",
- "stateID": "FL",
- "postalCode": "33928",
- "applicants": "Walter DeVeas",
- "dateTimeCreated": "2026-04-20 13:59:38",
- "dateTimeModified": "2026-04-25 19:07:46"
}, - "status": {
- "applicationStatusID": "6",
- "primaryApplicationStatusID": "6",
- "isSystemStatus": "1",
- "name": "Approved"
}, - "unit": {
- "propertyID": "730",
- "name": null,
- "address": "9470 Corkscrew Palms Circle",
- "address2": "315",
- "city": "Estero",
- "stateID": "FL",
- "postalCode": "33928"
}, - "property": {
- "propertyID": "730",
- "name": null,
- "address": "9470 Corkscrew Palms Circle",
- "address2": "315",
- "city": "Estero",
- "stateID": "FL",
- "postalCode": "33928",
- "portfolioID": "450"
}, - "lease": {
- "leaseID": "2997",
- "startDate": "2026-04-20",
- "endDate": "2027-04-30",
- "tenants": [
- "Walter William DeVeas"
]
}
}, - {
- "application": {
- "applicationID": "1701",
- "assignedToUserID": null,
- "number": "101652",
- "unitID": "624",
- "countryID": "US",
- "address": "10201 Arcos Avenue",
- "address2": null,
- "city": "Estero",
- "stateID": "FL",
- "postalCode": "33928",
- "applicants": "Jane Smith",
- "dateTimeCreated": "2026-04-20 13:37:52",
- "dateTimeModified": "2026-04-20 13:37:52"
}, - "status": {
- "applicationStatusID": "2",
- "primaryApplicationStatusID": "2",
- "isSystemStatus": "1",
- "name": "Submitted"
}, - "unit": {
- "propertyID": "649",
- "name": null,
- "address": "10201 Arcos Avenue",
- "address2": null,
- "city": "Estero",
- "stateID": "FL",
- "postalCode": "33928"
}, - "property": {
- "propertyID": "649",
- "name": null,
- "address": "10201 Arcos Avenue",
- "address2": null,
- "city": "Estero",
- "stateID": "FL",
- "postalCode": "33928",
- "portfolioID": "377"
}, - "lease": {
- "leaseID": null,
- "startDate": null,
- "endDate": null,
- "tenants": [ ]
}
}
]Returns the core details of a single rental application by its ID, including the application record and its current status.
404 if the application does not exist or is not accessible to the authenticated account.status object reflects both the custom sub-status (applicationStatusID) and the underlying system-level status (primaryApplicationStatusID).GET /screening/applications — list all applicationsGET /screening/applications/{applicationID}/summary — full summary with applicant details and screening dataPOST /screening/applications/{applicationID}/status — update the application status| applicationID required | integer Example: 1702 The unique identifier of the application. |
required | object |
required | object |
{- "application": {
- "applicationID": "1702",
- "number": "101653",
- "primaryApplicationStatusID": "6",
- "applicationStatusID": "6",
- "assignedToUserID": null,
- "unitID": "709",
- "countryID": "US",
- "address": "9470 Corkscrew Palms Circle",
- "address2": "315",
- "city": "Estero",
- "stateID": "FL",
- "postalCode": "33928",
- "dateTimeCreated": "2026-04-20 13:59:38",
- "dateTimeModified": "2026-04-25 19:07:46"
}, - "status": {
- "applicationStatusID": "6",
- "primaryApplicationStatusID": "6",
- "isSystemStatus": "1",
- "name": "Approved",
- "orderIndex": "5"
}
}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.
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 dataGET /screening/applicants/{applicantID}/tab/application — full applicant form data for a specific applicantPOST /screening/reports — order screening reports for applicantsPOST /screening/applications/{applicationID}/status — update the application status| applicationID required | integer Example: 1702 The unique identifier of the application. |
required | object |
{- "application": {
- "applicationID": "1702",
- "applicationStatusID": "6",
- "assignedToUserID": null,
- "primaryApplicationStatusID": "6",
- "summary": {
- "applicantNames": "Walter William DeVeas",
- "rent": "1000",
- "incomeRatio": "4.00",
- "availableBy": null,
- "combinedIncome": 4000,
- "applicants": 1,
- "occupants": 0,
- "animals": 0,
- "requestedMoveIn": "--",
- "numberOfBedrooms": "0",
- "numberOfBathrooms": "0",
- "numberOfHalfBathrooms": "0",
- "expectedRatio": 2.5,
- "address": "9470 Corkscrew Palms Circle",
- "address2": "315",
- "city": "Estero",
- "stateID": "FL",
- "postalCode": "33928",
- "countryID": "US",
- "dateTimeCreated": "2026-04-20 13:59:38",
- "dateTimeModified": "2026-04-25 19:07:46",
- "number": "101653",
- "propertyID": "730",
- "prospectID": null,
- "unitID": "709",
- "leaseID": "2997",
- "paymentCount": 0,
- "messageCount": 1,
- "fileCount": 0,
- "noteCount": 0,
- "letterCount": 0
}, - "applicants": [
- {
- "applicantID": "1664",
- "name": "Walter William DeVeas",
- "email": "applicant@example.com",
- "phone": null,
- "dob": "1-1-2001",
- "ssn": "3333",
- "templateID": "1",
- "applicantType": null,
- "isApiUser": false,
- "isManagerSubmitted": true,
- "dateTimeCreated": "2026-04-20 09:59:38",
- "data": [
- {
- "field": "application",
- "label": "Application",
- "icon": "newspaper",
- "status": "complete",
- "value": "Submitted",
- "BadgeLabel": "Apr 20, 2026",
- "BadgeStatus": 1,
- "showIcon": false
}, - {
- "field": "credit",
- "label": "Credit",
- "icon": "credit-card",
- "screeningReportModeID": null,
- "value": "Error",
- "showIcon": true,
- "BadgeLabel": "Error",
- "BadgeStatus": 2
}
]
}
], - "pendingApplicants": [ ],
- "legacyReports": [ ],
- "screeningReportModeID": "2"
}
}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).
applicationStatusID must reference a valid system or custom status ID.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.400 if applicationStatusID is missing or invalid.404 if the application does not exist or is not accessible.GET /screening/applications/{applicationID} — retrieve current application statusGET /screening/applications/{applicationID}/summary — full application review data| applicationID required | integer Example: 1702 The unique identifier of the application. |
| applicationStatusID required | string ID of the status to set on the application. Common system status IDs:
|
| sendEmail | boolean Default: false Whether to send a notification email to the applicant on status change. |
object Email configuration. Required when |
required | object The updated application record. |
required | object The application status record set by this action. |
{- "applicationStatusID": "6",
- "sendEmail": true,
- "email": {
- "emailTemplateID": "22",
- "copySender": "0",
- "bcc": [
- "manager@example.com"
], - "additionalRecipients": [
- "owner@example.com"
], - "subject": "Your application is approved!",
- "message": "<p>Hello {{ application.applicantNames | list }},</p><p>Your application has been approved for {{ application.address }}. Please keep an eye out for an email to activate your tenant portal where you will be able to enter a payment to secure the unit.</p><p>Thanks!</p>",
- "attachments": [ ],
- "recipients": [
- "applicant@example.com"
]
}
}{- "application": {
- "applicationID": "1702",
- "number": "101653",
- "primaryApplicationStatusID": "1",
- "applicationStatusID": "1",
- "assignedToUserID": "45",
- "unitID": "709",
- "countryID": "US",
- "address": "9470 Corkscrew Palms Circle",
- "address2": "315",
- "city": "Estero",
- "stateID": "FL",
- "postalCode": "33928",
- "dateTimeCreated": "2026-04-20 13:59:38",
- "dateTimeModified": "2026-04-27 12:57:59"
}, - "status": {
- "applicationStatusID": "1",
- "primaryApplicationStatusID": "1",
- "isSystemStatus": "1",
- "name": "Pending",
- "orderIndex": "1"
}
}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.
builder field structure to display custom application sections and fields404 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 applicantsGET /screening/applications/{applicationID} — application core recordPOST /screening/reports — order screening reports for this applicant| applicantID required | integer Example: 1664 The unique identifier of the applicant. |
| 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 |
object Employment history entries. | |
| occupants | object or null Additional occupants in |
object Vehicle information entries. | |
object Dynamic form builder structure defining the application sections and fields. |
{- "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": {
- "items": [
- {
- "_id": 1,
- "name": "Acme Property Management",
- "phone": "+12395550188",
- "position": "Property Manager",
- "monthlySalary": "4000.00",
- "isCurrentEmployer": "Yes"
}
], - "maxID": 1
}, - "occupants": null,
- "vehicles": {
- "items": [
- {
- "_id": 1,
- "make": "Nissan",
- "model": "Altima",
- "color": "Gray",
- "yearBuilt": "2017"
}
], - "maxID": 1
}
}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.
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 — Credit2 — Criminal3 — EvictionapplicationProviderID in screening settings).400 if any applicant ID does not belong to the specified application or if reportTypeIDs is empty.GET /screening/applications/{applicationID}/summary to check report status.GET /screening/settings — verify screening provider is configuredGET /screening/applications/{applicationID}/summary — check report status after orderingGET /screening/applicants/{applicantID}/tab/application — view applicant details before ordering| 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.
|
Confirmation that screening report requests were submitted.
{- "applicationID": "1702",
- "applicantIDs": [
- 1664
], - "reportTypeIDs": [
- 1,
- 2,
- 3
]
}{- "success": true,
- "message": "Screening reports have been ordered"
}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.
customFieldCategoryObjectTypeID values for use in POST /custom-field-categories and GET /custom-field-category-object-types/{customFieldCategoryObjectTypeID}categoryCount reflects the total number of custom field categories assigned to this object typefieldCount reflects the total number of individual custom fields across all categories for this object typeGET /custom-field-category-object-types/{customFieldCategoryObjectTypeID} — list all categories and fields for a specific object typePOST /custom-field-categories — create a new custom field category under one of these object typesGET /custom-fields/values/{objectTypeID}/{objectID} — retrieve field values for an object| customFieldCategoryObjectTypeID required | integer Unique identifier for the object type. Use this value as |
| 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. |
[- {
- "customFieldCategoryObjectTypeID": 1,
- "categoryCount": "17",
- "fieldCount": "20"
}, - {
- "customFieldCategoryObjectTypeID": 2,
- "categoryCount": "13",
- "fieldCount": "12"
}, - {
- "customFieldCategoryObjectTypeID": 3,
- "categoryCount": "9",
- "fieldCount": "10"
}, - {
- "customFieldCategoryObjectTypeID": 4,
- "categoryCount": "55",
- "fieldCount": "73"
}, - {
- "customFieldCategoryObjectTypeID": 5,
- "categoryCount": "121",
- "fieldCount": "185"
}, - {
- "customFieldCategoryObjectTypeID": 6,
- "categoryCount": "18",
- "fieldCount": "27"
}, - {
- "customFieldCategoryObjectTypeID": 8,
- "categoryCount": "9",
- "fieldCount": "22"
}, - {
- "customFieldCategoryObjectTypeID": 9,
- "categoryCount": "3",
- "fieldCount": "2"
}, - {
- "customFieldCategoryObjectTypeID": 10,
- "categoryCount": "4",
- "fieldCount": "7"
}, - {
- "customFieldCategoryObjectTypeID": 11,
- "categoryCount": "3",
- "fieldCount": "6"
}, - {
- "customFieldCategoryObjectTypeID": 12,
- "categoryCount": "1",
- "fieldCount": "3"
}, - {
- "customFieldCategoryObjectTypeID": 13,
- "categoryCount": "1",
- "fieldCount": "0"
}
]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.
customFieldID keys when constructing a payload for POST /custom-fields/values/{objectTypeID}/{objectID}customFieldCategoryObjectTypeID must be a valid ID from GET /custom-field-category-object-typesorderIndexcustomFields array listing all fields in that category, ordered by their own orderIndexsettings property is a JSON-encoded string that may contain a description and an options array for dropdown (fieldTypeID: 3) fieldsGET /custom-fields/values/{objectTypeID}/{objectID} for thatGET /custom-field-category-object-types — list all available object typesGET /custom-fields/values/{objectTypeID}/{objectID} — retrieve field values for a specific objectPOST /custom-fields/values/{objectTypeID}/{objectID} — save field values for a specific objectPOST /custom-field-categories — create a new category under this object type| customFieldCategoryObjectTypeID required | integer Example: 1 The ID of the object type whose categories and fields should be returned. Obtain valid IDs from |
| 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. |
[- {
- "customFieldCategoryID": "43",
- "customFieldCategoryObjectTypeID": "1",
- "name": "Owner Birthday",
- "orderIndex": "0",
- "customFields": [
- {
- "customFieldID": "402",
- "customFieldCategoryID": "43",
- "name": "Rentvine Test",
- "fieldTypeID": "2",
- "customFieldCategoryObjectTypeID": "1",
- "settings": "{\"description\":null}",
- "orderIndex": "0",
- "valueColumn": "paragraph_2"
}, - {
- "customFieldID": "72",
- "customFieldCategoryID": "43",
- "name": "Owner Birthdayy",
- "fieldTypeID": "5",
- "customFieldCategoryObjectTypeID": "1",
- "settings": "{\"description\":null}",
- "orderIndex": "3",
- "valueColumn": "date_3"
}
]
}, - {
- "customFieldCategoryID": "31",
- "customFieldCategoryObjectTypeID": "1",
- "name": "Insurance",
- "orderIndex": "2",
- "customFields": [
- {
- "customFieldID": "55",
- "customFieldCategoryID": "31",
- "name": "Insurance Carrier",
- "fieldTypeID": "1",
- "customFieldCategoryObjectTypeID": "1",
- "settings": "{\"description\":null}",
- "orderIndex": "0",
- "valueColumn": "text_1"
}, - {
- "customFieldID": "56",
- "customFieldCategoryID": "31",
- "name": "Cancellation Date",
- "fieldTypeID": "5",
- "customFieldCategoryObjectTypeID": "1",
- "settings": "{\"description\":null}",
- "orderIndex": "1",
- "valueColumn": "date_2"
}
]
}, - {
- "customFieldCategoryID": "184",
- "customFieldCategoryObjectTypeID": "1",
- "name": "Trash List",
- "orderIndex": "5",
- "customFields": [ ]
}
]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.
name and customFieldCategoryObjectTypeID together must be unique — a category with the same name cannot be created more than once for the same object typecustomFieldCategoryObjectTypeID must reference a valid object type from GET /custom-field-category-object-typesGET /custom-field-category-object-types — list available object types to find a valid customFieldCategoryObjectTypeIDGET /custom-field-category-object-types/{customFieldCategoryObjectTypeID} — verify the new category appears in the list after creationGET /custom-fields/values/{objectTypeID}/{objectID} — retrieve field values for objects in this category's object type| 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 |
| 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.
|
| options | string JSON-encoded array of options for Dropdown fields. Use |
required | object |
{- "name": "test-docs",
- "fieldTypeID": 1,
- "options": "[]",
- "customFieldCategoryID": "43",
- "customFieldCategoryObjectTypeID": "1"
}{- "customField": {
- "customFieldID": "610",
- "customFieldCategoryID": "43",
- "name": "test-docs",
- "fieldTypeID": "1",
- "customFieldCategoryObjectTypeID": "1",
- "settings": "{\"description\":null}",
- "orderIndex": "7",
- "valueColumn": "text_12"
}
}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.
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 typenull for the value propertycustomFieldCategoryID and ordered by orderIndexsettings property is a JSON-encoded string containing field metadata such as dropdown options and descriptionPOST /custom-fields/values/{objectTypeID}/{objectID} — save or update field values for the objectGET /custom-field-category-object-types — list all object types and their category countsGET /custom-field-category-object-types/{customFieldCategoryObjectTypeID} — list categories and fields for an object type| objectTypeID required | integer Example: 5 The ID of the object type (e.g., |
| objectID required | integer Example: 577 The unique ID of the specific object whose custom field values are being retrieved. |
| 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. |
[- {
- "customFieldCategoryID": "12",
- "customFieldCategoryObjectTypeID": "5",
- "name": "Alarm System",
- "orderIndex": "1",
- "fields": [
- {
- "customFieldID": "25",
- "customFieldCategoryID": "12",
- "name": "Numeric Alarm Pad",
- "fieldTypeID": "8",
- "customFieldCategoryObjectTypeID": "5",
- "settings": "{\"description\":null}",
- "orderIndex": "0",
- "valueColumn": "integer_2",
- "value": "123"
}, - {
- "customFieldID": "50",
- "customFieldCategoryID": "12",
- "name": "Alarm Provider",
- "fieldTypeID": "3",
- "customFieldCategoryObjectTypeID": "5",
- "settings": "{\"description\":null,\"options\":\"[\\\"Simply Safe\\\",\\\"Tyco\\\",\\\"ADT\\\"]\"}",
- "orderIndex": "1",
- "valueColumn": "text_7",
- "value": null
}
]
}, - {
- "customFieldCategoryID": "26",
- "customFieldCategoryObjectTypeID": "5",
- "name": "WiFi Code",
- "orderIndex": "2",
- "fields": [
- {
- "customFieldID": "40",
- "customFieldCategoryID": "26",
- "name": "Code",
- "fieldTypeID": "1",
- "customFieldCategoryObjectTypeID": "5",
- "settings": "{\"description\":null}",
- "orderIndex": "0",
- "valueColumn": "text_3",
- "value": null
}
]
}
]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.
nullobjectTypeID and objectID in the path must match a valid objectcustomFieldID values cast to stringscustomFieldCategoryID is required in the payload to scope the write to the correct categorynull clears any previously stored valueGET /custom-fields/values/{objectTypeID}/{objectID})GET /custom-fields/values/{objectTypeID}/{objectID} — retrieve current field values for the objectGET /custom-field-category-object-types/{customFieldCategoryObjectTypeID} — list categories and fields to know which customFieldID keys are valid| objectTypeID required | integer Example: 5 The ID of the object type (e.g., |
| objectID required | integer Example: 577 The unique ID of the specific object whose custom field values are being saved. |
| 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 |
| 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. |
{- "364": null,
- "469": "test",
- "customFieldCategoryID": "96"
}[- {
- "customFieldCategoryID": "12",
- "customFieldCategoryObjectTypeID": "5",
- "name": "Alarm System",
- "orderIndex": "1",
- "fields": [
- {
- "customFieldID": "25",
- "customFieldCategoryID": "12",
- "name": "Numeric Alarm Pad",
- "fieldTypeID": "8",
- "customFieldCategoryObjectTypeID": "5",
- "settings": "{\"description\":null}",
- "orderIndex": "0",
- "valueColumn": "integer_2",
- "value": "123"
}, - {
- "customFieldID": "50",
- "customFieldCategoryID": "12",
- "name": "Alarm Provider",
- "fieldTypeID": "3",
- "customFieldCategoryObjectTypeID": "5",
- "settings": "{\"description\":null,\"options\":\"[\\\"Simply Safe\\\",\\\"Tyco\\\",\\\"ADT\\\"]\"}",
- "orderIndex": "1",
- "valueColumn": "text_7",
- "value": null
}
]
}
]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 |
|---|---|
| 1 | Account |
| 2 | User |
| 3 | Contact |
| 4 | Lease |
| 5 | Bill |
| 6 | Property |
| 7 | Unit |
| 8 | Deposit |
| 9 | Accounting Transaction |
| 10 | Accounting Transaction Entry |
| 11 | Portfolio |
| 12 | Payout |
| 13 | Bank Adjustment |
| 14 | Company |
| 15 | Statement |
| 16 | Work Order |
| 17 | Inspection |
| 18 | Inspection Area |
| 19 | Inspection Item |
| 20 | Application |
| 21 | Applicant |
| 22 | Bank Transfer |
| 23 | Listing |
| 24 | Appliance |
| 25 | Text Message |
| 26 | Email Message |
| 27 | Work Order Estimate |
| 28 | Settlement |
| 29 | Lease Tenant |
| 30 | Email Template |
| 31 | Note |
| 32 | File Attachment |
| 33 | Vendor Bill |
| 34 | Document Transaction |
| 35 | Document Envelope |
| 36 | Application Template |
| 37 | Recurring Bill |
| 38 | Chat Message |
| 39 | Reconciliation |
| 40 | Path |
| 41 | Payout Return |
| 42 | Management Fee Setting |
| 43 | Additional Management Fee Setting |
| 44 | Accounting Setting |
| 45 | Posting Setting |
| 46 | Late Fee Setting |
| 47 | Statement Setting |
| 48 | Payout Batch |
| 49 | Letter |
| 50 | Reminder |
| 51 | Review |