# Social media posting API (REST)

Canonical: https://status200uploads.com/integrations/rest-api

Checked on 26 October 2026.

The Status 200 Uploads REST API posts to a social network with one HTTPS request: send the post as JSON to https://status200uploads.com/api/v2/posts with your rl_ API key, and it goes out now or at a time you choose, up to 365 days ahead. On every plan, Free included. Every answer says what happened, gives the address that reads the post back, and, when a request is refused, the code and the next step.

Tested on 22 October 2026.

## What you need

- On every plan, Free included.
- **An API key:** An rl_ key from the dashboard, under API (Generate Key). Send it as Authorization: Bearer rl_your_api_key; the word Bearer may be written in any case.
- **Address:** https://status200uploads.com/api/v2. The older address https://app.status200uploads.com/functions/v1 takes the same key for posts and imports; reads and upload links are on the main address only.
- **Connected networks:** Connect each network once in the dashboard under Connections. The API posts from those profiles; it never asks for a network password.
- **The whole contract:** OpenAPI 3.1 at https://status200uploads.com/openapi.yaml: every path, field, answer and error code, so a client can also be generated from it. [The API reference](https://status200uploads.com/docs/api)
- **Keys on Free:** The Free plan has the REST API and its own API keys, with the same posting rules as the dashboard.

## Steps

1. **Connect your networks and make a key** In the dashboard, connect the networks you want to post to under Connections, then open API and click Generate Key. Keep the key secret: anyone who has it can post as you.
2. **Import the media (skip it for a text post)** POST https://status200uploads.com/api/v2/media with {"url": "https://..."} imports an image or a video from a public address and answers with its file_id. A large file may still be importing: then read GET https://status200uploads.com/api/v2/media?file_id= until its status is ready.
3. **Send the post** POST https://status200uploads.com/api/v2/posts with one post: the profile (accountId, its UUID or its @name), the platform, the text, the file ids in content.mediaID, and the network's own options. Add an Idempotency-Key header made once for this post, so a retry can never post twice.
4. **Read the answer, then the post** A 200 or 202 that recorded something carries status200.post_id and status200.status_url. A 202 is never a failure: do not send it again. Read status_url every 30 seconds, for up to 10 minutes, until done is true and the permalink is there.

## What it can do

- **Publish now:** POST /posts: one post to one network from one profile in each request. Without a scheduledFor it goes out at once.
- **Schedule and cancel:** Add scheduledFor (ISO 8601 with a time zone, or Unix seconds) up to 365 days ahead: the answer is 202 with "code": "scheduled" and a scheduled_post_id. DELETE /posts/{scheduled_post_id} cancels it before it goes out.
- **Check without sending:** "dryRun": true runs every check a publish makes and sends nothing: the answer says whether the post would be published, queued, scheduled or refused. A dry run does not count toward your plan.
- **Safe retries:** An Idempotency-Key header (1 to 255 printable characters) makes a retry safe: for 24 hours the same key and body get the first answer back, byte for byte, with Idempotent-Replayed: true, and never a second post.
- **Import media:** POST /media imports an image or a video from a public address, and a Google Drive share link on the paid plans. Videos up to 5 GB; each network's own limit still applies when you post.
- **Upload from a computer:** POST /media/uploads gives a one-time private upload link for a file on your computer; the file must arrive with the exact size and SHA-256 you announced before it can be posted. Upload links are on the paid plans.
- **Accounts and options:** GET /accounts lists your profiles, their ids and the networks connected to each. GET /accounts/{profile_id}/options says what each account really allows, such as the TikTok privacy levels or the Pinterest boards.
- **History and media library:** GET /posts lists your posts and scheduled posts, newest first, up to 100 a page with a next_url; GET /posts/{id} reads one with its status and link. GET /media/files lists the files in your media library.

## A worked example: a video to TikTok

Import the video, then publish it with its file_id. The first answer gives the file_id; the second gives status200.status_url, the address to read the post back. Without a privacy level the API posts a TikTok video as SELF_ONLY (only you see it), so the body sets one.

Import, then publish (replace rl_your_api_key and @yourprofile)

