A typed, asynchronous TypeScript SDK for Rent Manager WAPI12, ported from the companion Python and PHP implementations. It combines generated resource namespaces for the known API catalog with a generic request interface so newly discovered endpoints remain usable immediately.
This is an independent, community-maintained project. It is not affiliated with, endorsed by, or supported by Rent Manager or London Computer Systems. You need your own authorized WAPI12 account and must follow the provider's terms and your organization’s data-handling requirements.
- Zero runtime dependencies; uses the standard Fetch, FormData, and Blob APIs
- 338 generated resource namespaces and 361 permissive model classes
- 1,579-entry endpoint registry copied from the Python/PHP source catalog
- Automatic authentication, token reuse, one-time 401 reauthentication, retries, and timeouts
- RQL filters, fields, embeds, ordering, save options, pagination, and async page iteration
- Structured API, authentication, permission, conflict, rate-limit, server, and transport errors
- Multipart uploads and raw binary downloads
- Memory or private file-backed token storage
- Email lookup and detailed service-ticket export workflows
- Both camelCase TypeScript names and snake_case Python compatibility aliases
Until an npm package is published, install from the repository:
npm install github:azero/RentManager-TypeScriptFor development:
npm install
npm run checkNode.js 18 or newer is required.
import { RentManagerClient, RQL } from "@azero/rentmanager-api";
const client = new RentManagerClient({
corpId: "your-corp-id",
username: "your-api-user",
password: "your-password",
locationId: 1,
});
try {
const tenants = await client.tenants.list({
fields: ["TenantID", "Name"],
filters: [RQL.eq("IsActive", true)],
pageSize: 100,
});
for (const tenant of tenants) {
console.log(tenant.TenantID, tenant.Name);
}
} finally {
await client.close();
}The default base URL is https://<corp-id>.api.rentmanager.com. Supply
baseUrl for another environment.
const rows = await client.get("CustomResource", {
filters: RQL.ct("Name", "Smith"),
});
const result = await client.action("RecurringCharges/PostRecurringCharges", {
PostDate: "2026-07-09",
});All generated resources inherit:
resource.list(query)
resource.get(id, query)
resource.create(payload, query)
resource.update(id, payload, query)
resource.delete(id)
resource.deleteMany(ids, query)
resource.paginate(options)
resource.iterPages(options)Catalog resource properties are available in both naming styles:
await client.accountGroupMasterPayments.list(); // TypeScript
await client.account_group_master_payments.list(); // Python-compatiblefor await (const page of client.tenants.iterPages({
pageSize: 250,
filters: RQL.eq("IsActive", true),
})) {
console.log(page.pageNumber, page.totalResults, page.data);
}Tokens stay in memory by default. Persistent storage is explicit:
import { FileTokenStore, RentManagerClient } from "@azero/rentmanager-api";
const client = new RentManagerClient({
corpId: "your-corp-id",
username: "your-api-user",
password: "your-password",
tokenStore: new FileTokenStore(".rentmanager-token.json"),
});Never commit credentials, token files, .env files, exports, or customer data.
await client.serviceManager.issues.uploadAttachment(123, {
file: ["photo.jpg", photoBytes, "image/jpeg"],
});
const pdf = await client.downloadBytes("Files/44");import {
exportNewestServiceTicketDetails,
lookupByEmail,
} from "@azero/rentmanager-api/workflows";
const matches = await lookupByEmail(client, "tenant@example.com");
const manifest = await exportNewestServiceTicketDetails(client, {
limit: 10,
exportRoot: "service-ticket-exports",
});Ticket exports may contain tenant, vendor, history, billing, and attachment metadata. The workflow creates private directories/files where the operating system supports permissions.
import { EndpointRegistry } from "@azero/rentmanager-api/catalog";
for (const endpoint of EndpointRegistry.default()) {
console.log(endpoint.method, endpoint.path, endpoint.confidence);
}See the parity matrix for the porting contract.
This project is source-available under the PolyForm Noncommercial License 1.0.0, matching the Python and PHP projects. Commercial use requires separate permission from the copyright holder.