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 self-disclosure. On a
carousel it rides the parent container, the only place Meta accepts it. This is the one field
Chirio on other platforms rather than ignoring: a disclosure you asked for and
silently did not get is the failure it exists to prevent.
is_ai_generated
rejects
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: per-target content and mediaItems overrides, 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.
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.