appfolio-data-api
v0.8.0
Published
Type-safe TypeScript SDK for the AppFolio Property Manager API
Maintainers
Readme
AppFolio Data API SDK
A type-safe, lightweight TypeScript SDK for the AppFolio Property Manager API.
Features
- 🔒 Type-Safe: Full TypeScript definitions for Properties, Units, Vendors, Bills, GL Accounts, and Leads.
- ⚡ Lightweight: Minimal dependencies (uses native
fetch). - 🛠 Browser & Node: Works in both server-side (Node/Bun) and client-side environments.
- 📦 Easy Config: Simple Basic Auth wrapper.
- 🔍 Search & Cache: Optional Upstash Redis integration for instant search (perfect for Vercel!).
Installation
npm install appfolio-data-api
# or
pnpm add appfolio-data-api
# or
bun add appfolio-data-apiUsage
1. Initialize the Client
import { AppFolioClient } from 'appfolio-data-api';
const appfolio = new AppFolioClient({
clientId: process.env.APPFOLIO_CLIENT_ID,
clientSecret: process.env.APPFOLIO_CLIENT_SECRET,
developerId: process.env.APPFOLIO_DEVELOPER_ID,
});2. Fetch Data
Get Properties
const response = await appfolio.properties.list({
LastUpdatedAtFrom: '2023-01-01T00:00:00Z',
page: { size: 100 }
});
console.log(response.data); // Typed as Property[]Get Units
const units = await appfolio.units.list({
PropertyId: 'some-property-uuid'
});Create a Bill
await appfolio.bills.create({
PropertyId: 'prop-uuid',
VendorId: 'vendor-uuid',
InvoiceDate: '2023-10-01',
DueDate: '2023-10-30',
TotalAmount: '150.00',
LineItems: [
{
Amount: '150.00',
Description: 'Lawn Care',
GlAccountId: 'gl-uuid'
}
]
});Search & Caching (Optional)
For Vercel/serverless environments, enable caching with Upstash Redis to search 1000s of records instantly:
import { Redis } from '@upstash/redis';
import { AppFolioClientWithStorage, UpstashAdapter } from 'appfolio-data-api';
const redis = new Redis({
url: process.env.UPSTASH_REDIS_REST_URL!,
token: process.env.UPSTASH_REDIS_REST_TOKEN!,
});
const appfolio = new AppFolioClientWithStorage({
clientId: process.env.APPFOLIO_CLIENT_ID!,
clientSecret: process.env.APPFOLIO_CLIENT_SECRET!,
developerId: process.env.APPFOLIO_DEVELOPER_ID!,
storage: {
adapter: new UpstashAdapter(redis),
ttl: 300, // Cache for 5 minutes
}
});
// First call fetches from API and caches
const vendors = await appfolio.vendors.list();
// Search uses cache - NO API call! (~10ms)
const results = await appfolio.vendors.search({ CompanyName: 'Acme' });See QUICK_START_STORAGE.md for setup guide.
Development
This repository includes a playground to test the SDK against mock or real data.
- Install dependencies:
pnpm install - Run the playground:
pnpm dev - Build the library:
pnpm build
License
MIT
