Queber API

Run Queber automations through REST API

Use HTTPS endpoints, OpenAPI documentation, and scoped credentials to create, schedule, edit, and monitor supported automation jobs in Queber Desktop

REST API

Connect an API client

Create a scoped credential in the member area, keep Queber Desktop online, and call the API endpoints with an Authorization Bearer header.

Schema and docs

Swagger UI first, schema when you need it

Use Swagger to test calls in the browser, then import the OpenAPI JSON schema into your client or tooling.

Authorization

Use a personal API token for simple automations

Create a scoped token in the member area, store it as a secret in your external tool, and send it as an Authorization Bearer header. OAuth is still available for interactive clients and hosted apps that need user consent.

How it works

The REST client never talks directly to your local app.

1

Client sends an HTTPS request

Your client calls an /actions endpoint of the Queber REST API with a personal API token or an OAuth access token.

2

Server checks auth and scopes

Queber validates the token, paid-plan access, and the scopes that endpoint requires.

3

Desktop executes locally

The server relays the command to your signed-in Queber Desktop app over its secure background connection.

4

Response returns as JSON

The endpoint returns a structured JSON response with status, profile, job, or automation output.

Available tools

What an authorized client can do.

Check Desktop status

See whether your desktop relay is connected and which capabilities are available.

Read browser profiles

List profiles, inspect one profile, open it manually, or close local sessions.

Inspect jobs

List jobs page by page, read one job with its result, logs, and progress, and edit, cancel, archive, delete, or retry jobs.

Run supported automation

Create Reddit posts and Reddit post checks that run now or on a schedule.

Access is controlled by OAuth tokens, requested scopes, paid-plan checks, and the live Queber Desktop connection. Revoke a client if you no longer trust it.

Example: Reddit post check

Track Reddit posts after publishing

A post check job opens each link in a background tab of a browser profile and returns what the post page shows: whether the post is live, removed, or gone, its score, upvote ratio, comments, and the views of your own posts. Create one job, then poll it until it completes.

Create a check

Send POST /actions/jobs/run with automationType post_read and the links in platformData.reddit.post_read.links: full post links, old.reddit, redd.it, profile posts, and share links all work. Add an Idempotency-Key; the answer is the job with status pending.

Poll the job

Call GET /actions/jobs/{jobId} every few seconds until status is completed or failed. Links are checked one after another with a human pause, so a longer list takes longer.

Read the results

resultData.reddit.post_read.items holds one item per link with status ok, removed, not_found, or failed, and summary counts them. A removed post keeps Reddit's removal message in removalMessage; a value Reddit did not show is null, and warnings says why.

Views of your own posts

Reddit shows views only to the post's author, so they come only for posts of the profile that checks, rounded the way Reddit shows them, like 5.2K. Each check of your own post adds one view on Reddit.

The job fails only when no link could be checked; a link that fails gets status failed and the check goes on. A run is charged when it checked at least one post, and your plan sets how many links one run may take.

POST https://mcp.queber.app/actions/jobs/run
Authorization: Bearer <token>
Idempotency-Key: post-read-2026-08-12-01

{
  "profileId": "3f1a2b4c-5d6e-4f70-8a91-b2c3d4e5f607",
  "platform": "reddit",
  "automationType": "post_read",
  "platformData": { "reddit": { "post_read": { "links": [
    "https://www.reddit.com/r/SideProject/comments/1abc234/queber_desktop_116_queue_view/",
    "https://old.reddit.com/r/webdev/comments/1abd345/how_do_you_schedule_reddit_posts/",
    "https://redd.it/1abe456"
  ] } } }
}

HTTP/1.1 201 Created
{ "job": { "id": "e2d4f6a8-1b3c-4d5e-8f70-9a1b2c3d4e5f", "automationType": "post_read", "status": "pending", … } }

GET https://mcp.queber.app/actions/jobs/e2d4f6a8-1b3c-4d5e-8f70-9a1b2c3d4e5f
Authorization: Bearer <token>

HTTP/1.1 200 OK
{ "job": { "status": "completed", "resultData": { "reddit": { "post_read": {
  "items": [
    { "url": "https://www.reddit.com/r/SideProject/comments/1abc234/", "status": "ok", "readAs": "author",
      "score": 13, "upvoteRatio": 0.93, "comments": 8, "views": 5200, "shares": 4, "reposts": 1,
      "topCountries": [{ "country": "US", "name": "United States", "percent": 41.2 }, …], "authorRank": 2,
      "warnings": [{ "field": "views", "code": "rounded", "message": "Reddit shows views rounded: 5.2K views" }], … },
    { "url": "https://www.reddit.com/r/webdev/comments/1abd345/", "status": "ok", "readAs": "other",
      "score": 1001, "upvoteRatio": 0.96, "comments": 5348, "views": null,
      "warnings": [{ "field": "views", "code": "author_only", "message": "Reddit shows views only to the post author" }], … },
    { "url": "https://www.reddit.com/comments/1abe456/", "status": "removed", "readAs": "author",
      "removalMessage": "Sorry, this post has been removed by the moderators of r/example.", … }
  ],
  "summary": { "total": 3, "read": 3, "removed": 1, "notFound": 0, "failed": 0 }
} } }, … } }
Example: Reddit comment

Comment and reply on Reddit

