API Documentation

The Status 200 Uploads API lets you upload media and publish to TikTok, Instagram, Facebook, YouTube, X (Twitter), LinkedIn, Pinterest, and Threads programmatically.

Base URL

https://app.status200uploads.com/functions/v1

All API requests use this base URL

Protocol

HTTPS

All requests must use HTTPS

Format

JSON

Request and response bodies are JSON

Supported Platforms

TikTok

Video, Photo slideshow

Instagram

Image, Reel, Story, Carousel

Facebook

Photo, Video, Reel, Text

YouTube

Video

X (Twitter)

Text, Image, Video

LinkedIn

Text, Image, Video

Pinterest

Image Pin

Authentication

All API requests require a valid API key passed in the Authorization header using Bearer token format.

Generating API Keys

  1. Sign in to your dashboard
  2. Navigate to API Management
  3. Click "Generate Key" and give it a descriptive name
  4. Copy the key immediately - it will only be shown once

Using Your API Key

Authorization: Bearer rl_your_api_key_here

Keep Your Keys Secure

Never expose API keys in client-side code, public repositories, or logs. Use environment variables and server-side proxies. Rotate keys periodically and revoke any that may have been compromised.

Key Rotation Best Practices

  • 1. Generate a new key before revoking the old one
  • 2. Update all services to use the new key
  • 3. Verify traffic is flowing with the new key
  • 4. Revoke the old key from your dashboard

MCP server (Claude Code, Cursor, Windsurf …)

Recommended — hosted MCP: Integrations hublists every client snippet. Endpoint https://mcp.status200uploads.com/mcp terminates TLS publicly; each user attaches Authorization: Bearer rl_… (dashboard API key) or a Supabase access JWT on MCP initialization so tenants never share a password. Probe readiness with https://mcp.status200uploads.com/health.

Hosted operators keep SUPABASE_SERVICE_ROLE_KEY on the MCP container only — never expose it to agents, repos, or the browser bundle. Operational detail lives in mcp-server/README.md.

Cursor / MCP clients supporting remote HTTPS

{
  "mcpServers": {
    "status200-uploads": {
      "url": "https://mcp.status200uploads.com/mcp",
      "headers": {
        "Authorization": "Bearer rl_put_your_dashboard_key_here"
      }
    }
  }
}

Rate Limits

Daily post limits are enforced per platform per account. Your plan determines how many posts you can publish each day to each connected platform. When you use the REST API at POST https://status200uploads.com/api/v2/posts, a request that would exceed your daily cap is still accepted: the server responds with HTTP 202 and queues the post for the next calendar day (see the Post endpoint reference).

Limits by Plan

ParameterTypeDescription
Free5 / dayPer platform, per account
Beginner20 / dayPer platform, per account
Apprentice50 / dayPer platform, per account
Skilled100 / dayPer platform, per account
Expert150 / dayPer platform, per account
AgencyUnlimitedPer platform, per account

Rate Limit Headers

Responses include headers indicating your current rate limit status:

X-RateLimit-Limit: 100

X-RateLimit-Remaining: 97

X-RateLimit-Reset: 2026-04-17T00:00:00Z

Quick Start

Get up and running in two steps: upload media, then publish a post.

1

Upload Media

curl -X POST 'https://app.status200uploads.com/functions/v1/api-media-upload' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer rl_your_api_key' \
  -d '{"url": "https://example.com/video.mp4"}'
{
  "success": true,
  "file_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "size": 5242880,
  "type": "video/mp4"
}
2

Publish a Post

curl -X POST 'https://app.status200uploads.com/functions/v1/api-posts' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer rl_your_api_key' \
  -d '{
    "post": {
      "accountId": "@yourprofile",
      "platform": "tiktok",
      "content": {
        "text": "My first API post! #automation",
        "mediaID": ["YOUR_FILE_ID"]
      },
      "tiktok": {
        "privacyLevel": "PUBLIC_TO_EVERYONE"
      }
    }
  }'
{
  "success": true,
  "post_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "platform": "tiktok",
  "status": "published"
}

API Reference

POST/v1/posts

Create and publish a post to a connected social media platform. Each request publishes to one platform at a time.

REST v2 — Use POST https://status200uploads.com/api/v2/posts with the same JSON body for TikTok, Instagram, Facebook, and YouTube. If you have already hit your plan's daily post limit for that platform, the server responds with 202 Accepted and queues the post for the next calendar day (response shape below). On immediate success the status is 200 with the platform payload.

