Skip to content
AlgoMuse

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:read
  • posts:write
  • posts:publish
  • analytics:read
  • conversations:read
  • conversations:write
  • workspace:read
  • templates:read
  • templates:write
  • calendar:read
  • calendar:write
  • crisis:read
  • crisis:write
  • listening:read
  • listening:write
  • competitors:read
  • competitors:write
  • linkinbio:read
  • linkinbio:write
  • influencers:read
  • influencers:write
  • search:read
  • uploads:read
  • uploads:write
  • media: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 window
  • X-RateLimit-Remaining — requests left in the window
  • X-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"
  }
}
StatusCodeMeaning
401invalid_api_keyMissing, invalid, revoked or expired key.
403insufficient_scopeThe key does not have the scope this endpoint needs.
404resource_not_foundThe resource does not exist.
422validation_errorThe request failed validation.
429rate_limit_exceededToo many requests — see the Retry-After header.
500internal_errorSomething 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.

curl "https://api.algomuse.io/api/v1/posts?limit=25&offset=50" -H "Authorization: Bearer am_live_..."

Endpoints

Paths are relative to the base URL https://api.algomuse.io/api/v1.

Posts

GET/postsList posts, optionally filtered by statusposts:read
POST/postsCreate a draft, or schedule it by setting scheduledAt (no media: mediaUrls is refused)posts:write
GET/posts/{postId}Retrieve a postposts:read
PATCH/posts/{postId}Update a postposts:write
DELETE/posts/{postId}Delete a postposts:write
POST/posts/{postId}/publishPublish a post nowposts:publish
PUT/posts/{postId}/first-commentSet the comment posted after the post goes outposts:write
GET/posts/{postId}/first-commentRetrieve the first commentposts:read
DELETE/posts/{postId}/first-commentRemove the first commentposts:write
POST/posts/{postId}/first-comment/retryRetry a first comment that failedposts:publish

Bulk operations

POST/bulkSchedule, reschedule, publish, delete or archive up to 500 posts at onceposts:write
GET/bulkList bulk operationsposts:read
GET/bulk/{operationId}Check a bulk operation's progressposts:read
POST/bulk/{operationId}/cancelCancel a bulk operationposts:write

Analytics

GET/analytics/overviewWorkspace analytics overviewanalytics:read
GET/analytics/postsPer-post performanceanalytics:read
GET/analytics/top-postsBest-performing postsanalytics:read
GET/analytics/audienceAudience insightsanalytics:read

AI assistant

POST/ai/chatSend a message to the AI assistant, in a new or existing conversationconversations:write
GET/ai/conversationsList conversationsconversations:read
GET/ai/conversations/{conversationId}/messagesRead a conversationconversations:read
GET/ai/brand-contextThe brand voice and context the AI writes withworkspace:read
GET/ai/insightsAI-generated insightsanalytics:read

RSS feeds

GET/rss/feedsList feedsposts:read
POST/rss/feedsAdd a feedposts:write
GET/rss/feeds/{feedId}Retrieve a feedposts:read
PATCH/rss/feeds/{feedId}Update a feedposts:write
DELETE/rss/feeds/{feedId}Remove a feedposts:write
POST/rss/feeds/{feedId}/pausePause a feed (and /resume to restart it)posts:write
POST/rss/feeds/{feedId}/fetchFetch new items nowposts:write
GET/rss/feeds/{feedId}/itemsList a feed's itemsposts:read
POST/rss/feeds/{feedId}/items/{itemId}/publishTurn an item into a post (or /skip it)posts:publish

Auto-reply rules

GET/auto-reply/rulesList rulesposts:read
POST/auto-reply/rulesCreate a ruleposts:write
PATCH/auto-reply/rules/{ruleId}Update a ruleposts:write
DELETE/auto-reply/rules/{ruleId}Delete a ruleposts:write
POST/auto-reply/rules/{ruleId}/testTest a rule against sample textposts:write
GET/auto-reply/templatesList reply templatesposts:read

Content templates

