Developers

Post one video to 8 networks with the API

Post one video to eight networks through The Send developer interface. Steps below are the public API already documented on this site.

Start

Prerequisites

Plan details are on pricing. Then log in at /app and connect the accounts for the brand. The API does not log you into Instagram or YouTube by itself.

Open Company API, name a key, and copy it once. The Send does not store the plaintext key after you leave the create screen. You can hold up to 5 keys per account and revoke them from /app. A key is pinned to the brand you created it on, unless you are the operator.

Checked 2026-10-29. These steps match the public API docs.

Auth

Auth

Authorization: Bearer tsk_your_key
# or
X-Api-Key: tsk_your_key

60 requests per minute per key. Failed guesses from the same IP are throttled. HTTPS only in production. Posting endpoints reject missing, fake, revoked, and unpaid keys.

Upload

Upload

POST /api/v1/media uploads an MP4 or JPG, or you pass a public https URL. POST /api/v1/posts creates a short from a file, a mediaId, or a mediaUrl. Video max is 200 MB. A public media URL must be https on a public host.

curl https://getthesend.com/api/v1/posts \
  -H "Authorization: Bearer tsk_YOUR_KEY" \
  -F "[email protected]" \
  -F "title=Studio walkthrough" \
  -F "text=One file, a caption for each network." \
  -F "channels=instagram,tiktok,facebook,youtube" \
  -F "scheduledAt=2026-08-25T14:00:00Z"
curl https://getthesend.com/api/v1/posts \
  -H "Authorization: Bearer tsk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "mediaUrl": "https://cdn.example.com/short.mp4",
    "text": "One file, a caption for each network.",
    "channels": ["instagram", "tiktok"],
    "send": true
  }'

Networks

Per-network options

The channels field names the networks for that post. The eight networks are instagram, facebook, tiktok, youtube, x, linkedin, threads, and pinterest. Pass send true to publish immediately. Otherwise the post sits in the queue until you send or until the scheduler hits scheduledAt. Unique titles, captions, and hashtags still run per network when copy is enabled.

GET /api/v1/channels shows which networks are connected. The full endpoint list is on the API docs.

MethodPathWhat it does
GET/api/v1Discovery (no auth)
GET/api/v1/accountPlan, brand, connected channels
GET/api/v1/channelsWhich networks are connected
POST/api/v1/mediaUpload MP4/JPG, or pass a public https URL
GET/api/v1/postsList queue / calendar items
POST/api/v1/postsCreate a short (file, mediaId, or mediaUrl)
GET/api/v1/posts/:idOne post
PATCH/api/v1/posts/:idEdit title, text, channels, schedule
DELETE/api/v1/posts/:idRemove it
POST/api/v1/posts/:id/sendPublish now to connected channels

Status

Status and errors

Read one post with GET /api/v1/posts/:id.

When an in-memory Send now job is already running for that post, POST /api/v1/posts/:id/send returns HTTP 200 with ok true, the current post (status sending), and skipped as an empty list. That JSON does not include alreadyRunning, jobId, results, or error. The MCP send_post tool returns ok true and that post. alreadyRunning is not in the tool result.

A second v1 send while a direct send holds the file lock, and that post is not in the in-memory job set, returns HTTP 400 with ok false and error "send already in progress". alreadyRunning is not in that body. The MCP send_post tool then returns ok false and error "send already in progress". alreadyRunning is not in the tool result.