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
| Field | Type | Description |
|---|---|---|
| limit | number | Page size. Defaults to 20 and cannot exceed 100. |
| cursor | string | Pagination cursor from a previous response. |
| status | string | Optional comma-separated status filter. Supported values: draft, scheduled, publishing, published, failed. |
| labels | string | Optional comma-separated label ID filter. Matching uses OR semantics. |
| socials | string | Optional 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
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the request succeeded. |
| data.items | Post[] | Returned posts for this page. |
| data.total | number | Total number of posts owned by the caller. |
| data.has_more | boolean | Whether another page of posts is available. |
| data.next_cursor | string | null | Cursor for the next page, or null when there are no more results. |
GET /posts/:id
Fetch a single post by ID.
Path parameters
| Field | Type | Description |
|---|---|---|
| id | string | Post 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
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the request succeeded. |
| data | Post | Requested post. |
POST /posts
Create a new post.
Request body
| Field | Type | Description |
|---|---|---|
| text | string | null | Root post text. Required for regular and short publish types; conditionally required for story based on target accounts. |
| media | string[] | Ordered media IDs to attach. |
| thumbnail_media_id | string | null | Completed image media ID to use as the custom thumbnail for the root Reel/Short video. |
| subposts | SubpostInput[] | Optional thread replies. |
| accounts | string[] | AccountReferenceInput[] | Optional social account IDs or account objects to target. |
| account_customizations | AccountCustomizationInput[] | Optional per-account overrides. |
| labels | string[] | Optional label IDs to attach. |
| status | draft | scheduled | Optional post status. Defaults to draft. |
| scheduled_at | string | Conditional. ISO 8601 future datetime; required when status is scheduled. |
| notes | string | null | Optional internal notes. |
| short_link_enabled | boolean | Optional short-link setting. |
| publish_type | regular | short | story | Optional publish mode. Defaults to regular. |
| title | string | null | Optional platform-specific title (YouTube, Google Business, Pinterest). |
| link | string | null | Optional platform-specific link (Google Business, Pinterest). |
| terms_and_conditions | string | null | Optional Google Business offer terms. |
| coupon_code | string | null | Optional Google Business offer coupon code. |
| start_date | string | null | Optional Google Business event/offer start datetime. |
| end_date | string | null | Optional Google Business event/offer end datetime. |
| cta | string | null | Optional Google Business CTA. |
| topic_type | string | null | Optional Google Business topic type. |
| privacy_status | string | null | Optional YouTube/TikTok privacy status. |
| allow_comments | boolean | null | Optional TikTok comment toggle. |
| allow_duet | boolean | null | Optional TikTok duet toggle. |
| allow_stitch | boolean | null | Optional TikTok stitch toggle. |
SubpostInput
| Field | Type | Description |
|---|---|---|
| text | string | null | Subpost text. |
| media | string[] | Ordered media IDs for the subpost. Do not send duplicates. |
AccountReferenceInput
| Field | Type | Description |
|---|---|---|
| id | string | Account ID. |
| board_id | string | null | Pinterest board ID. |
AccountCustomizationInput
| Field | Type | Description |
|---|---|---|
| id | string | Account ID. Must also appear in the accounts array. |
| text | string | null | Override text for that account. |
| media | string[] | Override media IDs. |
| thumbnail_media_id | string | null | Completed image media ID for this account's Reel/Short video. |
| subposts | SubpostInput[] | Override subposts for that account. |
| title | string | null | Platform-specific override title. |
| link | string | null | Platform-specific override link. |
| terms_and_conditions | string | null | Google Business offer terms override. |
| coupon_code | string | null | Google Business offer coupon code override. |
| start_date | string | null | Google Business event/offer start datetime override. |
| end_date | string | null | Google Business event/offer end datetime override. |
| cta | string | null | Google Business CTA override. |
Validation rules
publish_typemust be one of:regular,short,story.- For
publish_type = regular:textis required and must be non-empty.mediais optional.
- For
publish_type = short:textis required and must be non-empty.mediais required.- If
accountsare present, all accounts must be short-compatible:facebook,instagram,youtube,tiktok. - Posts with no accounts are allowed in draft state.
thumbnail_media_idis supported when the post targets Instagram or YouTube andmediacontains exactly one video.- The thumbnail must be a completed image upload owned by the same user/workspace. GIFs, videos, incomplete uploads, and inaccessible media are rejected.
- For
publish_type = story:mediais required.- If no accounts are present,
textis optional. - If all accounts are story-compatible (
facebook,instagram),textis optional. - If any account is not story-compatible,
textis required and must be non-empty.
- Media ID, account ID, and label ID arrays must not contain duplicates.
- For
accounts, you may pass either plain account IDs or{ id, board_id }objects. - Both snake_case and legacy camelCase are accepted for platform-specific request fields, but snake_case is the official public API format.
- Every
account_customizations[].idvalue must also be present inaccounts. - Each
account_customizationsentry inherits the top-levelpublish_typeand must satisfy that publish type's validation rules. - When
statusisscheduled:accountsmust be provided.scheduled_atmust be provided.scheduled_atmust be a future datetime.
scheduled_atis only permitted whenstatusisscheduled.
Public API callers are always treated as non-approvers. If the owner/workspace requires approval, creating with status: "scheduled" stores the post as pending approval while still storing scheduled_at.
Custom Reel and Short thumbnails
Upload and complete both files through the media upload flow
before creating the post. Use the completed video media ID in media and the completed image
media ID in thumbnail_media_id. Do not pass an upl_... upload-session ID.
YouTube Short:
{
"text": "Watch the full walkthrough",
"media": ["med_short_video"],
"thumbnail_media_id": "med_short_thumbnail",
"accounts": ["youtube_account_id"],
"publish_type": "short"
}Instagram Reel:
{
"text": "A quick product walkthrough",
"media": ["med_reel_video"],
"thumbnail_media_id": "med_reel_thumbnail",
"accounts": ["instagram_account_id"],
"publish_type": "short"
}Publish type examples
Regular post:
{
"text": "Launch update for this week",
"publish_type": "regular"
}Short post:
{
"text": "Quick update",
"media": ["med_short_video"],
"accounts": ["social_fb"],
"publish_type": "short"
}Story post:
{
"media": ["med_story_image"],
"accounts": ["social_ig"],
"publish_type": "story"
}Story post with no accounts yet:
{
"media": ["med_story_image"],
"publish_type": "story"
}Story post targeting a non-story-compatible account (text required):
{
"text": "Cross-posting this story asset",
"media": ["med_story_image"],
"accounts": ["social_linkedin"],
"publish_type": "story"
}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",
{ "id": "social_456", "board_id": null }
],
"account_customizations": [
{
"id": "social_456",
"text": "A LinkedIn-specific version of the launch update.",
"media": [],
"subposts": [],
"title": "Launch week teaser",
"link": "https://feedhive.com/launch",
"terms_and_conditions": "Valid while supplies last.",
"coupon_code": "LAUNCH20",
"start_date": "2026-04-15T00:00:00.000Z",
"end_date": "2026-04-22T00:00:00.000Z",
"cta": "learn_more"
}
],
"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,
"title": "Launch week teaser",
"link": "https://feedhive.com/launch",
"terms_and_conditions": "Valid while supplies last.",
"coupon_code": "LAUNCH20",
"start_date": "2026-04-15T00:00:00.000Z",
"end_date": "2026-04-22T00:00:00.000Z",
"cta": "learn_more",
"topic_type": "offer",
"privacy_status": "private",
"allow_comments": true,
"allow_duet": false,
"allow_stitch": true
}'Response body
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the request succeeded. |
| data | Post | Created post. |
PATCH /posts/:id
Update an existing post. Fields use replace semantics, so any field you send fully overwrites the current value.
Path parameters
| Field | Type | Description |
|---|---|---|
| id | string | Post identifier. |
Request body
| Field | Type | Description |
|---|---|---|
| text | string | null | Replacement root text. |
| media | string[] | Replacement media IDs. |
| thumbnail_media_id | string | null | New completed image media ID for the root Reel/Short video. Send null to remove it. |
| subposts | SubpostInput[] | Replacement subposts. |
| accounts | string[] | AccountReferenceInput[] | Replacement social account IDs or account objects. |
| account_customizations | AccountCustomizationInput[] | Replacement per-account overrides. |
| labels | string[] | Replacement label IDs. |
| status | draft | scheduled | Replacement status. |
| publish_type | regular | short | story | Replacement publish mode. |
| scheduled_at | string | null | Replacement scheduled datetime. Send null to clear it. |
| notes | string | null | Replacement notes value. |
| short_link_enabled | boolean | Replacement short-link setting. |
| title | string | null | New platform-specific title. |
| link | string | null | New platform-specific link. |
| terms_and_conditions | string | null | New Google Business offer terms. |
| coupon_code | string | null | New Google Business coupon code. |
| start_date | string | null | New Google Business event/offer start datetime. |
| end_date | string | null | New Google Business event/offer end datetime. |
| cta | string | null | New Google Business CTA. |
| topic_type | string | null | New Google Business topic type. |
| privacy_status | string | null | New YouTube/TikTok privacy status. |
| allow_comments | boolean | null | New TikTok comment toggle. |
| allow_duet | boolean | null | New TikTok duet toggle. |
| allow_stitch | boolean | null | New TikTok stitch toggle. |
The same validation rules as POST /posts apply.
You can change only the thumbnail without replacing media; the existing root media must
still contain exactly one video.
When updating to status: "scheduled", Public API callers are always treated as non-approvers. If the owner/workspace requires approval, the post is stored as pending approval, with scheduled_at preserved.
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,
"title": "Launch week teaser - revised",
"link": "https://feedhive.com/launch-revised",
"terms_and_conditions": "Valid while supplies last.",
"coupon_code": "LAUNCH20",
"start_date": "2026-04-16T00:00:00.000Z",
"end_date": "2026-04-23T00:00:00.000Z",
"cta": "learn_more",
"topic_type": "offer",
"privacy_status": "private",
"allow_comments": true,
"allow_duet": false,
"allow_stitch": true
}'Response body
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the request succeeded. |
| data | Post | Updated 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
| Field | Type | Description |
|---|---|---|
| id | string | Post 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
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the request succeeded. |
| data | Post | Deleted post. |