Connect Retool to Yardi using a REST API Resource configured for Yardi's SOAP or REST API endpoints. Yardi's API typically requires a partnership agreement and credentials provided by Yardi directly. Build property management operations panels that display resident records, track work orders, manage lease data, and monitor property performance across multi-family and commercial portfolios.
| Fact | Value |
|---|---|
| Tool | Yardi |
| Category | Other |
| Method | REST API Resource |
| Difficulty | Advanced |
| Time required | 60 minutes |
| Last updated | April 2026 |
Build a Yardi Property Management Operations Panel in Retool
Yardi Voyager and Yardi Breeze are the most widely deployed property management platforms in North America, used by operators managing everything from a few dozen units to portfolios of tens of thousands of apartments and commercial spaces. While Yardi's native interface is comprehensive, operations teams and asset managers frequently need custom dashboards that surface specific data views, combine property data with external sources, or provide simplified interfaces for field staff and regional managers.
A Retool integration with Yardi enables building purpose-built operations panels: a resident management dashboard that shows all current leases with expiration dates, renewal status, and outstanding balances; a maintenance tracking panel that lists open work orders by property, priority, and assigned vendor; and an asset performance dashboard that combines occupancy data from Yardi with financial reporting from a separate accounting system. These panels reduce the need for Yardi training for peripheral staff and give property managers faster access to the data they need most.
Yardi's API architecture is complex and varies significantly by product. Yardi Voyager — the enterprise flagship — uses a SOAP-based API that predates modern REST conventions, requiring XML-formatted requests and responses. Yardi Breeze — the newer SMB product — has a more modern REST API. Retool handles both patterns through its REST API Resource, with Yardi SOAP calls routed through standard POST requests using XML bodies. Because all requests proxy through Retool's server, Yardi credentials remain secure and CORS is not a concern.
Integration method
Yardi does not have a native Retool connector. Integration requires Yardi's API credentials, which are provided through Yardi's partner program or enterprise support engagement — self-serve API access is not available. Depending on your Yardi product and version (Yardi Voyager, Yardi Breeze, RentCafe), you may work with Yardi's SOAP-based Voyager API, the newer REST API for Breeze, or specific product APIs. Retool's REST API Resource handles all configurations with Retool proxying all requests server-side to keep credentials secure.
Prerequisites
- A Yardi Voyager, Yardi Breeze, or other Yardi product account with API access enabled — contact Yardi Support or your Account Manager to request API credentials (API access requires a paid licensing agreement)
- API credentials from Yardi: typically a username, password, server name, database name, and interface entity code for Voyager; or API key for Breeze
- Knowledge of your Yardi product version and deployment type (cloud-hosted vs on-premises), as this determines the API endpoint URL
- A Retool account with permission to create Resources and Configuration Variables
- Familiarity with SOAP/XML web services if using Yardi Voyager, or REST API concepts for Yardi Breeze
Step-by-step guide
Obtain Yardi API access and understand your API type
Yardi API access is not self-service — it must be arranged through Yardi directly. Contact Yardi Support at your organization's support portal (support.yardi.com) or speak with your Yardi Account Manager to request API credentials. Specify that you are building a Retool integration and need API access for the Yardi products you use. Yardi will provide credentials and documentation specific to your product. Understanding which API you are working with is essential before configuring Retool. Yardi Voyager (enterprise) uses a SOAP-based web service — requests are XML-formatted POST calls to a SOAP endpoint. The Voyager API base URL follows the pattern https://{yardi-server}/Voyager/webservice/itfYardiGuestCard.asmx (endpoint names vary by integration type — resident data, work orders, and financial data each have separate WSDL endpoints). Yardi Breeze (SMB) uses a more modern REST API with JSON responses and API key authentication. RentCafe (the resident-facing portal platform) has its own API for marketing and leasing data. Your Yardi Account Manager will provide the specific endpoint URLs, WSDL files, and authentication parameters for your account. Store all Yardi credentials in Retool Settings → Configuration Variables: create YARDI_USERNAME, YARDI_PASSWORD, YARDI_SERVER_NAME, YARDI_DATABASE, and YARDI_ENTITY as separate secret variables. This structure matches the Voyager API's required parameters.
Pro tip: Request Yardi's API documentation for your specific product and version when you contact them for credentials. Yardi's documentation is not publicly available and varies significantly between product versions. Having the WSDL file for Voyager SOAP services is essential.
Expected result: You have Yardi API credentials, documentation, and the specific endpoint URL for your Yardi product, stored as configuration variables in Retool.
Create the Yardi REST API Resource in Retool
In Retool, click the Resources tab and Add Resource. Select REST API. Name it 'Yardi API'. For the Base URL, enter the base URL of your Yardi server. For Yardi Voyager (cloud-hosted), this is typically https://{your-yardi-server-name}.yardipcv.com — your Yardi Account Manager will confirm the exact hostname. For on-premises Voyager deployments, the URL is your internal server address (e.g., https://yardi.yourcompany.com). For Yardi Breeze, the API URL is typically https://api.yardibreeze.com or similar — confirm with Yardi documentation. For Voyager SOAP endpoints, the Authentication method depends on how your integration is configured. Many Voyager integrations embed credentials in the SOAP XML body rather than in HTTP headers. In the Retool resource, select 'No Auth' as the authentication type and include credentials in the query body. For Yardi Breeze REST API, select API Key authentication with the header name and value provided by Yardi. Add a Content-Type header: for SOAP requests, use text/xml; charset=utf-8; for REST/JSON, use application/json. Add an Accept header set to text/xml for SOAP or application/json for REST. Click Save Changes. Because Yardi Voyager's SOAP interface embeds authentication in every request body, you will configure credential substitution in each query using configuration variable references rather than resource-level authentication headers.
Pro tip: If your Yardi deployment is on-premises within a private network, you will need Retool self-hosted (running in your VPC) or an SSH tunnel configured in the resource settings to reach the Yardi server. Retool Cloud cannot reach private IP addresses without additional network configuration.
Expected result: A 'Yardi API' resource appears in the Retool Resources list with the correct base URL and content type headers for your Yardi product.
Build a Voyager SOAP query to retrieve resident data
Yardi Voyager's SOAP API uses XML request envelopes — each query is a POST request with an XML body following the specific WSDL schema for that operation. To retrieve resident (tenant) data, create a query in the Retool Code panel, select the Yardi API resource, set Method to POST, and set Path to the specific SOAP endpoint path (e.g., /Voyager/webservice/itfResidentData.asmx or the endpoint provided in your Yardi documentation). In the Body section, set Body Type to Raw and Body to an XML SOAP envelope. The SOAP envelope structure for Yardi Voyager embeds authentication credentials (server name, database, username, password, and entity) in the SOAP body within a 'Credentials' element — not in HTTP headers. Construct the SOAP body dynamically using Retool's {{ }} syntax to inject configuration variable values. In the Response Transformer (Advanced tab), write a JavaScript transformer to parse the XML response. Retool's REST API queries return XML responses as strings — parse them using the browser's DOMParser or a JSON transformation. Use the pattern: const parser = new DOMParser(); const xmlDoc = parser.parseFromString(data, 'text/xml') to access XML nodes. Extract resident records from the parsed XML and return a flat array of JavaScript objects for use in Retool Table components.
1// Yardi Voyager SOAP Request body — configure as Raw Body2`<?xml version="1.0" encoding="utf-8"?>3<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"4 xmlns:xsd="http://www.w3.org/2001/XMLSchema"5 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">6 <soap:Body>7 <GetResidents xmlns="http://tempuri.org/">8 <UserName>{{ retoolContext.configVars.YARDI_USERNAME }}</UserName>9 <Password>{{ retoolContext.configVars.YARDI_PASSWORD }}</Password>10 <ServerName>{{ retoolContext.configVars.YARDI_SERVER_NAME }}</ServerName>11 <Database>{{ retoolContext.configVars.YARDI_DATABASE }}</Database>12 <PlatformType>SQL Server</PlatformType>13 <InterfaceEntity>{{ retoolContext.configVars.YARDI_ENTITY }}</InterfaceEntity>14 <YardiPropertyId>{{ propertySelect.value }}</YardiPropertyId>15 </GetResidents>16 </soap:Body>17</soap:Envelope>`Pro tip: The exact element names in the Yardi SOAP envelope depend on your specific Voyager interface configuration. Yardi provides WSDL files that document the exact schema for each operation — use a SOAP client or Postman to test the SOAP call before building it in Retool.
Expected result: The resident data query executes without SOAP fault errors and returns an XML response that the transformer parses into a flat array of resident records.
Parse Yardi XML responses and build the dashboard UI
Yardi Voyager returns data as XML, which requires parsing in Retool's JavaScript transformer. Create a transformer attached to your resident data query (in the query's Advanced tab, enable the transformer toggle). Write a parser that extracts resident elements from the SOAP response XML. The transformer receives the raw XML string in the 'data' variable. Use DOMParser to traverse the XML DOM and extract fields. Map each resident node's child elements to JavaScript object properties: tenant code, name, unit number, property code, lease start date, lease end date, market rent, actual charges, and resident status. With parsed data available, build the dashboard UI. Drag a Select component for property selection — populate it from a separate Yardi query that fetches all properties (/GetPropertyList equivalent). When the property selection changes, trigger the resident data query via event handler. Drag a Table component, bind its data to the resident query's transformer output ({{ getResidents.data }}), and configure columns: unit, tenant_name, lease_end, market_rent, status (with conditional formatting: 'Current' in green, 'Notice' in yellow, 'Past' in red). Add a search Text Input bound to the Table's search property. For work orders, create a separate SOAP query for the Yardi maintenance interface and display results in a second tab. For complex multi-property Yardi integrations with custom data transformations, RapidDev can help design the full query architecture and XML parsing layer.
1// Transformer: parse Yardi Voyager XML resident response2// 'data' is the raw XML string from the SOAP response3try {4 const parser = new DOMParser();5 const xmlDoc = parser.parseFromString(data, 'text/xml');6 const residents = xmlDoc.getElementsByTagName('Resident');7 const result = [];89 for (let i = 0; i < residents.length; i++) {10 const r = residents[i];11 const getText = (tag) => r.getElementsByTagName(tag)[0]?.textContent || '';12 result.push({13 unit: getText('UnitCode'),14 tenant_code: getText('TenantCode'),15 tenant_name: getText('Name'),16 lease_start: getText('LeaseFrom'),17 lease_end: getText('LeaseTo'),18 market_rent: parseFloat(getText('MarketRent')) || 0,19 status: getText('Status'),20 property: getText('PropertyCode')21 });22 }23 return result;24} catch (e) {25 return [{ error: 'XML parse error: ' + e.message }];26}Pro tip: If the SOAP response contains a SOAP fault instead of data, the fault message is nested in the XML at a path like Envelope > Body > Fault > faultstring. Add a check at the start of your transformer: if (data.includes('<faultstring>')) to extract and display the fault message for debugging.
Expected result: The property management dashboard displays resident records in a searchable Table with lease expiration date sorting and status-based conditional formatting.
Add work order management and property performance metrics
Extend the dashboard with maintenance and performance views. For work orders, create a second SOAP query targeting Yardi's work order or service request interface. The Yardi SOAP endpoint for work orders varies by Voyager module — common options are GetWorkOrders, GetServiceRequests, or similar depending on your Voyager configuration. Follow the same SOAP envelope pattern as the resident query, substituting the operation name and parameters. Work order data typically returns: work order number, unit code, description, priority (Emergency, Routine, Priority), status (New, Assigned, Completed), assigned vendor, date created, and scheduled date. Add a second tab to your dashboard's Tab Container labeled 'Maintenance'. Drag a Table component bound to the work order query data. Configure column formatting: priority 'Emergency' in red, 'Priority' in orange, 'Routine' in blue. Add days-open as a calculated column using a JavaScript transformer: const daysOpen = Math.floor((Date.now() - new Date(row.created_date).getTime()) / (1000 * 60 * 60 * 24)). For portfolio metrics, create a JavaScript transformer query that aggregates the resident data: calculates occupancy rate as (occupied units / total units * 100), total scheduled charges, delinquent balance, and expiring leases count. Display these in a Stats component row at the top of the dashboard. Add a Bar Chart component showing unit availability by property using the aggregated query output.
1// Transformer: aggregate Yardi resident data into portfolio metrics2const residents = getResidents.data || [];3const total = residents.length;4const occupied = residents.filter(r => r.status === 'Current').length;5const expiringSoon = residents.filter(r => {6 if (!r.lease_end) return false;7 const daysLeft = Math.floor(8 (new Date(r.lease_end) - new Date()) / (1000 * 60 * 60 * 24)9 );10 return daysLeft >= 0 && daysLeft <= 60;11}).length;12const totalRent = residents13 .filter(r => r.status === 'Current')14 .reduce((sum, r) => sum + (r.market_rent || 0), 0);1516return {17 occupancy_rate: total > 0 ? ((occupied / total) * 100).toFixed(1) + '%' : '0%',18 occupied_units: occupied,19 total_units: total,20 expiring_60_days: expiringSoon,21 total_scheduled_rent: `$${totalRent.toLocaleString()}`22};Pro tip: Cache work order and resident queries for at least 5 minutes — Yardi's SOAP API can be slow (2-5 second response times are common for large datasets), and caching prevents multiple simultaneous users from overloading the Yardi API with identical requests.
Expected result: The dashboard shows portfolio metrics in stats cards at the top, resident records in the main tab, and work orders organized by priority in the maintenance tab.
Common use cases
Build a lease expiration and renewal tracking dashboard
Create a Retool property management panel that queries Yardi for all active leases across properties and highlights leases expiring within 30, 60, and 90 days. Display a filterable Table with resident name, unit, lease end date, monthly rent, and renewal status. Include a renewal action button that updates the lease status in Yardi and notifies the property manager via email or Slack.
Build a Retool dashboard showing all active Yardi leases sorted by expiration date, with color-coded rows for leases expiring in under 30/60/90 days, a filter for property and unit type, and a button to mark leases as renewal-offered.
Copy this prompt to try it in Retool
Build a maintenance work order management panel
Create a Retool maintenance dashboard that displays all open work orders from Yardi, organized by property and priority. Show technician assignments, completion status, estimated vs actual completion times, and vendor costs. Include a form to create new work orders and update status, enabling field supervisors to manage maintenance without navigating Yardi's full interface.
Build a Retool work order panel pulling open Yardi maintenance requests, organized by property and priority (Emergency/Routine), showing assigned technician, days open, and a status update form for field supervisors.
Copy this prompt to try it in Retool
Build a portfolio occupancy and financial performance dashboard
Create a Retool asset management dashboard that aggregates Yardi occupancy data across all properties in the portfolio. Show current occupancy rate, vacant units by property and unit type, average rent per square foot, and delinquency totals. Combine with historical occupancy data to show trends in Charts for quarterly portfolio reviews.
Build a Retool portfolio dashboard aggregating Yardi occupancy across all properties — show current occupancy %, vacant units by bedroom count, delinquent balance totals, and a Line Chart of occupancy trend over 12 months.
Copy this prompt to try it in Retool
Troubleshooting
SOAP request returns a SOAP Fault with 'Authentication failed' or 'Invalid credentials' message
Cause: Yardi Voyager SOAP authentication credentials are embedded in the XML request body — if any of the five required credential fields (UserName, Password, ServerName, Database, InterfaceEntity) are missing, incorrect, or in the wrong element names for your Yardi version, the server returns a SOAP fault.
Solution: Extract the fault message from the XML response using: xmlDoc.getElementsByTagName('faultstring')[0]?.textContent. Verify each credential field matches exactly what Yardi provided. The InterfaceEntity field is often overlooked — it corresponds to the Yardi entity code for your organization in Voyager. Confirm with your Yardi administrator or support team if unsure of any value.
1// Extract SOAP fault message in transformer2if (data.includes('<faultstring>')) {3 const parser = new DOMParser();4 const xmlDoc = parser.parseFromString(data, 'text/xml');5 const fault = xmlDoc.getElementsByTagName('faultstring')[0]?.textContent;6 return [{ error: 'SOAP Fault: ' + fault }];7}Retool query times out before Yardi API returns a response
Cause: Yardi Voyager SOAP calls can be slow, particularly for queries that span large property portfolios or long date ranges. Default Retool query timeout of 10 seconds may be insufficient for large Yardi datasets.
Solution: In the query's Advanced settings, increase the query timeout — Retool allows up to 600,000 ms (10 minutes) on Cloud and configurable values on self-hosted. For large portfolios, add property filters to the SOAP request body to limit the result set. Alternatively, query data per property and use Retool's parallel query execution to fetch multiple properties concurrently.
XML transformer returns empty array despite Yardi response appearing to contain data
Cause: Yardi SOAP responses often have XML namespaces on element tags (e.g., 'ns1:Resident' instead of 'Resident'). The getElementsByTagName() method is case-sensitive and namespace-sensitive — querying for 'Resident' will not find 'ns1:Resident'.
Solution: Use getElementsByTagNameNS('*', 'Resident') or inspect the raw response first using console.log(data.substring(0, 500)) in the transformer to see the actual element names including any namespace prefixes. Update your getElementsByTagName calls to match the actual element names returned by your Yardi installation.
1// Namespace-aware element retrieval2const residents = xmlDoc.getElementsByTagNameNS('*', 'Resident');3// or using querySelector with local name:4const items = Array.from(xmlDoc.querySelectorAll('[localName="Resident"], Resident'));Yardi API is not accessible from Retool Cloud queries
Cause: On-premises Yardi deployments run on private networks without public IP addresses. Retool Cloud cannot reach servers that are not accessible from the public internet. Cloud Retool IP ranges also need to be whitelisted in Yardi's server firewall if using a publicly accessible Yardi cloud deployment.
Solution: For on-premises Yardi: deploy Retool self-hosted in your organization's network where it can reach the Yardi server directly. For cloud-hosted Yardi: whitelist Retool's published CIDR ranges (35.90.103.132/30 and 44.208.168.68/30 for US West) in Yardi's server firewall rules. Contact your network administrator and Yardi support to configure the appropriate access.
Best practices
- Store all Yardi credentials (username, password, server name, database, entity code) in Retool Configuration Variables marked as secret — Yardi SOAP requests embed credentials in XML bodies that would be visible if stored in plaintext query code
- Apply a minimum 5-minute query cache to all Yardi SOAP queries — Yardi Voyager's SOAP layer can be slow and is not designed for high-frequency polling; caching prevents both performance issues and accidental server overload
- Add property-level filtering to all Yardi queries from the start — queries without property filters can return tens of thousands of records for large portfolios, causing both slow responses and Retool's 100 MB result size limit to be reached
- Use Retool's query timeout setting (accessible in Advanced query settings) and set it to at least 30,000 ms (30 seconds) for Yardi SOAP calls, as large dataset queries regularly take 5-15 seconds to complete
- Build XML parsing transformers defensively with try/catch blocks and early fault detection — Yardi SOAP errors return valid HTTP 200 responses with SOAP fault XML bodies, not HTTP error codes
- For work order status updates and lease modifications, require manager-level access control using Retool's permission groups — property management write operations through the API bypass Yardi's native audit controls
- Document all WSDL endpoints and SOAP operation names used in your Retool integration — Yardi updates can change available operations, and having a reference makes troubleshooting API changes much faster
Alternatives
Buildium is a better choice for small-to-mid property managers who want a modern REST API with straightforward JSON responses and self-serve API access, without the enterprise complexity and partnership requirements of Yardi's SOAP-based integration.
Propertybase runs on Salesforce infrastructure and offers SOQL-based API access for real estate CRM data — a better fit if your team is already using Salesforce and wants property management data alongside CRM records in Retool.
CoStar provides commercial real estate market data and property analytics through an enterprise API — complementary to Yardi for asset managers who need market comparison data alongside their operational Yardi metrics in the same Retool dashboard.
Frequently asked questions
How do I get API access to Yardi for a Retool integration?
Yardi API access is not self-service. Contact your Yardi Account Manager or Yardi Support (support.yardi.com) and request API credentials for integration. Yardi will ask about your intended use case, required data entities (residents, work orders, financials), and may require a separate API license or partner agreement depending on your current contract. The process typically takes 1-3 weeks to receive credentials and interface documentation.
Does Retool support SOAP requests for Yardi Voyager?
Yes. Retool's REST API Resource can send SOAP requests by setting the HTTP method to POST, configuring the Content-Type header to 'text/xml; charset=utf-8', and using a Raw body with the XML SOAP envelope. Yardi Voyager's responses are also XML, which you parse in the query's JavaScript transformer using the DOMParser API. This approach works for all Yardi WSDL operations, though you must construct the correct XML envelope structure for each operation type.
Can I write data back to Yardi from Retool?
Yes, Yardi's SOAP API supports write operations including creating work orders, updating resident information, and entering payment data. The same SOAP POST pattern applies — construct an XML request body for the appropriate write operation WSDL method. Yardi strongly recommends restricting write access to specific operations and user accounts through Yardi's native role configuration. Always test write operations in a Yardi test/staging environment before connecting to your production Yardi database.
What is the difference between Yardi Voyager and Yardi Breeze API integration?
Yardi Voyager uses a SOAP/XML API with credentials embedded in request bodies — complex to configure but highly flexible for enterprise data. Yardi Breeze has a more modern REST API with JSON responses and API key authentication, making it significantly easier to configure in Retool. Both products require Yardi to provision API access, but Breeze integration follows standard REST patterns while Voyager requires XML parsing and SOAP envelope construction.
How should I handle large portfolio queries that return thousands of Yardi records?
Filter all Yardi queries to a single property or small property set rather than pulling all records in one request. Add a property selector component in your Retool app that populates from a property list query, and pass the selected property ID as a parameter in every data query. For portfolio-wide analytics, consider building a Retool Workflow that runs nightly, queries Yardi property by property, and stores aggregated metrics in Retool Database — your dashboard then reads from the cached database rather than querying Yardi directly on demand.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation