Purchase Orders
NewBetaWritePurchase Order objects represent purchase orders issued to vendors in AppFolio®. Skywalk API lets you list the purchase orders in your account as they appear on AppFolio®'s Purchase Orders screen, retrieve one purchase order in full detail with its line items, and create new purchase orders.
- Get All Purchase Orders
GET /v1/purchase-ordersNewBeta - Get One Purchase Order
GET /v1/purchase-orders/:appfolioIdNewBeta - Create a Purchase Order
POST /v1/purchase-ordersWrite
The Purchase Order Object
One object per row of AppFolio®'s Purchase Orders screen (Maintenance > Purchase Orders), as displayed. The list row does not include line items; see The Purchase Order Detail Object for the full record.
Attributes
"17"
"1042"
"08/01/2026"
"Warm Weather Apartments"
"ACME Plumbing Inc."
"Approved"
false
"216-240: Unit:Plumbing Repairs"
"1250.00"
{
"appfolioId": "17",
"number": "1042",
"createdOn": "08/01/2026",
"propertyName": "Warm Weather Apartments",
"vendorName": "ACME Plumbing Inc.",
"approvalStatus": "Approved",
"completed": false,
"glAccountName": "216-240: Unit:Plumbing Repairs",
"amount": "1250.00"
}
Get All Purchase Orders
GET /v1/purchase-orders NewBeta
Follows: Authentication • Caching • Polling • List Response Format • Scheduled Job
The purchase orders endpoint returns a list of all purchase orders in your AppFolio® account — the same rows, values and visibility a user sees on the Purchase Orders screen. Narrow the list with the same filters that screen offers: a creation date range, approval status, whether the order is completed or submitted, a property, a vendor or a GL account. Canceled purchase orders are left out unless you ask for them with includeCanceled. Line items are not part of the list; fetch one purchase order's detail with Get One Purchase Order. 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 Purchase Order objects.
curl -X GET 'https://api.skywalkapi.com/v1/purchase-orders' \
-H "X-API-Key: PUT_YOUR_API_KEY_HERE"
{
"meta": {
"status": "ok",
"path": "/v1/purchase-orders",
"count": 2,
"lastUpdated": 1610992228
},
"links": {
"next": "/v1/purchase-orders?cursor=abcdefg"
},
"data": [
{
"appfolioId": "17",
"number": "1042",
"createdOn": "08/01/2026",
"propertyName": "Warm Weather Apartments",
"vendorName": "ACME Plumbing Inc.",
"approvalStatus": "Approved",
"completed": false,
"glAccountName": "216-240: Unit:Plumbing Repairs",
"amount": "1250.00"
},
{
"appfolioId": "18",
"number": "1043",
"createdOn": "08/03/2026",
"propertyName": "Sample Property",
"vendorName": "Example Landscaping, LLC",
"approvalStatus": "Pending Approval",
"completed": false,
"glAccountName": "206-330: Landscape",
"amount": "480.00"
}
]
}
Get One Purchase Order
GET /v1/purchase-orders/:appfolioId NewBeta
Follows: Authentication • Caching • Polling • List Response Format • Scheduled Job
Returns one purchase order in full detail — the header fields, the vendor it
is issued to, its ship-to address, the work orders and bills linked to it,
and every line item. Look purchase order IDs up with
Get All Purchase Orders.
To enter a vendor's invoice against the order, pass its appfolioId as
purchaseOrderId to Create a Bill; the
new bill then appears in billIds.
Parameters
Returns
The standard List Response Format with a data property containing an array with the requested Purchase Order Detail object.
curl -X GET 'https://api.skywalkapi.com/v1/purchase-orders/17' \
-H "X-API-Key: PUT_YOUR_API_KEY_HERE"
{
"meta": {
"status": "ok",
"path": "/v1/purchase-orders/17",
"count": 1,
"lastUpdated": 1610992228
},
"links": {},
"data": [
{
"appfolioId": "17",
"number": "1042",
"amount": "1250.00",
"approvalStatus": "Approved",
"requiresApproval": true,
"approved": true,
"partiallyApproved": false,
"nextApprovers": null,
"lastApprovedBy": "Jane Smith",
"completed": false,
"billed": false,
"canceled": false,
"createdAt": "2026-08-01T15:04:05Z",
"requiredBy": "08/15/2026",
"orderSubmittedDate": null,
"invoiceNumber": "INV-1042",
"instructions": "Deliver to the leasing office between 9am and 4pm.",
"revisionInstructions": null,
"taxPercentage": null,
"vendorId": "466",
"vendorName": "ACME Plumbing Inc.",
"companyName": null,
"supplierName": null,
"shipToPropertyId": "12",
"shipToPropertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"shipToPortfolioId": null,
"workOrderIds": [
"210"
],
"billIds": [],
"createdByName": "Jane Smith",
"lineItems": [
{
"appfolioId": "41",
"description": "Sprinkler head replacement",
"quantity": "2",
"itemAmount": "125.00",
"shippingAmount": "0.00",
"taxAmount": "0.00",
"receivedAt": null,
"glAccountId": "204",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitId": "48",
"unitName": "3B",
"inventoryName": null
},
{
"appfolioId": "42",
"description": "Labor",
"quantity": "1",
"itemAmount": "1000.00",
"shippingAmount": "0.00",
"taxAmount": "0.00",
"receivedAt": null,
"glAccountId": "204",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitId": "48",
"unitName": "3B",
"inventoryName": null
}
]
}
]
}
The Purchase Order Detail Object
One purchase order in full — the header fields, the vendor it is issued to, its ship-to address, the work orders and bills linked to it, and every line item. Get One Purchase Order returns this object, and so does Create a Purchase Order for the newly created purchase order.
Attributes
"17"
"1042"
"1250.00"
"Approved"
true
false
false
false
"2026-08-01T15:04:05Z"
"08/15/2026"
"INV-1042"
"Deliver to the leasing office between 9am and 4pm."
"466"
"ACME Plumbing Inc."
"12"
["210"]
[]
[{"appfolioId":"41","description":"Sprinkler head replacement","quantity":"2","itemAmount":"125.00","shippingAmount":"0.00","taxAmount":"0.00","receivedAt":null,"glAccountId":"204","glAccountName":"216-240: Unit:Plumbing Repairs","propertyId":"12","propertyName":"Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001","unitId":"48","unitName":"3B","inventoryName":null},{"appfolioId":"42","description":"Labor","quantity":"1","itemAmount":"1000.00","shippingAmount":"0.00","taxAmount":"0.00","receivedAt":null,"glAccountId":"204","glAccountName":"216-240: Unit:Plumbing Repairs","propertyId":"12","propertyName":"Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001","unitId":"48","unitName":"3B","inventoryName":null}]More Attributes
{
"appfolioId": "17",
"number": "1042",
"amount": "1250.00",
"approvalStatus": "Approved",
"requiresApproval": true,
"approved": true,
"partiallyApproved": false,
"nextApprovers": null,
"lastApprovedBy": "Jane Smith",
"completed": false,
"billed": false,
"canceled": false,
"createdAt": "2026-08-01T15:04:05Z",
"requiredBy": "08/15/2026",
"orderSubmittedDate": null,
"invoiceNumber": "INV-1042",
"instructions": "Deliver to the leasing office between 9am and 4pm.",
"revisionInstructions": null,
"taxPercentage": null,
"vendorId": "466",
"vendorName": "ACME Plumbing Inc.",
"companyName": null,
"supplierName": null,
"shipToPropertyId": "12",
"shipToPropertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"shipToPortfolioId": null,
"workOrderIds": [
"210"
],
"billIds": [],
"createdByName": "Jane Smith",
"lineItems": [
{
"appfolioId": "41",
"description": "Sprinkler head replacement",
"quantity": "2",
"itemAmount": "125.00",
"shippingAmount": "0.00",
"taxAmount": "0.00",
"receivedAt": null,
"glAccountId": "204",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitId": "48",
"unitName": "3B",
"inventoryName": null
},
{
"appfolioId": "42",
"description": "Labor",
"quantity": "1",
"itemAmount": "1000.00",
"shippingAmount": "0.00",
"taxAmount": "0.00",
"receivedAt": null,
"glAccountId": "204",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitId": "48",
"unitName": "3B",
"inventoryName": null
}
]
}
Create a Purchase Order
POST /v1/purchase-orders Write
Follows: Authentication • Caching • Polling • List Response Format
Creates a new purchase order issued to a vendor, with its line items.
Depending on your AppFolio configuration, creating a purchase order may enter an approval workflow and notify approvers. The vendor must already exist; create one first with Create a Vendor if needed. Purchase orders issued to your management company or to a supplier, and ship-to portfolios, are not yet supported.
Parameters
Returns
The standard List Response Format with a data property containing an array with the created purchase order as a Purchase Order Detail object.
The response reflects the purchase order as stored in AppFolio, not the
request as submitted — the same shape
Get One Purchase Order
returns, not the list row. When number was omitted, the response carries the
number AppFolio assigned.
curl -X POST 'https://api.skywalkapi.com/v1/purchase-orders' \
-H "X-API-Key: PUT_YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"vendorId": "466",
"shipToPropertyId": "12",
"workOrderIds": [
"210"
],
"requiredBy": "08/15/2026",
"invoiceNumber": "INV-1042",
"instructions": "Deliver to the leasing office between 9am and 4pm.",
"lineItems": [
{
"glAccountId": "204",
"propertyId": "12",
"unitId": "48",
"itemAmount": "125.00",
"quantity": "2",
"description": "Sprinkler head replacement"
},
{
"glAccountId": "204",
"propertyId": "12",
"unitId": "48",
"itemAmount": "1000.00",
"description": "Labor"
}
]
}'
{
"meta": {
"status": "ok",
"path": "/v1/purchase-orders",
"query": {
"vendorId": "466",
"shipToPropertyId": "12",
"workOrderIds": [
"210"
],
"requiredBy": "08/15/2026",
"invoiceNumber": "INV-1042",
"instructions": "Deliver to the leasing office between 9am and 4pm.",
"lineItems": [
{
"glAccountId": "204",
"propertyId": "12",
"unitId": "48",
"itemAmount": "125.00",
"quantity": "2",
"description": "Sprinkler head replacement"
},
{
"glAccountId": "204",
"propertyId": "12",
"unitId": "48",
"itemAmount": "1000.00",
"description": "Labor"
}
]
},
"count": 1,
"lastUpdated": 1610992228
},
"errors": [],
"data": [
{
"appfolioId": "17",
"number": "1042",
"amount": "1250.00",
"approvalStatus": "Approved",
"requiresApproval": true,
"approved": true,
"partiallyApproved": false,
"nextApprovers": null,
"lastApprovedBy": "Jane Smith",
"completed": false,
"billed": false,
"canceled": false,
"createdAt": "2026-08-01T15:04:05Z",
"requiredBy": "08/15/2026",
"orderSubmittedDate": null,
"invoiceNumber": "INV-1042",
"instructions": "Deliver to the leasing office between 9am and 4pm.",
"revisionInstructions": null,
"taxPercentage": null,
"vendorId": "466",
"vendorName": "ACME Plumbing Inc.",
"companyName": null,
"supplierName": null,
"shipToPropertyId": "12",
"shipToPropertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"shipToPortfolioId": null,
"workOrderIds": [
"210"
],
"billIds": [],
"createdByName": "Jane Smith",
"lineItems": [
{
"appfolioId": "41",
"description": "Sprinkler head replacement",
"quantity": "2",
"itemAmount": "125.00",
"shippingAmount": "0.00",
"taxAmount": "0.00",
"receivedAt": null,
"glAccountId": "204",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitId": "48",
"unitName": "3B",
"inventoryName": null
},
{
"appfolioId": "42",
"description": "Labor",
"quantity": "1",
"itemAmount": "1000.00",
"shippingAmount": "0.00",
"taxAmount": "0.00",
"receivedAt": null,
"glAccountId": "204",
"glAccountName": "216-240: Unit:Plumbing Repairs",
"propertyId": "12",
"propertyName": "Warm Weather Apartments - 1234 Warm Weather Rd., CA 90001",
"unitId": "48",
"unitName": "3B",
"inventoryName": null
}
]
}
]
}