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

# Review and approve summaries

> List, retrieve, annotate, and approve meeting summaries through Floral's public API.

Use summary operations to read structured meeting outcomes, replace the approved `internalNotes` field, and approve a caller-created summary that is waiting for approval.

## Prerequisites

You need `meetings:read` to list or retrieve summaries and `meetings:write` to update notes or approve a summary.

Set these values once in your shell before running the examples:

```bash theme={null}
export FLORAL_BASE_URL="https://app.floral.so/api/v1"
export FLORAL_WORKSPACE="your-workspace"
export FLORAL_TOKEN="floral_pat_..."
```

Use a personal access token created for this workspace. The examples use synthetic IDs and values; replace them with values returned by your workspace.

<Warning>
  Keep `FLORAL_TOKEN` in a secret manager outside local development. Never commit it to source control or include it in logs.
</Warning>

## List and filter summaries

Summary collections use opaque cursor pagination. Filter by state, company, appointment time, or evidence audience.

```bash theme={null}
curl --get --fail-with-body \
  --url "$FLORAL_BASE_URL/workspaces/$FLORAL_WORKSPACE/summaries" \
  --header "Authorization: Bearer $FLORAL_TOKEN" \
  --data-urlencode "companyId=1842" \
  --data-urlencode "status=WAITING_APPROVAL" \
  --data-urlencode "evidenceAudience=CUSTOMER" \
  --data-urlencode "appointmentAfter=2026-08-01T00:00:00.000Z" \
  --data-urlencode "appointmentBefore=2026-08-31T23:59:59.000Z" \
  --data-urlencode "limit=20"
```

The supported states are `WAITING`, `WAITING_APPROVAL`, `APPROVED`, and `FAILED`. Evidence audience is `CUSTOMER` or `INTERNAL`. Pass a non-null `nextCursor` as `cursor` for the next page.

## Retrieve a summary and its version

Get the current summary immediately before changing it. Copy the strong `ETag` response header exactly, including its quotes.

```bash theme={null}
curl --request GET --fail-with-body --include \
  --url "$FLORAL_BASE_URL/workspaces/$FLORAL_WORKSPACE/summaries/946" \
  --header "Authorization: Bearer $FLORAL_TOKEN"
```

Treat `content` as the structured public summary. It can be null while the summary is not ready.

## Replace summary notes

The partial-update operation accepts only `internalNotes`. Sending a string replaces the complete field; sending `null` clears it. Other summary fields are rejected.

```bash theme={null}
export SUMMARY_ETAG='"v1.ZXhhbXBsZS1zdW1tYXJ5"'

curl --request PATCH --fail-with-body --include \
  --url "$FLORAL_BASE_URL/workspaces/$FLORAL_WORKSPACE/summaries/946" \
  --header "Authorization: Bearer $FLORAL_TOKEN" \
  --header "Content-Type: application/json" \
  --header "If-Match: $SUMMARY_ETAG" \
  --data '{
    "internalNotes": "Confirm the implementation owner before the next review."
  }'
```

Save the new `ETag` from the response before approving the summary.

## Approve the current summary

Approval requires the latest `ETag` and a unique idempotency key. Omit the optional request body to approve the current appointment time and structured content.

```bash theme={null}
export UPDATED_SUMMARY_ETAG='"v1.ZXhhbXBsZS11cGRhdGVk"'
export SUMMARY_APPROVAL_KEY="01J5C6P2N8R4M7K1Q0D3T5V9WX"

curl --request POST --fail-with-body --include \
  --url "$FLORAL_BASE_URL/workspaces/$FLORAL_WORKSPACE/summaries/946/approve" \
  --header "Authorization: Bearer $FLORAL_TOKEN" \
  --header "Idempotency-Key: $SUMMARY_APPROVAL_KEY" \
  --header "If-Match: $UPDATED_SUMMARY_ETAG"
```

A successful response has `APPROVED` status and includes a new `ETag`. Approval is valid only for a caller-created summary in `WAITING_APPROVAL`; another state returns `409 INVALID_STATE`.

If the response is interrupted, retry the identical approval with the same key and version. Floral replays the original result. Never reuse the key for another summary or edited approval input.

## Clear summary notes

Reload the summary to get its current `ETag`, then send `null`:

```bash theme={null}
export CURRENT_SUMMARY_ETAG='"v1.ZXhhbXBsZS1jdXJyZW50"'

curl --request PATCH --fail-with-body --include \
  --url "$FLORAL_BASE_URL/workspaces/$FLORAL_WORKSPACE/summaries/946" \
  --header "Authorization: Bearer $FLORAL_TOKEN" \
  --header "Content-Type: application/json" \
  --header "If-Match: $CURRENT_SUMMARY_ETAG" \
  --data '{"internalNotes": null}'
```

Floral protects writes with two opaque values:

* Send a unique `Idempotency-Key` when an operation requires one. Retrying the identical request with the same key replays its result for 24 hours. Within that operation, reusing the key with different canonical input returns `409 IDEMPOTENCY_CONFLICT`.
* Send the latest strong `ETag` as `If-Match` when an operation changes an existing resource. A stale value returns `412 VERSION_CONFLICT`; a missing value returns `428 PRECONDITION_REQUIRED`.

Keep the quote characters around an `ETag`, and replace your saved value after every successful write. See [Reliability and retries](/developers/api/reliability) for the complete retry rules.
