Fix the n8n Twitter 403
every cause, every fix
The n8n X node returns 403 Forbidden for five different reasons, and the error text rarely tells you which one you hit. This page maps each error to its real cause and the exact fix, then shows the one-node setup that makes all of them impossible.
7-day free trial. No X developer account needed.
Match your error to its cause
All of these surface in n8n as a 403. Find your exact message, then jump to the fix below.
"Forbidden - perhaps check your credentials?"
This is the most common n8n X node failure, and the wording sends everyone to re-paste their keys. The keys are usually fine. The real cause is almost always app permissions: in the X developer portal your app defaults to Read only, and a read-only token cannot create tweets, so every post attempt comes back 403.
The fix has two steps, and skipping the second is why people stay stuck:
- In the X developer portal, open your app, go to User authentication settings, and set App permissions to Read and write.
- Regenerate your keys and tokens, then reconnect the credential in n8n. Tokens issued before the permission change keep the old read-only scope forever. Changing the setting alone changes nothing.
Two more traps hide behind this same message. First, X API v2 requires your app to be attached to a Project in the developer portal. A standalone app gets 403 client-not-enrolled responses on every v2 call. Create a Project and move the app inside it. Second, if a run fails and n8n retries with identical text, X rejects the duplicate with a 403, so check whether the tweet actually went out before debugging auth. Users on the n8n forum have reported the tweet appearing on X while n8n still shows the 403.
"Forbidden: Missing permission media.write"
Text tweets post fine, but the moment you attach an image the node fails with this exact error. The cause is in n8n itself: the predefined X OAuth2 credential requests a fixed list of scopes, and media.write is not on it. The v2 media upload endpoint requires it, so no amount of clicking Reconnect helps. The token n8n holds simply was never granted the permission.
The fix that works, confirmed in n8n community thread 269970: drop the predefined credential and create a generic OAuth2 API credential with the scope spelled out.
Grant Type: Authorization Code (with PKCE)
Authorization URL: https://twitter.com/i/oauth2/authorize
Access Token URL: https://api.twitter.com/2/oauth2/token
Scope: tweet.read tweet.write users.read media.write offline.accessReconnect your account with this credential and X issues a fresh token that includes the media scope. Keep offline.access in the list or the token stops refreshing and the workflow dies again in two hours.
n8n X media upload not working
Beyond the missing scope, media uploads break for a structural reason: for years, uploading media to X meant the v1.1 endpoint at upload.twitter.com, and X shut that endpoint down on June 9, 2025, after extending the original March 31 deadline. Older n8n versions and most community workflow templates still point at it, or bolt on OAuth 1.0a credentials specifically to reach it. Those workflows now fail no matter how the credentials are configured.
The related classic: You currently have access to a subset of X API V2 endpoints and limited v1.1 endpoints. That message means the node called a v1.1 endpoint your access tier does not include. It plagued the pre-1.1.0 n8n Twitter node, which was built on v1.1 throughout.
Three fixes, in order:
- Upgrade n8n to 1.1.0 or later, where the X node was rebuilt on API v2.
- Delete the old Twitter node and its credential, and recreate both from scratch. Reusing the old credential is a documented way to keep the error after upgrading.
- For media, use the v2 media upload flow with a token that carries media.write, as shown above. Anything referencing upload.twitter.com is dead.
The tier problem: pay-per-use credits and dead free tiers
If your workflow worked for weeks and then started failing with no config change, look at billing. On February 6, 2026, X made pay-per-use the default for new developers and discontinued the free tier for new signups. Posting costs roughly $0.015 per tweet, and since April 2026 a tweet containing a link costs around $0.20. New signups get a small one-time credit voucher, and when it runs out, write requests start failing.
Older accounts were not spared: the $200 Basic tier was closed and migrated to pay-per-use around June 1, 2026. So an n8n workflow that posts a few link tweets a day quietly becomes a real monthly bill, and a drained balance surfaces in n8n as yet another opaque request failure.
There is no n8n-side fix for this one. Either you fund the X API meter, or you stop calling the X API from n8n at all, which is the next section.
The fix that skips all of it: one HTTP Request node
Every 403 above lives in the X OAuth and billing stack. Take that stack out of your workflow and the errors go with it. OpenTweet holds the X connection (a normal login, no developer account, no app, no Project, no scopes) and n8n talks to OpenTweet with one Bearer key.
Native X node
- Five distinct 403 causes to debug
- Scopes, Projects, token regeneration
- Per-post billing, $0.20 link posts
- Media upload tied to deprecated endpoints
HTTP Request to OpenTweet
- One Bearer key, no OAuth in n8n
- Post, schedule, threads, media
- Flat price, no per-post fees
- OpenTweet manages X tokens and refresh
JSON body to post immediately:
{
"text": "Posted from n8n. No X OAuth, no 403.",
"publish_now": true
}With media (the part the native node keeps breaking on), or scheduled for later:
{
"text": "Chart of the week.",
"media_urls": ["https://example.com/chart.png"],
"scheduled_date": "2026-07-15T15:00:00Z"
}Full endpoint reference in the API docs. Building the workflow from zero? Start with the post to X from n8n guide, or see how the two approaches compare in OpenTweet vs n8n.
One API key
Replaces the X developer account, Projects, scopes, and token babysitting.
No more 403
OpenTweet holds a proper user context with write access, always.
Post or schedule
publish_now for instant, scheduled_date to queue, media_urls for images.
Flat pricing, no per-post fees. See plans and pricing.
Frequently asked questions
Why does the n8n X (Twitter) node return 403 Forbidden?
There are five common causes: your X app permissions are set to Read only, your OAuth credential is missing the media.write scope (media uploads only), your X app is not attached to a Project in the developer portal, you are on an old n8n version whose Twitter node still calls legacy v1.1 endpoints, or your X API pay-per-use credits have run out. Each has a different fix, covered on this page. If you would rather not debug X OAuth at all, an HTTP Request node pointed at OpenTweet posts with a single Bearer key.
How do I fix "Forbidden: Missing permission media.write" in n8n?
The predefined X OAuth2 credential in n8n does not request the media.write scope, so text tweets work but media uploads return 403. Create a generic OAuth2 API credential instead, with authorization URL https://twitter.com/i/oauth2/authorize, access token URL https://api.twitter.com/2/oauth2/token, and the scope string "tweet.read tweet.write users.read media.write offline.access", then reconnect your account so X issues a fresh token with the media scope.
I changed my X app to Read and Write but n8n still says 403. Why?
Tokens issued before the permission change keep the old read-only scope. After switching app permissions to Read and Write in the X developer portal, you must regenerate your keys and tokens there, then reconnect the credential in n8n so the new token is used. Reusing the old connection keeps the old permissions.
Does the X API free tier still exist for n8n workflows?
Not for new developers. X made pay-per-use billing the default for new signups on February 6, 2026 and discontinued the free tier for them. Posting costs roughly $0.015 per tweet, and since April 2026 a post containing a link costs about $0.20. When your credits run out, write requests start failing. OpenTweet is flat-priced instead, so an n8n workflow can post as much as your plan allows with no per-post metering.
Can I post to X from n8n without an X developer account?
Yes. Connect your X account to OpenTweet with a normal login, create an API key, and call the OpenTweet API from an n8n HTTP Request node. There is no developer application, no OAuth setup in n8n, no scopes, and no Project attachment. The full walkthrough is in our post to Twitter from n8n guide.
Stop debugging X OAuth in n8n
Connect X once, get one key, and post from a single HTTP Request node. No scopes, no Projects, no per-post billing.
Start your 7-day free trial