Introduction
What this is
Section titled “What this is”The Dropslate REST API is the same contract the dashboard and MCP both use - apps/api/openapi.json, also served live at GET /v1/openapi.json. This page is the practical path: get a key, run the upload → post → status scenario end to end, then use the generated OpenAPI reference for every field.
Get a key
Section titled “Get a key”Settings → API keys → New key. Name it for what it’s for, and grant write if it needs to publish - without it, a key only reads accounts, media and posts. The full key (ds_live_...) is shown once, right after creation - copy it then, because the server stores only its hash and prefix afterward.
The key is not for a prompt. It belongs in a client’s environment or a workflow tool’s credential store (an n8n credential, a Make connection, a .env file), never in text an AI agent reads: an agent that can read its own instructions can read a key pasted into them just as easily.
Upload → post → status
Section titled “Upload → post → status”The acceptance scenario for this API - it must run end to end against the live server.
export KEY="ds_live_..."export API="https://api.dropslate.top/v1"
# 1) Who we are, and which account publishesACCOUNT_ID=$(curl -s "$API/accounts" -H "Authorization: Bearer $KEY" | jq -r '.accounts[0].id')
# 2) Start an uploadTICKET=$(curl -s -X POST "$API/media/uploads" \ -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d '{"filename":"launch.mp4","mime":"video/mp4","size":18874368}')MEDIA_ID=$(echo "$TICKET" | jq -r '.mediaId')UPLOAD_URL=$(echo "$TICKET" | jq -r '.uploadUrl')
# 3) PUT the file's bytes to uploadUrl (not through /v1 - the URL is signed on its own)curl -s -X PUT "$UPLOAD_URL" --data-binary @launch.mp4 -H "Content-Type: video/mp4"
# 4) Create the post (needs the write scope)POST=$(curl -s -X POST "$API/posts" \ -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d "{ \"targets\": {\"accountIds\": [\"$ACCOUNT_ID\"]}, \"mediaIds\": [\"$MEDIA_ID\"], \"text\": \"Launch day.\", \"when\": \"now\", \"confirm\": true }")POST_ID=$(echo "$POST" | jq -r '.posts[0].id')
# 5) Check its statuscurl -s "$API/posts/$POST_ID" -H "Authorization: Bearer $KEY" | jq .statusNext: Authentication, Rate limits, Errors, or the field-by-field OpenAPI reference.