Skip to content
yeetpostyeetpost

Analytics

A post's numbers, and totals per day and per platform.


The numbers yeetpost reads back off the platforms after a post goes out.

Get a post's numbers

GET/posts/{postId}/metrics

The numbers yeetpost has read back from the platform for one post: the newest read, and every read before it.

A post is read an hour after it goes out, then hourly for 48 hours, then once a day until it is 30 days old. Before the first read latest is null.

What each platform reports differs, and a number a platform does not report is null rather than 0. Bluesky and Mastodon give likes, reposts and replies for free. LinkedIn gives likes and comments on any share, and impressions and clicks only on a page. X gives impressions, likes, reposts and replies, and X charges for the read, so it is off unless the account has X analytics enabled.

Rate limit: 60 requests per minute per API key.

curl "https://api.yeetpost.com/api/v2/posts/6f1b0c8a-1f3d-4d3e-9a2b-2f5a1c9e7d10/metrics" \  -H "x-api-key: $YEETPOST_API_KEY"
response 200
{  "latest": {    "fetchedAt": "2026-08-30T10:00:00.000Z",    "impressions": null,    "likes": 12,    "reposts": 3,    "replies": 1,    "clicks": null  },  "history": [    {      "fetchedAt": "2026-08-29T10:00:00.000Z",      "impressions": null,      "likes": 4,      "reposts": 1,      "replies": 0,      "clicks": null    },    {      "fetchedAt": "2026-08-30T10:00:00.000Z",      "impressions": null,      "likes": 12,      "reposts": 3,      "replies": 1,      "clicks": null    }  ]}

path parameters

postIdstring <uuid>required

Id of the post, as returned by POST /posts or GET /posts.

response 200

The post's numbers.

headers: x-request-id, x-ratelimit-limit, x-ratelimit-remaining, x-ratelimit-reset

response body

latestany | nullrequired

The most recent read, null when the post has not been read yet. A post is first read an hour after it goes out.

historyobject[]required

Every read, oldest first. A post is read hourly for 48 hours and then daily until it is 30 days old, so a finished history is 78 reads.

history[].fetchedAtstring <date-time>required

An ISO 8601 timestamp in UTC, in the same format as the timestamps you send in: 2026-08-26T09:24:11.412Z.

history[].impressionsinteger | nullrequired

How many times the post was shown. X and LinkedIn pages report it; Bluesky, Mastodon and personal LinkedIn profiles do not. Null means the platform does not report this number, which is not the same as zero.

history[].likesinteger | nullrequired

Likes, favourites or reactions, whatever the platform calls them. Null means the platform does not report this number, which is not the same as zero.

history[].repostsinteger | nullrequired

Reposts, retweets or boosts. On Bluesky quotes are counted here too. LinkedIn does not report it. Null means the platform does not report this number, which is not the same as zero.

history[].repliesinteger | nullrequired

Replies or comments. Null means the platform does not report this number, which is not the same as zero.

history[].clicksinteger | nullrequired

Link clicks. LinkedIn pages report it; nobody else does. Null means the platform does not report this number, which is not the same as zero.

errors

The post id is not a valid id.

Missing or invalid API key.

No post of yours with that id.

More than 60 requests in a minute for this API key. Back off and retry.

Something went wrong on our side. Quote the x-request-id when you report it. A failure can happen before the rate limit is checked, so this response carries the request id and nothing else.

What each code means and the fix: errors.

Totals, a per-day series and a per-platform split

GET/analytics

Every post that went out in a window, with the newest numbers read for each of them.

Counters are running totals, so a post counts once, at whatever its newest read said. A post counts on the day it went out, which is what makes days a series you can chart.

The window is named in whole UTC days at both ends. Left out, it is the last 30 days, which is exactly as long as a post's numbers are refreshed for. The longest window is 365 days.

Scoped like everything else: a test key counts sandbox posts only, and a key scoped to a profile counts that profile's posts only.

Rate limit: 60 requests per minute per API key.

curl "https://api.yeetpost.com/api/v2/analytics" \  -H "x-api-key: $YEETPOST_API_KEY"
response 200
{  "totals": {    "posts": 2,    "readPosts": 2,    "impressions": null,    "likes": 16,    "reposts": 4,    "replies": 1,    "clicks": null  },  "days": [    {      "day": "2026-08-29",      "posts": 1,      "impressions": 0,      "likes": 4,      "reposts": 1,      "replies": 0    },    {      "day": "2026-08-30",      "posts": 1,      "impressions": 0,      "likes": 12,      "reposts": 3,      "replies": 1    }  ],  "byPlatform": [    {      "platformId": "bluesky",      "posts": 2,      "impressions": 0,      "likes": 16,      "reposts": 4,      "replies": 1,      "clicks": 0    }  ],  "from": "2026-08-29",  "to": "2026-08-30"}

query parameters

fromstring <date>optional

First UTC day of the window, inclusive, as YYYY-MM-DD.

tostring <date>optional

Last UTC day of the window, inclusive, as YYYY-MM-DD.

profileIdstring <uuid>optional

Count only the posts that went out through this profile's connections.

platformstringoptional

Count only the posts that went out to this platform, such as bluesky.

connectionSlugstringoptional

Count only the posts that went out through this connection.

response 200

The window.

headers: x-request-id, x-ratelimit-limit, x-ratelimit-remaining, x-ratelimit-reset

response body

totalsobjectrequired
totals.postsintegerrequired

Posts that went out in the window.

totals.readPostsintegerrequired

How many of those posts have been read at least once.

totals.impressionsintegerrequired

Null when readPosts is 0: nothing has been read yet, which is not the same as reading zero of it.

totals.likesintegerrequired
totals.repostsintegerrequired
totals.repliesintegerrequired
totals.clicksintegerrequired
daysobject[]required

One entry per UTC day of the window, gaps included, so it can be charted as it comes. A post counts on the day it went out, and its numbers count with it.

days[].daystringrequired
days[].postsintegerrequired
days[].impressionsintegerrequired
days[].likesintegerrequired
days[].repostsintegerrequired
days[].repliesintegerrequired
byPlatformobject[]required

The same window split by platform. A platform with no posts in the window is not listed.

byPlatform[].platformIdstringrequired

The platform, such as bluesky or mastodon.

byPlatform[].postsintegerrequired
byPlatform[].impressionsintegerrequired
byPlatform[].likesintegerrequired
byPlatform[].repostsintegerrequired
byPlatform[].repliesintegerrequired
byPlatform[].clicksintegerrequired
fromstringrequired

First UTC day of the window, inclusive.

tostringrequired

Last UTC day of the window, inclusive.

errors

400

Missing or invalid API key.

More than 60 requests in a minute for this API key. Back off and retry.

Something went wrong on our side. Quote the x-request-id when you report it. A failure can happen before the rate limit is checked, so this response carries the request id and nothing else.

What each code means and the fix: errors.