A comment job leaves one comment under a post or as a reply to one of its comments, in a background tab of a browser profile. Check the post first for free, pick where to answer, create the job, then poll it until it completes.

Check the post

Send POST /actions/reddit/comments/check with profileId and link. It opens the post with that profile, free and outside the queue, and returns blocked (why commenting is not possible, or null), the media the comment box takes, and up to 300 comments in thread. It can take up to 3 minutes when the profile has to start.

Pick where to answer

Pass one comment id from thread as replyToCommentId, or leave it out to comment on the post. Every comment in thread carries its author, so a reply to a given user is a filter on author. A link to a comment in link works the same as its id.

Create the comment

Send POST /actions/jobs/run with automationType comment and platformData.reddit.comment: link, body (text or HTML), and at most one image, GIF, or video from importMedia. Add an Idempotency-Key; the answer is the job with status pending.

Read the result

Poll the job until it completes. resultUrl is the new comment's page, and resultData.reddit.comment holds its id, the comment it answered, and alreadyPosted when an earlier run had left it and nothing was sent again. A failed job names the reason, such as rate_limited with the minutes Reddit asks to wait.

The check is free. A comment is charged when Reddit shows it; a failed run and a run that finds the same comment already there cost nothing. The same Idempotency-Key never creates a second job.

POST https://mcp.queber.app/actions/reddit/comments/check
Authorization: Bearer <token>

{
  "profileId": "3f1a2b4c-5d6e-4f70-8a91-b2c3d4e5f607",
  "link": "https://www.reddit.com/r/SideProject/comments/1abc234/queber_desktop_116_queue_view/"
}

HTTP/1.1 200 OK
{ "ok": true, "check": {
  "post": { "postId": "1abc234", "community": "r/SideProject", "comments": 8, … },
  "blocked": null,
  "media": { "images": true, "animatedImages": true, "videos": false, "maxMedia": 1 },
  "thread": { "loaded": 8, "complete": true, "comments": [
    { "id": "ohd7k2m", "author": "quiet_reader", "body": "Does it keep the profile logged in?", … },
    …
  ] }
} }

POST https://mcp.queber.app/actions/jobs/run
Authorization: Bearer <token>
Idempotency-Key: comment-2026-08-12-01

{
  "profileId": "3f1a2b4c-5d6e-4f70-8a91-b2c3d4e5f607",
  "platform": "reddit",
  "automationType": "comment",
  "platformData": { "reddit": { "comment": {
    "link": "https://www.reddit.com/r/SideProject/comments/1abc234/queber_desktop_116_queue_view/",
    "replyToCommentId": "ohd7k2m",
    "body": "Yes, every profile keeps its own session."
  } } }
}

HTTP/1.1 201 Created
{ "job": { "id": "b7c9d1e3-5f7a-4b9c-8d1e-3f5a7b9c1d2e", "automationType": "comment", "status": "pending", … } }

GET https://mcp.queber.app/actions/jobs/b7c9d1e3-5f7a-4b9c-8d1e-3f5a7b9c1d2e
→ { "job": { "status": "completed", "resultUrl": "https://www.reddit.com/r/SideProject/comments/1abc234/comment/ohe2p4q/",
  "resultData": { "reddit": { "comment": {
    "commentId": "ohe2p4q", "parentId": "ohd7k2m",
    "repliedTo": { "commentId": "ohd7k2m", "author": "quiet_reader" }, …
  } } }, … } }
Reliability

Retries and connection drops

Queber Desktop runs on your computer, so a request can meet a sleeping laptop, a network switch, or a slow answer. With these rules a retry never posts twice.

One Idempotency-Key per job

Send an Idempotency-Key header, for example a UUID, with every request that creates or changes something. Repeating the request with the same key returns the first result instead of posting twice, so after a timeout or a 503 retry with the same key. Use a new key for every job and every changed request, never one key for a whole batch.

Wait for Retry-After

429 and 503 answers carry a Retry-After header and retryAfterSeconds in the error body when the wait is known. Wait that long, then repeat the same request with the same key. error.retryable tells whether the same request can succeed later; after desktop_offline the app has to be opened first.

Check relayState before a batch

Call GET /actions/status before sending a batch. connected: send it. reconnecting: the app dropped and is expected back, wait retryAfterSeconds. offline: open Queber Desktop and sign in. conflict: close all but one older desktop app.

Choose how long to wait

While the app reconnects, a request waits up to 25 seconds, then answers 503 desktop_reconnecting. The X-Queber-Desktop-Wait-Ms header, from 0 to 60000, changes that wait; keep your HTTP timeout longer than the wait plus 30 seconds (150 for media import).

POST https://mcp.queber.app/actions/jobs/schedule
Authorization: Bearer <token>
Idempotency-Key: post-2026-08-13-r-webdev-01
X-Queber-Desktop-Wait-Ms: 20000

{ "profileId": "3f1a2b4c-5d6e-4f70-8a91-b2c3d4e5f607", "platform": "reddit", … }

HTTP/1.1 503 Service Unavailable
Retry-After: 12

{
  "error": {
    "code": "desktop_reconnecting",
    "message": "Queber Desktop lost its connection and is reconnecting. Retry the request shortly; you do not need to restart the app.",
    "retryable": true,
    "retryAfterSeconds": 12
  }
}
Need help?

Questions about the REST API integration

If token setup, schema import, API calls or desktop execution does not work as expected, contact Queber support or write to us on Telegram.