Typefully API v1 Shut Down
on June 15, 2026
Every script still calling api.typefully.com/v1 is broken. You have two ways forward: rebuild your payloads for Typefully v2, or spend 15 minutes migrating to OpenTweet, an X-only scheduler that treats the API as the product. This guide covers both.
7-day free trial • No credit card required
What Happened to the Typefully API
Typefully released API v2 in December 2025 and set a deadline: v1 endpoints would keep working until June 15, 2026. That date has passed. Creating new v1 keys was disabled even earlier, so any integration built on POST /v1/drafts/ with the X-API-KEY header now fails.
v2 is not a rename, it is a redesign. Authentication moved to a standard Authorization: Bearer header and old keys are incompatible, so you must generate new ones. Every draft operation now requires a social_set_id, which means an extra call to GET /v2/social-sets before you can post anything. The flat content string became a nested platforms object with a posts array per network. schedule-date was renamed to publish_at. Auto-threadify is gone. Notification endpoints were removed with no v2 equivalent.
The upside of v2 is real: one draft can publish to X, LinkedIn, Threads, Bluesky, and Mastodon, and the API gained media uploads and full draft management. If you need multi-platform publishing, follow Typefully's official migration guide, it is well written. But if you only ever posted to X, you are being asked to rewrite your integration around social sets and platform envelopes you will never use. That is the moment to ask whether the rewrite should point somewhere else.
Endpoint Mapping: Typefully v1 vs v2 vs OpenTweet
Every v1 call you might have in production, and where it goes on each path. OpenTweet paths are relative to https://opentweet.io.
| Task | Typefully v1 (dead) | Typefully v2 | OpenTweet |
|---|---|---|---|
| Auth header | X-API-KEY: Bearer KEY | Authorization: Bearer KEY (new key required) | Authorization: Bearer ot_xxx |
| Create a draft | POST /v1/drafts/ with content | POST /v2/social-sets/{id}/drafts with platforms.x.posts[] | POST /api/v1/posts with text, omit scheduled_date |
| Schedule for a time | "schedule-date": "2026-07-15T10:00:00Z" | "publish_at": "2026-07-15T10:00:00Z" | "scheduled_date": "2026-07-15T10:00:00Z" |
| Publish immediately | Not supported (schedule only) | "publish_at": "now" | "publish_now": true |
| Next best slot | "schedule-date": "next-free-slot" | "publish_at": "next-free-slot" | POST /api/v1/posts/smart-schedule (smart or interval mode) |
| Post a thread | threadify: true or 4 consecutive newlines | Explicit posts array per platform | is_thread: true + thread_tweets[] (up to 25 tweets) |
| List scheduled | GET /v1/drafts/recently-scheduled/ | GET /v2/social-sets/{id}/drafts?status=scheduled | GET /api/v1/posts?status=scheduled |
| List published | GET /v1/drafts/recently-published/ | GET /v2/social-sets/{id}/drafts?status=published | GET /api/v1/posts?status=posted |
| Verify credentials | GET /v1/verify-credentials/ | GET /v2/me + GET /v2/social-sets | GET /api/v1/me (plan, limits, connected accounts) |
| Bulk operations | One draft per request | One draft per request | Up to 50 posts per request, plus /posts/batch-schedule |
| Account targeting | Key is bound to one account | social_set_id in every URL | Optional x_account_id field, defaults to primary account |
Typefully columns based on their official v1 to v2 migration guide. Full OpenTweet reference at /docs/api.
The Same Call, Before and After
Your old Typefully v1 call (stopped working June 15, 2026)
curl -X POST https://api.typefully.com/v1/drafts/ \
-H "X-API-KEY: Bearer YOUR_TYPEFULLY_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Shipped a new feature today.",
"schedule-date": "2026-07-15T10:00:00Z"
}'The OpenTweet equivalent: same flat shape, three renames
curl -X POST https://opentweet.io/api/v1/posts \
-H "Authorization: Bearer ot_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Shipped a new feature today.",
"scheduled_date": "2026-07-15T10:00:00Z"
}'Threads: threadify is gone everywhere, so the split is explicit. Publish immediately with publish_now
curl -X POST https://opentweet.io/api/v1/posts \
-H "Authorization: Bearer ot_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "How we cut our build time in half (thread)",
"is_thread": true,
"thread_tweets": [
"1. We profiled the pipeline instead of guessing.",
"2. Caching dependencies saved 4 minutes per run.",
"3. Full writeup on the blog this week."
],
"publish_now": true
}'Responses return the post id, status, and the live X URL after publishing. Drafts, scheduling, and immediate publishing are all the same endpoint.
Which Path Should You Take?
An honest split. Both are good tools, they optimize for different users.
Stay on Typefully: migrate to v2
The right call if you publish to more than X. One v2 draft can go to X, LinkedIn, Threads, Bluesky, and Mastodon, with per-platform content overrides and media uploads. The editor and writing experience remain Typefully's core strength.
- Generate a new v2 key, old keys are incompatible
- Fetch your social_set_id from GET /v2/social-sets
- Rebuild payloads around the platforms object
- Rename schedule-date to publish_at
- Replace threadify with explicit posts arrays
Move to OpenTweet: X-only, API-first
The right call if X is your only target and the API is how you actually use the product. Flat payloads close to Typefully v1, bulk creation up to 50 posts per call, batch and smart scheduling, evergreen recycling, webhooks, idempotency keys, and a hosted MCP server for AI agents. Pro is $11.99/mo, Advanced is $29/mo, details on the pricing page.
- No social_set_id, no platforms wrapper
- Three parameter renames from v1, same ISO dates
- Threads, scheduling, and publish-now on one endpoint
- GET /api/v1/me returns plan, limits, and accounts
- MCP tools for Claude, Cursor, and agent frameworks
The 15-Minute Migration, Step by Step
Sign Up and Connect X
Create an OpenTweet account with the free 7-day trial and connect your X account in the dashboard. OpenTweet manages X OAuth tokens and refresh for you, the same way Typefully does, so your script never touches the X API.
Generate an API Key
Go to Settings and generate an API key. Keys use the ot_ prefix and work immediately. No approval queue, and unlike the Typefully v1 to v2 change, you will not be asked to regenerate keys for a new API version.
Swap the Endpoint and Auth Header
Replace POST https://api.typefully.com/v1/drafts/ with POST https://opentweet.io/api/v1/posts. Replace the X-API-KEY header with Authorization: Bearer ot_xxx. If you already migrated your header for Typefully v2, this part is identical.
Rename Three Parameters
content becomes text. schedule-date becomes scheduled_date, same ISO 8601 format. threadify becomes is_thread: true with an explicit thread_tweets array of follow-up tweets. Everything stays in one flat JSON object, no social_set_id, no platforms wrapper.
Update List and Status Calls
recently-scheduled becomes GET /api/v1/posts?status=scheduled and recently-published becomes ?status=posted. verify-credentials becomes GET /api/v1/me, which also returns your plan, remaining daily posts, and connected X accounts in one response.
Test with a Draft, Then Go Live
Send one request without scheduled_date or publish_now. That creates a draft you can inspect in the dashboard. When it looks right, add scheduled_date to queue it or publish_now: true to post immediately.
Things You Gain in the Move
Use Idempotency Keys for Retries
Send an Idempotency-Key header on POST /api/v1/posts and retries of the same request return the original response instead of creating a duplicate. Typefully v1 had no equivalent, so if your script had retry-dedup logic bolted on, you can delete it.
Batch Instead of Looping
Typefully v1 forced one draft per request. OpenTweet accepts a posts array of up to 50 in a single call, and POST /api/v1/posts/batch-schedule assigns times to up to 50 existing drafts at once. A week of content becomes one HTTP request.
Duplicate Content Is Soft-Blocked
If you resend text you already posted, the API returns 409 with details instead of silently double-posting. Pass allow_duplicate: true when the repeat is intentional, for example evergreen reposts.
Consider MCP If an Agent Does the Posting
If the thing calling Typefully was an AI agent rather than a cron script, skip REST entirely: point the agent at the hosted MCP endpoint https://mcp.opentweet.io/mcp and it gets create_tweet, create_thread, schedule_tweet, batch_schedule, and analytics as native tools.
Migration Mistakes to Avoid
Porting schedule-date as publish_at
publish_at is the Typefully v2 name. On OpenTweet the field is scheduled_date, and it must be a future ISO 8601 timestamp. There is no "now" magic string: use publish_now: true for immediate publishing instead.
Expecting Auto-Threadify
Typefully v1 split long content into a thread automatically. OpenTweet does not guess. Send the first tweet in text and the rest as thread_tweets, with is_thread: true. Your code decides where tweets break, which also means threads never split mid-sentence.
Sending publish_now with a posts Array
publish_now works for a single post only. When you create posts in bulk, they are saved as drafts or scheduled, and the response includes a warning if publish_now was ignored. Publish singles immediately, batch the rest with dates.
Leaving the Old Typefully Key in Your Env
v1 keys are dead and v2 keys use a different header. Whichever path you pick, clean up TYPEFULLY_API_KEY references so a half-migrated deploy fails loudly at startup instead of silently skipping posts.
Frequently Asked Questions
Did the Typefully API v1 really stop working?
Yes. Typefully's own migration guide states that v1 endpoints were operational until June 15, 2026, and creating new v1 API keys was disabled before that. If your integration still calls api.typefully.com/v1, it is broken now. You either move to their v2 API or to another posting API.
What changed in Typefully API v2?
Almost everything. The auth header changed from X-API-KEY to Authorization: Bearer, and v1 keys do not work with v2. Every draft operation now requires a social_set_id, so you must call GET /v2/social-sets first. The flat content field was replaced by a nested platforms object with a posts array per platform. schedule-date was renamed to publish_at. Auto-threadify is gone, threads are explicit arrays. Notification endpoints were removed entirely.
Is OpenTweet a drop-in replacement for Typefully API v1?
Not byte-for-byte, but it is very close in shape. Like v1, OpenTweet uses a flat JSON body with a single text field and an ISO 8601 schedule field, so migrating usually means changing the URL, the auth header, and three parameter names. There is no social_set_id concept and no nested platforms object. Most single-file posting scripts migrate in 15 minutes or less.
Does OpenTweet have an equivalent of Typefully's next-free-slot scheduling?
Yes. POST /api/v1/posts/smart-schedule takes draft post IDs (or schedule_all_drafts: true) and schedules them with schedule_mode 'smart', which picks times based on engagement patterns, or 'interval' for fixed spacing. It handles up to 50 posts per request.
What does OpenTweet not do that Typefully v2 does?
OpenTweet is X-only. Typefully v2 can publish the same draft to X, LinkedIn, Threads, Bluesky, and Mastodon from one API call. If cross-posting to multiple networks is a hard requirement, Typefully v2 is the better fit and you should follow their migration guide. If X is your only target, the multi-platform envelope is overhead you pay on every request.
What are OpenTweet's API rate limits?
Publishing limits depend on your plan: Pro allows 20 posts per day, Advanced 100, and Agency 300. Threads count as one post. A single request can create up to 50 posts, and threads support up to 25 tweets. Rate limit state is returned in response headers, and the API supports an Idempotency-Key header so retries never double-post.
Do I need an X developer account for either option?
No. Both Typefully and OpenTweet handle X publishing on their side, so you never touch the X API, its pay-per-use billing, or OAuth token refresh. With OpenTweet you connect your X account once in the dashboard and the API posts on its behalf from then on.
Your v1 Script Is One Diff Away from Working Again
New endpoint, new header, three renamed fields. Generate an API key, point your script at opentweet.io/api/v1/posts, and your scheduled posting is back before the coffee gets cold.