Log in
For developers · REST API and MCP server

Records, not reports

Most AppFolio® integrations are built on scheduled reports someone emails out and parses. Skywalk is a JSON REST API over the live data: forty-plus endpoints, a stable ID on every object, reads and writes, and webhooks that hand the data on to the tools you already use.

Linked property, unit, contact and ledger records delivered as code to a laptop.

Stable records, one interface

Every record carries its own ID and the IDs of everything it belongs to, so this tenant stays the same tenant after a move, a rename or a renewal.

One record tree: a property linked to its contacts, money and work orders, read and written with a scoped key.
GET /v1/tenants?propertyId=1180
{
  "appfolioId": "30261",
  "name": "Priya Hartley",
  "emailAddresses": ["priya.hartley@example.com"],
  "occupancyAppfolioId": "44127",
  "status": "Current",
  "rent": "1795.00",
  "moveIn": "08/01/2025",
  "leaseTo": "07/31/2026",
  "lastRentIncrease": "08/01/2025"
}
40+
endpoints

Portfolio, People, Money, Operations. Every object addressable by ID.

Two-way
reads and writes

Tenant charges, bills, purchase orders and vendors go back into AppFolio® through the same API.

One key
per integration

Scoped to read, or read plus write. Revoke it from the dashboard in one click.

Webhooks
out to your tools

When a refresh finishes, Skywalk posts the data to your system or to a tool like Zapier.

What a real API changes

If you have parsed an emailed report into a database, you already know the left column.

A stack of paper reports beside a tree of linked property, unit and contact records.
Report-based integrations

A report scheduled inside AppFolio®, emailed out, then parsed.

Skywalk

JSON over HTTPS from the live data, the moment you ask.

Report-based integrations
Skywalk
Identity
Matched by name and address. Breaks when a tenant moves or a unit is renamed.
A stable ID on every object. A lease is the same record through every renewal.
Shape
Whatever columns that report happens to include, in that report's order.
One schema across forty-plus endpoints. Cursor pagination, versioned changes.
Change
Re-run the report, re-parse the email, notice tomorrow.
Refresh on demand or on a schedule, and have the result posted to your tools.
Writing back
Someone keys the result into AppFolio® by hand.
Four POST endpoints, scoped per key, logged.

Skywalk API is an independent third party and is not affiliated with AppFolio, Inc. AppFolio® is a registered trademark of AppFolio, Inc.

From key to first call

Three steps, no SDK required. Any HTTP client, any language. The account owner connects AppFolio® once; from then on it is a key and a URL.

Three steps: a scoped key, paginated records, and current records handed on to your tools.
01

Create a key, pick its scope

From the dashboard, once the AppFolio® account is connected. Read only for reporting; read plus write for anything that posts back.

curl https://api.skywalkapi.com/v1/units \
  -H "X-API-Key: eyJhbGciOiJIUzI1NiIs…"
02

Page through any object

Every list is cursor-paginated and filterable by the IDs it belongs to. Same field names everywhere, so the client you write for leases works for work orders.

GET /v1/lease-history?propertyId=1180

{ "meta": { "status": "ok", "count": 100 },
  "links": { "next": "…?cursor=eyJvZmZzZXQiOjEwMH0" },
  "data": [ {
    "leaseUUID": "5f1c2e9a-…",
    "rent": "1795.00",
    "leaseEnd": "07/31/2026" } ] }
03

Keep it current, hand it on

Skywalk caches the portfolio and refreshes it in the background: ask for a refresh in a call, or schedule one and skip the server. Add a webhook and the fresh data is posted to your system or a tool like Zapier when it lands.

curl https://api.skywalkapi.com/v1/units \
  -H "X-API-Key: eyJhbGciOiJIUzI1NiIs…" \
  -H "X-API-NOTIFY-URL: https://you.example/hooks"

POST https://you.example/hooks
{ "meta": { "path": "/v1/units", "status": "ok" },
  "data": [ … ] }

Browse the full reference: every endpoint, parameter and response, with the polling, scheduling and webhook guides.

Building with Claude Code or Cursor? Give it api.skywalkapi.com/llms.txt: the endpoints, authentication and polling in one file it can read.

One schema, four families

Forty-plus endpoints, grouped the way the business thinks about it. Same field names in every family, same IDs across all of them.

Portfolio

properties · units · unit-vacancies · unit-photos

People

tenants · lease-history · owners · vendors

Money

general-ledger · tenant-ledger · bills · purchase-orders

Operations

work-orders · rental-applications · showings · attachments

Write back, on your terms

The half most integrations leave out. A read-only key cannot reach these; write scope is something the account owner turns on per key, and every call lands in the log.

Charges and other updates written back to the portfolio, each one logged.

Read-only by default.

Write scope per key, every call logged, and the MCP server stays read-only.

Four write paths
POST /v1/tenant-chargeUtility sub-billing, late fees, one-off charges, straight to the tenant ledger. POST /v1/vendorsAdd vendors from your own onboarding, contact and address details included. POST /v1/purchase-ordersIssue a purchase order to a vendor, line items included. POST /v1/billsEnter a vendor bill with its line items and the invoice PDF.
POST /v1/tenant-charge
{ "occupancyId": "44127",
  "amount": "48.20",
  "description": "Water · September 2026" }

Two more ways in

The REST API is one door. The same connection is open to the tools you code in, and to us if you would rather not build it this quarter.

Two more ways in: an AI assistant for the portfolio, or a build done with Skywalk.
MCP server

Your agent gets the same portfolio.

Cursor, Claude Code and any MCP client read the same records through the MCP server, with no key to manage. Prototype the query in chat, then ship it over REST with the same IDs.

How the MCP server works
Consulting

Build alongside us, or hand us the list.

We build on this same API, so anything we ship is something you can read and extend. Source, docs and monitoring are handed over, and we stay on only if you want us to.

How consulting works

Built for production

The parts you only notice when they are missing.

Secure by default.

AES-256 at rest, HTTPS only, 2FA on the dashboard, keys you revoke in one click.

Predictable.

One schema, cursor pagination everywhere, versioned changes.

Every call logged.

Reads and writes by key, in the dashboard. One key per integration, so the log says which did what.

Kept current for you.

Scheduled jobs refresh any endpoint on the interval you pick. No server to run.

Free to try.

Seven days of a limited Automate, free: reads, writes, webhooks and the MCP server on your own portfolio. Then Analyze for reads only, or Automate and Scale for writes.

People who answer.

A developer who knows the data, by email or video call, from the first request to the integration plan.

Your portfolio, in one request

Seven-day free trial. Connect the AppFolio® account, create a key, and page through the portfolio this afternoon.

A property portfolio framed in code, with an API key and a certificate.