API Reference
A RESTful, JSON API to create, schedule and publish posts and read analytics programmatically.
Quick start
# All requests are versioned under /api/v1 and authenticated with a Bearer key
curl https://api.algomuse.io/api/v1/posts \
-H "Authorization: Bearer am_live_YOUR_API_KEY"
Base URL & versioning
The API is served from https://api.algomuse.io/api/v1. The version is pinned in the URL path (/api/v1). Backwards-incompatible changes ship under a new version; additive, non-breaking changes may be made to /api/v1. When we deprecate a version we announce it in advance and support the previous version through a migration window.
Authentication
API access is available on the Business and Enterprise plans. Authenticate every request with a secret API key sent as a Bearer token: Authorization: Bearer am_live_... (test keys start am_test_). Create, roll, and revoke keys in Dashboard → Developers; a new key is shown once.
Treat keys like passwords: keep them server-side, never embed them in client-side code or commit them to source control. Requests without a valid key return 401 invalid_api_key.
Scopes
Each key carries the scopes you pick when you create it, and each endpoint below names the scope it needs. A key without it gets 403 insufficient_scope. Available scopes:
posts:readposts:writeposts:publishanalytics:readconversations:readconversations:writeworkspace:readtemplates:readtemplates:writecalendar:readcalendar:writecrisis:readcrisis:writelistening:readlistening:writecompetitors:readcompetitors:writelinkinbio:readlinkinbio:writeinfluencers:readinfluencers:writesearch:readuploads:readuploads:writemedia:read
Rate limits
Rate limits are enforced per API key. Each key allows 60 requests a minute and 10,000 a day by default; you can set other limits when you create it, up to 1,000 a minute and 100,000 a day. All /api/v1 traffic is also held to 100 requests a minute per key. Every response includes the current limit state in these headers:
X-RateLimit-Limit— the ceiling for the current windowX-RateLimit-Remaining— requests left in the windowX-RateLimit-Reset— when the window resets
Exceeding a limit returns 429 rate_limit_exceeded with a Retry-After header. Back off and retry after the indicated delay.
Errors
Errors use conventional HTTP status codes and a JSON body. The error.code is a stable, machine-readable string; error.message is human-readable and may change.
{
"success": false,
"error": {
"code": "resource_not_found",
"message": "Post not found"
}
}| Status | Code | Meaning |
|---|---|---|
| 401 | invalid_api_key | Missing, invalid, revoked or expired key. |
| 403 | insufficient_scope | The key does not have the scope this endpoint needs. |
| 404 | resource_not_found | The resource does not exist. |
| 422 | validation_error | The request failed validation. |
| 429 | rate_limit_exceeded | Too many requests — see the Retry-After header. |
| 500 | internal_error | Something went wrong on our end. |
Pagination
List endpoints accept limit (page size, up to 100) and offset (records to skip) query parameters, and return a pagination object (totalItems, totalPages, hasNextPage) alongside the data array.
Endpoints
Paths are relative to the base URL https://api.algomuse.io/api/v1.
Posts
/postsList posts, optionally filtered by statusposts:read/postsCreate a draft, or schedule it by setting scheduledAt (no media: mediaUrls is refused)posts:write/posts/{postId}Retrieve a postposts:read/posts/{postId}Update a postposts:write/posts/{postId}Delete a postposts:write/posts/{postId}/publishPublish a post nowposts:publish/posts/{postId}/first-commentSet the comment posted after the post goes outposts:write/posts/{postId}/first-commentRetrieve the first commentposts:read/posts/{postId}/first-commentRemove the first commentposts:write/posts/{postId}/first-comment/retryRetry a first comment that failedposts:publishBulk operations
/bulkSchedule, reschedule, publish, delete or archive up to 500 posts at onceposts:write/bulkList bulk operationsposts:read/bulk/{operationId}Check a bulk operation's progressposts:read/bulk/{operationId}/cancelCancel a bulk operationposts:writeAnalytics
/analytics/overviewWorkspace analytics overviewanalytics:read/analytics/postsPer-post performanceanalytics:read/analytics/top-postsBest-performing postsanalytics:read/analytics/audienceAudience insightsanalytics:readAI assistant
/ai/chatSend a message to the AI assistant, in a new or existing conversationconversations:write/ai/conversationsList conversationsconversations:read/ai/conversations/{conversationId}/messagesRead a conversationconversations:read/ai/brand-contextThe brand voice and context the AI writes withworkspace:read/ai/insightsAI-generated insightsanalytics:readRSS feeds
/rss/feedsList feedsposts:read/rss/feedsAdd a feedposts:write/rss/feeds/{feedId}Retrieve a feedposts:read/rss/feeds/{feedId}Update a feedposts:write/rss/feeds/{feedId}Remove a feedposts:write/rss/feeds/{feedId}/pausePause a feed (and /resume to restart it)posts:write/rss/feeds/{feedId}/fetchFetch new items nowposts:write/rss/feeds/{feedId}/itemsList a feed's itemsposts:read/rss/feeds/{feedId}/items/{itemId}/publishTurn an item into a post (or /skip it)posts:publishAuto-reply rules
/auto-reply/rulesList rulesposts:read/auto-reply/rulesCreate a ruleposts:write/auto-reply/rules/{ruleId}Update a ruleposts:write/auto-reply/rules/{ruleId}Delete a ruleposts:write/auto-reply/rules/{ruleId}/testTest a rule against sample textposts:write/auto-reply/templatesList reply templatesposts:readContent templates
/templatesList or search templatestemplates:read/templatesCreate a templatetemplates:write/templates/{templateId}Retrieve a templatetemplates:read/templates/{templateId}Update a templatetemplates:write/templates/{templateId}Delete a templatetemplates:write/templates/{templateId}/useFill a template's variables and log the usetemplates:write/templates/collectionsList template collectionstemplates:read/templates/collectionsCreate a collectiontemplates:write/templates/hashtags/setsList hashtag setstemplates:read/templates/hashtags/setsCreate a hashtag settemplates:writeCalendar
/calendar/preferencesCalendar preferencescalendar:read/calendar/preferencesUpdate calendar preferencescalendar:write/calendar/reservationsSlot reservations in a date rangecalendar:read/calendar/reservationsReserve a slotcalendar:write/calendar/reservations/{reservationId}/convertTurn a reservation into a postcalendar:write/calendar/commentsComments on a post or datecalendar:read/calendar/commentsAdd a commentcalendar:write/calendar/activityCalendar activity feedcalendar:readCrisis management
/crisis/rulesList alert rulescrisis:read/crisis/rulesCreate an alert rulecrisis:write/crisis/incidentsList incidentscrisis:read/crisis/incidentsOpen an incidentcrisis:write/crisis/incidents/{incidentId}Update an incident's statuscrisis:write/crisis/contactsList crisis contactscrisis:read/crisis/statsCrisis dashboard statscrisis:readSocial listening
/listening/monitorsList monitorslistening:read/listening/monitorsCreate a monitorlistening:write/listening/monitors/{monitorId}/togglePause or resume a monitorlistening:write/listening/signalsList signalslistening:read/listening/signalsIngest a signal (or up to 100 at /signals/bulk)listening:write/listening/reportsList reportslistening:read/listening/reports/generateGenerate a reportlistening:write/listening/statsListening dashboard statslistening:readCompetitors
/competitorsList competitorscompetitors:read/competitorsTrack a competitorcompetitors:write/competitors/{competitorId}Retrieve a competitorcompetitors:read/competitors/{competitorId}/postsA competitor's postscompetitors:read/competitors/insightsCompetitor insightscompetitors:read/competitors/benchmarksBenchmarks against competitorscompetitors:read/competitors/compareCompare your metrics with competitorscompetitors:readLink in bio
/linkinbio/pagesList pageslinkinbio:read/linkinbio/pagesCreate a pagelinkinbio:write/linkinbio/pages/{pageId}Retrieve a page with its blockslinkinbio:read/linkinbio/pages/{pageId}/publishPublish or unpublish a pagelinkinbio:write/linkinbio/pages/{pageId}/blocksAdd a blocklinkinbio:write/linkinbio/pages/{pageId}/analyticsPage analyticslinkinbio:readInfluencers
/influencersSearch influencersinfluencers:read/influencersAdd an influencerinfluencers:write/influencers/{influencerId}Retrieve an influencerinfluencers:read/influencers/{influencerId}/outreachSend an outreach messageinfluencers:write/influencers/listsList influencer listsinfluencers:read/influencers/campaignsList campaignsinfluencers:read/influencers/campaignsCreate a campaigninfluencers:write/influencers/paymentsList paymentsinfluencers:readSearch, uploads and images
/searchSearch across the workspace (q=...)search:read/search/{index}Search one indexsearch:read/uploads/presignedGet a presigned URL to upload a fileuploads:write/uploads/{key}/urlGet a temporary download URLuploads:read/uploads/{key}Delete an uploaded fileuploads:write/images/{key}Serve an image, resized with w, h, q and fmedia:readWebhooks
You can register webhook endpoints in Dashboard → Developers and send them a test event. Delivery of post, account and analytics events is not live yet; until it is, poll the endpoints above. Each delivery is an HTTP POST with a { id, type, created_at, data } body and these headers:
X-AlgoMuse-Event— the event typeX-AlgoMuse-Delivery— the delivery idX-AlgoMuse-Signature— formattedt=<unix time>,v1=<hex>
Always verify the signature. Compute an HMAC-SHA256 of <t>.<raw request body> using your endpoint's signing secret and compare it (in constant time) to the v1 value before trusting the payload.
Building something with the API?
Our developer support team is happy to help.
Contact developer support