Request Headers

ParameterTypeDescription
Content-Typerequiredstringapplication/json
AuthorizationrequiredstringBearer rl_your_api_key

Body Parameters

ParameterTypeDescription
post.accountIdrequiredstringProfile handle from your Connections page (e.g. "@myprofile")
post.platformrequiredstringTarget platform: tiktok, instagram, facebook, youtube, x, linkedin, pinterest
post.content.textrequiredstringCaption, title, or tweet text
post.content.mediaIDstring[]Array of file IDs from the media upload endpoint (preferred)
post.content.mediaUrlsstring[]Array of public URLs (alternative to mediaID)
post.scheduledForstringISO 8601 timestamp to schedule the post for a future time

Platform-Specific Options

Include a platform object in the request body alongside the required fields above. Each platform supports different options:

Example

curl -X POST 'https://app.status200uploads.com/functions/v1/api-posts' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer rl_your_api_key' \
  -d '{
    "post": {
      "accountId": "@myprofile",
      "platform": "instagram",
      "content": {
        "text": "Check out this reel! #trending",
        "mediaID": ["a1b2c3d4-e5f6-7890-abcd-ef1234567890"]
      },
      "instagram": {
        "postType": "reel",
        "shareToFeed": true
      }
    }
  }'
200Post published immediately (v2 returns the platform JSON on success; legacy responses may vary)
{
  "success": true,
  "post_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "platform": "instagram",
  "status": "published"
}
202Post accepted and queued for the next day — returned by POST /api/v2/posts when the daily post cap for that platform is already reached (scheduled in dashboard as a scheduled post).
{
  "queued": true,
  "code": "queued_for_next_day",
  "message": "Daily post limit reached for instagram (5/5 today). Post queued for 2026-05-17T14:30:00.000Z.",
  "scheduled_post_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "scheduled_at": "2026-05-17T14:30:00.000Z",
  "limit": 5,
  "used": 5,
  "plan": "free"
}
StatusErrorDescription
400Bad RequestMissing required fields or invalid platform
401UnauthorizedMissing or invalid API key
403ForbiddenAccount not connected or insufficient permissions
429Too Many RequestsCooldown between rapid requests to the same platform on the legacy Supabase endpoint, or other spacing limits — not the daily-post cap (v2 uses 202 for daily cap)
500Server ErrorPublishing failed, or v2 could not save the queued post (error code queue_failed)
GET/v1/posts

List all posts for the authenticated user. Returns posts in reverse chronological order with pagination support.

Query Parameters

ParameterTypeDescription
platformstringFilter by platform (tiktok, instagram, facebook, youtube, x, linkedin, pinterest)
statusstringFilter by status (published, failed, scheduled, pending)Default: all
limitnumberNumber of results to returnDefault: 20
offsetnumberNumber of results to skip for paginationDefault: 0
curl 'https://app.status200uploads.com/functions/v1/api-posts?platform=tiktok&limit=10' \
  -H 'Authorization: Bearer rl_your_api_key'
200Posts retrieved successfully
{
  "posts": [
    {
      "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "platform": "tiktok",
      "account_id": "@myprofile",
      "caption": "Check this out! #viral",
      "status": "published",
      "platform_post_id": "7123456789012345678",
      "created_at": "2026-04-15T10:30:00Z",
      "published_at": "2026-04-15T10:30:05Z"
    }
  ],
  "total": 42,
  "limit": 10,
  "offset": 0
}
GET/v1/posts/{id}

Retrieve a single post by its ID. Returns full post details including platform-specific metadata.

Path Parameters

ParameterTypeDescription
idrequiredstringThe unique post ID returned when the post was created
curl 'https://app.status200uploads.com/functions/v1/api-posts/b2c3d4e5-f6a7-8901-bcde-f12345678901' \
  -H 'Authorization: Bearer rl_your_api_key'
200Post retrieved successfully
{
  "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "platform": "tiktok",
  "account_id": "@myprofile",
  "caption": "Check this out! #viral",
  "status": "published",
  "platform_post_id": "7123456789012345678",
  "media": [
    {
      "file_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "type": "video/mp4",
      "size": 5242880
    }
  ],
  "platform_options": {
    "privacyLevel": "PUBLIC_TO_EVERYONE"
  },
  "created_at": "2026-04-15T10:30:00Z",
  "published_at": "2026-04-15T10:30:05Z"
}
StatusErrorDescription
401UnauthorizedMissing or invalid API key
404Not FoundPost does not exist or belongs to another user
DELETE/v1/posts/{id}

