# Get post

> Returns information about a specific approved post.

Breadcrumb: Storefront API › Get post
Docs index: https://docs.cevoid.com/developers/llms.txt

`GET https://api.widget.cevoid.com/v1/posts/{post_id}`

Returns information about a specific approved post.

## Authorizations

Bearer token in the Authorization header: `Authorization: Bearer <key>` (Cevoid publishable key).

## Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `post_id` | `string` | Yes | Stable public Post identifier. Length: `1 to 256`. Example: `pst_summerlook`. |

## Query parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `market` | `string` | Yes | Market identifier used for localized product data. Length: `1 to 256`. Example: `mar_sweden`. |

## Response

### 200: Successful response

`application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | `object` | Yes |  |
| `data.id` | `string` | Yes | Stable public Post identifier. Length: `1 to 256`. Example: `pst_summerlook`. |
| `data.type` | `enum<string>` | Yes | Post media type. Allowed values: `IMAGE`, `VIDEO`. Example: `IMAGE`. |
| `data.media` | `object` | Yes |  |
| `data.media.url` | `string<uri>` | Yes | CDN URL for the post media. Example: `https://cdn.cevoid.com/posts/pst_summerlook.jpg`. |
| `data.media.thumbnail_url` | `string<uri>` | No | Smaller preview image when available. Example: `https://cdn.cevoid.com/posts/pst_summerlook-thumbnail.jpg`. |
| `data.media.sprite_url` | `string<uri>` | No | Video sprite image for timeline previews when available. Example: `https://cdn.cevoid.com/posts/pst_summerlook-sprite.jpg`. |
| `data.media.blurhash` | `string` | No | BlurHash placeholder for the media asset. Example: `LEHV6nWB2yk8pyo0adR*.7kCMdnj`. |
| `data.media.aspect_ratio` | `number` | No | Media width divided by height. Range: `0 < x`. Example: `0.8`. |
| `data.media.duration_seconds` | `number` | No | Video duration in seconds. Range: `0 <= x`. Example: `12.5`. |
| `data.media.has_audio` | `boolean` | No | Whether video media includes an audio track. Example: `true`. |
| `data.caption` | `string` | No | Public post caption. Omitted when hide_caption is true. Example: `A summer favorite.`. |
| `data.hide_caption` | `boolean` | Yes | Whether clients should hide the caption. Example: `false`. |
| `data.alt` | `string` | No | Accessible media description. Example: `Person wearing a beige linen shirt outdoors.`. |
| `data.video_captions` | `string` | No | WebVTT captions for video media. Example: `WEBVTT

00:00.000 --> 00:02.000
A summer favorite.`. |
| `data.video_description` | `string` | No | Accessible description of video content. Example: `A person turns to show the front and back of a linen shirt.`. |
| `data.source_url` | `string<uri>` | No | Original public social post URL when available. Example: `https://www.instagram.com/p/example/`. |
| `data.author` | `object` | No |  |
| `data.author.name` | `string` | Yes | Public display name selected for the storefront. Example: `@jane`. |
| `data.author.avatar_url` | `string<uri>` | No | Public profile image URL when available. Example: `https://cdn.cevoid.com/profiles/prf_jane.jpg`. |
| `data.custom_link` | `object` | No | Editorial link attached to this post. |
| `data.custom_link.url` | `string<uri>` | Yes | Example: `https://shop.example.com/stories/summer`. |
| `data.custom_link.title` | `string` | No | Example: `Summer stories`. |
| `data.custom_link.description` | `string` | No | Example: `Explore our summer stories.`. |
| `data.custom_link.image_url` | `string<uri>` | No | Example: `https://cdn.cevoid.com/stories/summer.jpg`. |
| `data.tagged_products` | `object[]` | Yes | Shoppable products in the selected market. Products without a presentation in that market are omitted. |
| `data.tagged_products[].id` | `string` | Yes | Stable public Product identifier. Length: `1 to 256`. Example: `prd_linen_shirt`. |
| `data.tagged_products[].title` | `string` | Yes | Market-specific product title. Example: `Linen Shirt`. |
| `data.tagged_products[].type` | `enum<string>` | Yes | Allowed values: `PRODUCT`, `VARIANT`. Example: `PRODUCT`. |
| `data.tagged_products[].parent_product_id` | `string` | No | Length: `1 to 256`. Example: `prd_linen_shirt`. |
| `data.tagged_products[].availability` | `enum<string>` | No | Allowed values: `IN_STOCK`, `OUT_OF_STOCK`. Example: `IN_STOCK`. |
| `data.tagged_products[].url` | `string<uri>` | No | Market-specific storefront URL. Example: `https://shop.example.com/products/linen-shirt`. |
| `data.tagged_products[].image_url` | `string<uri>` | No | Market-specific product image URL. Example: `https://cdn.cevoid.com/products/linen-shirt.jpg`. |
| `data.tagged_products[].price` | `object` | No | Product price range or exact variant price in the selected market. Omitted when the market hides prices. |
| `data.tagged_products[].price.currency` | `string` | Yes |  |
| `data.tagged_products[].price.min_amount` | `number` | Yes | Range: `0 <= x`. |
| `data.tagged_products[].price.max_amount` | `number` | Yes | Range: `0 <= x`. |
| `data.tagged_products[].price.currency` | `string` | Yes |  |
| `data.tagged_products[].price.amount` | `number` | Yes | Range: `0 <= x`. |
| `data.tagged_products[].price.sale_amount` | `number` | No | Range: `0 <= x`. |
| `data.tagged_products[].x` | `number` | No | Normalized horizontal hotspot position. Omitted together with y when no valid position is stored. Range: `0 <= x <= 1`. Example: `0.35`. |
| `data.tagged_products[].y` | `number` | No | Normalized vertical hotspot position. Range: `0 <= x <= 1`. Example: `0.65`. |
| `data.published_at` | `string<date-time>` | Yes | Creation time in Cevoid, used for newest-first ordering. This can differ from the original social publication date. Example: `2026-08-01T10:00:00.000Z`. |

