REST API
Posts
Endpoints

Endpoints

Use the posts endpoints to create, schedule, update, fetch, list, and delete posts in FeedHive. The response shape is documented on the Post object page.

GET /posts

List all posts owned by the authenticated caller.

Query parameters

FieldTypeDescription
limitnumberPage size. Defaults to 20 and cannot exceed 100.
cursorstringPagination cursor from a previous response.
statusstringOptional comma-separated status filter. Supported values: draft, scheduled, publishing, published, failed.
labelsstringOptional comma-separated label ID filter. Matching uses OR semantics.
socialsstringOptional comma-separated social account ID filter. Matching uses OR semantics.

Example request

curl --request GET \
  --url 'https://api.feedhive.com/posts?limit=20&status=draft,scheduled&labels=lbl_campaign_q4&socials=social_123' \
  --header 'accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_KEY'

Response body

FieldTypeDescription
successbooleanWhether the request succeeded.
data.itemsPost[]Returned posts for this page.
data.totalnumberTotal number of posts owned by the caller.
data.has_morebooleanWhether another page of posts is available.
data.next_cursorstring | nullCursor for the next page, or null when there are no more results.

GET /posts/:id

Fetch a single post by ID.

Path parameters

FieldTypeDescription
idstringPost identifier.

Example request

curl --request GET \
  --url https://api.feedhive.com/posts/post_123 \
  --header 'accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_KEY'

Response body

FieldTypeDescription
successbooleanWhether the request succeeded.
dataPostRequested post.

POST /posts

Create a new post.

Request body

FieldTypeDescription
textstringRequired. Root post text and must be non-empty.
mediastring[]Ordered media IDs to attach. Do not send duplicates.
subpostsSubpostInput[]Optional thread replies.
accountsstring[]Optional social account IDs to target.
account_customizationsAccountCustomizationInput[]Optional per-account overrides. Each id must also appear in accounts.
labelsstring[]Optional label IDs to attach. Do not send duplicates.
statusdraft | scheduledOptional post status. Defaults to draft.
scheduled_atstringRequired when status is scheduled. Must be a future ISO 8601 datetime.
notesstring | nullOptional internal notes.
short_link_enabledbooleanOptional short-link setting.

SubpostInput

FieldTypeDescription
textstring | nullSubpost text.
mediastring[]Ordered media IDs for the subpost. Do not send duplicates.

AccountCustomizationInput

FieldTypeDescription
idstringAccount ID. Must also appear in the accounts array.
textstring | nullOverride text for that account.
mediastring[]Override media IDs.
subpostsSubpostInput[]Override subposts for that account.

Validation rules

  • text is required and must be non-empty.
  • Arrays for media IDs, account IDs, and label IDs must not contain duplicates.
  • Every account_customizations[].id value must also be present in accounts.
  • When status is scheduled, you must send accounts and a future scheduled_at value.
  • scheduled_at is only allowed when status is scheduled.

Example request

curl --request POST \
  --url https://api.feedhive.com/posts \
  --header 'accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "text": "Launch update for this week",
    "media": ["med_hero_image"],
    "subposts": [
      {
        "text": "Thread follow-up with the main rollout checklist.",
        "media": []
      }
    ],
    "accounts": ["social_123", "social_456"],
    "account_customizations": [
      {
        "id": "social_456",
        "text": "A LinkedIn-specific version of the launch update.",
        "media": [],
        "subposts": []
      }
    ],
    "labels": ["lbl_campaign_q4"],
    "status": "scheduled",
    "scheduled_at": "2026-04-15T13:00:00.000Z",
    "notes": "Use the updated CTA once legal signs off.",
    "short_link_enabled": true
  }'

Response body

FieldTypeDescription
successbooleanWhether the request succeeded.
dataPostCreated post.

PATCH /posts/:id

Update an existing post. Fields use replace semantics, so any field you send fully overwrites the current value.

Path parameters

FieldTypeDescription
idstringPost identifier.

Request body

FieldTypeDescription
textstring | nullReplacement root text.
mediastring[]Replacement media IDs.
subpostsSubpostInput[]Replacement subposts.
accountsstring[]Replacement social account IDs.
account_customizationsAccountCustomizationInput[]Replacement per-account overrides.
labelsstring[]Replacement label IDs.
statusdraft | scheduledReplacement status.
scheduled_atstring | nullReplacement scheduled datetime. Send null to clear it.
notesstring | nullReplacement notes value.
short_link_enabledbooleanReplacement short-link setting.

The same validation rules as POST /posts apply.

Example request

curl --request PATCH \
  --url https://api.feedhive.com/posts/post_123 \
  --header 'accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "text": "Launch update for this week - revised",
    "labels": ["lbl_campaign_q4", "lbl_product_launch"],
    "scheduled_at": "2026-04-16T13:00:00.000Z",
    "notes": "Approved for the final review pass.",
    "short_link_enabled": false
  }'

Response body

FieldTypeDescription
successbooleanWhether the request succeeded.
dataPostUpdated post.

DELETE /posts/:id

Soft-delete a post. Deleted posts no longer appear in list results, but the underlying record is retained internally.

Path parameters

FieldTypeDescription
idstringPost identifier.

Example request

curl --request DELETE \
  --url https://api.feedhive.com/posts/post_123 \
  --header 'accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_KEY'

Response body

FieldTypeDescription
successbooleanWhether the request succeeded.
dataPostDeleted post.