Cancel a scheduled post. Only posts with status 'scheduled' can be cancelled. Published posts cannot be deleted via the API.

Path Parameters

ParameterTypeDescription
idrequiredstringThe unique post ID of the scheduled post to cancel
curl -X DELETE 'https://app.status200uploads.com/functions/v1/api-posts/b2c3d4e5-f6a7-8901-bcde-f12345678901' \
  -H 'Authorization: Bearer rl_your_api_key'
200Post cancelled successfully
{
  "success": true,
  "message": "Scheduled post cancelled"
}
StatusErrorDescription
400Bad RequestPost is not in scheduled status and cannot be cancelled
401UnauthorizedMissing or invalid API key
404Not FoundPost does not exist or belongs to another user
POST/v1/media

Upload media by providing a publicly accessible URL. The file is downloaded, validated, and stored in your media library.

Request Body

ParameterTypeDescription
urlrequiredstringPublic URL to the media file (JPG, PNG, WebP, MP4, MOV, WebM)

Images

JPG, PNG, WebP - Max 20 MB

Videos

MP4, MOV, WebM - Max 250 MB

curl -X POST 'https://app.status200uploads.com/functions/v1/api-media-upload' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer rl_your_api_key' \
  -d '{"url": "https://example.com/photo.jpg"}'
200Media uploaded successfully
{
  "success": true,
  "file_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "size": 2048576,
  "type": "image/jpeg"
}
StatusErrorDescription
400Bad RequestInvalid URL or unsupported file format
401UnauthorizedMissing or invalid API key
413Payload Too LargeFile exceeds maximum size limit
422UnprocessableFile could not be downloaded from the provided URL
GET/v1/profiles

List all connected social media profiles for the authenticated user. Use accountId values from this response when creating posts.

curl 'https://app.status200uploads.com/functions/v1/api-posts?action=profiles' \
  -H 'Authorization: Bearer rl_your_api_key'
200Profiles retrieved successfully
{
  "profiles": [
    {
      "account_id": "@creator_studio",
      "platform": "tiktok",
      "display_name": "Creator Studio",
      "status": "active",
      "connected_at": "2026-03-01T12:00:00Z"
    },
    {
      "account_id": "@mybrand",
      "platform": "instagram",
      "display_name": "My Brand",
      "status": "active",
      "connected_at": "2026-03-05T08:30:00Z"
    }
  ]
}
GET/v1/platforms

List all supported platforms and their capabilities, including supported media types, character limits, and file size restrictions.

curl 'https://app.status200uploads.com/functions/v1/api-posts?action=platforms' \
  -H 'Authorization: Bearer rl_your_api_key'
200Platforms retrieved successfully
{
  "platforms": [
    {
      "id": "tiktok",
      "name": "TikTok",
      "media_types": ["video", "photo_slideshow"],
      "max_caption_length": 4000,
      "max_video_size_mb": 287,
      "max_image_size_mb": 20
    },
    {
      "id": "instagram",
      "name": "Instagram",
      "media_types": ["image", "reel", "story", "carousel"],
      "max_caption_length": 2200,
      "max_video_size_mb": 250,
      "max_image_size_mb": 8
    }
  ]
}
GET/v1/analytics/{post_id}

Get engagement metrics for a published post including views, likes, comments, shares, and platform-specific metrics.

Path Parameters

ParameterTypeDescription
post_idrequiredstringThe unique post ID returned when the post was created
curl 'https://app.status200uploads.com/functions/v1/poll-engagement?post_id=b2c3d4e5-f6a7-8901' \
  -H 'Authorization: Bearer rl_your_api_key'
200Metrics retrieved successfully
{
  "post_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "platform": "tiktok",
  "metrics": {
    "views": 15420,
    "likes": 892,
    "comments": 47,
    "shares": 123,
    "saves": 56
  },
  "polled_at": "2026-04-16T08:00:00Z"
}
StatusErrorDescription
401UnauthorizedMissing or invalid API key
404Not FoundPost not found or no metrics available yet

Guides

Your First API Call

This guide walks you through making your first successful API call to publish a post.

1

Get your API key

Sign in to your dashboard, navigate to API Management, and click "Generate Key". Copy the key - you will only see it once.

2

Connect a social account

Go to Connections and link at least one social media account. Note the account handle (e.g. @myprofile) - you will need this for the API call.