Response headers:

| Header | Type | Description |
| --- | --- | --- |
| `Cevoid-Processing-Ms` | `string` | End-to-end request processing time in milliseconds |
| `Cevoid-Request-Id` | `string` | Request identifier for support and tracing |
| `RateLimit-Limit` | `string` | Current rate limit bucket size |
| `RateLimit-Remaining` | `string` | Remaining requests in the current rate limit window |
| `RateLimit-Reset` | `integer` | Seconds until the next request token is available |
| `Cache-Control` | `string` | Browser freshness is 60 seconds. Shared caches are fresh for five minutes and may serve stale content while revalidating for another five minutes. TTL is the only invalidation guarantee; moderation or removal may take up to ten minutes because no active purge is performed. |
| `Vary` | `string` | Workspace credential headers included in the shared-cache key. |

```json
{
  "data": {
    "id": "pst_summerlook",
    "type": "IMAGE",
    "media": {
      "url": "https://cdn.cevoid.com/posts/pst_summerlook.jpg",
      "thumbnail_url": "https://cdn.cevoid.com/posts/pst_summerlook-thumbnail.jpg",
      "sprite_url": "https://cdn.cevoid.com/posts/pst_summerlook-sprite.jpg",
      "blurhash": "LEHV6nWB2yk8pyo0adR*.7kCMdnj",
      "aspect_ratio": 0.8,
      "duration_seconds": 12.5,
      "has_audio": false
    },
    "caption": "A summer favorite.",
    "hide_caption": false,
    "alt": "Person wearing a beige linen shirt outdoors.",
    "source_url": "https://www.instagram.com/p/example/",
    "author": {
      "name": "@jane",
      "avatar_url": "https://cdn.cevoid.com/profiles/prf_jane.jpg"
    },
    "tagged_products": [
      {
        "id": "prd_linen_shirt",
        "type": "PRODUCT",
        "title": "Linen Shirt",
        "url": "https://shop.example.com/products/linen-shirt",
        "image_url": "https://cdn.cevoid.com/products/linen-shirt.jpg",
        "price": {
          "min_amount": 59.95,
          "max_amount": 79.95,
          "currency": "SEK"
        },
        "x": 0.35,
        "y": 0.65
      }
    ],
    "published_at": "2026-08-01T10:00:00.000Z"
  }
}
```

### 400: Bad request

