Invoice Approvals

Learn about how to programmatically manage approvals in Ottimate

Overview

Ottimate’s approval system allows you to manage invoice approvers programmatically through the API. While approval policies are configured in the Ottimate UI, the API enables you to:

  • View all approvers assigned to an invoice
  • Add manual approvers to invoices
  • Remove approvers from the approval chain
  • Force approve invoices when authorized

For information on how to configure approval policies in Ottimate, see Approval Policy Configuration.

Note: The Approval API manages approvers and approval actions only. Approval policies themselves must be configured through the Ottimate user interface.

How Invoice Approvals Work

When an invoice enters the approval workflow, it receives a pending-approval status. The invoice must be approved by all assigned approvers before it can proceed to export. Approvers can be assigned either:

  • Policy-based approvers: Automatically assigned based on approval policies configured in Ottimate
  • Manual approvers: Added individually via the API or UI for ad-hoc review requirements

List Invoice Approvers

To view all approvers assigned to an invoice, including their approval status:

GET /invoices/{id}/approvers

Where {id} is the Ottimate-generated invoice ID.

Response Details

The response includes an array of approvers, where each approver object contains:

  • id: The approval record ID (e.g., pbjappr_xxx) - use this ID when removing an approver via the DELETE endpoint
  • approver: User details including ID, email, and display name
  • policy: Associated approval policy for policy-based approvers (empty for manual approvers)
  • created_date: When this approver was added to the invoice

Example Response

1{
2 "version": "1.0.0",
3 "approvers": [
4 {
5 "id": "pbjappr_e1e7eb2cf7cf11f080d40eff1c63a64d",
6 "approver": {
7 "id": "138872",
8 "email": "api_user@example.com",
9 "display_name": "Api User"
10 },
11 "policy": {
12 "id": "plcy_e00205b8f7cf11f0b0300eff1c63a64d",
13 "name": "Minimum Approvals"
14 },
15 "created_date": "2026-01-22T12:21:06.883965-08:00"
16 },
17 {
18 "id": "pbjappr_c1f04ec4f7a011f0ac5f0eff1c63a64d",
19 "approver": {
20 "id": "136597",
21 "email": "peter@example.com",
22 "display_name": "Peter"
23 },
24 "policy": {
25 "id": "",
26 "name": ""
27 },
28 "created_date": "2026-01-22T06:43:46.905413-08:00"
29 }
30 ]
31}

Identifying Manual vs. Policy-Based Approvers: Manual approvers have empty policy.id and policy.name fields, while policy-based approvers include the policy details.

Use Cases

  • Check who needs to approve an invoice
  • Monitor approval progress
  • Audit the approval chain
  • Track policy-based vs. manual approvers

Add a Manual Approver

Add an ad-hoc approver to an invoice using:

POST /invoices/{id}/approvers

Important Behavior

When you add a manual approver:

  • The approver must be an authorized user of the location with permission to access the invoice.

Remove an Approver

Remove a specific approver from an invoice:

DELETE /invoices/{id}/approvers?approval_id={approval_id}

Parameters

  • id: The invoice ID
  • approval_id: The approval record ID to remove (e.g., pbjappr_xxx) - this is the id field from the approver object returned by GET /invoices/{id}/approvers

Approve an Invoice

Approve an invoice to mark it ready for export and payment:

POST /invoices/{id}/approve

Features

  • Marks the invoice with an approved_date
  • Automatically verifies the invoice if not already verified
  • Updates invoice status to ready-for-export when all approvals are complete

Force Approval

For authorized users, you can bypass the normal approval chain:

1{
2 "force_approve": true
3}