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

Tumblr setup

Tumblr uses native HTTP with OAuth 1.0a signing. You register an application, finish the authorization flow yourself, and store four OAuth values plus the target blog name in the Worker.

Experimental Provider tumblr-native

Status and evidence

Syndroo 0.2.0-rc.1 is an unpublished release candidate: prepared in the repository, not published to npm, not tagged, and not deployed. Tumblr is recorded as experimental for this candidate.

Evidence: unit tests and the approved native-HTTP spike recorded in the core repository. The SDK route was rejected earlier because it lacked cancellation and response-size controls, so the adapter signs its own requests. There is no Mock SNS end-to-end coverage for Tumblr, and no live-account acceptance record exists. See Platform readiness and the capability record.

What you need

  • A Tumblr account you can post from, and the blog you intend to publish to.
  • A registered Tumblr OAuth application that gives you a consumer key and secret.
  • The completed OAuth 1.0a authorization for that account, which yields the user token and token secret. Syndroo does not run this flow; you finish it once, outside the Worker.
  • A running Worker and its API key. Either a deployment in your own Cloudflare account or a local instance. The Worker holds the platform credentials; clients hold only SYNDROO_API_KEY. If you have not set one up yet, the first-post walkthrough covers the whole path with Bluesky.

The adapter reads five Worker secrets:

SecretRequiredValue
TUMBLR_CONSUMER_KEYYesOAuth consumer key of your registered application.
TUMBLR_CONSUMER_SECRETYesOAuth consumer secret of that application.
TUMBLR_TOKENYesUser OAuth token from the completed authorization.
TUMBLR_TOKEN_SECRETYesSecret paired with that user token.
TUMBLR_BLOGYesThe target blog name, for example alice. Not a URL.

All five are required, and the authorized user must be able to post to that blog. The blog value is validated when the Worker reads it, so a URL is rejected instead of being sent as a blog identifier.

Register the application and authorize

The Tumblr OAuth application page and its registration form are Tumblr's; keep the official documentation linked under Official sources open while you work. The documented flow is OAuth 1.0a with the HMAC-SHA1 signature method, and registering the application is what issues your consumer key.

  1. Register an OAuth application

    Sign in to Tumblr, open the OAuth applications page and register an application. Registration issues the consumer key and secret for that application.

  2. Complete the OAuth 1.0a authorization

    Run the OAuth 1.0a flow for the account you will publish from and approve write access for the target blog. This produces the user token and token secret. You run this step yourself, once; Syndroo only signs requests with the values you store.

  3. Confirm the target blog

    Note the blog's short name, which is what the API expects, and confirm from the Tumblr client that the authorizing account can publish to it. A secondary blog the account cannot post to will fail later, after a request has been accepted.

Token revocation is your responsibility.

Tumblr can revoke application or user tokens, and you can revoke them yourself in account settings. When that happens the Worker keeps the old value until you replace it, and publishing fails with errorCode AUTH instead of renewing anything.

Add the secrets to the Worker

Put the values where your runtime reads secrets: Worker secrets for a deployment, .dev.vars for a local instance. Cloudflare deployment and Local development cover the exact commands for each path.

TUMBLR_CONSUMER_KEY="your-tumblr-consumer-key"
TUMBLR_CONSUMER_SECRET="your-tumblr-consumer-secret"
TUMBLR_TOKEN="your-tumblr-user-token"
TUMBLR_TOKEN_SECRET="your-tumblr-user-token-secret"
TUMBLR_BLOG="alice"
Configuration is checked for shape, not for validity.

Before accepting a post, Syndroo checks that every required value exists, is non-empty and looks like a blog name. It does not call Tumblr to test the credentials. Revoked or under-scoped values pass that check and surface later as a publication failure with errorCode AUTH.

Publish and check one post

The commands below publish for real once the secrets above are configured. Set the two client variables in the terminal that will call Syndroo.