`application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `additional_data` | `object` | No | Optional machine-readable error details. |
| `additional_data.{key}` | `any \| null` | No |  |
| `status` | `integer` | Yes | HTTP status code. Example: `404`. |
| `code` | `string` | Yes | Stable machine-readable error code. Example: `not_found`. |
| `message` | `string` | Yes | Human-readable error description. Example: `Resource not found`. |
| `request_id` | `string` | No | Request identifier for support and tracing. Example: `req_abc123`. |

Response headers:

| Header | Type | Description |
| --- | --- | --- |
| `Cevoid-Processing-Ms` | `string` | End-to-end request processing time in milliseconds |
| `Cevoid-Request-Id` | `string` | Request identifier for support and tracing |
| `RateLimit-Limit` | `string` | Current rate limit bucket size |
| `RateLimit-Remaining` | `string` | Remaining requests in the current rate limit window |
| `RateLimit-Reset` | `integer` | Seconds until the next request token is available |

```json
{
  "additional_data": {
    "property1": null,
    "property2": null
  },
  "status": 400,
  "code": "bad_request",
  "message": "Bad request",
  "request_id": "req_abc123"
}
```

### 401: Unauthorized

`application/json`

Same fields as 400.

Response headers: the same as 400.

```json
{
  "status": 401,
  "code": "unauthorized",
  "message": "Unauthorized",
  "request_id": "req_abc123"
}
```

### 403: Forbidden

`application/json`

Same fields as 400.

Response headers: the same as 400.

```json
{
  "status": 403,
  "code": "forbidden",
  "message": "Forbidden",
  "request_id": "req_abc123"
}
```

### 404: Not found

`application/json`

Same fields as 400.

Response headers: the same as 400.

```json
{
  "additional_data": {
    "property1": null,
    "property2": null
  },
  "status": 404,
  "code": "not_found",
  "message": "Resource not found",
  "request_id": "req_abc123"
}
```

### 422: Validation error

`application/json`

Same fields as 400.

Response headers: the same as 400.

```json
{
  "additional_data": {
    "property1": null,
    "property2": null
  },
  "status": 422,
  "code": "validation_error",
  "message": "Validation error",
  "request_id": "req_abc123"
}
```

### 429: Too many requests

`application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `additional_data` | `object` | Yes | Machine-readable rate-limit details. |
| `additional_data.retry_after_seconds` | `integer` | Yes | Range: `0 <= x`. |
| `additional_data.{key}` | `any \| null` | No |  |
| `status` | `integer` | Yes | HTTP status code. Example: `404`. |
| `code` | `string` | Yes | Stable machine-readable error code. Example: `not_found`. |
| `message` | `string` | Yes | Human-readable error description. Example: `Resource not found`. |
| `request_id` | `string` | No | Request identifier for support and tracing. Example: `req_abc123`. |

Response headers:

| Header | Type | Description |
| --- | --- | --- |
| `Cevoid-Processing-Ms` | `string` | End-to-end request processing time in milliseconds |
| `Cevoid-Request-Id` | `string` | Request identifier for support and tracing |
| `RateLimit-Limit` | `string` | Current rate limit bucket size |
| `RateLimit-Remaining` | `string` | Remaining requests in the current rate limit window |
| `RateLimit-Reset` | `integer` | Seconds until the next request token is available |
| `Retry-After` | `integer` | Seconds to wait before retrying the request |

```json
{
  "status": 429,
  "code": "rate_limit_exceeded",
  "message": "Rate limit exceeded",
  "request_id": "req_abc123",
  "additional_data": {
    "retry_after_seconds": 1
  }
}
```

### 500: Internal server error

`application/json`

Same fields as 400.

Response headers: the same as 400.

```json
{
  "status": 500,
  "code": "internal_server_error",
  "message": "Internal server error",
  "request_id": "req_abc123"
}
```

### 503: Service unavailable

`application/json`

Same fields as 400.

Response headers: the same as 400.

```json
{
  "status": 503,
  "code": "service_unavailable",
  "message": "Service unavailable",
  "request_id": "req_abc123"
}
```

## Request example

```bash
curl 'https://api.widget.cevoid.com/v1/posts/pst_summerlook?market=mar_sweden' \
  -H "Authorization: Bearer ${CEVOID_PUBLISHABLE_KEY}"
```

---

Canonical: https://docs.cevoid.com/developers/storefront-api/storefront-ugc/get-post
