2026-08-20 — Video covers, alt text, and the AI disclosure
Three things a media item can now carry, all of them per item rather than per post:
coverUrl — a public image to use as a video's cover. Instagram takes the first frame
by default, which is why a reel so often opens on a blurred still. Honoured on Instagram
single-video posts and on LinkedIn.
thumbOffsetMs — milliseconds into the video of a frame to use instead, where you would
rather point at a good moment than supply an image. Instagram only; LinkedIn refuses it and
says to send coverUrl.
altText — up to 1,000 characters of screen-reader description on an image. Per item,
so each image in a carousel describes itself.
Per target, aiGenerated: true sends Meta's is_ai_generated self-disclosure. On a
carousel it rides the parent container, the only place Meta accepts it. This is the one field
Chirio rejects on other platforms rather than ignoring: a disclosure you asked for and
silently did not get is the failure it exists to prevent.Cover images have specs worth reading before you generate them —
Instagram wants JPEG, 8 MB, sRGB and 9:16, and crops rather than
refuses anything else.
2026-08-20 — Repost any post URL
POST /api/v1/reposts reshares a post Chirio never published — a colleague's announcement, an
older post, anything that went out before you connected the account. Name it by URL (every X
link shape works) or by platform + platformPostId, and name the accounts that should
reshare it. Per-account outcomes, one network write per account.Repeat calls are billed once. X answers a repeated retweet exactly as it answers the first, so
nothing in the platform's response marks a duplicate — Chirio's usage ledger keys these writes
on the account and the post. That is what makes a "repost once it passes 500 likes" poll safe
to run on a schedule. See the Posts reference.
2026-08-20 — Chirio owns the clock
Posts can be scheduled. Send publishAt on POST /api/v1/posts and the response is 202
with every target pending; a dispatcher runs every minute and sends the post when its time
comes. POST /api/v1/posts/:id/cancel calls one off while it is still waiting.This reverses the earlier position that callers own their own clock. It stopped making sense
once there was more than one caller: a self-hosted instance cannot lean on another app's cron,
and a desktop client is not running at 09:00.Also shipped: , so one post can carry a
different caption or a different crop per platform instead of forcing you into one post per
target. Overrides work on immediate publishes too.
per-target content and mediaItems overrides
2026-08-20 — Disconnecting keeps the account's identity
DELETE /api/v1/accounts/:id now destroys the account's credentials but keeps the row, marked
revoked, instead of deleting it. Reconnecting the same profile reuses the same accountId,
so ids stored on your side survive a disconnect-and-reconnect cycle. Revoked accounts are
hidden from GET /api/v1/accounts unless you pass includeRevoked=true, and they no longer
count against your plan's connected-account cap.
Platform-initiated removals are unchanged: when someone removes Chirio from their Instagram or
Threads settings, or files a data-deletion request, every row for that profile is deleted
outright.
2026-08-18 — Reposts and an OpenAPI spec
POST /api/v1/posts/:id/repost reshares a post's published targets from the accounts that
published them — the amplification half of "repost when it performs": poll
metrics on your own schedule, and when a post crosses your threshold,
call repost once. X first (a retweet of the original — repeat calls are a no-op, and
Chirio bills at most one repost per target); other platforms report unsupported until their
repost contracts land. A repost is one network write, with no link surcharge.
The full /api/v1 contract also ships as a machine-readable OpenAPI 3.1 spec, served at
/openapi.yaml on every Chirio instance — generate clients from it instead of hand-writing
requests.
2026-08-10 — Engagement metrics
GET /api/v1/posts/:id/metrics reads a post's current views, likes, comments, shares and
saves — live from each platform, with the same per-target result shape as publishing. Reading
is free; nothing is stored, so snapshot on your own schedule if you need a time series.
Instagram and Threads accounts connected before this date must reconnect to grant the
insights permissions; X needs a read-capable (paid) API tier; LinkedIn reports likes and
comments. See the Posts reference.
2026-08-08 — Supa Hub
Publishing into self-hosted Supa Social hubs (e.g. Orbit) as a platform target:
Connect with a hub API key — or a one-time connect code the hub user generates, so the
end user never handles a secret. No OAuth, and the connection never expires.
The first line of content becomes the hub post's title; images publish as a single image
or a 2–10 item carousel.
A per-target spaceSlug overrides the account's default space, so one request can post to
several spaces through the same account.
GET /api/v1/accounts/:id/spaces lists the hub's spaces (searched and paginated) for
space pickers.
Also that week: X media uploads moved to the dedicated v2 chunked endpoints, and a Threads
first comment now retries when the just-published post is not yet addressable — both
reliability fixes, no API change.
2026-08-04 — X media uploads
Media uploads to X are more reliable, and a failed X response now carries enough detail to
diagnose. Accounts connected before this date must be reconnected before they can publish
media to X — permissions are fixed at the moment a user authorises, so an existing connection
cannot gain them.
2026-08-03 — Billing
Metered billing is live:
Network writes as the billable unit — one per target, one per first comment that posts.
Plans with included volume, account and project caps, and overage on paid tiers.
Quota enforced before any platform call; 429 quota_exceeded on plans that stop at the
allowance.
Self-serve upgrades, invoices and current-period usage in Settings → Billing.
X's two rates confirmed against its published rate card — $0.015 per post, $0.20 per post
containing a link, which is why an X link write costs 65 units.
Also that day: a comment refused for permissions now tells you what actually fixes it, instead
of repeating the platform's unhelpful copy.
2026-08-02 — Revocation and data deletion
When someone removes Chirio from their Instagram or Threads settings, their stored credentials
are now deleted automatically, and platform data-deletion requests are handled end to end. See
Revocation and deletion.
2026-08-02 — First comments
firstComment per target: a comment posted from the author's own account right after that
target publishes — the link-in-the-comments pattern. Supported on Instagram, Threads and
LinkedIn; reported unsupported on X. A comment failure never fails the post.
2026-07-31 — LinkedIn
Publishing to LinkedIn personal profiles and company pages. Text up to 3,000
characters, up to 10 images as a multi-image post or a single video, and first comments.
2026-07-30 — Carousels
Instagram and Threads carousels via ordered mediaItems. Two or more items publish as a single
carousel in array order; a carousel fails atomically per target.
2026-07-29 — Idempotency
POST /api/v1/posts accepts an Idempotency-Key. A retry after a timeout returns the original
post with replayed: true instead of publishing twice. See
Idempotency and retries.