Circle Admin Posts and Comments API

Create, list, retrieve, update, move, and delete posts across spaces, manage the comments on those posts, generate AI post summaries, and administer topics. Post parameters control publish/draft status, comment enablement, and pinning.

OpenAPI Specification

circle-community-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Circle Developer Platform API
  description: >-
    Circle (circle.so) is an all-in-one community platform for creators, coaches,
    and brands. This description grounds Circle's documented public developer
    platform into a single OpenAPI file for discovery. It covers two admin- or
    member-authenticated REST surfaces: the Admin API V2 (base
    https://app.circle.so/api/admin/v2) for community administration and
    automation, and the Headless Member API (base
    https://app.circle.so/api/headless/v1) for building your own member-facing
    experience, plus the Headless Auth API token exchange. Admin API requests use
    an "Authorization: Token AUTH_TOKEN" header; Headless Member API requests use
    a member-scoped JWT in an "Authorization: Bearer ACCESS_TOKEN" header issued
    by the Auth API. API access is gated to the Business plan and above. This is
    the community-software company at circle.so, NOT the USDC / stablecoin
    financial-services company. Paths shown are a representative, grounded subset
    of the full reference published at api-headless.circle.so.
  version: '2.0'
  contact:
    name: Circle
    url: https://circle.so
  license:
    name: Proprietary
    url: https://circle.so/terms
servers:
  - url: https://app.circle.so
    description: Circle production
security:
  - tokenAuth: []
tags:
  - name: Admin - Members
    description: Admin-authenticated community member management.
  - name: Admin - Spaces
    description: Spaces, space groups, and their memberships.
  - name: Admin - Posts
    description: Posts, comments, and topics.
  - name: Admin - Events
    description: Events and event attendees.
  - name: Admin - Courses
    description: Course sections, lessons, and progress.
  - name: Headless - Auth
    description: Member JWT token exchange for the Headless Member API.
  - name: Headless - Member
    description: Member-authenticated experience endpoints.
paths:
  /api/admin/v2/community_members:
    get:
      tags: [Admin - Members]
      summary: List community members
      security:
        - tokenAuth: []
      parameters:
        - { name: page, in: query, schema: { type: integer, default: 1 } }
        - { name: per_page, in: query, schema: { type: integer, default: 10 } }
      responses:
        '200': { description: A page of community members. }
    post:
      tags: [Admin - Members]
      summary: Invite or create a community member
      security:
        - tokenAuth: []
      responses:
        '200': { description: The created or invited member. }
  /api/admin/v2/community_members/search:
    get:
      tags: [Admin - Members]
      summary: Search community members
      security:
        - tokenAuth: []
      responses:
        '200': { description: Matching community members. }
  /api/admin/v2/community_members/{id}:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      tags: [Admin - Members]
      summary: Retrieve a community member
      security:
        - tokenAuth: []
      responses:
        '200': { description: The community member. }
    put:
      tags: [Admin - Members]
      summary: Update a community member
      security:
        - tokenAuth: []
      responses:
        '200': { description: The updated member. }
    delete:
      tags: [Admin - Members]
      summary: Delete a community member
      security:
        - tokenAuth: []
      responses:
        '200': { description: Deletion result. }
  /api/admin/v2/community_members/{id}/ban_member:
    put:
      tags: [Admin - Members]
      summary: Ban a community member
      security:
        - tokenAuth: []
      parameters:
        - { name: id, in: path, required: true, schema: { type: integer } }
      responses:
        '200': { description: Ban result. }
  /api/admin/v2/member_tags:
    get:
      tags: [Admin - Members]
      summary: List member tags
      security:
        - tokenAuth: []
      responses:
        '200': { description: A page of member tags. }
    post:
      tags: [Admin - Members]
      summary: Create a member tag
      security:
        - tokenAuth: []
      responses:
        '200': { description: The created member tag. }
  /api/admin/v2/tagged_members:
    get:
      tags: [Admin - Members]
      summary: List tagged members
      security:
        - tokenAuth: []
      responses:
        '200': { description: Members carrying a given tag. }
    post:
      tags: [Admin - Members]
      summary: Apply a tag to a member
      security:
        - tokenAuth: []
      responses:
        '200': { description: The tag assignment. }
    delete:
      tags: [Admin - Members]
      summary: Remove a tag from a member
      security:
        - tokenAuth: []
      responses:
        '200': { description: Removal result. }
  /api/admin/v2/spaces:
    get:
      tags: [Admin - Spaces]
      summary: List spaces
      security:
        - tokenAuth: []
      responses:
        '200': { description: A page of spaces. }
    post:
      tags: [Admin - Spaces]
      summary: Create a space
      security:
        - tokenAuth: []
      responses:
        '200': { description: The created space. }
  /api/admin/v2/spaces/{id}:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      tags: [Admin - Spaces]
      summary: Retrieve a space
      security:
        - tokenAuth: []
      responses:
        '200': { description: The space. }
    put:
      tags: [Admin - Spaces]
      summary: Update a space
      security:
        - tokenAuth: []
      responses:
        '200': { description: The updated space. }
    delete:
      tags: [Admin - Spaces]
      summary: Delete a space
      security:
        - tokenAuth: []
      responses:
        '200': { description: Deletion result. }
  /api/admin/v2/space_groups:
    get:
      tags: [Admin - Spaces]
      summary: List space groups
      security:
        - tokenAuth: []
      responses:
        '200': { description: A page of space groups. }
    post:
      tags: [Admin - Spaces]
      summary: Create a space group
      security:
        - tokenAuth: []
      responses:
        '200': { description: The created space group. }
  /api/admin/v2/space_members:
    get:
      tags: [Admin - Spaces]
      summary: List space members
      security:
        - tokenAuth: []
      responses:
        '200': { description: A page of space members. }
    post:
      tags: [Admin - Spaces]
      summary: Add a member to a space
      security:
        - tokenAuth: []
      responses:
        '200': { description: The added space member. }
    delete:
      tags: [Admin - Spaces]
      summary: Remove a member from a space
      security:
        - tokenAuth: []
      responses:
        '200': { description: Removal result. }
  /api/admin/v2/posts:
    get:
      tags: [Admin - Posts]
      summary: List posts
      security:
        - tokenAuth: []
      parameters:
        - { name: page, in: query, schema: { type: integer, default: 1 } }
        - { name: per_page, in: query, schema: { type: integer, default: 10 } }
      responses:
        '200': { description: A page of posts. }
    post:
      tags: [Admin - Posts]
      summary: Create a post
      security:
        - tokenAuth: []
      responses:
        '200': { description: The created post. }
  /api/admin/v2/posts/{id}:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      tags: [Admin - Posts]
      summary: Retrieve a post
      security:
        - tokenAuth: []
      responses:
        '200': { description: The post. }
    put:
      tags: [Admin - Posts]
      summary: Update or move a post
      security:
        - tokenAuth: []
      responses:
        '200': { description: The updated post. }
    delete:
      tags: [Admin - Posts]
      summary: Delete a post
      security:
        - tokenAuth: []
      responses:
        '200': { description: Deletion result. }
  /api/admin/v2/posts/{post_id}/summary:
    get:
      tags: [Admin - Posts]
      summary: Get an AI summary of a post
      security:
        - tokenAuth: []
      parameters:
        - { name: post_id, in: path, required: true, schema: { type: integer } }
      responses:
        '200': { description: The post summary. }
  /api/admin/v2/comments:
    get:
      tags: [Admin - Posts]
      summary: List comments
      security:
        - tokenAuth: []
      responses:
        '200': { description: A page of comments. }
    post:
      tags: [Admin - Posts]
      summary: Create a comment
      security:
        - tokenAuth: []
      responses:
        '200': { description: The created comment. }
  /api/admin/v2/comments/{id}:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      tags: [Admin - Posts]
      summary: Retrieve a comment
      security:
        - tokenAuth: []
      responses:
        '200': { description: The comment. }
    delete:
      tags: [Admin - Posts]
      summary: Delete a comment
      security:
        - tokenAuth: []
      responses:
        '200': { description: Deletion result. }
  /api/admin/v2/topics:
    get:
      tags: [Admin - Posts]
      summary: List topics
      security:
        - tokenAuth: []
      responses:
        '200': { description: A page of topics. }
    post:
      tags: [Admin - Posts]
      summary: Create a topic
      security:
        - tokenAuth: []
      responses:
        '200': { description: The created topic. }
  /api/admin/v2/events:
    get:
      tags: [Admin - Events]
      summary: List events
      security:
        - tokenAuth: []
      responses:
        '200': { description: A page of events. }
    post:
      tags: [Admin - Events]
      summary: Create an event
      security:
        - tokenAuth: []
      responses:
        '200': { description: The created event. }
  /api/admin/v2/events/{id}:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      tags: [Admin - Events]
      summary: Retrieve an event
      security:
        - tokenAuth: []
      responses:
        '200': { description: The event. }
    put:
      tags: [Admin - Events]
      summary: Update an event
      security:
        - tokenAuth: []
      responses:
        '200': { description: The updated event. }
    delete:
      tags: [Admin - Events]
      summary: Delete an event
      security:
        - tokenAuth: []
      responses:
        '200': { description: Deletion result. }
  /api/admin/v2/event_attendees:
    get:
      tags: [Admin - Events]
      summary: List event attendees
      security:
        - tokenAuth: []
      responses:
        '200': { description: A page of attendees. }
    post:
      tags: [Admin - Events]
      summary: Add an event attendee
      security:
        - tokenAuth: []
      responses:
        '200': { description: The added attendee. }
    delete:
      tags: [Admin - Events]
      summary: Remove an event attendee
      security:
        - tokenAuth: []
      responses:
        '200': { description: Removal result. }
  /api/admin/v2/course_sections:
    get:
      tags: [Admin - Courses]
      summary: List course sections
      security:
        - tokenAuth: []
      responses:
        '200': { description: A page of course sections. }
    post:
      tags: [Admin - Courses]
      summary: Create a course section
      security:
        - tokenAuth: []
      responses:
        '200': { description: The created section. }
  /api/admin/v2/course_lessons:
    get:
      tags: [Admin - Courses]
      summary: List course lessons
      security:
        - tokenAuth: []
      responses:
        '200': { description: A page of course lessons. }
    post:
      tags: [Admin - Courses]
      summary: Create a course lesson
      security:
        - tokenAuth: []
      responses:
        '200': { description: The created lesson. }
  /api/admin/v2/course_lessons/{id}:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      tags: [Admin - Courses]
      summary: Retrieve a course lesson
      security:
        - tokenAuth: []
      responses:
        '200': { description: The course lesson. }
    patch:
      tags: [Admin - Courses]
      summary: Update a course lesson
      security:
        - tokenAuth: []
      responses:
        '200': { description: The updated lesson. }
    delete:
      tags: [Admin - Courses]
      summary: Delete a course lesson
      security:
        - tokenAuth: []
      responses:
        '200': { description: Deletion result. }
  /api/admin/v2/course_lesson_progress:
    put:
      tags: [Admin - Courses]
      summary: Set a member's course lesson progress
      security:
        - tokenAuth: []
      responses:
        '200': { description: Updated progress. }
  /api/v1/headless/auth_token:
    post:
      tags: [Headless - Auth]
      summary: Exchange a headless auth token for a member JWT
      description: >-
        Server-to-server exchange of a community-level headless auth token for a
        member-scoped JWT access token plus refresh token. Access tokens expire
        after one hour.
      security:
        - bearerAuth: []
      responses:
        '200':
          description: The issued access and refresh tokens.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HeadlessAuthToken'
  /api/headless/v1/home:
    get:
      tags: [Headless - Member]
      summary: Get the member home feed
      security:
        - bearerAuth: []
      responses:
        '200': { description: The member's home feed. }
  /api/headless/v1/spaces:
    get:
      tags: [Headless - Member]
      summary: List spaces visible to the member
      security:
        - bearerAuth: []
      responses:
        '200': { description: The member's spaces. }
  /api/headless/v1/spaces/{id}/join:
    post:
      tags: [Headless - Member]
      summary: Join a space
      security:
        - bearerAuth: []
      parameters:
        - { name: id, in: path, required: true, schema: { type: integer } }
      responses:
        '200': { description: Join result. }
  /api/headless/v1/spaces/{space_id}/posts:
    get:
      tags: [Headless - Member]
      summary: List posts in a space
      security:
        - bearerAuth: []
      parameters:
        - { name: space_id, in: path, required: true, schema: { type: integer } }
      responses:
        '200': { description: A page of posts. }
    post:
      tags: [Headless - Member]
      summary: Create a post in a space
      security:
        - bearerAuth: []
      parameters:
        - { name: space_id, in: path, required: true, schema: { type: integer } }
      responses:
        '200': { description: The created post. }
  /api/headless/v1/posts/{post_id}/comments:
    get:
      tags: [Headless - Member]
      summary: List comments on a post
      security:
        - bearerAuth: []
      parameters:
        - { name: post_id, in: path, required: true, schema: { type: integer } }
      responses:
        '200': { description: A page of comments. }
    post:
      tags: [Headless - Member]
      summary: Comment on a post
      security:
        - bearerAuth: []
      parameters:
        - { name: post_id, in: path, required: true, schema: { type: integer } }
      responses:
        '200': { description: The created comment. }
  /api/headless/v1/posts/{post_id}/user_likes:
    post:
      tags: [Headless - Member]
      summary: Like a post
      security:
        - bearerAuth: []
      parameters:
        - { name: post_id, in: path, required: true, schema: { type: integer } }
      responses:
        '200': { description: Like result. }
  /api/headless/v1/community_events:
    get:
      tags: [Headless - Member]
      summary: List community events
      security:
        - bearerAuth: []
      responses:
        '200': { description: A page of community events. }
  /api/headless/v1/events/{event_id}/event_attendees:
    post:
      tags: [Headless - Member]
      summary: RSVP to an event
      security:
        - bearerAuth: []
      parameters:
        - { name: event_id, in: path, required: true, schema: { type: integer } }
      responses:
        '200': { description: The RSVP. }
  /api/headless/v1/courses/{course_id}/sections:
    get:
      tags: [Headless - Member]
      summary: List course sections
      security:
        - bearerAuth: []
      parameters:
        - { name: course_id, in: path, required: true, schema: { type: integer } }
      responses:
        '200': { description: The course sections. }
  /api/headless/v1/courses/{course_id}/lessons/{id}:
    get:
      tags: [Headless - Member]
      summary: Get a course lesson
      security:
        - bearerAuth: []
      parameters:
        - { name: course_id, in: path, required: true, schema: { type: integer } }
        - { name: id, in: path, required: true, schema: { type: integer } }
      responses:
        '200': { description: The course lesson. }
  /api/headless/v1/messages:
    get:
      tags: [Headless - Member]
      summary: List chat rooms / direct messages
      security:
        - bearerAuth: []
      responses:
        '200': { description: The member's chat rooms. }
    post:
      tags: [Headless - Member]
      summary: Start a chat room / direct message
      security:
        - bearerAuth: []
      responses:
        '200': { description: The created chat room. }
  /api/headless/v1/messages/{chat_room_uuid}/chat_room_messages:
    get:
      tags: [Headless - Member]
      summary: List messages in a chat room
      security:
        - bearerAuth: []
      parameters:
        - { name: chat_room_uuid, in: path, required: true, schema: { type: string } }
      responses:
        '200': { description: A page of chat messages. }
    post:
      tags: [Headless - Member]
      summary: Send a message to a chat room
      security:
        - bearerAuth: []
      parameters:
        - { name: chat_room_uuid, in: path, required: true, schema: { type: string } }
      responses:
        '200': { description: The sent message. }
  /api/headless/v1/notifications:
    get:
      tags: [Headless - Member]
      summary: List notifications
      security:
        - bearerAuth: []
      responses:
        '200': { description: A page of notifications. }
  /api/headless/v1/profile:
    put:
      tags: [Headless - Member]
      summary: Update the member profile
      security:
        - bearerAuth: []
      responses:
        '200': { description: The updated profile. }
components:
  securitySchemes:
    tokenAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Admin API token in the format "Token AUTH_TOKEN". Community admins
        generate the token on the Developers -> Tokens page.
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Member-scoped JWT access token from /api/v1/headless/auth_token in the
        format "Bearer ACCESS_TOKEN". Expires after one hour.
  schemas:
    HeadlessAuthToken:
      type: object
      properties:
        access_token: { type: string }
        refresh_token: { type: string }
        access_token_expires_at: { type: string }
        refresh_token_expires_at: { type: string }
        community_member_id: { type: integer }
        community_id: { type: integer }