```bash
curl -X POST 'https://status200uploads.com/api/v2/media' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer rl_your_api_key' \
  -d '{"url": "https://example.com/video.mp4"}'

curl -X POST 'https://status200uploads.com/api/v2/posts' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer rl_your_api_key' \
  -H 'Idempotency-Key: 8e03978e-40d5-43e8-bc93-6894a57f9324' \
  -d '{
    "post": {
      "accountId": "@yourprofile",
      "platform": "tiktok",
      "content": {
        "text": "My first API post! #automation",
        "mediaID": ["YOUR_FILE_ID"]
      },
      "tiktok": {
        "privacyLevel": "PUBLIC_TO_EVERYONE"
      }
    }
  }'
```

## Limits and safe retries

- One request is one post to one network from one profile. Posts to the same network are spaced 20 seconds apart; a request that comes sooner is answered rate_limited with a Retry-After.
- Reads are limited to 60 a minute per account, all your keys together; posting options have their own, lower limit. One media import starts every 20 seconds per account.
- Every answer of /api/v2 arrives within about 25 seconds: set a timeout of 30 seconds or more. A post the network is still working on answers 202 still_publishing; do not send it again without the same Idempotency-Key.
- Your plan's posts and daily limits apply as in the dashboard. A post over the day's limit is answered 202 queued_for_next_day with a scheduled_post_id, and goes out the next day by itself.
- At most 500 scheduled posts wait per account. Imported media is kept 7 days, and until a scheduled post that uses it has gone out.
- There are no outgoing webhooks: read the post back from status200.status_url, which every answer that recorded something carries.

## Troubleshooting

**The answer is 401 unauthorized.** The key is missing, mistyped or revoked. Copy it again from the dashboard under API, and send it as Authorization: Bearer rl_...

**The answer is 400 scheduled_for_invalid.** error.reason says why: no_time_zone (add Z or an offset such as +02:00), unreadable (write 2026-10-01T09:00:00Z, not 01/10/2026) or too_far_ahead.

**The answer is 202 and nothing is on the network yet.** A 202 means accepted, not published yet, and never a failure. Read status200.status_url until done is true; sending the request again could post twice.

**The answer is 422 idempotency_key_reused.** The same Idempotency-Key came with a different body. Keep the body the same on every try (work out times before the first try), or make a new key for a new post.

**The answer is 409 idempotency_in_progress.** The first try with this key is still working. Wait the seconds in Retry-After and send the same request again: you get the first answer back.

**A network answers reconnect_required.** The network ended the connection to your account. Connect it again in the dashboard under Connections, then send the post again.

## Questions

### Is the REST API on the Free plan?

Yes. The REST API is on every plan, Free included, with your own API keys. Your plan's posts and daily limits apply as they do in the dashboard.

### Can one request post to several networks?

No. One request is one post to one network from one profile. Import the media once, then send one request per network with the same file_id and that network's options.

### Does the API send webhooks?

No. There are no outgoing webhooks. Every answer that recorded a post carries status200.status_url: read it every 30 seconds, for up to 10 minutes, until done is true.

### How do I retry without posting twice?

Make one Idempotency-Key per post, once, before the first try, and send it on every try. For 24 hours the same key and body get the first answer back instead of a second post.

### Can I change a scheduled post?

Not through the REST API: there is no endpoint to change one. Cancel it with DELETE /api/v2/posts/{scheduled_post_id} before it goes out and send a new one.

### What does a 202 answer mean?

Accepted, not published yet, and never a failure: do not send the request again. Its code says which case it is: scheduled, queued_for_next_day, still_publishing or schedule_unconfirmed; without a code the network is still processing the post.

### Is there an OpenAPI file?

Yes: OpenAPI 3.1 at https://status200uploads.com/openapi.yaml, with every path, field, answer and error code. You can generate a client from it, or use our Python package or n8n node.

### Is there a Zapier or Make app?

There is no Zapier or Make app. Their HTTP steps (Webhooks by Zapier, on Zapier's paid plans; Make's HTTP module) can call the REST API with your key, which we have not tested yet.

## Related

- [TikTok](https://status200uploads.com/platforms/tiktok)
- [Instagram](https://status200uploads.com/platforms/instagram)
- [YouTube](https://status200uploads.com/platforms/youtube)
- [Python](https://status200uploads.com/integrations/python)
- [n8n](https://status200uploads.com/integrations/n8n)
- [AI agents (MCP)](https://status200uploads.com/integrations/mcp)
- [The API reference](https://status200uploads.com/docs/api)
- [Safe retries, in the API reference](https://status200uploads.com/docs/api#safe-retries)
- [File limits of every network](https://status200uploads.com/docs/file-limits)
- [Pricing](https://status200uploads.com/pricing)
