---
title: "Approve a payroll run (admin/approver only)"
method: POST
path: "/payroll/approve"
tags: ["Payroll"]
---

# Approve a payroll run (admin/approver only)

`POST /payroll/approve`

## Request

- Base URL: `https://api.app.lastaccountingcompany.com/portal`
- URL: `https://api.app.lastaccountingcompany.com/portal/payroll/approve`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/lastaccountingcompany/apis/lac-customer-api/docs/payroll/approve/post.ts> (a function with typed inputs; its response is checked against the schema)

NOT available to API keys — requires an interactive admin/approver session. Approves a drafted payroll run for payment and reporting. API keys (even write-scoped ones) receive 403.

## Request body

- object
  - `customer_id` string: Target company. Optional for single-company sessions.
  - `period` string, required: Payroll period, `YYYY-MM`.
  - `run_id` string, required: The drafted run to approve.
  - `idempotency_key` string: Client-chosen key to deduplicate retries.

## Response `200`

Updated payroll workspace with the approved run.

- PayrollWorkspaceData: The payroll workspace for a period: employees, employer settings, and runs. Amounts are integer cents; rates are basis points. Interior shapes beyond the top level vary and are returned as-is.

## Other responses

- `401`: Missing or invalid bearer token.
- `403`: Insufficient scope or role — e.g. a read-scoped key on a mutating method, or an API key on an admin/approver-only endpoint.

---

[API](https://skmtc.dev/lastaccountingcompany/apis/lac-customer-api.md) - [All operations](https://skmtc.dev/lastaccountingcompany/apis/lac-customer-api/llms.txt) - [OpenAPI document](https://skmtc.dev/lastaccountingcompany/apis/lac-customer-api/revisions/52e277b4f031?raw)
