Syndroo docs
Version 0.2.0-rc.1 unpublished release candidate Website GitHub

Set up an agent to publish

An agent does not need a Syndroo package. It needs a URL, a Bearer token, and instructions about when to send a request. This page writes out that workflow, including the parts a client owns and the parts the API owns, so the two are not confused.

There is nothing to install.

No Syndroo skill, plugin, tool package or MCP server exists for the 0.2.0-rc.1 candidate. Any command that claims to install a Syndroo skill is not from this project. The supported interface is the documented HTTP API, and the workflow below is the only setup path that exists today.

Access methods and their status

This is the whole compatibility record. A method is listed as not verified until there is a reproducible setup and a recorded test.

Agent access methods recorded for the 0.2.0-rc.1 candidate, reviewed 2026-09-18 against product commit 87ba42b.
MethodWhat it isStatusNotes
Manual HTTP workflow Your agent or script sends POST /v1/posts with a Bearer token. Documented, no end-to-end acceptance record Written out on this page. It needs a client that can set a Bearer header and issue HTTP requests; no specific client has been tested.
Syndroo skill or plugin A packaged skill that wraps the API for a specific client. Not built Nothing exists to install, and no client-specific setup has been tested.
MCP server A Model Context Protocol server exposing Syndroo tools. Out of scope for 0.2.0-rc.1 Not planned for this candidate. Do not treat MCP as a supported transport yet.

Nothing on this page has been exercised end to end with a real client in a recorded run. It describes the API contract and the safe client behaviour around it, not a verified integration.

The manual HTTP workflow

  1. Prove the service answers

    Health needs no authentication, so check it before involving any credential. Set the URL first:

    export SYNDROO_URL="https://your-worker.your-subdomain.workers.dev"
    curl "$SYNDROO_URL/health"

    Expected: {"status":"ok"}. This endpoint always answers 200 while the Worker is running, including in maintenance mode. Maintenance mode only rejects new posts: POST /v1/posts then returns 503 with SERVICE_UNAVAILABLE, and reads keep working.

  2. Give the client the credential out of band

    Put SYNDROO_API_KEY in the environment or secret store the agent process reads. Do not paste the key into a prompt, a chat transcript, an issue, a screenshot or a log line. The key can publish, so it deserves the same handling as a password.

    export SYNDROO_URL="https://your-worker.your-subdomain.workers.dev"
    export SYNDROO_API_KEY="the-secret-your-worker-has"
  3. Draft and preview in the client

    Let the agent write the text and show it to you, per platform. Two things are worth stating plainly: the draft is produced by your agent, not by Syndroo, and the preview is a client feature. The API has no preview or approval endpoint, and it accepts whatever a confirmed request contains.

    Keep each platform's own limit in view while drafting: the candidate enforces 300 Unicode code points and 3,000 UTF-8 bytes for Bluesky, 500 characters for Threads, 280 weighted characters for X, 4,096 code points for Tumblr, and at most 3,000 UTF-16 units after escaping for LinkedIn. Each platform guide records its own limit and its own counting rule.

  4. Confirm before anything is sent

    A person approves the text. This is a workflow rule for your client, not a service feature. It is the only thing standing between a model's suggestion and a public post.

  5. Send one request with a stable key

    Use one Idempotency-Key per logical post, derived from content the client can reproduce (a release tag, a commit SHA, a job id). The same key with the same body returns the original result; the same key with different text is rejected with 409.

    curl -X POST "$SYNDROO_URL/v1/posts" \
      -H "Authorization: Bearer $SYNDROO_API_KEY" \
      -H "Content-Type: application/json" \
      -H "Idempotency-Key: agent-run-2291" \
      --data '{
        "content": "Nightly ingest finished: 41,208 rows reconciled, 0 quarantined records.",
        "platforms": ["bluesky", "threads"]
      }'
  6. Treat HTTP 202 as accepted, not published

    The reply is {"id": "post_...", "status": "queued"} (or "scheduled"). HTTP 202 does not confirm platform success, and it describes the state when the Worker accepted the request: by the time the response reaches you, a fast Queue consumer may already have published the post. Only the post's own status tells you what happened, so poll it until it is terminal.

    curl -H "Authorization: Bearer $SYNDROO_API_KEY" \
      "$SYNDROO_URL/v1/posts/post_..."

    Terminal post statuses are published, partial and failed. While a post is queued or publishing, wait and ask again instead of sending a new request.

  7. Read failures per platform

    Each publication entry carries status, attempts, errorCode, errorMessage, errorAmbiguous, and the identifiers the platform returned. errorAmbiguous: true means the write may have reached the platform: stop, check by hand, and never resend automatically.

An instruction block you can adapt

This is a starting point for your own agent's instructions. It encodes the guardrails above; adjust the platform list and the tone, and keep the safety rules.

You publish social posts through a self-hosted Syndroo Worker.

Endpoint: $SYNDROO_URL (set in my environment; do not print it)
Auth: send the header "Authorization: Bearer $SYNDROO_API_KEY" (also from my environment)

Rules:
1. Never publish without showing me the exact text per platform and getting my yes.
2. One logical post, one Idempotency-Key. Reuse the key only when retrying the identical body.
3. Treat HTTP 202 as "accepted", never as "published". Confirm with
   GET /v1/posts/{id} until the status is published, partial or failed.
4. If a publication has errorAmbiguous true, tell me to check the platform by hand.
   Do not resend it, and do not send a new key for the same text.
5. If one platform fails and others published, retry nothing on my behalf; report per platform.
6. Never put the API key, or any platform token, in a prompt, a log, a commit or an issue.

Credential and secret handling

  • SYNDROO_API_KEY is a publishing credential. It is not a read-only key. Treat anyone who has it as able to publish through your Worker.
  • Platform credentials stay in the Worker. Bluesky, Threads, X, Tumblr and LinkedIn secrets are configured on your deployment; clients never hold them.
  • The client holds one secret. The agent process needs the Syndroo URL and the API key, and nothing else.
  • Rotation is replacing a secret. Change the value on the Worker, then update the environment your client reads. There is no token-issuing flow in this candidate.
  • Nothing is sent to Syndroo by the website. The marketing demo is simulated and performs no request.

Response handling reference

ResponseMeaningCorrect client behaviour
202 with status: queuedAccepted; one pending publication per platform was stored.Keep the returned id and poll it.
200 with replayed: trueThe same key and the same body were sent again.Use the returned post; do not publish another.
409 IDEMPOTENCY_CONFLICTThe key already belongs to a different request.Do not retry with the same key. Use a new key only if the post is genuinely new.
401 UNAUTHORIZEDThe Bearer token is missing or wrong.Fix the credential. Do not retry in a loop.
422 PLATFORM_NOT_CONFIGUREDThat platform is not installed or its credentials are missing.Configure the platform, or drop it from platforms.
partial post statusAt least one platform published and at least one did not.Act per publication. Never resend the platforms that already published.
failed with errorAmbiguous: trueThe write may have succeeded remotely.Verify by hand before any further publishing.

What is not verified yet

  • No Syndroo-authored skill, plugin or tool package exists, and none has been test-installed.
  • No client-specific setup has been recorded: this page documents the HTTP workflow, not a tested client integration.
  • No platform has a live-account acceptance record. Bluesky and Threads are mock-tested locally; X, Tumblr and LinkedIn are experimental.
  • The Worker has not been deployed or published as a release in this candidate.

Next steps