CircleMix

CircleMix Developers

CircleMix now has a public API foundation for social media schedulers and integration partners. It supports OAuth-style app approval, authenticated profile lookup, media upload, post and story publishing, post listing, and basic analytics.

Authorize a posting tool ยท Open Developer API Test Console

OpenAPI GET /api/v1/openapi

Machine-readable API documentation for schedulers and integration tools.

Developer Apps GET /api/v1/developer-apps POST /api/v1/developer-apps

Create a scheduler app, get a client ID, and save the one-time client secret.

Connected Apps GET /api/v1/connected-apps POST /api/v1/connected-apps DELETE /api/v1/connected-apps?id=TOKEN_ID

Let signed-in users create, view, and revoke posting tokens without sharing their password.

OAuth Connect POST /api/v1/oauth-authorize POST /api/v1/oauth-token

Let users approve an app and exchange the approval code for a CircleMix API token.

Profile GET /api/v1/profile

Verify the connected CircleMix account and profile details.

Media POST /api/v1/media

Upload a photo or video and receive a public media URL.

Posts GET /api/v1/posts POST /api/v1/posts

List posts or publish text, photo, clip, poll, event, and live posts.

Stories GET /api/v1/stories POST /api/v1/stories DELETE /api/v1/stories?id=STORY_ID

List, publish, or take down recent stories for the connected account.

Analytics GET /api/v1/analytics

Read basic post, reaction, comment, and view totals.

Authentication

Use an authenticated CircleMix user access token for first-party tools, or connect scheduler apps with the CircleMix OAuth beta. Connected apps receive a cmix_... API token they can use in the Authorization header.

Authorization: Bearer YOUR_CIRCLEMIX_USER_ACCESS_TOKEN
Authorization: Bearer cmix_YOUR_CONNECTED_APP_TOKEN

OAuth Beta

Run developer-api-setup.sql in Supabase once, then create a developer app.

fetch("https://www.circlemix.app/api/v1/developer-apps", {
  method: "POST",
  headers: {
    "content-type": "application/json",
    authorization: "Bearer YOUR_CIRCLEMIX_USER_ACCESS_TOKEN"
  },
  body: JSON.stringify({
    name: "My Scheduler",
    redirect_uris: ["https://scheduler.example.com/circlemix/callback"],
    scopes: ["profile:read", "post:write", "media:upload", "analytics:read"]
  })
});

Send users to this approval URL. CircleMix redirects back with code and state.

https://www.circlemix.app/oauth.html?client_id=YOUR_CLIENT_ID&redirect_uri=https%3A%2F%2Fscheduler.example.com%2Fcirclemix%2Fcallback&scope=profile%3Aread%20post%3Awrite%20media%3Aupload%20analytics%3Aread&state=SECURE_RANDOM_STATE

Exchange the code for a CircleMix API token.

fetch("https://www.circlemix.app/api/v1/oauth-token", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({
    grant_type: "authorization_code",
    code: "CODE_FROM_CALLBACK",
    client_id: "YOUR_CLIENT_ID",
    client_secret: "YOUR_CLIENT_SECRET",
    redirect_uri: "https://scheduler.example.com/circlemix/callback"
  })
});

Example Post Request

fetch("https://www.circlemix.app/api/v1/posts", {
  method: "POST",
  headers: {
    "content-type": "application/json",
    authorization: "Bearer YOUR_CIRCLEMIX_USER_ACCESS_TOKEN"
  },
  body: JSON.stringify({
    post_type: "text",
    text: "Scheduled through the CircleMix API."
  })
});

Example Story Request

Upload media first with /api/v1/media, then publish that media URL as a story.

fetch("https://www.circlemix.app/api/v1/stories", {
  method: "POST",
  headers: {
    "content-type": "application/json",
    authorization: "Bearer YOUR_CIRCLEMIX_USER_ACCESS_TOKEN"
  },
  body: JSON.stringify({
    caption: "A quick CircleMix story.",
    media_url: "PUBLIC_MEDIA_URL_FROM_MEDIA_UPLOAD",
    media_type: "video"
  })
});