Skip to main content

Bills

NewBetaWrite

Bill 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.

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


appfolioIdstring
AppFolio ID of the bill. Pass it to GET /bills/<appfolioId> to retrieve the bill's full detail.
Example:
"375619"

payeeNamestring
Display name of the payee (usually the vendor) the bill is owed to.
Example:
"ACME Plumbing Inc."

referencestring
Reference on the bill, typically the vendor's invoice number. Null when none was entered.
Example:
"INV-1042"

billDatestring
Date the bill was incurred (AppFolio's Bill Date), as displayed (MM/DD/YYYY).
Example:
"08/01/2026"

propertyAndUnitNamesstring
Property (and unit, when applicable) the bill is coded to, as displayed. Bills spanning several properties show a combined label.
Example:
"Warm Weather Apartments"

glAccountNamestring
GL account the bill is coded to, as displayed (number and name, e.g. "226-740: Other Tenant Misc").
Example:
"216-240: Unit:Plumbing Repairs"

dueDatestring
Date the bill is due, as displayed (MM/DD/YYYY).
Example:
"08/31/2026"

amountstring
Total amount of the bill as a decimal string such as "250.00", without a currency symbol.
Example:
"250.00"

statusstring
Payment status of the bill as displayed on the Bills screen: Paid or Unpaid. A vendor credit shows Used or Unused instead.
Example:
"Unpaid"


More Attributes


cashAccountNamestring

hasAttachmentboolean

The Bill Object
{
"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: AuthenticationCachingPollingList Response FormatScheduled 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


billDateFromdate
Earliest bill date to include, as MM/DD/YYYY. May be used without billDateTo.

billDateTodate
Latest bill date to include, as MM/DD/YYYY. May be used without billDateFrom.

statusselect
Payment status to include, as shown on the Bills screen: Paid or Unpaid. Paid also includes used vendor credits, Unpaid unused ones. Defaults to All.
Default Value:  
All
Possible Values:  
All
Paid
Unpaid

approvalStatusselect
Approval status to include, as shown on the Bills screen: Pending Approval or Approved. Defaults to All.
Default Value:  
All
Possible Values:  
All
Pending Approval
Approved

propertyIdselect
AppFolio ID of a property. When provided, returns only bills with a line item coded to that property. The property must exist and be visible to your connected AppFolio user.

vendorIdstring
AppFolio ID of a vendor. When provided, returns only bills payable to that vendor. The vendor must exist and be visible to your connected AppFolio user. Look vendors up with the Vendors endpoint.

 

Returns


The standard List Response Format with a data property containing an array of Bill objects.

GET /v1/bills
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"
Response
{
"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: AuthenticationCachingPollingList Response FormatScheduled 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


appfolioIdstring
The bill's appfolioId, as returned by the Bills endpoint. Supplied in the path: GET /bills/<appfolioId>.

 

Returns


The standard List Response Format with a data property containing an array with the requested Bill Detail object.

GET /v1/bills/:appfolioId
curl -X GET 'https://api.skywalkapi.com/v1/bills/375619' \
-H "X-API-Key: PUT_YOUR_API_KEY_HERE"
Response
{
"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


appfolioIdstring
AppFolio ID of the bill.
Example:
"375619"

payeeNamestring
Display name of the payee (usually the vendor) the bill is owed to.
Example:
"ACME Plumbing Inc."

vendorIdstring
AppFolio ID of the payee vendor, when the payee is a vendor. Null for other payee types.
Example:
"466"

referencestring
Reference on the bill, typically the vendor's invoice number.
Example:
"INV-1042"

approvalStatusstring
Approval workflow status of the bill as displayed (e.g. Pending Approval, Approved).
Example:
"Approved"

billDatestring
Date the bill was incurred (AppFolio's Bill Date; the Bill Details page labels it "Invoice Date", or "Date" on a vendor credit), as displayed (MM/DD/YYYY).
Example:
"08/01/2026"

dueDatestring
Date the bill is due, as displayed (MM/DD/YYYY).
Example:
"08/31/2026"

amountstring
Total amount of the bill as a decimal string such as "250.00", without a currency symbol.
Example:
"250.00"

statusstring
Payment status of the bill as displayed on the Bills screen: Paid or Unpaid. A vendor credit shows Used or Unused instead.
Example:
"Unpaid"

lineItemsBillLineItem[]
Line items on the bill. Each entry has "propertyId" (when available), "propertyName", "unitName", "glAccountName", "description", "amount", "status" and "payDate". GL accounts and units are given by name only; no ids are available for them.
Example:
[{"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}]

attachmentsAttachmentSummary[]
Files attached to the bill. Each entry has "appfolioId" (pass it to the File endpoint to download the file) and "fileName".
Example:
[{"appfolioId":"9127","fileName":"INV-1042.pdf"}]


More Attributes


purchaseOrderNumberstring

remarksstring

memoForCheckstring

nextApproversstring

postingDatestring

cashAccountNamestring

currentApprovalStepstring

lastApprovedBystring

The Bill Detail Object
{
"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: AuthenticationCachingPollingList 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 content must fit the 20 MB request body (about 14 MB of PDF); send larger files by url. Skywalk API does not retain file contents.


Parameters


vendorIdstring
AppFolio ID of the vendor the bill is payable to. Look vendors up with the Vendors endpoint.

billDatestring
Date the bill was incurred (AppFolio's Bill Date), as MM/DD/YYYY.

dueDatestring
Date the bill is due, as MM/DD/YYYY.

lineItemsmulti
Line items for the bill, as a JSON array. Each entry requires "glAccountId", "propertyId" and "amount" (a decimal string such as "125.00"), and may carry "unitId", "description", "serviceFrom" and "serviceTo" (MM/DD/YYYY). At least one line item is required. The GL account must be a postable account, not a parent or header account.

amountstring
Total amount of the bill as a decimal string. Defaults to the sum of the line item amounts; when provided it must equal that sum.

referencestring
Reference for the bill, typically the vendor's invoice number.

remarksstring
Free-form remarks on the bill.

memoForCheckstring
Memo printed on the check when the bill is paid.

accountNumberstring
Your account number with the vendor, as shown on the invoice. Accepted on create but never included in a response.

cashAccountIdselect
AppFolio ID of the cash (bank) GL account the bill is paid from. When omitted, AppFolio selects the account automatically.

workOrderIdstring
AppFolio ID of a work order to associate the bill with. Accepted on create but never included in a response.

purchaseOrderIdstring
AppFolio ID of the purchase order this bill is entered against. The created bill carries the order's number as purchaseOrderNumber, and the order lists the bill in its billIds. Look purchase orders up with the Purchase Orders endpoint.

attachmentsmulti
Files to attach to the bill, as a JSON array. Each entry requires "fileName" (with its extension) and exactly one of "content" (the file's bytes as base64) or "url" (an https URL the file can be fetched from). Accepted types: .pdf. Up to 10 files, each at most 30 MB; base64 content also has to fit the request body limit. Skywalk API does not retain file contents; the response reports each file by name, size and SHA-256 hash, and the bill is returned with each file's AppFolio ID.

 

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.

POST /v1/bills
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"
}
]
}'
Response
{
"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"
}
]
}
]
}