3

Upload your media

curl -X POST 'https://app.status200uploads.com/functions/v1/api-media-upload' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer rl_YOUR_KEY' \
  -d '{"url": "https://example.com/video.mp4"}'

Save the file_id from the response.

4

Publish your post

curl -X POST 'https://app.status200uploads.com/functions/v1/api-posts' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer rl_YOUR_KEY' \
  -d '{
    "post": {
      "accountId": "@myprofile",
      "platform": "tiktok",
      "content": {
        "text": "Hello world! #firstpost",
        "mediaID": ["YOUR_FILE_ID"]
      },
      "tiktok": { "privacyLevel": "PUBLIC_TO_EVERYONE" }
    }
  }'
5

Check the result

A successful response returns {"success": true} with the post_id. You can view the post in your History page or via the GET /v1/posts endpoint.

Scheduling Posts in Bulk

Automate publishing across multiple platforms and time slots using the scheduling API.

import requests
from datetime import datetime, timedelta

API_KEY = "rl_your_api_key"
BASE_URL = "https://app.status200uploads.com/functions/v1"
HEADERS = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {API_KEY}"
}

# Define your content schedule
schedule = [
    {"platform": "tiktok", "account": "@mytiktok", "hour": 9},
    {"platform": "instagram", "account": "@myinsta", "hour": 12},
    {"platform": "x", "account": "@mytwitter", "hour": 15},
    {"platform": "linkedin", "account": "@mylinkedin", "hour": 17},
]

# Upload media once
media_resp = requests.post(
    f"{BASE_URL}/api-media-upload",
    headers=HEADERS,
    json={"url": "https://example.com/content.mp4"}
)
file_id = media_resp.json()["file_id"]

# Schedule posts across platforms
tomorrow = datetime.now() + timedelta(days=1)
for item in schedule:
    scheduled_time = tomorrow.replace(
        hour=item["hour"], minute=0, second=0
    ).isoformat() + "Z"

    resp = requests.post(
        f"{BASE_URL}/api-posts",
        headers=HEADERS,
        json={
            "post": {
                "accountId": item["account"],
                "platform": item["platform"],
                "content": {
                    "text": "Check out our latest content!",
                    "mediaID": [file_id]
                },
                "scheduledFor": scheduled_time
            }
        }
    )
    status = "OK" if resp.json().get("success") else "FAIL"
    print(f"{item['platform']}: {status} at {scheduled_time}")

Handling Media Uploads

Best practices for uploading images and videos through the API.

Supported Formats

Images

JPEG, PNG, WebP - up to 20 MB

Videos

MP4, MOV, WebM - up to 250 MB

Upload Flow

  1. 1. Host your media on a publicly accessible URL (S3, CloudFlare R2, any CDN)
  2. 2. Call POST /v1/media with the URL
  3. 3. The API downloads, validates, and stores the file
  4. 4. Use the returned file_id when creating posts
  5. 5. A single file_id can be reused across multiple posts and platforms

Pro Tip

For Instagram carousels and TikTok photo slideshows, upload multiple media files and pass all file_id values in the mediaID array.

Using Webhooks for Status Updates

Receive real-time notifications when posts are published, fail, or when profiles disconnect.

1

Set up an endpoint

Create an HTTPS endpoint on your server that accepts POST requests. The endpoint should respond with a 200 status within 5 seconds.

2

Register your webhook URL

Configure your webhook URL in the dashboard under API Management. Select which events you want to receive.

3

Handle incoming events

app.post('/webhooks/status200', (req, res) => {
  const signature = req.headers['x-webhook-signature'];
  // Verify the signature (see Signature Verification section)

  const event = req.body;
  switch (event.type) {
    case 'post.published':
      console.log('Post published:', event.data.post_id);
      break;
    case 'post.failed':
      console.log('Post failed:', event.data.error);
      break;
    case 'profile.disconnected':
      console.log('Profile disconnected:', event.data.account_id);
      break;
  }

  res.status(200).send('OK');
});

Integrating with n8n

Use n8n workflows to automate social media publishing with Status 200 Uploads.

1

Add an HTTP Request node

Set the method to POST and the URL to https://app.status200uploads.com/functions/v1/api-posts

2

Configure headers

Add Authorization: Bearer rl_your_key and Content-Type: application/json as headers.

3

Set the JSON body

Use the standard post body structure. You can dynamically reference values from previous nodes using n8n expressions like {{ $json.caption }}.

