MemberClicks Continuing Education API

Read continuing education credits earned by members. List credits via GET /api/v1/continuing-education/credit (filterable by profileId with pageNumber and pageSize paging) and retrieve a single credit by creditId.

OpenAPI Specification

memberclicks-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: MemberClicks MC Professional API
  description: >-
    The MemberClicks MC Professional API (formerly branded "Oasis") is a JSON
    REST API for interacting with an organization's association / membership
    management data - profiles, attributes, member types and statuses, groups,
    events, and continuing education credits. MemberClicks is owned by Personify.
    The API is protected by the OAuth 2.0 authorization framework: a client
    obtains an access token from /oauth/v1/token using HTTP Basic client
    credentials (Base64 clientId:clientSecret) with scope "read", "write", or
    "read write", then sends it as an Authorization: Bearer token on each request
    along with an Accept: application/json header.

    The API is hosted per organization at https://{orgId}.memberclicks.net, where
    {orgId} is the organization's MC Professional ID. There is no single global
    host and no open self-serve key issuance - client credentials are provisioned
    inside an MC Professional account under API Management. MemberClicks notes the
    API is intended for developers with technical expertise and that support does
    not assist with custom integrations.

    Endpoints for Countries, Groups, and Events are documented as API resources
    but their exact paths are behind gated (Cloudflare-protected) developer
    documentation; those paths in this document are modeled to the confirmed
    /api/v1/{resource} convention (see x-endpoint-status).
  version: '1.0'
  contact:
    name: MemberClicks by Personify
    url: https://memberclicks.com
servers:
  - url: https://{orgId}.memberclicks.net
    description: Per-organization MC Professional host
    variables:
      orgId:
        default: your-org
        description: The organization's MC Professional ID.
security:
  - oauth2: []
tags:
  - name: Authorization
    description: OAuth 2.0 token issuance.
  - name: Profiles
    description: Member / contact profile records.
  - name: Profile Search
    description: Search over the membership database.
  - name: Attributes
    description: Profile schema - built-in and custom fields.
  - name: Reference Data
    description: Member types and statuses.
  - name: Groups
    description: Group membership (modeled paths).
  - name: Events
    description: Events and registration (modeled paths).
  - name: Continuing Education
    description: Continuing education credits.
