Build on Athenous
Publish organic posts and run ad campaigns across the networks Athenous connects, with one API. Start with the quickstart, or pick a platform.
Athenous API
Add publishing and ads to your own app. There is no language SDK. Call the REST API, or use MCP and the CLI.
Athenous for AI and the terminal
Use the same key from the assistant or shell you already work in.
What the API covers
channels lists the networks. Options for each network live in channelSettings.
Publish and scheduleApprove a draft, then set SCHEDULED and scheduledAt, or publish now.
Per-channel resultsRead publications[] and call sync. This API does not send webhooks.
Ads in orderCreate and publish the campaign, then the ad set, then the ad.
Quickstart
Schedule one post. The public base URL is https://public-api.athenous.io. Send X-Api-Key: ath_… on Posts, Ads, and Connectors.
- An Athenous account on Pro, Agency, or Enterprise.
- A login for one network in Platforms. The example uses LinkedIn.
- That network connected in the app. The API lists connections. It does not start OAuth.
Using a coding agent? Give it this prompt.
Add the Athenous API to this project. Read https://developers.athenous.io/ first and follow it.
1. Read the API key from the ATHENOUS_API_KEY environment variable. Never hardcode it or commit it.
2. Call https://public-api.athenous.io and send X-Api-Key on every Posts, Ads, and Connectors request.
3. List connections with GET /api/v1/connectors and keep the id of the account I connected.
4. Create a draft with POST /api/v1/posts. Send channels as an array. Send channelSettings as a JSON string; each channel object needs connectorId.
5. Approve with POST /api/v1/posts/{id}/approve.
6. Schedule with PUT /api/v1/posts/{id}?status=SCHEDULED and body {"scheduledAt":"..."} in ISO-8601 UTC.
7. Confirm with GET /api/v1/posts/{id} and show me status.
Ask me which channel to use before you start. Stop if any call returns an error. Do not call publish unless I ask: publish sends the post immediately.
1. Create an API key
- Open Settings → API keys.
- Enable REST API (
api). Add CLI (cli) only if you will use the terminal. - Copy the key once. Athenous stores only a hash.
export ATHENOUS_API_KEY=ath_xxxx
2. Copy a connector id
Connect the account under Connections in the app, then list it.
curl -sS "https://public-api.athenous.io/api/v1/connectors" \
-H "X-Api-Key: $ATHENOUS_API_KEY"
3. Create a draft
channelSettings is a JSON string. Build the object, then stringify it. Field limits are in the post field tables.
POST_ID=$(curl -sS -X POST "https://public-api.athenous.io/api/v1/posts" \
-H "X-Api-Key: $ATHENOUS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "March update",
"body": "Hello from the API",
"channels": ["linkedin"],
"channelSettings": "{\"linkedin\":{\"contentType\":\"post\",\"connectorId\":\"CONNECTOR_UUID\"}}"
}' | jq -r '.id')
4. Approve, then schedule
A draft cannot move to SCHEDULED until approvedAt is set. Editing the title, body, media, or channels clears approvedAt, so approve again after those edits.
curl -sS -X POST "https://public-api.athenous.io/api/v1/posts/$POST_ID/approve" \
-H "X-Api-Key: $ATHENOUS_API_KEY"
curl -sS -X PUT "https://public-api.athenous.io/api/v1/posts/$POST_ID?status=SCHEDULED" \
-H "X-Api-Key: $ATHENOUS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"scheduledAt":"2026-03-20T14:00:00Z"}'
Athenous publishes SCHEDULED posts at scheduledAt. A per-channel scheduledAt inside channelSettings overrides the post time for that channel. Publish now, retry a failed channel, and upload media in the guides.
Scopes
| Scope | What it allows |
|---|---|
api | REST calls to Posts, Ads, and Connectors. |
cli | Exchange the key for a bearer token at POST /api/v1/auth/cli/token. |
athenous_post | Posts API only. |
athenous_ad | Ads API only. |
batch | Higher rate limit, 500 requests per minute. |
A key that lists neither athenous_post nor athenous_ad can call both products. A key that lists one of them is limited to that product. Connected accounts stay available to any REST key. The default limit is 100 requests per minute per key.
Glossary
Short definitions for the words these docs use. The field each one maps to is in the API reference.
| Term | Meaning |
|---|---|
| Connector | A network account linked in the app. Its id is connectorId. |
| Channel | An organic network id, such as linkedin or tiktok. Ads use a separate platform value, such as META. |
channelSettings | A JSON object stored as a string. Keys are channel ids. Each value holds that channel’s connectorId and options. |
approvedAt | Set by approve. Required before a draft can become SCHEDULED. Cleared when title, body, media, or channels change. |
| Publication | One row per channel (or per ad network) with status, the network’s id, and an error when that network failed. |
PARTIAL | At least one channel published and at least one failed. Retry with retry-failed. |
| Sync | POST …/sync pulls likes, comments, impressions, and the other stored metrics. It does not push content. |