GET/templatesList or search templatestemplates:read
POST/templatesCreate a templatetemplates:write
GET/templates/{templateId}Retrieve a templatetemplates:read
PATCH/templates/{templateId}Update a templatetemplates:write
DELETE/templates/{templateId}Delete a templatetemplates:write
POST/templates/{templateId}/useFill a template's variables and log the usetemplates:write
GET/templates/collectionsList template collectionstemplates:read
POST/templates/collectionsCreate a collectiontemplates:write
GET/templates/hashtags/setsList hashtag setstemplates:read
POST/templates/hashtags/setsCreate a hashtag settemplates:write

Calendar

GET/calendar/preferencesCalendar preferencescalendar:read
PUT/calendar/preferencesUpdate calendar preferencescalendar:write
GET/calendar/reservationsSlot reservations in a date rangecalendar:read
POST/calendar/reservationsReserve a slotcalendar:write
POST/calendar/reservations/{reservationId}/convertTurn a reservation into a postcalendar:write
GET/calendar/commentsComments on a post or datecalendar:read
POST/calendar/commentsAdd a commentcalendar:write
GET/calendar/activityCalendar activity feedcalendar:read

Crisis management

GET/crisis/rulesList alert rulescrisis:read
POST/crisis/rulesCreate an alert rulecrisis:write
GET/crisis/incidentsList incidentscrisis:read
POST/crisis/incidentsOpen an incidentcrisis:write
PATCH/crisis/incidents/{incidentId}Update an incident's statuscrisis:write
GET/crisis/contactsList crisis contactscrisis:read
GET/crisis/statsCrisis dashboard statscrisis:read

Social listening

GET/listening/monitorsList monitorslistening:read
POST/listening/monitorsCreate a monitorlistening:write
POST/listening/monitors/{monitorId}/togglePause or resume a monitorlistening:write
GET/listening/signalsList signalslistening:read
POST/listening/signalsIngest a signal (or up to 100 at /signals/bulk)listening:write
GET/listening/reportsList reportslistening:read
POST/listening/reports/generateGenerate a reportlistening:write
GET/listening/statsListening dashboard statslistening:read

Competitors

GET/competitorsList competitorscompetitors:read
POST/competitorsTrack a competitorcompetitors:write
GET/competitors/{competitorId}Retrieve a competitorcompetitors:read
GET/competitors/{competitorId}/postsA competitor's postscompetitors:read
GET/competitors/insightsCompetitor insightscompetitors:read
GET/competitors/benchmarksBenchmarks against competitorscompetitors:read
GET/competitors/compareCompare your metrics with competitorscompetitors:read

Link in bio

GET/linkinbio/pagesList pageslinkinbio:read
POST/linkinbio/pagesCreate a pagelinkinbio:write
GET/linkinbio/pages/{pageId}Retrieve a page with its blockslinkinbio:read
POST/linkinbio/pages/{pageId}/publishPublish or unpublish a pagelinkinbio:write
POST/linkinbio/pages/{pageId}/blocksAdd a blocklinkinbio:write
GET/linkinbio/pages/{pageId}/analyticsPage analyticslinkinbio:read

Influencers

GET/influencersSearch influencersinfluencers:read
POST/influencersAdd an influencerinfluencers:write
GET/influencers/{influencerId}Retrieve an influencerinfluencers:read
POST/influencers/{influencerId}/outreachSend an outreach messageinfluencers:write
GET/influencers/listsList influencer listsinfluencers:read
GET/influencers/campaignsList campaignsinfluencers:read
POST/influencers/campaignsCreate a campaigninfluencers:write
GET/influencers/paymentsList paymentsinfluencers:read

Search, uploads and images

GET/searchSearch across the workspace (q=...)search:read
GET/search/{index}Search one indexsearch:read
POST/uploads/presignedGet a presigned URL to upload a fileuploads:write
GET/uploads/{key}/urlGet a temporary download URLuploads:read
DELETE/uploads/{key}Delete an uploaded fileuploads:write
GET/images/{key}Serve an image, resized with w, h, q and fmedia:read

Webhooks

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 type
  • X-AlgoMuse-Delivery — the delivery id
  • X-AlgoMuse-Signature — formatted t=<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