Post status
Overall state of the post: draft, pending, scheduled, processing, processed, or media_processing_failed
When you create a post through Postproxy, it moves through a predictable lifecycle. This guide explains each state, what to expect, and how to handle different scenarios.
Every post has three independent status layers. Understanding these is essential for building reliable integrations.
Post status
Overall state of the post: draft, pending, scheduled, processing, processed, or media_processing_failed
Platform status
Individual status for each social platform: pending, processing, published, failed, or failed_waiting_for_retry
Media status
Processing state of each attachment: pending, processed, or failed
Your post is saved but not scheduled for publication. It’s a work in progress.
{ "status": "draft", "draft": true, "scheduled_at": null}Next step: Call POST /api/posts/:id/publish to publish immediately, or update the post with scheduled_at to schedule it.
Can edit/delete: Yes
Your post has been created and media is being processed. The post is not yet ready for publication.
{ "status": "pending", "draft": false, "media": [ { "status": "pending", "content_type": "image/jpeg" } ]}What happens:
pending → processed or failedNext step:
scheduledmedia_processing_failedTypical duration: Images 1–15 seconds. Videos 10–120 seconds depending on size.
Can edit/delete: Cannot edit. Can delete.
Your post is ready and queued for publication at the specified time. All media has been successfully processed.
{ "status": "scheduled", "draft": false, "scheduled_at": "2024-01-15T10:00:00Z", "media": [ { "status": "processed", "url": "https://cdn.postproxy.dev/..." } ]}Next step: At the scheduled time, the system changes status to processing, initiates publishing jobs, and immediately transitions to processed.
Can edit/delete: Cannot edit. Can delete.
A brief intermediate state while platform publishing jobs are being enqueued.
{ "status": "processing", "draft": false}Duration: Usually less than 1 second.
Can edit/delete: No
Platform publishing jobs have been initiated. The post is now in the hands of each platform’s publishing system.
{ "status": "processed", "draft": false}At the platform level, you may see various states:
{ "platforms": [ { "network": "twitter", "status": "published" }, { "network": "instagram", "status": "processing" }, { "network": "youtube", "status": "failed" } ]}Can edit/delete: Cannot edit. Can delete from Postproxy (does not remove from social platforms).
One or more media attachments failed to download or process. This is the only failure state at the post level.
{ "status": "media_processing_failed", "media": [ { "id": "abc123", "status": "failed", "error_message": "Media file not found (404)", "source_url": "https://example.com/missing.jpg" } ]}Recovery: Create a new post with correct media URLs and delete the failed post.
Even if a post has status: "processed", individual platforms can succeed or fail independently.
| Status | Meaning |
|---|---|
pending | Waiting to be processed |
processing | Currently publishing — active API call in progress |
published | Successfully live on the social network |
failed | Permanent failure — check error_message |
failed_waiting_for_retry | Temporary failure, retry scheduled — see retry_after |
Post to 3 platforms where 2 succeed and 1 fails:
{ "status": "processed", "platforms": [ { "network": "twitter", "status": "published" }, { "network": "linkedin", "status": "published" }, { "network": "instagram", "status": "failed", "error_message": "Instagram account disconnected" } ]}Postproxy automatically retries transient failures so you don’t have to.
Retried automatically
Network timeouts, temporary rate limits, platform API temporarily unavailable, quota errors
Not retried
Invalid credentials, account disconnected, content policy violations, invalid media format
Retries use exponential backoff:
| Attempt | Delay |
|---|---|
| 1st retry | 1 minute |
| 2nd retry | 5 minutes |
| 3rd retry | 15 minutes |
| 4th retry | 30 minutes |
| 5th retry | 60 minutes |
Maximum: 5 retry attempts
{ "network": "twitter", "status": "failed_waiting_for_retry", "error_message": "Rate limit exceeded", "retry_attempts": 2, "retry_after": "2024-01-15T10:20:00Z"}When you include media in a post, it must be processed before publishing can begin.
| Status | Meaning | Duration |
|---|---|---|
pending | Downloading/processing | 1–30 seconds |
processed | Ready for publication | — |
failed | Could not process | Check error_message |
| Media type | Typical duration |
|---|---|
| Small image (< 1 MB) | 1–5 seconds |
| Large image (1–10 MB) | 5–15 seconds |
| Short video (< 100 MB) | 10–30 seconds |
| Large video (> 100 MB) | 30–120 seconds |
| Error | Cause |
|---|---|
Media file not found (404) | URL doesn’t exist |
Access denied to media file (403) | URL requires authentication |
Connection timed out | Server too slow or unreachable |
Unsupported format | File type not supported by platform |
Subscribe to webhooks to receive real-time updates about your posts. See Webhooks for setup.
| Event | When it fires |
|---|---|
post.processed | Post finished processing, jobs initiated |
platform_post.published | Individual platform published successfully |
platform_post.failed | Individual platform failed |
platform_post.failed_waiting_for_retry | Retry scheduled for a platform |
media.failed | Media processing error |
platform_post.insights | New analytics available |
{ "event_type": "post.processed", "data": { "id": "abc123", "body": "Hello world!", "status": "processed", "platforms": [ { "platform": "twitter", "status": "published" }, { "platform": "instagram", "status": "published" } ] }}{ "event_type": "platform_post.failed", "data": { "id": "pp_456", "post_id": "abc123", "platform": "instagram", "status": "failed", "error": "Invalid credentials" }}POST /api/posts{ "post": { "body": "Big announcement tomorrow!", "scheduled_at": "2024-01-16T09:00:00Z" }, "profiles": ["twitter", "linkedin"]}status: "scheduled" (no media to process)processing → processed (jobs enqueued, < 1 second)POST /api/posts{ "post": { "body": "Big announcement tomorrow!", "scheduled_at": "2024-01-16T09:00:00Z" }, "profiles": ["instagram", "facebook"], "media": ["https://example.com/photo.jpg"]}status: "pending", media status: "pending"scheduledprocessing → processed (jobs initiated)POST /api/posts{ "post": { "body": "Live now!" }, "profiles": ["twitter"]}scheduled_at to current timescheduled → processing → processed (< 1 second)Total time: 2–10 seconds
# Step 1: Create draftPOST /api/posts{ "post": { "body": "Work in progress", "draft": true }, "profiles": ["twitter"]}# Response: status: "draft"# Step 2: Publish when ready (hours or days later)POST /api/posts/abc123/publish# Response: status: "processing"The draft stays in draft status with no automatic publishing until you explicitly call /publish.
processing → processed (< 1 second)processed — platform statuses show mixed resultsAfter platforms finish:
{ "status": "processed", "platforms": [ { "network": "twitter", "status": "published" }, { "network": "linkedin", "status": "published" }, { "network": "instagram", "status": "failed", "error_message": "Instagram account disconnected" } ]}Recovery: Fix Instagram connection in your dashboard, then create a new post for Instagram if needed.
processing → processed (job initiated)failed_waiting_for_retryDuring retry:
{ "status": "processed", "platforms": [{ "network": "twitter", "status": "failed_waiting_for_retry", "retry_after": "2024-01-15T10:01:00Z" }]}| Phase | Duration | Notes |
|---|---|---|
| Post creation | < 1 sec | Post created with initial status |
| Media processing (images) | 1–15 sec | Post in pending status |
| Media processing (video) | 10–120 sec | Depends on file size |
| Scheduling | Instant | Post → scheduled after media ready |
| Job initiation | < 1 sec | processing → processed |
| Platform publishing (text) | 1–5 sec | Per platform |
| Platform publishing (images) | 5–15 sec | Per platform |
| Platform publishing (video) | 10–60 sec | Per platform |
| Retries | 1–60 min | Exponential backoff, max 5 attempts |
| First insights | 1+ hour | After platform reports published |
| Insight updates | 2–12 hours | Varies by platform |
Use the status query parameter to filter posts:
GET /api/posts?status=draftGET /api/posts?status=scheduledGET /api/posts?status=publishedGET /api/posts?status=failed| Filter | What you get |
|---|---|
draft | All draft posts |
scheduled | Posts scheduled for the future |
published | Successfully published posts (status: "processed") |
failed | Posts with at least one failed platform |
Check platform statuses
processed means jobs started, not completed. Always check individual platform statuses for actual publishing state.
Handle retries gracefully
Don’t alert users on first failure. Check for failed_waiting_for_retry and wait for automatic retries before reporting permanent failures.
Use webhooks
Instead of polling the API, subscribe to webhook events for instant notifications and fewer API calls.
Plan for partial failures
Posts can partially succeed — some platforms publish while others fail. Handle this in your UI and allow users to retry failed platforms.