Posteady
Posteady Docs
API

Facebook Page publishing

Publish, schedule, track, and read Facebook Page feed posts, Reels, and Stories through the REST API.

Use a connected Facebook Page with capabilities.publishPosts: true. Each request targets one Page and uses a self-contained facebook object instead of posts, video, instagram, or youtube.

GET /api/v1/accounts returns the Page accountId. Publishing and scheduling require a healthy connection with the pages_manage_posts scope and the Page CREATE_CONTENT task. They also remain disabled until Posteady's public-write rollout is enabled. Capabilities are a discovery aid; Posteady checks the current plan, workspace permission, rollout state, and Page eligibility again on every request. If rollout is not enabled, new jobs return 503 SERVICE_UNAVAILABLE while replay, status, and cancellation of existing jobs remain available.

Supported content

contentTypeInputRules
FEEDText only, one image, 2–10 images, or one videoRequires a non-empty message or media. Images and video cannot be mixed. A URL in a text-only message may become a link post.
REELSOne videoOptional message; video must be 3–90 seconds.
STORYOne image or videoThe message field is rejected because Facebook Stories have no caption surface. Story videos must be 3–60 seconds.

Messages allow up to 63,206 characters and surrounding whitespace is removed. Images must be confirmed JPEG files up to 8 MiB. Videos must be confirmed MP4 or QuickTime files up to 1 GiB and 20 minutes; Reels and video Stories also have the shorter limits above. Posteady resolves every mediaId in the Page's workspace and verifies the stored object and media metadata before publishing.

Choose or upload media

List confirmed images or videos:

curl "https://www.posteady.com/api/v1/media?mediaType=IMAGE" \
  -H "Authorization: Bearer $POSTEADY_API_KEY"

To upload new media, call POST /api/v1/media/uploads, PUT the bytes to the returned private staging URL with every requiredHeaders value, then call POST /api/v1/media/uploads/confirm. Use only the resulting mediaId; arbitrary public URLs and caller-supplied media metadata are not accepted by the Facebook publishing contract.

Publish now

Create one UUID and keep it when retrying the same request:

curl -X POST https://www.posteady.com/api/v1/posts \
  -H "Authorization: Bearer $POSTEADY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountIds": ["<facebook-page-account-uuid>"],
    "facebook": {
      "requestId": "<request-uuid>",
      "contentType": "FEED",
      "message": "Our latest release is live",
      "items": [{ "mediaId": "<confirmed-image-uuid>" }]
    }
  }'

Facebook publishing is always asynchronous. A new or still-running job returns HTTP 202 with results[0].jobId; success: true means accepted, not published. An idempotent replay in any terminal state (published, failed, canceled, or unknown) returns HTTP 200. HTTP 200 means the existing job was retrieved, not that publication succeeded: success remains false for failed, canceled, and unknown, so always inspect both fields.

curl "https://www.posteady.com/api/v1/publish-jobs/<job-uuid>" \
  -H "Authorization: Bearer $POSTEADY_API_KEY"

Wait for published before using the native postId. unknown means the final Meta submission outcome could not be established. Posteady does not automatically submit it again; check the Page before creating a new request.

The same requestId and normalized input return the existing job. Changing the Page, content type, message, ordered media IDs, schedule, or timezone returns 409 REQUEST_CONFLICT. A replay still checks current access and counts as one API call for rate, quota, and audit purposes.

Schedule and cancel

Send the same facebook object to POST /api/v1/scheduled-posts with a future timestamp:

{
  "accountIds": ["<facebook-page-account-uuid>"],
  "facebook": {
    "requestId": "<request-uuid>",
    "contentType": "STORY",
    "items": [{ "mediaId": "<confirmed-image-uuid>" }]
  },
  "scheduledAt": "<future-time-with-offset>",
  "timezone": "Asia/Seoul"
}

An accepted Facebook schedule returns HTTP 202. List it with GET /api/v1/scheduled-posts?provider=facebook and cancel it before processing starts:

curl -X DELETE "https://www.posteady.com/api/v1/scheduled-posts/<scheduled-post-uuid>?platform=facebook" \
  -H "Authorization: Bearer $POSTEADY_API_KEY"

Once processing begins, cancellation returns POST_NOT_CANCELLABLE. Immediate jobs and jobs with an uncertain (unknown) outcome do not appear in the scheduled-post list.

Read posts and metrics

Call GET /api/v1/posts?provider=facebook. Results come from non-deleted Page posts already synchronized to Posteady; this does not trigger a live Graph refresh. mediaType is TEXT, LINK, PHOTO, MULTI_PHOTO, VIDEO, REEL, STORY, or null. views is Facebook post_media_view, comments map to replies, and the Facebook share count appears as both shares and reposts. Unsupported reach, quotes, and bookmarks are null. Treat all null metrics as unavailable, not zero.

Use MCP

Use list_accounts, the media tools, publish_post, schedule_post, get_publish_status, list_scheduled_posts, cancel_scheduled_post, and list_posts. Pass the same facebook object. Publishing and scheduling derive the workspace from the Page; status derives it from the job. See What you can do.

On this page