GrowthZone Scheduled Billing API

Preview, export, set up, and run scheduled recurring membership billing by membership type, and retrieve and download the history of past billing runs. Drives automated dues invoicing across the member base.

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