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

# Get Post

> Retrieve a specific post by ID

## Get Post

Retrieves detailed information about a specific post, including its content, status, scheduling information, and platform-specific details. Use `include_comments=true` to attach all comments for the post, including their associated contact info.

You can also load the same resource [by public permalink](/api-reference/posts/get-by-url) or [by platform-native post id](/api-reference/posts/get-by-platform-post-id) when you do not know the internal PostSyncer id.

For **aggregated analytics** without parsing `platforms` here, use the [Analytics API](/api-reference/analytics/overview) - for example [`GET /analytics/posts/{post}`](/api-reference/analytics/post) for one post (totals plus per-account rows).

### Request

<ParamField path="id" type="integer" required>
  The ID of the post to retrieve
</ParamField>

<ParamField query="include_comments" type="boolean" default="false">
  When true, includes all comments associated with the post, including their contact info (CRM contact)
</ParamField>

<RequestExample>
  ```bash theme={null}
  curl -X GET "https://postsyncer.com/api/v1/posts/123?include_comments=true" \
    -H "Authorization: Bearer YOUR_API_TOKEN"
  ```
</RequestExample>

### Response

<ResponseField name="id" type="integer">
  Unique identifier for the post
</ResponseField>

<ResponseField name="content" type="array">
  Array of content objects with text, media, optional `cover_image`, and optional first-comment fields (`is_first_comment`, `first_comment_delay`). Cover requirements by platform: TikTok uses `video_cover_timestamp_ms` only; YouTube, Instagram, and Facebook use `thumbnail` only - see [Create post](/api-reference/posts/create#platform-requirements-for-cover-images). First comments: see [Create post - first comments](/api-reference/posts/create#first-comments).
</ResponseField>

<ResponseField name="status" type="string">
  Status of the post (draft, scheduled, published, failed)
</ResponseField>

<ResponseField name="posted_on" type="array">
  Array of posted timestamps in workspace timezone
</ResponseField>

<ResponseField name="scheduled_at" type="string">
  Scheduled date and time in workspace timezone
</ResponseField>

<ResponseField name="repeatable" type="boolean">
  Whether the post is set to repeat
</ResponseField>

<ResponseField name="repeatable_times" type="integer">
  Number of times the post will repeat
</ResponseField>

<ResponseField name="repeatable_gap" type="integer">
  Gap between repeats
</ResponseField>

<ResponseField name="repeatable_gap_unit" type="string">
  Unit for the repeat gap (`minutes`, `hours`, `days`, `weeks`, `months`)
</ResponseField>

<ResponseField name="repeatable_accounts" type="integer[]">
  Account IDs limiting repeat scheduling when set; configure with `repeatable` / `repeatable_accounts` on [create](/api-reference/posts/create) or [update](/api-reference/posts/update).
</ResponseField>

<ResponseField name="remaining_posts" type="integer">
  Number of remaining posts in the repeat sequence
</ResponseField>

<ResponseField name="workspace" type="object">
  Information about the post's workspace
</ResponseField>

<ResponseField name="labels" type="array">
  Array of labels attached to the post
</ResponseField>

<ResponseField name="platforms" type="array">
  Array of platform-specific post information. For published posts, each platform includes an `analytics` object with performance metrics (likes, comments, impressions, engagement\_rate, etc.)
</ResponseField>

<ResponseField name="auto_plug" type="object | null">
  Auto plug when enabled, or `null`. Update via [Update post auto plug](/api-reference/posts/auto-plug).
</ResponseField>

<ResponseField name="comments_settings" type="object | null">
  Per-post comment moderation. Update via [Update post comment moderation](/api-reference/posts/comment-moderation).
</ResponseField>

<ResponseField name="contact_collection_settings" type="object | null">
  CRM contact collection rules. Update via [Update post contact collection](/api-reference/posts/contact-collection).
</ResponseField>

<ResponseField name="comments" type="array">
  When `include_comments=true`, includes all comments for the post. Each comment has `id`, `content`, `author_name`, `platform`, `created_at`, and a `contact` object with CRM contact info (name, username, profile\_url, etc.) when available.
</ResponseField>

<ResponseField name="created_at" type="string">
  Creation timestamp in workspace timezone
</ResponseField>

<ResponseField name="updated_at" type="string">
  Last update timestamp in workspace timezone
</ResponseField>

<ResponseExample>
  ```json theme={null}
  { 
    "id": 743,
    "content": [
        {
            "text": "",
            "media": [
                {
                    "id": 1594,
                    "name": "file_example_MP4_1920_18MG.mp4",
                    "url": "https://postsyncer-local.c6c56f7fb91dd557ca29aa14c4e7d980.r2.cloudflarestorage.com/media/12/5ee789eb-c88c-4af2-8449-54c6c0561f31.mp4?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=a4bcd089276d5d5b77253aa9b13fe59c%2F20250705%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20250705T131116Z&X-Amz-SignedHeaders=host&X-Amz-Expires=1800&X-Amz-Signature=0ef23b86009e4cac6e160863a4b91f15b78270e5524f328fb764a9f22bdaffe3",
                    "type": "video/mp4",
                    "size": 17839845
                }
            ]
        }
    ],
    "status": "PUBLISHED",
    "posted_on": [
        "2025-07-05 12:36"
    ],
    "scheduled_at": "2025-07-05 16:00",
    "repeatable": false,
    "repeatable_times": null,
    "repeatable_gap": null,
    "repeatable_gap_unit": null,
    "remaining_posts": null,
    "created_at": "2025-07-05 12:34",
    "updated_at": "2025-07-05 12:36",
    "workspace": {
        "id": 12,
        "name": "abdulmejidshemsuawel",
        "slug": "abdulmejidshemsuawel",
        "type": "PERSONAL",
        "logo": null,
        "timezone": "Africa/Addis_Ababa",
        "language": "en"
    },
    "labels": [],
    "platforms": [
        {
            "platform": "twitter",
            "posted_on": [
                "2025-07-05 12:36"
            ],
            "status": "PUBLISHED",
            "settings": {
                "for_super_followers_only": false,
                "reply_settings": "everyone",
                "quote_tweet_id": null,
                "reply": {
                    "in_reply_to_tweet_id": null
                },
                "community_id": null,
                "share_with_followers": true,
                "text": null,
                "poll": {
                    "enabled": false
                }
            },
            "analytics": {
                "comments": 8,
                "likes": 42,
                "shares": 8,
                "impressions": 1250,
                "quotes": 2,
                "saves": 12,
                "engagement_rate": 4.4
            }
        }
    ],
    "auto_plug": null,
    "comments": []
  }
  ```
</ResponseExample>

### Code Examples

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://postsyncer.com/api/v1/posts/123?include_comments=true" \
    -H "Authorization: Bearer YOUR_API_TOKEN"
  ```

  ```javascript Node.js theme={null}
  const axios = require('axios');

  const getPost = async (postId) => {
    try {
      const response = await axios.get(`https://postsyncer.com/api/v1/posts/${postId}`, {
        headers: {
          'Authorization': 'Bearer YOUR_API_TOKEN'
        }
      });
      
      console.log('Post:', response.data);
      return response.data;
    } catch (error) {
      console.error('Error fetching post:', error.response?.data || error.message);
    }
  };

  getPost(123);
  ```

  ```php PHP theme={null}
  <?php

  $postId = 123;

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, "https://postsyncer.com/api/v1/posts/{$postId}");
  curl_setopt($ch, CURLOPT_HTTPGET, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      'Authorization: Bearer YOUR_API_TOKEN'
  ]);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  $response = curl_exec($ch);
  $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  curl_close($ch);

  if ($httpCode === 200) {
      $post = json_decode($response, true);
      echo "Post {$post['id']}: " . $post['content'][0]['text'];
  } else {
      echo "Error: " . $response;
  }
  ?>
  ```

  ```python Python theme={null}
  import requests

  post_id = 123
  headers = {
      'Authorization': 'Bearer YOUR_API_TOKEN'
  }

  response = requests.get(
      f'https://postsyncer.com/api/v1/posts/{post_id}',
      headers=headers
  )

  if response.status_code == 200:
      post = response.json()
      print(f"Post {post['id']}: {post['content'][0]['text']}")
      print(f"Status: {post['status']}")
      print(f"Platforms: {len(post['platforms'])}")
  else:
      print(f"Error: {response.status_code}")
      print(response.text)
  ```
</CodeGroup>

### Error Codes

<ResponseField name="401" type="Unauthorized">
  Missing or invalid API token
</ResponseField>

<ResponseField name="403" type="Forbidden">
  Token does not have 'posts' permission
</ResponseField>

<ResponseField name="404" type="Not Found">
  Post not found or user does not have access to the post's workspace
</ResponseField>
