Chirio
Get Started
Introduction
Quickstart
How Chirio works
Authentication
Platforms
Overview
Instagram
Threads
X
LinkedIn
Supa Hub
Guides
Connect accounts
Publish a post
Media requirements
Carousels
First comments
Idempotency and retries
Account lifecycle
Revocation and deletion
The dashboard
Billing
Plans
Metering
Quotas
Api Reference
Overview
Accounts
Posts
Errors
Changelog
Roadmap
TrademarkTrademark
Ctrl k
Search…
Sign up
Chirio
Get Started
Introduction
Quickstart
How Chirio works
Authentication
Platforms
Overview
Instagram
Threads
X
LinkedIn
Supa Hub
Guides
Connect accounts
Publish a post
Media requirements
Carousels
First comments
Idempotency and retries
Account lifecycle
Revocation and deletion
The dashboard
Billing
Plans
Metering
Quotas
Api Reference
Overview
Accounts
Posts
Errors
Changelog
Roadmap
TrademarkTrademark© Dopler. All rights reserved.
Built with Aveiro

Quickstart

From an API key to a published post in four calls.
Updated 1mo ago
Introduction
How Chirio works
From nothing to a published post. Four calls, a few minutes.

1. Get an API key

Sign in at chirio.dev/auth with a magic link — an account, workspace and project are created on first sign-in. Then go to Settings → API keys and create one. The full key is shown once. It looks like chirio_sk_...; only a hash of it is stored, so a lost key has to be revoked and replaced.
export CHIRIO_API_KEY=chirio_sk_...
export CHIRIO=https://chirio.dev

2. Connect a social account

Ask for an authorize URL and send your user to it.
curl -X POST "$CHIRIO/api/v1/accounts/connect" \
  -H "Authorization: Bearer $CHIRIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "instagram",
    "profileId": "user_123",
    "redirectUrl": "https://yourapp.com/settings/social"
  }'
{ "authUrl": "https://www.instagram.com/oauth/authorize?..." }
The user authorises on the platform and lands back on your redirectUrl with the result in the query string:
https://yourapp.com/settings/social?status=success&accountId=...&platform=instagram&username=...
Store that accountId — it is what you target when publishing, and it stays the same if the user ever disconnects and reconnects. Omit redirectUrl and the user lands on Chirio's own confirmation page instead.
Instagram needs a professional account
Instagram only allows publishing from Business or Creator accounts. Each platform has a requirement or two like this — see the platform pages before your first connect.

3. Publish

curl -X POST "$CHIRIO/api/v1/posts" \
  -H "Authorization: Bearer $CHIRIO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: launch-2026-08-04" \
  -d '{
    "content": "Launch day!",
    "mediaItems": [{ "type": "image", "url": "https://cdn.yourapp.com/launch.jpg" }],
    "platforms": [{ "platform": "instagram", "accountId": "8f2c..." }]
  }'
201 Created:
{
  "post": {
    "id": "3a1e...",
    "content": "Launch day!",
    "media": [{ "type": "image", "url": "https://cdn.yourapp.com/launch.jpg" }],
    "createdAt": "2026-08-04T09:12:44.101Z",
    "targets": [
      {
        "id": "b77d...",
        "accountId": "8f2c...",
        "platform": "instagram",
        "status": "published",
        "platformPostId": "17851...",
        "url": "https://www.instagram.com/p/...",
        "error": null,
        "publishedAt": "2026-08-04T09:12:51.882Z",
        "commentStatus": "none",
        "commentId": null,
        "commentError": null
      }
    ]
  },
  "replayed": false
}
201 does not mean everything published
A 201 means the request was accepted and every target was attempted. Targets settle independently, so read post.targets[].status — published or failed — rather than treating the HTTP status as the outcome.
Add "publishAt": "2026-08-21T09:00:00Z" to that same body and the post is scheduled instead: you get a 202, its targets read pending, and Chirio sends it when the time comes. No cron of your own. See Scheduling a post.

4. Read it back

Useful when a target was still processing — video can take minutes — or when a retried request came back with replayed: true and you want the settled state. It is also how you check on a scheduled post after its time has passed.

Where to go next

  • How Chirio works — what happens during a publish
  • Connect accounts — the OAuth flow in detail, including LinkedIn company pages
  • Publish a post — media rules, mixed results, per-platform limits
  • Idempotency and retries — making a timed-out publish safe to resend
  • Platforms — what each network allows
curl "$CHIRIO/api/v1/posts/3a1e..." -H "Authorization: Bearer $CHIRIO_API_KEY"