GrowthZone OAuth / OpenID Connect (SSO) API

OpenID Connect provider for single sign-on - authorize, token, userinfo, and JWKS endpoints supporting authorization-code, implicit, and hybrid flows with the openid, profile, and email scopes. Lets a website or app authenticate members against their GrowthZone identity.

OpenAPI Specification

growthzone-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: GrowthZone REST API
  description: >-
    Programmatic access to a GrowthZone association management (AMS) database -
    contacts (members and organizations), memberships, groups and directories,
    scheduled billing, certifications, and events. GrowthZone is a REST-based,
    JSON API served per customer database at
    https://{subdomain}.growthzoneapp.com/api, where {subdomain} is the customer
    database sub-domain visible in the application URL (some databases are served
    from app.memberzone.org). The API is customer/partner-gated: an account must
    have API Access enabled, and an API Key is issued by GrowthZone WebSupport
    (websupport@growthzone.com). Authenticate by sending an
    `Authorization: ApiKey {API_Key}` header (Server authentication); OAuth 2.0 /
    OpenID Connect is also supported for user (SSO) flows.


    Endpoint status: paths marked "Confirmed" appear in GrowthZone's public
    integration documentation and Curated API reference. Paths marked "Modeled"
    are honestly inferred to round out standard CRUD or reflect the
    ChamberMaster/MemberZone (MicroNet) event feed; verify exact shapes against
    the gated full reference at documentation.growthzoneapp.com.
  version: '1.0'
  contact:
    name: GrowthZone WebSupport
    url: https://integration.growthzone.com
    email: websupport@growthzone.com
  license:
    name: Proprietary
    url: https://www.growthzone.com
servers:
  - url: https://{subdomain}.growthzoneapp.com/api
    description: GrowthZone customer database (replace {subdomain} with your database sub-domain)
    variables:
      subdomain:
        default: app
        description: The customer database sub-domain from your GrowthZone application URL.
  - url: https://app.memberzone.org/api
    description: MemberZone-hosted GrowthZone databases
security:
  - apiKeyAuth: []
tags:
  - name: Contacts
    description: Individuals (persons) and organizations, and their related data.
  - name: Memberships
    description: Membership types and member rosters.
  - name: Groups & Directory
    description: Groups, categories, and directory listings.
  - name: Scheduled Billing
    description: Recurring membership billing runs by membership type.
  - name: Certifications
    description: Certification tracks and component completion.
  - name: Events
    description: Association event calendar and registration (modeled).