paths:
  /oauth/v1/token:
    post:
      operationId: createAccessToken
      tags:
        - Authorization
      summary: Obtain an OAuth 2.0 access token
      description: >-
        Exchanges client credentials for an access token. The client ID and
        secret are Base64-encoded as clientId:clientSecret in an HTTP Basic
        Authorization header. Request scope "read", "write", or "read write".
      security: []
      parameters:
        - name: Authorization
          in: header
          required: true
          schema:
            type: string
          description: 'Basic <Base64(clientId:clientSecret)>'
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                grant_type:
                  type: string
                  example: client_credentials
                scope:
                  type: string
                  example: read write
      responses:
        '200':
          description: An access token.
          content:
            application/json:
              schema:
                type: object
                properties:
                  access_token:
                    type: string
                  token_type:
                    type: string
                    example: bearer
                  expires_in:
                    type: integer
                  scope:
                    type: string
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/profile:
    get:
      operationId: listProfiles
      tags:
        - Profiles
      summary: List profiles
      description: Returns a paged list of all profiles in the organization.
      parameters:
        - $ref: '#/components/parameters/pageNumber'
        - $ref: '#/components/parameters/pageSize'
      responses:
        '200':
          description: A paged list of profiles.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProfileList'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createProfile
      tags:
        - Profiles
      summary: Create a profile
      description: Creates a new profile. Requires the "write" scope.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Profile'
      responses:
        '201':
          description: The created profile.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Profile'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/profile/{profileId}:
    parameters:
      - $ref: '#/components/parameters/profileId'
    get:
      operationId: getProfile
      tags:
        - Profiles
      summary: Retrieve a profile
      description: Returns a single profile by its profileId.
      responses:
        '200':
          description: The requested profile.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Profile'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateProfile
      tags:
        - Profiles
      summary: Update a profile
      description: Updates an existing profile's attributes. Requires the "write" scope.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Profile'
      responses:
        '200':
          description: The updated profile.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Profile'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /api/v1/profile/search:
    post:
      operationId: createProfileSearch
      tags:
        - Profile Search
      summary: Create a profile search
      description: >-
        Creates a search over the membership database using attribute criteria
        and returns matching profiles (paged).
      parameters:
        - $ref: '#/components/parameters/pageNumber'
        - $ref: '#/components/parameters/pageSize'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Search criteria keyed by attribute.
              additionalProperties: true
      responses:
        '200':
          description: The matching profiles.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProfileList'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/attribute:
    get:
      operationId: listAttributes
      tags:
        - Attributes
      summary: List attributes
      description: Lists the profile attributes (built-in and custom fields).
      responses:
        '200':
          description: A list of attributes.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Attribute'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/attribute/{attributeId}/selection:
    parameters:
      - name: attributeId
        in: path
        required: true
        schema:
          type: string
        description: The ID of the attribute.
    get:
      operationId: listAttributeSelectionOptions
      tags:
        - Attributes
      summary: List attribute selection-set options
      description: Returns the selection-set options available for a custom attribute.
      responses:
        '200':
          description: A list of selection options.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                    value:
                      type: string
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/member-type:
    get:
      operationId: listMemberTypes
      tags:
        - Reference Data
      summary: List member types
      description: Returns the organization's member types.
      responses:
        '200':
          description: A list of member types.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/NamedRef'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/member-status:
    get:
      operationId: listMemberStatuses
      tags:
        - Reference Data
      summary: List member statuses
      description: Returns the organization's member statuses.
      responses:
        '200':
          description: A list of member statuses.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/NamedRef'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/continuing-education/credit:
    get:
      operationId: listContinuingEducationCredits
      tags:
        - Continuing Education
      summary: List continuing education credits
      description: >-
        Returns continuing education credits, optionally filtered by profileId.
        Paged with pageNumber (default 1) and pageSize (default 10, max 100).
      parameters:
        - name: profileId
          in: query
          required: false
          schema:
            type: string
          description: Filter credits to a single profile.
        - $ref: '#/components/parameters/pageNumber'
        - $ref: '#/components/parameters/pageSize'
      responses:
        '200':
          description: A paged list of continuing education credits.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ContinuingEducationCredit'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/continuing-education/credit/{creditId}:
    parameters:
      - name: creditId
        in: path
        required: true
        schema:
          type: string
        description: The ID of the continuing education credit.
    get:
      operationId: getContinuingEducationCredit
      tags:
        - Continuing Education
      summary: Retrieve a continuing education credit
      description: Returns a single continuing education credit by its ID.
      responses:
        '200':
          description: The requested credit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContinuingEducationCredit'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /api/v1/country:
    get:
      operationId: listCountries
      tags:
        - Reference Data
      summary: List countries
      description: >-
        Reference lookup of countries. MODELED - the Countries resource is
        documented but the exact path is behind gated documentation.
      x-endpoint-status: modeled
      responses:
        '200':
          description: A list of countries.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/NamedRef'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/group:
    get:
      operationId: listGroups
      tags:
        - Groups
      summary: List groups
      description: >-
        Returns the organization's groups. MODELED - the Groups resource is
        documented (group membership is reached via a groupsUrl reference on a
        profile's group built-in attribute), but the exact path is behind gated
        documentation.
      x-endpoint-status: modeled
      responses:
        '200':
          description: A list of groups.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/NamedRef'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/group/{groupId}:
    parameters:
      - name: groupId
        in: path
        required: true
        schema:
          type: string
        description: The ID of the group.
    get:
      operationId: getGroup
      tags:
        - Groups
      summary: Retrieve a group
      description: 'Returns a single group by ID. MODELED path.'
      x-endpoint-status: modeled
      responses:
        '200':
          description: The requested group.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NamedRef'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /api/v1/event:
    get:
      operationId: listEvents
      tags:
        - Events
      summary: List events
      description: >-
        Returns the organization's events. MODELED - an Events API resource is
        documented but its exact path is behind gated documentation.
      x-endpoint-status: modeled
      responses:
        '200':
          description: A list of events.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Event'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/event/{eventId}:
    parameters:
      - name: eventId
        in: path
        required: true
        schema:
          type: string
        description: The ID of the event.
    get:
      operationId: getEvent
      tags:
        - Events
      summary: Retrieve an event
      description: 'Returns a single event by ID. MODELED path.'
      x-endpoint-status: modeled
      responses:
        '200':
          description: The requested event.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Event'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  securitySchemes:
    oauth2:
      type: oauth2
      description: >-
        OAuth 2.0. Obtain a bearer token from /oauth/v1/token using HTTP Basic
        client credentials (Base64 clientId:clientSecret) with scope read, write,
        or read write.
      flows:
        clientCredentials:
          tokenUrl: https://{orgId}.memberclicks.net/oauth/v1/token
          scopes:
            read: Read access to resources.
            write: Write access to resources.
  parameters:
    profileId:
      name: profileId
      in: path
      required: true
      schema:
        type: string
      description: The ID of the profile.
    pageNumber:
      name: pageNumber
      in: query
      required: false
      schema:
        type: integer
        default: 1
      description: The 1-based page number to return.
    pageSize:
      name: pageSize
      in: query
      required: false
      schema:
        type: integer
        default: 10
        maximum: 100
      description: The number of records per page (max 100).
  responses:
    Unauthorized:
      description: Missing or invalid access token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Profile:
      type: object
      description: >-
        A member / contact profile. Fields are largely attribute-driven and vary
        by organization; commonly present fields are shown here.
      properties:
        profileId:
          type: string
        memberType:
          type: string
        memberStatus:
          type: string
        firstName:
          type: string
        lastName:
          type: string
        email:
          type: string
        groupsUrl:
          type: string
          description: Reference URL to the profile's group memberships.
      additionalProperties: true
    ProfileList:
      type: object
      properties:
        totalCount:
          type: integer
        pageNumber:
          type: integer
        pageSize:
          type: integer
        profiles:
          type: array
          items:
            $ref: '#/components/schemas/Profile'
    Attribute:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        type:
          type: string
        selectionUrl:
          type: string
    NamedRef:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
    Event:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        startDate:
          type: string
          format: date-time
        endDate:
          type: string
          format: date-time
      additionalProperties: true
    ContinuingEducationCredit:
      type: object
      properties:
        creditId:
          type: string
        profileId:
          type: string
        amount:
          type: number
        earnedDate:
          type: string
          format: date
      additionalProperties: true
    Error:
      type: object
      properties:
        error:
          type: string
        message:
          type: string