Skip to content
yeetpostyeetpost

Account

Who a key belongs to, and the account's activity log.


Who an API key is acting as, and what is left of its allowance.

Get the context of this API key

GET/me

Who the key is acting as: the account, live or test mode, the profile the key is scoped to, the plan, how much of today's post allowance and this month's render allowance is used, and how many connections the key reaches. Usage is account-wide, also for a key scoped to a profile, because the caps are shared across profiles. The MCP tool get_context answers the same.

Rate limit: 60 requests per minute per API key.

curl "https://api.yeetpost.com/api/v2/me" \  -H "x-api-key: $YEETPOST_API_KEY"
response 200
{  "account": {    "id": "3f0c2d54-6a1b-4c8e-9d7a-1b2c3d4e5f60",    "name": "Acme HQ"  },  "mode": "live",  "profile": null,  "plan": "free2",  "usage": {    "postsToday": 3,    "dailyPostCap": 100,    "postsThisMonth": 41,    "monthlyPostCap": null,    "messagesThisMonth": 2,    "monthlyMessageCap": 10,    "smsThisMonth": 0,    "monthlySmsCap": 10,    "rendersThisMonth": 12,    "monthlyRenderCap": 300  },  "rateLimits": {    "mcpRequestsPerMinute": 60  },  "connectionCount": 2,  "attention": {    "total": 1,    "items": [      {        "kind": "no_posting_slots",        "connection": "pangoling (LinkedIn)",        "postId": "9b1c2d3e-4f50-4a6b-8c7d-0e1f2a3b4c5d",        "errorCode": "queue_empty",        "message": "no posting slots set on this connection, add some or send at a set time"      }    ]  }}

response 200

The context of the key.

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

response body

accountobjectrequired
account.idstring <uuid>required

The account the key belongs to.

account.namestring | nullrequired

The account's name, null when it was never given one and always null for a key scoped to a profile.

modestringrequired

test for a test key, which reaches sandbox connections only.

live | test

profileobject | nullrequired

The profile the key is scoped to, null when it reaches the whole account or its profile was deleted.

profile.idstring <uuid>required
profile.namestringrequired
planstringrequired

The id of the plan the account is on right now.

usageobjectrequired
usage.postsTodayintegerrequired

Posts sent today, UTC.

usage.dailyPostCapinteger | nullrequired

The most posts a day the account may send, null when there is no cap.

usage.postsThisMonthintegerrequired

Posts sent this month, UTC.

usage.monthlyPostCapinteger | nullrequired

The most posts a month the plan allows, null when there is no cap.

usage.messagesThisMonthintegerrequired

Messages (Slack, email and the like, not SMS) sent this month, UTC.

usage.monthlyMessageCapinteger | nullrequired

The most messages a month the plan allows, null when there is no cap.

usage.smsThisMonthintegerrequired

SMS messages sent this month, UTC. SMS is counted apart from other messages because it costs per segment.

usage.monthlySmsCapinteger | nullrequired

The most SMS messages a month the plan allows, null when there is no cap.

usage.rendersThisMonthintegerrequired

Images rendered this month, UTC.

usage.monthlyRenderCapinteger | nullrequired

The most renders a month, null when there is no cap.

rateLimitsobjectrequired
rateLimits.mcpRequestsPerMinuteintegerrequired

Requests a minute the MCP endpoint takes per key.

connectionCountintegerrequired

The connections this key reaches: sandbox ones only for a test key, its own profile's for a scoped key.

attentionobjectrequired

What needs the user's eye right now, the same items the daily summary email carries: failed posts in the last 24 hours, logins that are expired or about to be, and connections with no posting slots that something tried to queue to. A scoped key sees only its profile's items and a test key only test-mode failed posts. Empty when all is well.

attention.totalintegerrequired

Every item that needs attention, however many are listed.

attention.itemsobject[]required

Up to 10 items, failed posts first (newest first), then logins.

attention.items[].kindstringrequired

failed_post | no_posting_slots | login_expired | login_expiring | source_error | source_item_failed | sources_allowance_reached | source_burst | sources_page_reads_reached

attention.items[].connectionstringrequired