paths:
  /contacts:
    get:
      operationId: listContacts
      tags: [Contacts]
      summary: List contacts (Confirmed)
      description: >-
        Returns a paged list of contacts. Responses include TotalRecordAvailable
        and a Results array of contact records (ContactId, Name,
        MembershipStatusTypeId, Balance, ImageUrl, ...).
      parameters:
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/PageSize'
      responses:
        '200':
          description: A paged list of contacts.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactListResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /contacts/delta:
    get:
      operationId: listChangedContacts
      tags: [Contacts]
      summary: List contacts changed since a date (Confirmed)
      description: Returns contacts created or modified since the supplied date.
      parameters:
        - name: since
          in: query
          required: true
          description: ISO 8601 date/time; return contacts changed at or after this instant.
          schema:
            type: string
            format: date-time
      responses:
        '200':
          description: Changed contacts.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactListResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /contacts/person/{contactId}:
    get:
      operationId: getPerson
      tags: [Contacts]
      summary: Get expanded individual contact (Confirmed)
      parameters:
        - $ref: '#/components/parameters/ContactId'
      responses:
        '200':
          description: Expanded individual contact.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /contacts/PersonSummary/{contactId}:
    get:
      operationId: getPersonSummary
      tags: [Contacts]
      summary: Get basic individual contact summary (Confirmed)
      parameters:
        - $ref: '#/components/parameters/ContactId'
      responses:
        '200':
          description: Basic individual contact summary.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /contacts/OrgGeneral/{contactId}:
    get:
      operationId: getOrganizationGeneral
      tags: [Contacts]
      summary: Get organization contact summary (Confirmed)
      parameters:
        - $ref: '#/components/parameters/ContactId'
      responses:
        '200':
          description: Organization contact summary.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /contacts/ContactAddresses/{contactId}:
    get:
      operationId: getContactAddresses
      tags: [Contacts]
      summary: Get contact addresses (Confirmed)
      parameters:
        - $ref: '#/components/parameters/ContactId'
      responses:
        '200':
          description: Addresses for the contact.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Address'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /contacts/PrimaryContact/Emails/{primaryContactId}:
    get:
      operationId: getPrimaryContactEmails
      tags: [Contacts]
      summary: Get primary contact email addresses (Confirmed)
      parameters:
        - name: primaryContactId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Email addresses for the primary contact.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
                  format: email
        '401':
          $ref: '#/components/responses/Unauthorized'
  /contacts/lookup/{contactId}/contactwebsites:
    get:
      operationId: getContactWebsites
      tags: [Contacts]
      summary: Get contact websites (Confirmed)
      parameters:
        - $ref: '#/components/parameters/ContactId'
      responses:
        '200':
          description: Website URLs for the contact.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
                  format: uri
        '401':
          $ref: '#/components/responses/Unauthorized'
  /contacts/{contactId}/NotesAndFields:
    get:
      operationId: getContactNotesAndFields
      tags: [Contacts]
      summary: Get contact notes and custom fields (Confirmed)
      parameters:
        - $ref: '#/components/parameters/ContactId'
      responses:
        '200':
          description: Notes and custom field values for the contact.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
  /contacts/person/{contactId}/categorySummary:
    get:
      operationId: getPersonCategorySummary
      tags: [Contacts]
      summary: Get category summary for an individual (Confirmed)
      parameters:
        - $ref: '#/components/parameters/ContactId'
      responses:
        '200':
          description: Category summary.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Category'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /contacts/person/{contactId}/memberships:
    get:
      operationId: getPersonMemberships
      tags: [Contacts]
      summary: Get memberships for an individual (Confirmed)
      parameters:
        - $ref: '#/components/parameters/ContactId'
      responses:
        '200':
          description: Memberships held by the individual.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Membership'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /contacts/org/{contactId}/groups:
    get:
      operationId: getOrganizationGroups
      tags: [Contacts]
      summary: Get groups for an organization (Confirmed)
      parameters:
        - $ref: '#/components/parameters/ContactId'
      responses:
        '200':
          description: Groups the organization belongs to.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Group'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /memberships/types:
    get:
      operationId: listMembershipTypes
      tags: [Memberships]
      summary: List membership types (Confirmed)
      description: Returns all membership types, paged.
      parameters:
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/PageSize'
      responses:
        '200':
          description: A paged list of membership types.
          content:
            application/json:
              schema:
                type: object
                properties:
                  TotalRecordAvailable:
                    type: integer
                  Results:
                    type: array
                    items:
                      $ref: '#/components/schemas/MembershipType'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /memberships/all:
    post:
      operationId: listAllMemberships
      tags: [Memberships]
      summary: List all memberships, filtered by type/status (Confirmed)
      description: >-
        Returns memberships across the database, optionally filtered by
        membership type and status. Accepts a JSON body of filter criteria and
        returns TotalRecordAvailable plus a paged Results array.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MembershipQuery'
      responses:
        '200':
          description: A paged list of memberships.
          content:
            application/json:
              schema:
                type: object
                properties:
                  TotalRecordAvailable:
                    type: integer
                  Results:
                    type: array
                    items:
                      $ref: '#/components/schemas/Membership'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /GroupsApi_GetGroupsByCategories:
    post:
      operationId: getGroupsByCategories
      tags: [Groups & Directory]
      summary: Get groups by categories (Confirmed)
      description: Resolves groups for one or more categories to build a filtered directory.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                CategoryIds:
                  type: array
                  items:
                    type: integer
      responses:
        '200':
          description: Groups matching the supplied categories.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Group'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /groups/{groupId}/members:
    get:
      operationId: listGroupMembers
      tags: [Groups & Directory]
      summary: List members of a group (Modeled)
      description: >-
        Modeled. Lists the member contacts belonging to a group, for directory
        rendering. Exact path and shape are behind the gated reference.
      parameters:
        - name: groupId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Group members.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Contact'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /certifications/{certificationContactId}/Components/{certificationComponentId}/Completed:
    post:
      operationId: markCertificationComponentCompleted
      tags: [Certifications]
      summary: Mark a certification component completed (Confirmed)
      parameters:
        - name: certificationContactId
          in: path
          required: true
          schema:
            type: string
        - name: certificationComponentId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: The component was marked complete.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /scheduledbilling/membershiptype/items:
    post:
      operationId: previewScheduledBillingItems
      tags: [Scheduled Billing]
      summary: Preview scheduled billing items by membership type (Confirmed)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledBillingRequest'
      responses:
        '200':
          description: Preview of items that would be billed.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
  /scheduledbilling/membershiptype/items/export:
    post:
      operationId: exportScheduledBillingItems
      tags: [Scheduled Billing]
      summary: Export scheduled billing items (Confirmed)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledBillingRequest'
      responses:
        '200':
          description: Exported billing items.
        '401':
          $ref: '#/components/responses/Unauthorized'
  /scheduledbilling/membershiptype/items/run/setup:
    post:
      operationId: setupScheduledBillingRun
      tags: [Scheduled Billing]
      summary: Set up a scheduled billing run (Confirmed)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledBillingRequest'
      responses:
        '200':
          description: Billing run configured.
        '401':
          $ref: '#/components/responses/Unauthorized'
  /scheduledbilling/membershiptype/items/run:
    post:
      operationId: runScheduledBilling
      tags: [Scheduled Billing]
      summary: Run scheduled billing for a membership type (Confirmed)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledBillingRequest'
      responses:
        '200':
          description: Billing run started; returns a system job identifier.
          content:
            application/json:
              schema:
                type: object
                properties:
                  SystemJobId:
                    type: string
        '401':
          $ref: '#/components/responses/Unauthorized'
  /scheduledbilling/membershiptype/run/history:
    get:
      operationId: listScheduledBillingRunHistory
      tags: [Scheduled Billing]
      summary: List scheduled billing run history (Confirmed)
      responses:
        '200':
          description: History of past scheduled billing runs.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BillingRun'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /scheduledbilling/membershiptype/run/history/download/{systemjobid}:
    post:
      operationId: downloadScheduledBillingRun
      tags: [Scheduled Billing]
      summary: Download a scheduled billing run result (Confirmed)
      parameters:
        - name: systemjobid
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: The billing run result file.
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
        '401':
          $ref: '#/components/responses/Unauthorized'
  /events:
    get:
      operationId: listEvents
      tags: [Events]
      summary: List events by date range and status (Modeled)
      description: >-
        Modeled from the GrowthZone ChamberMaster/MemberZone event feed (legacy
        base api.micronetonline.com/v1/associations({id})/events/details).
        Returns events filtered by date range and status for calendar embeds.
      parameters:
        - name: startDate
          in: query
          schema:
            type: string
            format: date
        - name: endDate
          in: query
          schema:
            type: string
            format: date
        - name: status
          in: query
          schema:
            type: string
      responses:
        '200':
          description: A list of events.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Event'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /events/{eventId}:
    get:
      operationId: getEvent
      tags: [Events]
      summary: Get event details (Modeled)
      parameters:
        - name: eventId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Event details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Event'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Server authentication. Send `Authorization: ApiKey {API_Key}` where the
        API Key is issued per application by GrowthZone WebSupport. OAuth 2.0 /
        OpenID Connect (authorize/token/userinfo at growthzoneapp.com) is used
        for user SSO flows.
  parameters:
    ContactId:
      name: contactId
      in: path
      required: true
      description: The GrowthZone ContactId (individual or organization).
      schema:
        type: string
    Page:
      name: page
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        default: 1
    PageSize:
      name: pageSize
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 500
        default: 100
  responses:
    Unauthorized:
      description: Missing or invalid API key.
      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:
    ContactListResponse:
      type: object
      properties:
        TotalRecordAvailable:
          type: integer
        Results:
          type: array
          items:
            $ref: '#/components/schemas/Contact'
    Contact:
      type: object
      properties:
        ContactId:
          type: string
        Name:
          type: string
        ContactType:
          type: string
          enum: [Individual, Organization]
        MembershipStatusTypeId:
          type: integer
          description: >-
            Status code - 1 Prospective, 2 Active, 4 Courtesy, 8 NonMember,
            16 Inactive, 32 Deleted.
        Balance:
          type: number
        ImageUrl:
          type: string
          format: uri
    Address:
      type: object
      properties:
        Type:
          type: string
        Line1:
          type: string
        Line2:
          type: string
        City:
          type: string
        StateProvince:
          type: string
        PostalCode:
          type: string
        Country:
          type: string
    Category:
      type: object
      properties:
        CategoryId:
          type: integer
        Name:
          type: string
    Group:
      type: object
      properties:
        GroupId:
          type: string
        Name:
          type: string
        CategoryId:
          type: integer
    Membership:
      type: object
      properties:
        MembershipId:
          type: string
        ContactId:
          type: string
        MembershipTypeId:
          type: integer
        Status:
          type: string
        JoinDate:
          type: string
          format: date
    MembershipType:
      type: object
      properties:
        MembershipTypeId:
          type: integer
        Name:
          type: string
        IsActive:
          type: boolean
    MembershipQuery:
      type: object
      properties:
        MembershipTypeId:
          type: integer
        MembershipStatusTypeId:
          type: integer
        Page:
          type: integer
        PageSize:
          type: integer
    ScheduledBillingRequest:
      type: object
      properties:
        MembershipTypeId:
          type: integer
        BillingDate:
          type: string
          format: date
    BillingRun:
      type: object
      properties:
        SystemJobId:
          type: string
        RunDate:
          type: string
          format: date-time
        Status:
          type: string
        RecordCount:
          type: integer
    Event:
      type: object
      properties:
        EventId:
          type: string
        Name:
          type: string
        StartDateTime:
          type: string
          format: date-time
        EndDateTime:
          type: string
          format: date-time
        Location:
          type: string
        Status:
          type: string
        RegistrationUrl:
          type: string
          format: uri
    Error:
      type: object
      properties:
        Message:
          type: string
        Code:
          type: string