Cross-post API cost:only the X half bills
Every tool selling one endpoint for many platforms prices its own subscription and never prices the calls underneath. Here is the arithmetic they leave out. Bluesky charges nothing and issues no API key. X charges $0.015 a post, and $0.20 the moment the text contains a link.
Last updated: September 2026
7-day free trial. Cancel anytime.
The short version
A cross-posting setup has one billable side. Bluesky has no API key, no developer program, and no price list, so its half of your bill is $0 at every volume. Everything you pay is an X call. Which means the question is not what cross-posting costs, it is what your X posting pattern costs, and the answer turns almost entirely on how many of your posts contain a URL.The rates on both sides
The X column is X pay-per-use pricing, covered rate by rate in X API pay-per-use explained. The Bluesky column is short because there is nothing in it.
| What you are doing | X | Bluesky |
|---|---|---|
| Create a plain post | $0.015 per request | Free |
| Create a post containing a link | $0.20 per request | Free |
| Read a post | $0.005 per post returned | Free |
| Read your own data | $0.001 per resource | Free |
| API key to obtain first | Developer account and an OAuth app | None exists |
| Monthly floor before you post anything | $0, billed per call | $0 |
Creating a post bills per request, not per network. One draft mirrored to both networks is one billable X post and one free Bluesky post.
What that adds up to in a month
Four workloads people actually run, with the X and Bluesky halves kept separate.
Plain text only
3 posts a day, no links
X: 90 x $0.015 = $1.35
Bluesky: $0
$1.35/mo
The cheapest cross-posting workload there is. If this is genuinely all you do, the raw API wins on price.
One in three carries a link
3 posts a day, 1 with a URL
X: 60 x $0.015 + 30 x $0.20 = $6.90
Bluesky: $0
$6.90/mo
The 30 link posts are 87% of the bill and 33% of the posts. This is where most build-in-public accounts sit.
A release or blog feed
3 posts a day, every one a link
X: 90 x $0.20 = $18.00
Bluesky: $0
$18.00/mo
The exact workload cross-posting tools are bought for, and the one where per-call billing hurts most.
A busy account with mentions monitoring
10 posts a day, half links, 2,000 reads a month
X: 150 x $0.015 + 150 x $0.20 + 2,000 x $0.005 = $42.25
Bluesky: $0
$42.25/mo
Reads are the quiet half. Bluesky reads are free, so this number is entirely X too.
The link fee is the whole story
$0.20 is 13 times the plain-post rate, and it applies to any URL in the text. A cross-poster is usually pushing a release note, a blog post, or a changelog entry, which means the workload people buy these tools for is the exact workload X prices highest. Rewriting the post to put the link in a reply is the common workaround, and it is two posts instead of one.Where the break-even actually sits
Against a flat $11.99 a month, with no per-post fee on either network.
Pay-per-use is cheaper when
- You post plain text and essentially never links
- At 20 plain posts a day, 600 a month, pay-per-use is $9.00
- You already hold an X developer account and OAuth app
- You do not need scheduling, because the X API has no scheduled-post endpoint
A flat fee is cheaper when
- You post 60 or more links a month, which is two a day
- You read anything back, since reads bill per post returned
- You want the post queued for later rather than published this second
- You would rather not run token refresh and 429 backoff yourself
60 link posts a month is where $0.20 a call passes $11.99. Below that, and with no reads, raw pay-per-use is genuinely the cheaper line item, and we would rather say so than pretend otherwise.
The Bluesky side is free, but it is not zero work
Nothing here costs money. All of it costs an afternoon.
There is no key to fetch, so the first thing to build is atproto OAuth: resolve the handle to the personal data server that holds the account, run the authorization flow against that server, and store the grant. You cannot hardcode bsky.social, because a handle can point at a server someone runs themselves.
Then the limits diverge from X and your cross-poster has to know both. Bluesky stops at 300 characters while X allows 280, or 25,000 on Premium, so a long Premium post is legal on one network and impossible on the other. Bluesky takes 4 images at 2MB each with alt text. Video does not cross-post to Bluesky at all. A post that breaks one network needs to still go out on the other, with the reason recorded, rather than failing the whole publish.
And there is one thing you cannot build at any price: Bluesky analytics do not exist. Nothing reads engagement back, so the Bluesky half of any cross-posting setup is publishing and scheduling only.
The flat-fee version
OpenTweet is X automation, with Bluesky as the mirror. Same draft, same queue, same calendar, and a per-network result telling you what landed where. Flat $11.99 a month with no per-post fee, no link surcharge, and no X developer account to hold, because the X connection is managed for you.
One request, both networks. Pass platforms to pin a post, or leave it out and let the account cross-post setting decide.
curl -X POST https://opentweet.io/api/v1/posts \
-H "Authorization: Bearer ot_your_key" \
-H "Content-Type: application/json" \
-d '{
"text": "Shipped the new scheduler. Notes in the changelog.",
"platforms": ["x", "bluesky"],
"publish_now": true
}'
# The response carries one result per network:
# "platforms": [
# { "platform": "x", "status": "published" },
# { "platform": "bluesky", "status": "published" }
# ]A post over 300 characters comes back skipped on Bluesky with the reason, and published on X. The endpoint reference is in the API docs, and the workflow around it is in the cross-posting guide.
Frequently asked questions
Does the Bluesky API cost anything?
No. Bluesky charges nothing to post and issues no API key at all. There is no developer program to apply to, no pricing page, and no billing account. You authorize an app on the server that holds your account over atproto OAuth, and that is the whole procurement step.
How much does it cost to post to X through the API?
On pay-per-use, $0.015 per post created and $0.20 if the post text contains a URL. Reads are billed separately at $0.005 per post returned and $0.001 per resource for your own data. Creating a post is billed per request, so one request that also gets mirrored to Bluesky is still one billable X post.
So what does a cross-posting setup actually cost?
The X half, and nothing else. If you publish 3 posts a day and one in three carries a link, that is 60 plain posts at $0.015 and 30 link posts at $0.20, so $6.90 a month on X and $0 on Bluesky. The Bluesky side of the same setup is free at every volume.
When is raw pay-per-use cheaper than a flat fee?
When you post plain text and never links. 20 plain posts a day, which is 600 a month, costs $9.00 on pay-per-use, under the $11.99 flat fee. The break-even flips at 60 link posts a month, which is two a day, because the $0.20 link fee is 13x the plain rate.
Do I need two API keys to cross-post to X and Bluesky?
You need one on the X side and none on the Bluesky side, because Bluesky does not have keys. Tools that advertise "one endpoint, many platforms" are collapsing two very different auth stories: an X developer account with OAuth 2.0 apps and per-call billing, and an atproto OAuth grant that costs nothing.
Does a post that is too long for Bluesky still cost me on X?
Yes, and it still publishes on X. Bluesky stops at 300 characters. A post over that is skipped on Bluesky with the reason recorded and goes out on X as normal, so you are billed for the X post you actually made and nothing for the Bluesky one you did not.
Is there a spend cap on X pay-per-use?
X exposes usage controls rather than a hard guarantee, which is why a retry loop is a billing risk and not only a reliability one. That is covered separately in our answer on whether X API pay-per-use has a spend cap.
Related guides
The X rates in full, the cross-posting workflow, and the API that runs both.
X API pay-per-use explained
Every current rate, how credits work, and what happened to the Basic tier. The source for the X column here.
Does X pay-per-use have a spend cap?
What actually bounds the bill when a retry loop goes wrong, and what does not.
How to cross-post from X to Bluesky
The four steps, the per-network result, and why a post gets skipped on one network.
Bluesky scheduler
atproto OAuth instead of an App Password, and what the connection is allowed to do.
REST API reference
The platforms parameter, the per-network results array, and the flat rate limits.
Pricing
Three plans from $11.99 a month. No per-post fee and no X developer account.
Stop paying $0.20 a link
Flat $11.99 a month, no per-post fee, no X developer account. One draft to X and Bluesky, with a per-network result you can read.