Bills
NewBetaWriteBill objects represent payable vendor invoices in AppFolio®. Skywalk API lets you list the bills in your account as they appear on AppFolio®'s Bills screen, retrieve one bill in full detail with its line items and attachments, and create new bills.
- Get All Bills
GET /v1/billsNewBeta - Get One Bill
GET /v1/bills/:appfolioIdNewBeta - Create a Bill
POST /v1/billsWrite
The Bill Object
One object per row of AppFolio®'s Bills screen (Accounting > Payables > Bills), as displayed. The list row does not include line items; see The Bill Detail Object for the full record.
Attributes
"375619"
"ACME Plumbing Inc."
"INV-1042"
"08/01/2026"
"Warm Weather Apartments"
"216-240: Unit:Plumbing Repairs"
"08/31/2026"
"250.00"
"Unpaid"
More Attributes
{
"appfolioId": "375619",
"payeeName": "ACME Plumbing Inc.",
"reference": "INV-1042",
"billDate": "08/01/2026",
"propertyAndUnitNames": "Warm Weather Apartments",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"dueDate": "08/31/2026",
"amount": "250.00",
"status": "Unpaid",
"cashAccountName": "600-100: Bank Account",
"hasAttachment": false
}
Get All Bills
GET /v1/bills NewBeta
Follows: Authentication • Caching • Polling • List Response Format • Scheduled Job
The bills endpoint returns a list of all bills (payable vendor invoices) in your AppFolio® account — the same rows, values and visibility a user sees on the Bills screen. Narrow the list with the same filters that screen offers: a bill date range, payment status, approval status, a property or a vendor. Line items are not part of the list; fetch one bill's detail with Get One Bill. This endpoint should respond immediately with your most recently cached data.
Parameters
Returns
The standard List Response Format with a data property containing an array of Bill objects.
curl -X GET 'https://api.skywalkapi.com/v1/bills?status=Unpaid&billDateFrom=08/01/2026&billDateTo=08/31/2026' \
-H "X-API-Key: PUT_YOUR_API_KEY_HERE"
{
"meta": {
"status": "ok",
"path": "/v1/bills",
"count": 2,
"lastUpdated": 1610992228
},
"links": {
"next": "/v1/bills?cursor=abcdefg"
},
"data": [
{
"appfolioId": "375619",
"payeeName": "ACME Plumbing Inc.",
"reference": "INV-1042",
"billDate": "08/01/2026",
"propertyAndUnitNames": "Warm Weather Apartments",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"dueDate": "08/31/2026",
"amount": "250.00",
"status": "Unpaid",
"cashAccountName": "600-100: Bank Account",
"hasAttachment": false
},
{
"appfolioId": "375620",
"payeeName": "Example Landscaping, LLC",
"reference": null,
"billDate": "08/03/2026",
"propertyAndUnitNames": "Sample Property",
"glAccountName": "206-330: Landscape",
"dueDate": "09/02/2026",
"amount": "1420.00",
"status": "Paid",
"cashAccountName": "600-100: Bank Account",
"hasAttachment": true
}
]
}
Get One Bill
GET /v1/bills/:appfolioId NewBeta
Follows: Authentication • Caching • Polling • List Response Format • Scheduled Job
Returns one bill (payable vendor invoice) in full detail — the header fields,
every line item and the files attached to the bill, with the same values and
visibility a user sees on AppFolio®'s Bill Details page. Download an
attachment with the File endpoint and its appfolioId.
Look bill IDs up with Get All Bills.
Parameters
Returns
The standard List Response Format with a data property containing an array with the requested Bill Detail object.
curl -X GET 'https://api.skywalkapi.com/v1/bills/375619' \
-H "X-API-Key: PUT_YOUR_API_KEY_HERE"
{
"meta": {
"status": "ok",
"path": "/v1/bills/375619",
"count": 1,
"lastUpdated": 1610992228
},
"links": {},
"data": [
{
"appfolioId": "375619",
"payeeName": "ACME Plumbing Inc.",
"vendorId": "466",
"reference": "INV-1042",
"purchaseOrderNumber": "4471",
"remarks": "Emergency repair, unit 3B",
"memoForCheck": "INV-1042 3B repair",
"approvalStatus": "Approved",
"nextApprovers": null,
"billDate": "08/01/2026",
"postingDate": "08/01/2026",
"dueDate": "08/31/2026",
"amount": "250.00",
"status": "Unpaid",
"cashAccountName": "600-100: Bank Account",
"currentApprovalStep": "Completed all 1 steps",
"lastApprovedBy": "System",
"lineItems": [
{
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitName": "3B",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"description": "Sprinkler head replacement",
"amount": "125.00",
"status": "Unpaid",
"payDate": null
},
{
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitName": "3B",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"description": "Labor",
"amount": "125.00",
"status": "Unpaid",
"payDate": null
}
],
"attachments": [
{
"appfolioId": "9127",
"fileName": "INV-1042.pdf"
}
]
}
]
}
The Bill Detail Object
One payable vendor invoice in full — the header fields, every line item and the files attached to the bill, exactly as AppFolio®'s Bill Details page shows them, plus the bill's payment status as the Bills screen shows it. Get One Bill returns this object, and so does Create a Bill for the newly created bill.
Attributes
"375619"
"ACME Plumbing Inc."
"466"
"INV-1042"
"Approved"
"08/01/2026"
"08/31/2026"
"250.00"
"Unpaid"
[{"propertyId":"12","propertyName":"Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001","unitName":"3B","glAccountName":"216-240: Unit:Plumbing Repairs","description":"Sprinkler head replacement","amount":"125.00","status":"Unpaid","payDate":null},{"propertyId":"12","propertyName":"Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001","unitName":"3B","glAccountName":"216-240: Unit:Plumbing Repairs","description":"Labor","amount":"125.00","status":"Unpaid","payDate":null}][{"appfolioId":"9127","fileName":"INV-1042.pdf"}]More Attributes
{
"appfolioId": "375619",
"payeeName": "ACME Plumbing Inc.",
"vendorId": "466",
"reference": "INV-1042",
"purchaseOrderNumber": "4471",
"remarks": "Emergency repair, unit 3B",
"memoForCheck": "INV-1042 3B repair",
"approvalStatus": "Approved",
"nextApprovers": null,
"billDate": "08/01/2026",
"postingDate": "08/01/2026",
"dueDate": "08/31/2026",
"amount": "250.00",
"status": "Unpaid",
"cashAccountName": "600-100: Bank Account",
"currentApprovalStep": "Completed all 1 steps",
"lastApprovedBy": "System",
"lineItems": [
{
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitName": "3B",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"description": "Sprinkler head replacement",
"amount": "125.00",
"status": "Unpaid",
"payDate": null
},
{
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitName": "3B",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"description": "Labor",
"amount": "125.00",
"status": "Unpaid",
"payDate": null
}
],
"attachments": [
{
"appfolioId": "9127",
"fileName": "INV-1042.pdf"
}
]
}
Create a Bill
POST /v1/bills Write
Follows: Authentication • Caching • Polling • List Response Format
Creates a new bill (payable vendor invoice) with its line items and,
optionally, the invoice PDF attached. To enter the bill against a purchase
order, pass the order's purchaseOrderId; the bill then carries the order's
number as purchaseOrderNumber and appears in the order's billIds.
Depending on your AppFolio configuration, creating a Bill may enter an approval workflow and notify approvers. The vendor must already exist; create one first with Create a Vendor if needed.
Attach the invoice PDF. Files sent inline as
contentmust fit the 20 MB request body (about 14 MB of PDF); send larger files byurl. Skywalk API does not retain file contents.
Parameters
Returns
The standard List Response Format with a data property containing an array with the created bill as a Bill Detail object.
The response reflects the bill as stored in AppFolio, not the request as
submitted — the same shape Get One Bill
returns, not the list row. The bill's attachments list each file by name
with the AppFolio ID you can pass to the File endpoint
to download it; meta.query.attachments reports each file as received, by
name, size and SHA-256 hash.
curl -X POST 'https://api.skywalkapi.com/v1/bills' \
-H "X-API-Key: PUT_YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"vendorId": "466",
"billDate": "08/01/2026",
"dueDate": "08/31/2026",
"reference": "INV-1042",
"purchaseOrderId": "4471",
"lineItems": [
{
"glAccountId": "204",
"propertyId": "12",
"unitId": "48",
"amount": "125.00",
"description": "Sprinkler head replacement"
},
{
"glAccountId": "204",
"propertyId": "12",
"unitId": "48",
"amount": "125.00",
"description": "Labor"
}
]
}'
{
"meta": {
"status": "ok",
"path": "/v1/bills",
"query": {
"vendorId": "466",
"billDate": "08/01/2026",
"dueDate": "08/31/2026",
"reference": "INV-1042",
"purchaseOrderId": "4471",
"attachments": [
{
"fileName": "INV-1042.pdf",
"contentType": "application/pdf",
"source": "base64",
"size": 48213,
"sha256": "3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855e",
"appfolioAttachmentId": "9127"
}
]
},
"count": 1,
"lastUpdated": 1610992228
},
"errors": [],
"data": [
{
"appfolioId": "375619",
"payeeName": "ACME Plumbing Inc.",
"vendorId": "466",
"reference": "INV-1042",
"purchaseOrderNumber": "4471",
"remarks": "Emergency repair, unit 3B",
"memoForCheck": "INV-1042 3B repair",
"approvalStatus": "Approved",
"nextApprovers": null,
"billDate": "08/01/2026",
"postingDate": "08/01/2026",
"dueDate": "08/31/2026",
"amount": "250.00",
"status": "Unpaid",
"cashAccountName": "600-100: Bank Account",
"currentApprovalStep": "Completed all 1 steps",
"lastApprovedBy": "System",
"lineItems": [
{
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitName": "3B",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"description": "Sprinkler head replacement",
"amount": "125.00",
"status": "Unpaid",
"payDate": null
},
{
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitName": "3B",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"description": "Labor",
"amount": "125.00",
"status": "Unpaid",
"payDate": null
}
],
"attachments": [
{
"appfolioId": "9127",
"fileName": "INV-1042.pdf"
}
]
}
]
}