# Get organic content

Read one stored organic corpus post by its original source id.

## Contract status

Preview contract: these routes and tools are implemented in the shared contract, but the public host, customer API access and OAuth flow have not been deployment verified.

## Endpoint: GET /v1/organic/{postId}

- Method: `GET`
- Path: `/v1/organic/{postId}`
- Authentication: Bearer API credential or OAuth access token
- Required scope: `context:read`
- MCP tool: `get_organic_content`

## 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.
- 404 not_found when the record is outside the accessible catalogue.
- 429 rate_limited; honor Retry-After when present.

## Request

The path id is the original corpus source id. This read does not scrape TikTok.

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

## Response

The same post object as search. product_app.matchedBy = product_name means a conservative inferred association, not verified ownership. get may include slide_texts as an array. relevance is always null.

```
{
  "id": "organic-post-example",
  "platform": "tiktok",
  "content_type": "slideshow",
  "link": "https://www.tiktok.com/@example/video/1",
  "category": "Food & Cooking",
  "business_type": "app",
  "product_name": "Example Meal Planner",
  "product_website": "https://example.com",
  "product_app": {
    "platform": "ios",
    "storeId": "6480417616",
    "appName": "Example Meal Planner",
    "iconUrl": "https://is1-ssl.mzstatic.com/example-meal-planner.jpg",
    "matchedBy": "product_name"
  },
  "account": "example",
  "caption": "five dinners in ten minutes",
  "hashtags": [
    "#cooking",
    "#mealprep"
  ],
  "date_published": "2026-04-02",
  "metrics": {
    "views": 412000,
    "likes": 31000,
    "comments": 480,
    "shares": 210,
    "bookmarks": 9400
  },
  "slide_count": 7,
  "preview_image_url": "https://cdn.example.com/preview.jpg",
  "image_urls": [
    "https://cdn.example.com/preview.jpg"
  ],
  "video_url": null,
  "hook_text": "I stopped meal planning and did this instead",
  "hook_analysis": {
    "content_class": "listicle_hook",
    "format_template": "I stopped X and did Y",
    "psychology_tags": [
      "curiosity",
      "relief"
    ]
  },
  "search_summary": "A slideshow about weeknight cooking for a meal-planning app.",
  "niche": "meal planning",
  "topics": [
    "cooking",
    "meal prep"
  ],
  "search_keywords": [
    "dinner ideas",
    "meal planner app"
  ],
  "slide_texts": [
    "I stopped meal planning and did this instead",
    "Shop once. Cook five nights."
  ],
  "relevance": null
}

```

## Source

Copied public organic corpus with original source IDs. Not a live TikTok scrape on GET.

## Refresh

The corpus copy is a separate import. This GET is a stored read.
