Skip to content

Quickstart

Five requests take you from a fresh API key to a scheduled post: find out who you are, list the accounts, plan a post, create it, read its status. Every request is https://api.dropslate.top/v1 plus a path, with the key in the Authorization header and JSON bodies. Uploading a file is the one extra step, covered in the working example; this page schedules a text post to keep the flow short.

  • A paid plan - the API starts on Creator - and an API key with write: Settings → API keys → New key, tick Allow creating and publishing posts. The key is shown once.
  • A connected Facebook Page or Threads profile: both take a post without a file. YouTube and Instagram need media.
  • curl and jq, or any HTTP client.
  1. Set the key. In a shell, not in a file you commit and never in a prompt to an agent:

    Terminal window
    export KEY="ds_live_xxxxxxxxxxxxxxxxxxxx"
    export API="https://api.dropslate.top/v1"
  2. Who am I. GET /whoami answers with the workspace, its time zone and plan, what the key may do, and this month’s usage.

    Terminal window
    curl -s "$API/whoami" -H "Authorization: Bearer $KEY" | jq
    {
    "workspace": { "id": "ws_3k9d", "slug": "what-we-made", "name": "What We Made", "plan": "creator", "currency": "USD", "tz": "Europe/Kiev" },
    "user": { "id": "usr_a1", "name": "Dmytro", "email": null },
    "credential": { "kind": "api_key", "name": "n8n integration", "scopes": ["read", "write"] },
    "usage": { "plan": "creator", "period": "2026-09", "posts": { "used": 46, "limit": 200 }, "storage": { "usedBytes": 1288490188, "limitBytes": 16106127360 }, "accounts": { "used": 3, "limit": 6 } }
    }

    tz is the zone every time is read in; scopes must contain write for the last two steps.

  3. List the accounts. Account ids come from here and nowhere else.

    Terminal window
    curl -s "$API/accounts" -H "Authorization: Bearer $KEY" | jq '.accounts[] | {id, platform, displayName, status}'
    { "id": "acc_fb_7c2e", "platform": "facebook", "displayName": "What We Made", "status": "ok" }
    { "id": "acc_th_91af", "platform": "threads", "displayName": "@whatwemade", "status": "ok" }

    Only an account with status: "ok" can be published to; expired or revoked needs a person to reconnect it in the dashboard.

  4. Plan. POST /posts/plan takes the post and answers with one row per account and a check. It creates nothing.

    Terminal window
    cat > post.json <<'EOF'
    {
    "targets": { "accountIds": ["acc_fb_7c2e", "acc_th_91af"] },
    "mediaIds": [],
    "text": "Office hours today at 18:00 Kyiv. Bring one question.",
    "when": { "publishAt": "2026-09-29T17:00", "timezone": "Europe/Kiev" },
    "perPlatform": { "facebook": { "contentType": "text", "link": "https://dropslate.top/" }, "threads": { "topicTag": "OfficeHours" } }
    }
    EOF
    curl -s -X POST "$API/posts/plan" -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d @post.json | jq
    {
    "ok": true,
    "status": "queued",
    "rows": [
    { "accountId": "acc_fb_7c2e", "platform": "facebook", "publishAt": "2026-09-29T14:00:00.000Z", "ok": true, "issues": [] },
    { "accountId": "acc_th_91af", "platform": "threads", "publishAt": "2026-09-29T14:00:00.000Z", "ok": true, "issues": [] }
    ],
    "quota": { "used": 46, "limit": 200, "requested": 2 },
    "table": "account network time check\nWhat We Made facebook 29 Sep, 17:00 (Kyiv) ok\n@whatwemade threads 29 Sep, 17:00 (Kyiv) ok"
    }

    A row with ok: false lists issues - {code, message, hint} each - and ok at the top is false. table is the same text an MCP agent shows a person.

  5. Create. The same body with confirm: true. Without it the answer is 409 confirm_required and nothing is created.

    Terminal window
    jq '. + {confirm: true}' post.json | curl -s -X POST "$API/posts" -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d @- | jq '.posts[] | {id, status, statusLine}'
    { "id": "pst_5e1b", "status": "queued", "statusLine": "Queued. Facebook · What We Made · 29 Sep, 17:00 (Kyiv)." }
    { "id": "pst_5e1c", "status": "queued", "statusLine": "Queued. Threads · @whatwemade · 29 Sep, 17:00 (Kyiv)." }

    One post per account; each is queued. when: "now" sends at once; when: "draft" saves without a time.

  6. Read the status. After the time, GET /posts/{id}:

    Terminal window
    curl -s "$API/posts/pst_5e1b" -H "Authorization: Bearer $KEY" | jq '{status, externalUrl, error, statusLine}'

    live comes with externalUrl; failed with error.code, error.message in the network’s own words and error.hint. Those are the only states after queued.

The two posts are on the dashboard’s Queue and Calendar like any other, with createdVia: "api" in the drawer. Retry, Cancel and Reschedule work on them there, and the same actions exist as POST /posts/{id}/retry, POST /posts/{id}/cancel and PATCH /posts/{id}.

Error Cause Fix
401 unauthenticated The key is missing, mistyped or revoked. Check Authorization: Bearer ds_live_…; create a new key if it was revoked.
403 insufficient_scope on POST /posts The key has only read. Create a key with Allow creating and publishing posts.
409 confirm_required confirm: true missing. Add it; nothing was created.
402 quota_exceeded The month’s posts or the plan’s API access. The body carries limit, used and upgradeUrl.
404 not_found on an account id The id is not in this workspace. Take ids from GET /accounts.
429 rate_limited 600 requests in 10 minutes from this address, or 60 POST /posts in an hour. Wait the seconds in Retry-After.