# Analyze organic post

Ask for creative analysis of one stored organic post; it runs in the background.

## Endpoint: POST /v1/organic/{postId}/analysis

- Method: `POST`
- Path: `/v1/organic/{postId}/analysis`
- Authentication: Bearer API credential or OAuth access token
- Required scope: `content:write`
- MCP tool: `refresh`
- MCP action: `organic_analysis`

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `postId` | path | string, 1–300 | yes | Organic corpus post id. |

## Known errors

- 400 invalid_request for an invalid filter, identity or limit.
- 401 authentication_required for a missing or invalid credential.
- 402 subscription_required when access is not entitled.
- 403 authorization_required for a missing scope or unavailable preview access.
- 403 workspace_not_accessible when x-genviral-tenancy names a workspace the credential cannot reach.
- 404 not_found when the record is outside the accessible catalogue.
- 429 rate_limited; honor Retry-After when present.
- 429 daily_call_limit; the plan's daily API and MCP calls are used until 00:00 UTC.
- 409 conflict when the write would duplicate an exclusive row.

## Request

The command has no request body and answers 202 at once: it stores the request and a background worker runs it, usually within a minute. Read where it stands with GET /v1/organic/{postId}/analysis every 15 to 30 seconds until status is ready or failed; each read counts toward the daily API and MCP call allowance. Asking again while it runs returns the same pending request, and a ready analysis is returned from storage without another run. A video post is read from its stored video, with a timeline of scenes, cuts and on-screen text; a slideshow is read from up to 10 slides in order, without a timeline. For a video, the same run also stores the transcript when the post has none; a transcript that fails, or a video with no speech, does not fail the analysis. A post with no stored video or slides answers 422.

```
curl --request POST 'https://api.peekpanda.com/v1/organic/organic-post-example/analysis' \
  --header "Authorization: Bearer $PEEKPANDA_TOKEN" \
  --header 'x-genviral-tenancy: personal'
```

## MCP request

Call refresh with action organic_analysis. Path fields go in params, filters in query, and a write body in body.

```
{
  "name": "refresh",
  "arguments": {
    "request": {
      "action": "organic_analysis",
      "params": {
        "postId": "<postId>"
      }
    }
  }
}

```

## Response

Returns the analysis state: pending with requestedAt while the worker runs it, or ready with the stored analysis when one already exists.

```
{
  "status": "pending",
  "requestedAt": "2026-11-02T10:00:00.000Z"
}

```

## Source

The post's stored copy in the organic corpus: its mirrored video, or its stored slides, with its caption, hook and creator handle as context.

## Refresh

An explicit request reads the stored copy and persists its result. Repeating after settlement returns the stored result without generating it again. A failed run keeps any analysis the post already had.
