# Approvals

Owners can require approval in **Settings → Workspace**. Then editors (and OAuth connections approved by editors) can't
schedule or publish directly. Instead they send posts for review:

```json
{ "caption": "…", "targets": [ … ], "action": "submit", "scheduledAt": "2026-11-07T10:00:00+08:00" }
```

The post is saved as a draft with `review: "pending"`, and the owner gets a notification.

## Approving

The owner (or an owner's API key) approves with [`POST /posts/{id}/approve`](/api/operations/approvepost/). The post is checked
and scheduled for its own `scheduledAt`, or for the time in the body:

```json
{ "scheduledAt": "2026-11-07T12:00:00+08:00" }
```

A post without a future time returns `400` until you send one.

## Rejecting

[`POST /posts/{id}/reject`](/api/operations/rejectpost/) sends it back as a plain draft (`review: "none"`). The author gets a
notification with the optional reason:

```json
{ "reason": "Use the new menu photo, please." }
```

## Finding posts to review

`GET /posts?status=drafts` and look for `review: "pending"`. Agents can do the same with `list_posts`, then `approve_post` or
`reject_post`, which makes a good owner workflow: *"Show me what's waiting for approval and approve the ones that fit our style."*

## Client approval

Separately from team approvals, a post's public preview link lets a client approve it without an account. When they do,
`clientApprovedAt` is set; changing the caption or media afterwards clears it.