export SYNDROO_URL="https://your-worker.your-subdomain.workers.dev"
export SYNDROO_API_KEY="the-same-secret-your-worker-has"
curl -X POST "$SYNDROO_URL/v1/posts" \
  -H "Authorization: Bearer $SYNDROO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: tumblr-setup-001" \
  --data '{
    "content": "First post from my own Syndroo Worker.",
    "platforms": ["tumblr"]
  }'

The accepted response is HTTP 202 with status queued:

{
  "id": "post_...",
  "status": "queued"
}

HTTP 202 means the request was accepted for processing. It does not confirm that Tumblr accepted anything, and it does not prove that the Queue has not already sent the platform request, because delivery can start immediately after acceptance. Read the stored state to learn the outcome:

curl \
  -H "Authorization: Bearer $SYNDROO_API_KEY" \
  "$SYNDROO_URL/v1/posts/post_..."
{
  "id": "post_...",
  "content": "First post from my own Syndroo Worker.",
  "platforms": ["tumblr"],
  "status": "published",
  "publications": [
    {
      "platform": "tumblr",
      "provider": "tumblr-native",
      "status": "published",
      "attempts": 1,
      "externalId": "700000000000000000",
      "errorAmbiguous": false
    }
  ]
}

queued and publishing are not terminal; poll the same URL. published and failed are terminal. Repeating the identical request with the same Idempotency-Key returns the stored result with HTTP 200 instead of creating a second post. See Idempotency-Key.

Limits, tokens and external dependencies

ItemRecorded for 0.2.0-rc.1
Text limit4,096 Unicode code points in a single NPF text block, validated before the network call.
Content typeText only. HTML and Markdown are sent as plain text rather than interpreted, and media, tags, drafts and reblogs are outside this version.
Credential maintenanceYours. Re-run the authorization or register a new application if Tumblr revokes access, then replace the Worker secrets. Syndroo has no OAuth flow and does not renew tokens.
External dependencyTumblr's own terms and rate limits apply, including the documented per-user daily posting limit that answers with 429 when it is exceeded. Syndroo controls none of them, includes no pricing of its own, and makes no promise about a provider's current plan, quota or API behaviour.

Check the provider's current documentation before relying on a specific limit, endpoint or authorization detail. Those facts change on the provider's schedule, not on this page; the links under Official sources are the references to re-check.

When something fails

A failed publication stores errorCode, errorMessage and errorAmbiguous in the post response. Read them before you act.

What you seeWhat it meansWhat to do
HTTP 422 PLATFORM_NOT_CONFIGUREDOne of the five Tumblr secrets is missing or empty, or the blog value looks like a URL.Add the secrets named above with a blog name, not a link, then send the request again. Nothing was stored or queued.
AUTHTumblr rejected the OAuth values, or the account cannot post to that blog.Re-run the authorization for the right account and blog, update the Worker secrets, and check the blog before resending.
INVALID_CONTENTThe text exceeded the code-point limit, or the request was otherwise not postable, and nothing was sent.Shorten the text and publish again with a new key.
RATE_LIMITTumblr asked the caller to slow down.Syndroo retries this automatically with backoff, up to three attempts. Let it finish, then poll the same post.
PROVIDER_UNAVAILABLE, NETWORK or UNKNOWN, with errorAmbiguous: trueThe write may have reached Tumblr; the outcome is unknown.Check the blog by hand. Syndroo never resends an ambiguous publication automatically.
Post status partialSome selected platforms succeeded and some failed.Never resubmit the platforms that succeeded. The failed ones need attention only after you have excluded an ambiguous outcome.
Rule out an ambiguous outcome before publishing again.

If a publication is failed with errorAmbiguous: true, check the blog by hand first, because the post may already exist. Only when you have confirmed that nothing was published and you still want the post should you send a new request with a new Idempotency-Key. Reusing the old key replays the stored result instead of publishing. Read Ambiguous outcomes for the reasoning.

Official sources

This page follows the candidate's capability record and the product revision above. It was not verified against a live Tumblr account, so re-check the official documentation when a registration step, limit or endpoint differs from what you see.