An employee creates and submits an expense report, which is routed to the employee's manager for approval. In some cases, approvals are required from multiple users.
After approval, an expense report becomes a reimbursement request, which is processed by accounting.
Returns a collection with a key, ID, and link for each expense to approve. This operation is mostly for use in testing; use query to find objects that meet certain criteria and to specify properties that are returned.
OK
Bad Request
{- "ia::result": [
- {
- "key": "101",
- "id": "101",
- "href": "/objects/expenses/expense-to-approve/101"
}, - {
- "key": "102",
- "id": "102",
- "href": "/objects/expenses/expense-to-approve/102"
}, - {
- "key": "103",
- "id": "103",
- "href": "/objects/expenses/expense-to-approve/103"
}
], - "ia::meta": {
- "totalCount": 3,
- "start": 1,
- "pageSize": 100,
- "next": 0,
- "previous": 0
}
}
Returns detailed information for a specified expense to approve.
key required | string system-assigned unique key for the expense-to-approve. Example: 99 |
OK
Bad Request
{- "ia::result": {
- "key": "124",
- "id": "124",
- "createdDate": "2021-01-23",
- "employee": {
- "key": "12345",
- "id": "EMP-025",
- "href": "/objects/company-config/employee/12345"
}, - "employeeContact": {
- "key": "20",
- "id": "Thomas, Glenn",
- "firstName": "Glenn",
- "lastName": "Thomas",
- "href": "/objects/company-config/contact/20"
}, - "state": "draft",
- "basePayment": {
- "baseCurrency": "USD",
- "paidDate": "2021-01-23",
- "totalEntered": "123.45",
- "totalPaid": "123.45",
- "totalDue": "123.45",
- "totalSelected": "110.00"
}, - "reimbursement": {
- "reimbursementCurrency": "EUR",
- "totalEntered": "123.16",
- "totalPaid": "123.16",
- "totalDue": "123.16",
- "totalSelected": "123.16"
}, - "expenseReportNumber": "EXP-00001",
- "expenseSummary": {
- "key": "334",
- "id": "334",
- "title": "Expenses 2023/01/31 batch",
- "postingDate": "2021-01-23",
- "state": "open",
- "preventGLPosting": false,
- "href": "/objects/projects/employee-expense-summary/12345"
}, - "nonReimbursable": {
- "baseTotalEntered": "123.45",
- "reimbursementTotalEntered": "123.45"
}, - "memo": "Paid to employee",
- "description": "Supplies for customer training",
- "reclassificationNotes": "Classified as supplies, not travel expense",
- "attachment": {
- "key": "1",
- "id": "1",
- "href": "/objects/company-config/attachment/12345"
}, - "audit": {
- "createdDateTime": "2014-01-08T11:28:12Z",
- "modifiedDateTime": "2022-04-20T16:20:00Z",
- "createdBy": "1",
- "modifiedBy": "95"
}, - "lines": [
- {
- "key": "312",
- "id": "312",
- "entryDate": "2021-01-23",
- "baseCurrency": "USD",
- "baseAmount": "123.45",
- "reimbursementCurrency": "CAD",
- "reimbursementAmount": "123.45",
- "txnCurrency": "INR",
- "txnAmount": "123.45",
- "totalSelected": "123.45",
- "totalPaid": "123.45",
- "quantity": "5.75",
- "unitRate": "20.00",
- "paidTo": "Hotel Westin",
- "paidFor": "Attending conference",
- "glAccount": {
- "key": "158",
- "id": "6775.30",
- "name": "Travel",
- "href": "/objects/general-ledger/account/23"
}, - "expenseType": {
- "key": "6000",
- "id": "Meals",
- "href": "/objects/expense-type/34"
}, - "lineNumber": 1,
- "reimburseToBaseConversion": {
- "exchangeRateDate": "2021-01-23",
- "exchangeRateTypeId": "-1",
- "exchangeRate": "1.18999"
}, - "transactionToReimburseConversion": {
- "exchangeRate": "65",
- "exchangeRateDate": "2021-01-23",
- "exchangeRateTypeId": "-1"
}, - "state": "draft",
- "isBillable": false,
- "isBilled": false,
- "form1099": {
- "isForm1099": "true",
- "type": "MISC",
- "box": "3"
}, - "paymentType": {
- "key": "1",
- "id": "1",
- "name": "Non-reimburse",
- "isNonReimbursable": false,
- "href": "string"
}, - "audit": {
- "createdDateTime": "2022-04-20T16:20:00Z",
- "modifiedDateTime": "2022-04-20T16:20:00Z",
- "createdBy": "1",
- "modifiedBy": "95"
}, - "entity": {
- "key": "46",
- "id": "Western Region",
- "name": "Western Region",
- "href": "/objects/company-config/entity/46"
}, - "dimensions": {
- "location": {
- "key": "1",
- "id": "1",
- "name": "USA"
}, - "department": {
- "key": "1",
- "id": "1",
- "name": "IT"
}, - "employee": {
- "key": "10",
- "id": "EMP-10",
- "href": "/objects/company-config/employee/10"
}, - "employeeContact": {
- "key": 20,
- "id": "Thomas, Glenn",
- "firstName": "Glenn",
- "lastName": "Thomas",
- "href": "/objects/company-config/contact/20"
}, - "project": {
- "key": "2",
- "id": "NET-XML30-2",
- "name": "Talcomp training",
- "href": "/objects/projects/project/2"
}, - "customer": {
- "key": "13",
- "id": "CUST-13",
- "name": "Jack In the Box",
- "href": "/objects/accounts-receivable/customer/13"
}, - "vendor": {
- "key": "357",
- "id": "1605212096809",
- "name": "GenLab",
- "href": "/objects/accounts-payable/vendor/357"
}, - "item": {
- "key": "13",
- "id": "Case 13",
- "name": "Platform pack",
- "href": "/objects/inventory-control/item/13"
}, - "warehouse": {
- "key": "6",
- "id": "WH01",
- "name": "WH01",
- "href": "/objects/inventory-control/warehouse/6"
}, - "class": {
- "key": "731",
- "id": "REST_CLS_001",
- "name": "Enterprises",
- "href": "/objects/company-config/class/731"
}, - "task": {
- "id": "1",
- "key": "1",
- "name": "Project Task",
- "href": "/objects/projects/task/1"
}, - "costType": {
- "id": "2",
- "key": "2",
- "name": "Project Expense",
- "href": "/objects/construction/cost-type/2"
}, - "asset": {
- "id": "A001",
- "key": "1",
- "name": "Laptop 1",
- "href": "/objects/asset/1"
}, - "contract": {
- "id": "CON-0045-1",
- "key": "12",
- "name": "ACME Widgets - Service",
- "href": "/objects/contracts/contract/12"
}
}, - "approveEmployeeExpense": {
- "id": "1",
- "key": "1"
}
}
]
}, - "ia::meta": {
- "totalCount": 1,
- "totalSuccess": 1,
- "totalError": 0
}
}
The approve workflow is used to set a submitted expense and its expense lines to 'approved' or 'partiallyApproved'. The submitted expense's beginning state depends on where the expense already is in the approval cycle and can include 'submitted', 'partiallyApproved', or 'partiallyDeclined'.
For example, new expenses will have a state of 'submitted', while an existing expense that's been partially approved can have a state of 'partiallyApproved' until all approvals are received. When an expense is fully approved, its state changes to 'approved'.
key required | string System-assigned key for the expense. Example: "518" |
expenseLineKeys | Array of strings Array of expense entry keys. Example: ["1","2"] |
notes | string Notes or comments from the approver. Example: "Approved by John Smith." |
glPostingDate | string GL posting date for approved expense. Example: "2025-08-02" |
OK
Bad Request
{- "key": "518",
- "expenseLineKeys": [
- "1",
- "2"
], - "notes": "Approved by John Smith.",
- "glPostingDate": "2025-08-02"
}
{- "ia::result": {
- "key": "518",
- "id": "518",
- "href": "/objects/expenses/expense-to-approve/518",
- "state": "approved"
}, - "ia::meta": {
- "totalCount": 3,
- "totalSuccess": 2,
- "totalError": 1
}
}
The decline workflow is used to set a submitted expense and its expense lines to 'declined' or 'partiallyDeclined'. The submitted expense's beginning state depends on where the expense already is in the approval cycle and can include 'submitted', 'partiallyApproved', or 'partiallyDeclined'.
For example, new expenses will have a state of 'submitted', while an existing expense that's been partially approved can have a state of 'partiallyApproved' until all approvals are received. When an expense is declined, its state changes to 'declined'.
key required | string System-assigned key for the expense. Example: "518" |
notes | string Notes or comments about the expense. Example: "Declined, missing information." |
expenseLineKeys | Array of strings Array of expense entry keys. Example: ["1","2"] |
OK
Bad Request
{- "key": "518",
- "notes": "Declined, missing information.",
- "expenseLineKeys": [
- "1",
- "2"
]
}
{- "ia::result": {
- "key": "518",
- "id": "518",
- "href": "/objects/expenses/expense-to-approve/518",
- "state": "declined"
}, - "ia::meta": {
- "totalCount": 3,
- "totalSuccess": 2,
- "totalError": 1
}
}
Use the query service to find expense to approves that meet certain criteria and to specify the properties that are returned.
OK
Bad Request
{- "ia::result": {
- "ia::error": {
- "code": "invalidRequest",
- "message": "A POST request requires a payload",
- "errorId": "REST-1028",
- "additionalInfo": {
- "messageId": "IA.REQUEST_REQUIRES_A_PAYLOAD",
- "placeholders": {
- "OPERATION": "POST"
}, - "propertySet": { }
}, - "supportId": "Kxi78%7EZuyXBDEGVHD2UmO1phYXDQAAAAo"
}
}, - "ia::meta": {
- "totalCount": 1,
- "totalSuccess": 0,
- "totalError": 1
}
}