---
title: "Create approvals"
method: POST
path: "/approvals"
tags: ["approvals"]
---

# Create approvals

`POST /approvals`

Approvals are not created or updated directly. Rather, approvable records are submitted or approved through this POST request.

> **Note:** Only administrators and portfolio editors can approve records. API users can only submit records (set status to `pending`), but not approve them.

## Request body

- ApprovalProcessRequest
  - `approvables` ApprovableObject[], required — An array of records being submitted or approved.
    - `id` integer, required — The ID of the Time Entry or Expense Item.
    - `type` 'TimeEntry' | 'ExpenseItem', required — The type of resource being submitted.
    - `updated_at` string, date-time, required — The current `updated_at` timestamp of the record, required for concurrency checks.
  - `status` 'pending' | 'approved', required — The desired status change.
  - `updated_at` string, date-time — The current `updated_at` timestamp of the record, **required for concurrency checks**. This value must exactly match the timestamp from the latest GET response to ensure the record hasn't been modified by another user.

## Response `200`

The approval requests were successfully processed.

- ApprovalsResponse
  - `paging` PagingMetadata
    - `per_page` integer — The maximum number of items to show per response page.
    - `page` integer — The current response page number.
    - `previous` string, nullable — If you're on the first page, this value is `null`; otherwise the value is the path and query parameters to get the previous page of items.
    - `self` string — The path and query parameters to get the current page of items.
    - `next` string, nullable — If there are more items, this value is the path and query parameters to get the next page of items; otherwise, it's `null`.
    - `count` integer, nullable — The total number of items in all the pages.
  - `data` Approval[]
    - `id` integer — Unique identifier for the approval record.
    - `status` 'pending' | 'approved' | 'rejected' — The current status of the approval.
    - `approvable_id` integer — The ID of the record being approved (TimeEntry or ExpenseItem).
    - `approvable_type` 'TimeEntry' | 'ExpenseItem' — The type of record being approved.
    - `submitted_by` integer — The ID of the user who submitted the record.
    - `submitted_at` string, date-time — The timestamp when the record was submitted for approval.
    - `approved_by` integer, nullable — The ID of the user who approved the record, or null if not yet approved.
    - `approved_at` string, date-time, nullable — The timestamp when the record was approved, or null if not yet approved.
    - `created_at` string, date-time
    - `updated_at` string, date-time

## Other responses

- `400` — Bad Request. Invalid input, status, or outdated `updated_at` timestamp.
- `403` — Access denied due to insufficient permissions or inability to access the specified records.

---

[API](https://skmtc.net/smartsheet/apis/resource-management-openapi-reference.md) · [All operations](https://skmtc.net/smartsheet/apis/resource-management-openapi-reference/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/smartsheet/resource-management-openapi-reference/versions/e4c439ac13f2/schema)
