Viral posts to your take
Find posts that took off in your niche, then have Postel write your own version as a draft.
Postel keeps a library of posts and videos that did far better than their creator usually does. You can search it, pick a post or a format, and have Postel write your own take on it in your voice.
The library only holds individual creators. Postel keeps brands, politicians and aggregator pages out.
Find viral posts
| Parameter | Type | Default | Description |
|---|---|---|---|
query | string | Topic or keywords, up to 200 characters. Leave it out to browse what is doing best. | |
network | string | x | x for posts, or youtube, tiktok or instagram for videos. |
format | string | X only. Only posts in this format, an id from GET /v1/viral/formats. | |
length | string | Videos only. short or long. | |
days | integer | 7 | How far back to look, 1 to 60 days. |
minOutlierScore | number | Only posts with at least this outlier score. | |
minViews | integer | Only posts with at least this many views. On X, results start at 10,000 views when you leave it out. | |
limit | integer | 20 | Results, 1 to 50. |
curl "https://www.postel.app/api/v1/viral/posts?query=pricing&days=14&minOutlierScore=5" \
-H "Authorization: Bearer $POSTEL_API_KEY"{
"posts": [
{
"id": "1853921047712395264",
"network": "x",
"url": "https://x.com/jonaslindqvist/status/1853921047712395264",
"title": null,
"text": "We raised prices 40% last month. Churn went down.\n\nHere's what we changed first.",
"author": {
"handle": "jonaslindqvist",
"name": "Jonas Lindqvist",
"followers": 8200
},
"postedAt": "2026-10-29T07:41:00.000Z",
"views": 214000,
"likes": 3120,
"comments": 184,
"reposts": 402,
"outlierScore": 26.1,
"outlierBasis": "followers",
"format": "the-numbers",
"isShort": null
}
]
}X results come most viewed first. Searching allows 30 requests a minute per workspace. See Rate limits.
Returns one viral post or video by its id, or 404 not_found.
Outlier score
The outlier score says how far a post outran what its creator normally gets. Higher means more unusual.
- On X, it is views divided by the author's followers. A score of 26 means the post got 26 times as many views as the author has followers.
- On videos, it is how many times more views the video got than a baseline. The baseline is the creator's usual views, their followers, or what videos on the same topic usually get.
outlierBasissays which:usual,followersortopic.
The score is null when Postel can't compute it, for example when it doesn't know the author's follower count.
The viral post object
| Field | Type | Description |
|---|---|---|
id | string | Postel's id for the post. Use it to write your take. |
network | string | x, youtube, tiktok or instagram. |
url | string | The post on its network. |
title | string or null | Videos only. |
text | string | The post text, or the video's description. |
author.handle | string | The creator's handle. |
author.name | string or null | The creator's name. |
author.followers | number or null | Their followers when Postel last checked. |
postedAt | string | UTC ISO 8601. |
views, likes, comments, reposts | number or null | Counts when Postel last checked. reposts is null for videos. |
outlierScore | number or null | See Outlier score. |
outlierBasis | string or null | followers, usual or topic. |
format | string or null | X only. The format the post follows. |
isShort | boolean or null | Videos only. true for short-form. |
Formats
Viral posts keep reusing the same shapes, like a real number with the decisions behind it, or a before and after. This endpoint lists them. Each format has a question. Your answer to it gives Postel the facts to write the post from.
{
"formats": [
{
"id": "the-numbers",
"name": "The numbers",
"why": "A real figure stops the scroll, and the decisions behind it are what readers save.",
"question": "What's a number from your work you'd stand behind?",
"placeholder": "40 demo calls in October, all from replying to posts, about 20 minutes a day"
},
{
"id": "then-now",
"name": "Then vs now",
"why": "A concrete before and after shows a shift the reader can act on.",
"question": "What changed in how you work?",
"placeholder": "We used to write every SEO page by hand. Now we publish fewer pages and update the ones that rank."
}
]
}Write your take
Postel writes your own post from a viral X post or from a format, in your voice, and saves one draft per network.
| Field | Type | Default | Description |
|---|---|---|---|
viralPostId | string | An X post from GET /v1/viral/posts to use as the template. Send this or format. | |
format | string | A format id from GET /v1/viral/formats. Send this or viralPostId. | |
answer | string | Your answer to the format's question: the facts the post is about. Required with format, optional with viralPostId. Up to 2,000 characters. | |
platforms | string[] | ["linkedin"] | x, linkedin or both. Postel writes one draft for each. |
curl https://www.postel.app/api/v1/viral/takes \
-H "Authorization: Bearer $POSTEL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"format": "the-numbers",
"answer": "We raised prices 25% in September. Two customers left, revenue went up 21%.",
"platforms": ["linkedin", "x"]
}'It answers 201 with:
| Field | Type | Description |
|---|---|---|
post | object | The first draft, as a post. |
posts | object[] | Every draft Postel wrote, one per network. |
failed | string[] | Networks whose draft Postel couldn't write. Usually empty. |
Things to know:
- Each draft uses 1 AI credit. A network whose draft fails costs nothing. Writing takes works on every plan.
- Writing takes 10 to 40 seconds. Set your HTTP client's timeout to at least 90 seconds.
- Takes share the limit of 3 posts written at once per workspace with
POST /v1/posts/generate. - Takes work from X posts and formats. A video's id gets
422 not_supported, because Postel writes from the post's text. - If no draft could be written, the response is
502 generate_failedand nothing is charged. - Send an
Idempotency-Keyonly when it is unique per run. A daily job with a fixed key would get the same drafts back for 24 hours.