4

Connect your trigger

Connect any trigger node (Schedule, Webhook, RSS, etc.) to automate when posts are created. For example, use a Schedule node to post every day at 9 AM.

Integrating with Make.com

Build automated scenarios in Make.com that publish content through the Status 200 Uploads API.

1

Create a new scenario

Start a new scenario in Make.com and add an HTTP module (Make a request).

2

Configure the HTTP module

Set URL to https://app.status200uploads.com/functions/v1/api-posts, method to POST, and body type to JSON. Add your Authorization header.

3

Map your data

Use Make.com's data mapping to dynamically populate the post body. Connect to Google Sheets, Airtable, or any data source for content.

4

Schedule and activate

Set the scenario to run on a schedule or trigger from another module. Activate the scenario to start publishing automatically.

Integrating with Zapier

Connect Status 200 Uploads to thousands of apps through Zapier's webhook integration.

1

Create a new Zap

Choose your trigger app (e.g., Google Sheets, Airtable, or Schedule by Zapier).

2

Add a Webhooks action

Select "Webhooks by Zapier" as the action and choose "Custom Request".

3

Configure the request

Set method to POST, URL to https://app.status200uploads.com/functions/v1/api-posts. Add headers for Authorization and Content-Type. Set the data field to your JSON post body.

4

Test and publish

Test the Zap with sample data. Once confirmed working, turn on the Zap to automate publishing.

SDKs

Official SDKs

Use our official SDKs to integrate with the Status 200 Uploads API in your language of choice. SDKs handle authentication, retries, and type safety out of the box.

Node.js

beta

@status200/uploads-node@1.0.0

npm install @status200/uploads-node

Python

beta

status200-uploads@1.0.0

pip install status200-uploads

Community SDKs

Building an SDK in another language? We would love to list it here. Reach out to us at info@status200uploads.com

Node.js SDK

Full TypeScript support with automatic type inference.

Installation

npm install @status200/uploads-node

Quick Start

import { Status200 } from '@status200/uploads-node';

const client = new Status200({ apiKey: process.env.STATUS200_API_KEY });

// Upload media
const media = await client.media.upload({
  url: 'https://example.com/video.mp4'
});

// Create a post
const post = await client.posts.create({
  accountId: '@myprofile',
  platform: 'tiktok',
  content: {
    text: 'Automated with the Node SDK!',
    mediaID: [media.file_id]
  },
  tiktok: {
    privacyLevel: 'PUBLIC_TO_EVERYONE'
  }
});

console.log('Published:', post.post_id);

// List posts
const { posts } = await client.posts.list({
  platform: 'tiktok',
  limit: 10
});

// Get analytics
const metrics = await client.analytics.get(post.post_id);
console.log('Views:', metrics.views);

Python SDK

Pythonic interface with full type hints and async support.

Installation

pip install status200-uploads

Quick Start

from status200 import Status200Client

client = Status200Client(api_key="rl_your_api_key")

# Upload media
media = client.media.upload(url="https://example.com/video.mp4")

# Create a post
post = client.posts.create(
    account_id="@myprofile",
    platform="tiktok",
    content={
        "text": "Automated with Python SDK!",
        "mediaID": [media.file_id]
    },
    tiktok={"privacyLevel": "PUBLIC_TO_EVERYONE"}
)

print(f"Published: {post.post_id}")

# List posts
posts = client.posts.list(platform="tiktok", limit=10)

# Async support
import asyncio
from status200 import AsyncStatus200Client

async def main():
    async_client = AsyncStatus200Client(api_key="rl_your_api_key")
    post = await async_client.posts.create(...)
    await async_client.close()

asyncio.run(main())

Webhooks

Webhooks

Webhooks let you receive real-time HTTP notifications when events occur in your account. Instead of polling the API, configure a webhook endpoint to get push notifications for post status changes and profile events.

How It Works

  1. 1. Register your HTTPS endpoint URL in the dashboard
  2. 2. Select which event types to subscribe to
  3. 3. We send POST requests to your endpoint when events occur
  4. 4. Respond with a 2xx status within 5 seconds to acknowledge

Retry Policy

If your endpoint fails to respond with a 2xx status, we retry up to 3 times with exponential backoff:

1st retry

after 1 minute

2nd retry

after 5 minutes

3rd retry

after 30 minutes

Event Types

Subscribe to the events relevant to your integration.