The connection's own description, such as "pangoling (LinkedIn)".

attention.items[].postIdstring <uuid> | nullrequired

The failed post, or the newest one that hit the problem. Null for a login.

attention.items[].errorCodestring | nullrequired

The post's error code. Null for a login.

attention.items[].messagestringrequired

Plain words that include the fix.

errors

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.

Get the account's activity

GET/activity

The account's activity log in plain words, newest first: posts that went out, failed, were cancelled or deleted, connections added, reconnected or needing a reconnect, team members, keys and webhooks. On the first page it also carries the post requests that were refused in the last 30 days and are still worth acting on, which never became a post and so are in no other list.

The log covers the whole account, so it needs a live key that is not scoped to a profile: a scoped key and a test key answer 403 forbidden. The MCP tool get_activity answers the same.

Rate limit: 60 requests per minute per API key.

curl "https://api.yeetpost.com/api/v2/activity" \  -H "x-api-key: $YEETPOST_API_KEY"
response 200
{  "items": [    {      "id": "6d1f0c2e-8b3a-4c55-9a10-2f7e4d5b6a71",      "at": "2026-08-29T09:24:11.412Z",      "kind": "post_sent",      "title": "Yeeted to LinkedIn",      "detail": "Spring menu is live.",      "href": "/app",      "actor": "you"    }  ],  "cursor": null,  "refusedRequests": [    {      "id": "c1a2b3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",      "createdAt": "2026-08-29T08:02:40.100Z",      "errorCode": "invalid_connection",      "status": 400,      "apiKeyName": "Acme integration",      "textPreview": "Spring menu is live.",      "responseMessage": "No connection with the slug 'linkedin-acme'.",      "connectionSlug": "linkedin-acme",      "resolution": "open",      "connectionName": null,      "connectionId": null    }  ]}

query parameters

limitinteger, 1 to 100, default 25optional

How many items to return.

cursorstringoptional

The cursor of the previous page. A cursor that does not decode starts over at the first page.

response 200

The activity, newest first.

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

response body

itemsobject[]required
items[].idstringrequired
items[].atstring <date-time>required
items[].kindstringrequired

post_sent | post_failed | post_cancelled | post_deleted | connection_added | connection_reconnected | connection_needs_reconnect | member_invited | member_joined | api_key_created | webhook_added | source_item_posted | source_item_failed | source_check_failed | refused_requests

items[].titlestringrequired

What happened, in plain words.

items[].detailstringrequired

A line more about it, such as the connection or the reason.

items[].hrefstringrequired

Where the console shows it.

items[].actorstringrequired

you when the key's own owner did it, a teammate's email, a key's name, or yeetpost when nobody in particular did.

cursorstring | nullrequired

Hand this back as cursor for the next older page. Null when there is nothing further back.

refusedRequestsobject[]required

The post requests the API refused outright in the last 30 days that are still worth acting on, newest first, on the first page only. A refused request never became a post, so it only lives here. A refusal already fixed is left out.

refusedRequests[].idstringrequired
refusedRequests[].createdAtstringrequired
refusedRequests[].errorCodestringrequired

The stable error code the request was refused with.

refusedRequests[].statusintegerrequired
refusedRequests[].apiKeyNamestring | nullrequired

The key that made the request. Null when the key has since been deleted.

refusedRequests[].textPreviewstring | nullrequired

The first characters of the text the request tried to post. Null when the body held no readable text.

refusedRequests[].responseMessagestring | nullrequired

The refusal in the caller's own words. Null when none was logged.

refusedRequests[].connectionSlugstring | nullrequired

The connection the request named. Null on a bulk request.

refusedRequests[].resolutionstringrequired

How the refusal stands today: open is still broken, moved is a slug that now belongs to another profile than the key's, deleted is a slug no connection answers to any more.

open | moved | deleted

refusedRequests[].connectionNamestring | nullrequired
refusedRequests[].connectionIdstring | nullrequired

errors

A limit outside 1 to 100.

Missing or invalid API key.

This API key is scoped to one profile, and the endpoint is outside that scope. Profiles are managed with an unscoped key; a scoped key may only read its own profile and connect accounts into it.

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.