> ## Documentation Index
> Fetch the complete documentation index at: https://docs.captureflow.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Approvals

> The API never publishes. Scheduling or posting is a proposal you accept in CaptureFlow.

An AI assistant can write a post, check it against each platform's rules and suggest when it should go out. It can't make it go out. That stays with you.

## How a proposal works

**1. The app proposes**

`POST /v1/posts/{id}/proposals` (scope `posts:schedule`) with the connected accounts to post to and `when`:

* `"now"`: as soon as you accept, or
* an ISO 8601 date-time with a time zone, at least 5 minutes and at most 365 days ahead, e.g. `2026-11-03T09:00:00+01:00`.

The post must be a draft (or have failed); it then waits with the status `to_accept`. To change a waiting proposal, withdraw it first, then propose again. Up to 10 accounts per proposal.

**2. You decide in CaptureFlow**

The answer's `approval_url` opens the post in CaptureFlow. It shows **Proposed by an AI assistant through the CaptureFlow API**, the accounts and the time (or **Goes out as soon as you accept**), with **Accept** and **Reject**.

**3. Accepted posts are scheduled**

Only when you accept is the post scheduled, through the same publishing as everything else in CaptureFlow. Reject sends it back to a draft.

An app can take a proposal back while it waits: `DELETE /v1/posts/{id}/proposals` returns the post to a draft.

## Before proposing

Call `POST /v1/posts/{id}/preflight` first: it checks the post against each account's platform rules (length, media, format) without changing anything, and lists the issues to fix. When proposing, some platforms' rules are checked again (a failure is refused with [`preflight_failed`](https://docs.captureflow.ai/api/errors#preflight_failed) and `details.issues`); every platform's rules, media included, are checked again when you accept.

Each target in the preflight answer has `ok`, and when it is `false`, a `code`: `PREFLIGHT_FAILED` (with `issues`), `ACCOUNT_NOT_CONNECTED`, `PLATFORM_NOT_ENABLED`, `PLATFORM_NOT_SUPPORTED` or `SOCIAL_ACCOUNT_NOT_FOUND`. These describe each target; they are not request errors.

## In agency workspaces

In an agency client workspace, proposals follow the workspace's approval rules, as posts prepared in the app do. Outside approval workspaces, the person who created a proposal through the API may accept it themselves.

## Errors

| Code | When |
| - | - |
| [`post_not_proposable`](https://docs.captureflow.ai/api/errors#post_not_proposable) | The post is not a draft (already scheduled or published), or a proposal is already waiting: withdraw it first. |
| [`not_proposed`](https://docs.captureflow.ai/api/errors#not_proposed) | Withdrawing a post that is not waiting for acceptance. |
| [`preflight_failed`](https://docs.captureflow.ai/api/errors#preflight_failed) | The post breaks a platform rule. |
| [`platform_not_enabled`](https://docs.captureflow.ai/api/errors#platform_not_enabled) | That platform is not available in this workspace. |
| [`validation_failed`](https://docs.captureflow.ai/api/errors#validation_failed) | `when` is in the past, too far ahead or has no time zone. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.