Build on Athenous
Publish organic posts and run ad campaigns across the networks Athenous connects, with one API. There is no language SDK. Call the REST API, or use MCP and the CLI from the sidebar.
Authentication
Every public call sends X-Api-Key: ath_…. The key needs api and a Pro, Agency, or Enterprise plan. Keep it in an environment variable. Do not put it in client-side code or a repository.
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
| Scope | What it allows |
|---|---|
api | REST calls to Posts, Ads, Collaborate, and Connectors. |
cli | Exchange the key for a bearer token at POST /api/v1/auth/cli/token. |
athenous_post | Posts API only. Collaborate stays available. |
athenous_ad | Ads API only. Collaborate stays available. |
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. The default limit is 100 requests per minute per key. Status codes are on Errors.
Quick start
Schedule one post. The public base URL is https://public-api.athenous.io. Send X-Api-Key: ath_… on Posts, Ads, Collaborate, and Connectors.
- A login for one network. 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, Collaborate, 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. 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"
2. 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')
3. 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.
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. |