The native X app was discontinued (existing scenarios stopped May 30, 2025, and the main thread about it, Make is officially decommissioning X (formerly Twitter) app , is now closed). Since people keep landing on that thread from Google without a working answer, here is the setup that works today with plain HTTP modules.
Reading tweets with the official X API
Reads only need an app-level bearer token, no OAuth dance:
- Create a project and app in the X developer console and copy the bearer token.
- In Make, add HTTP > Make a request:
- URL:
https://api.x.com/2/users/by/username/make(or any v2 endpoint) - Method: GET
- Headers:
Authorization=Bearer YOUR_TOKEN - Parse response: yes
- URL:
- Map the JSON output into whatever comes next (Sheets, Slack, a data store).
Note the official API is pay-per-use now: a standard post read is $0.005, so 10,000 reads is $50. Worth estimating volume before you build.
Posting tweets with the official X API
Writes need user-context OAuth 2.0, which is where most people get stuck. The checklist that makes it work:
- In the X developer portal, set the app type to Web App, and register the exact redirect URL that Make’s OAuth module shows you. A mismatch here produces the “You weren’t able to give access to the App” error with no further explanation.
- Enable scopes:
tweet.read,tweet.write,users.read, andoffline.access. Withoutoffline.accessyou get no refresh token and the connection dies after two hours. - Use HTTP > Make an OAuth 2.0 request with authorize URL
https://x.com/i/oauth2/authorize, token URLhttps://api.x.com/2/oauth2/token, and PKCE enabled. - Then POST to
https://api.x.com/2/tweetswith body{"text": "hello"}.
The simpler route if you do not want a developer account
Third-party Twitter data APIs work with a single bearer token and skip the OAuth setup entirely: same HTTP module, different base URL. I build one of these (GetXAPI), so obvious bias, but the HTTP module pattern is identical whichever provider you use.
Replacing the “watch tweets” trigger
The old trigger was polling anyway, so rebuild it honestly: a scheduled scenario that fetches the account’s recent tweets, a data store holding the last seen tweet ID, a filter that passes only tweets with a higher ID, then an update of the stored ID. One trap that costs people weeks: compare tweet IDs as numbers, not text. A text comparison sorts alphabetically and silently stops matching once IDs grow a digit, and the scenario keeps running green while finding nothing.
Happy to answer questions if anyone gets stuck on the OAuth part, that seems to be where most of the pain is.