ParameterTypeDescription
post.publishedeventA post was successfully published to the platform
post.failedeventA post failed to publish (includes error details)
post.scheduledeventA post was scheduled for future publishing
profile.disconnectedeventA connected social account was disconnected or token expired

Example Payloads

post.published

{
  "id": "evt_abc123",
  "type": "post.published",
  "created_at": "2026-04-16T10:30:00Z",
  "data": {
    "post_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "platform": "tiktok",
    "account_id": "@myprofile",
    "platform_post_id": "7123456789012345678",
    "published_at": "2026-04-16T10:30:05Z"
  }
}

post.failed

{
  "id": "evt_def456",
  "type": "post.failed",
  "created_at": "2026-04-16T10:30:00Z",
  "data": {
    "post_id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
    "platform": "instagram",
    "account_id": "@mybrand",
    "error_code": "MEDIA_ERROR",
    "error_message": "Video format not supported by Instagram"
  }
}

profile.disconnected

{
  "id": "evt_ghi789",
  "type": "profile.disconnected",
  "created_at": "2026-04-16T10:30:00Z",
  "data": {
    "account_id": "@myprofile",
    "platform": "facebook",
    "reason": "token_expired",
    "message": "Facebook access token has expired. Please reconnect."
  }
}

Signature Verification

Every webhook request includes an X-Webhook-Signature header. Verify this signature to ensure the request came from Status 200 Uploads and was not tampered with.

Signature Format

The signature is an HMAC-SHA256 hash of the raw request body, using your webhook signing secret as the key. The result is hex-encoded and prefixed with sha256=.

Node.js Example

import crypto from 'crypto';

function verifyWebhookSignature(body, signature, secret) {
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(body, 'utf8')
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signature)
  );
}

// In your webhook handler:
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const sig = req.headers['x-webhook-signature'];
  const isValid = verifyWebhookSignature(req.body, sig, WEBHOOK_SECRET);

  if (!isValid) {
    return res.status(401).send('Invalid signature');
  }

  const event = JSON.parse(req.body);
  // Process the event...

  res.status(200).send('OK');
});

Python Example

import hmac
import hashlib

def verify_signature(body: bytes, signature: str, secret: str) -> bool:
    expected = 'sha256=' + hmac.new(
        secret.encode(),
        body,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

# In your Flask handler:
@app.route('/webhook', methods=['POST'])
def webhook():
    sig = request.headers.get('X-Webhook-Signature', '')
    if not verify_signature(request.data, sig, WEBHOOK_SECRET):
        return 'Invalid signature', 401

    event = request.json
    # Process the event...

    return 'OK', 200

Resources

Changelog

API version history and breaking changes.

v1.4.0April 2026

Engagement Analytics & Scheduled Posts

  • +GET /v1/analytics/{post_id} endpoint for engagement metrics
  • +Post scheduling with scheduledFor parameter
  • +DELETE /v1/posts/{id} to cancel scheduled posts
  • +Webhook events for post.scheduled
v1.3.0March 2026

Pinterest & LinkedIn Carousel Support

  • +Pinterest platform support with board selection
  • +LinkedIn carousel posts with multiple images
  • +X (Twitter) community posting support
  • *Instagram carousel ordering now respects array order
v1.2.0February 2026

X (Twitter) & LinkedIn Platforms

  • +X (Twitter) platform support with text, image, and video
  • +LinkedIn platform support with text, image, and video
  • +Per-platform rate limiting
  • ~Rate limit headers now included in all responses
v1.1.0January 2026

YouTube Support & Media Library

  • +YouTube video upload support
  • +Media library with file_id reuse across posts
  • +GET /v1/profiles endpoint
  • ~mediaUrls now optional when mediaID is provided
v1.0.0December 2025

Initial Release

  • +POST /v1/posts for TikTok, Instagram, and Facebook
  • +POST /v1/media for URL-based media uploads
  • +Bearer token authentication
  • +Webhook notifications for post.published and post.failed

OpenAPI Specification

The full API is described using the OpenAPI 3.1 specification. Use it to generate client libraries, validate requests, or import into tools like Postman or Insomnia.

openapi.yaml

OpenAPI 3.1 specification

https://status200uploads.com/docs/api/openapi.yaml

Import the spec into your preferred tool:

  • - Postman: Import as API definition
  • - Insomnia: Import from URL
  • - openapi-generator: Generate typed clients in 40+ languages

Ready to get started?

Create an account to get your API key and start automating your social media posts.

Get Started Free