SendHub Group API

Create and manage groups.

OpenAPI Specification

sendhub-group-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: SendHub Authentication Group API
  version: v1
  contact:
    name: Contact SendHub
    email: support@sendhub.com
  termsOfService: https://www.sendhub.com/terms/
  license:
    url: https://www.sendhub.com/terms/#:~:text=Limited%20License
    name: Limited
  description: 'SendHub''s REST-like API allows you to control & interact with your SendHub account programmatically.


    Note: this documentation is in Beta and may be updated periodically.'
servers:
- url: https://api.sendhub.com
  description: SendHub's API
security:
- username: []
  api_key: []
- basic_auth: []
tags:
- name: Group
  x-displayName: Groups
  description: Create and manage groups.
paths:
  /v1/groups:
    x-testConfig:
      enabled: true
    get:
      x-testConfig:
        params:
          limit: 1
      tags:
      - Group
      summary: List Groups
      description: Gets a list of groups
      operationId: listGroups
      parameters:
      - $ref: '#/components/parameters/PageLimit'
      - $ref: '#/components/parameters/PageOffset'
      responses:
        '200':
          $ref: '#/components/responses/listGroups200'
        '401':
          $ref: '#/components/responses/401'
        '420':
          $ref: '#/components/responses/420PlanLimit'
        '429':
          $ref: '#/components/responses/429RateLimiting'
    post:
      x-testConfig:
        body:
          name: jest test {{now()}}{{random()}}
      tags:
      - Group
      summary: Create Group
      description: Creates a group
      operationId: createGroup
      responses:
        '201':
          $ref: '#/components/responses/createGroup201'
        '400':
          $ref: '#/components/responses/updateGroup400'
        '401':
          $ref: '#/components/responses/401'
        '420':
          $ref: '#/components/responses/420PlanLimit'
        '429':
          $ref: '#/components/responses/429RateLimiting'
      requestBody:
        $ref: '#/components/requestBodies/createGroup'
  /v1/groups/{group_id}:
    x-testConfig:
      enabled: true
      pathParameters:
        group_id: '{{group_id}}'
    parameters:
    - in: path
      name: group_id
      required: true
      schema:
        type: string
      description: The group ID
    get:
      tags:
      - Group
      summary: Get Group
      description: Gets an individual group by its id
      operationId: getGroup
      responses:
        '200':
          $ref: '#/components/responses/getGroup200'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/group404'
        '420':
          $ref: '#/components/responses/420PlanLimit'
        '429':
          $ref: '#/components/responses/429RateLimiting'
    put:
      x-testConfig:
        body:
          id: '{{group_id}}'
          name: ACME Alerts
          slug: alerts
          text_to_subscribe: true
          ttjResponse: Thanks for opting in!\nOpt-out anytime by replying UNSUBSCRIBE ALERTS
      tags:
      - Group
      summary: Update Group
      description: 'Updates an individual group referenced by its id


        **Note:** this is a _replace_ operation; any properties the group already has that you don''t specify in your request will be set to their defaults'
      operationId: updateGroup
      responses:
        '200':
          $ref: '#/components/responses/updateGroup200'
        '400':
          $ref: '#/components/responses/updateGroup400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/group404'
        '420':
          $ref: '#/components/responses/420PlanLimit'
        '429':
          $ref: '#/components/responses/429RateLimiting'
      requestBody:
        $ref: '#/components/requestBodies/updateGroup'
    delete:
      x-testConfig:
        enabled: false
      tags:
      - Group
      summary: Delete Group
      description: Deletes a group
      operationId: deleteGroup
      responses:
        '204':
          description: Deleted group
        '401':
          $ref: '#/components/responses/401'
        '404':
          description: Group not found
        '420':
          $ref: '#/components/responses/420PlanLimit'
        '429':
          $ref: '#/components/responses/429RateLimiting'
  /v1/groups/{group_id}/contacts:
    x-testConfig:
      enabled: true
      pathParameters:
        group_id: '{{group_id}}'
    parameters:
    - in: path
      name: group_id
      required: true
      schema:
        type: string
      description: The group ID
    get:
      x-testConfig:
        params:
          limit: 1
      tags:
      - Group
      summary: List Group's Contacts
      description: Lists contacts in a specified group
      operationId: listGroupContacts
      parameters:
      - $ref: '#/components/parameters/PageLimit'
      - $ref: '#/components/parameters/PageOffset'
      - $ref: '#/components/parameters/ContactsListFilterByNumber'
      - $ref: '#/components/parameters/ContactsListFilterByName'
      - $ref: '#/components/parameters/ContactsListFilterByScreened'
      - $ref: '#/components/parameters/ContactsListFilterByBlocked'
      - $ref: '#/components/parameters/ContactsListOrdering'
      responses:
        '200':
          $ref: '#/components/responses/listGroupContacts200'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/contact404'
        '420':
          $ref: '#/components/responses/420PlanLimit'
        '429':
          $ref: '#/components/responses/429RateLimiting'
    post:
      x-testConfig:
        body:
          add:
          - '116006957938017590'
      tags:
      - Group
      summary: Add/Remove Group's Contacts
      description: Add and/or remove contacts from a group
      operationId: addRemoveGroupContacts
      responses:
        '202':
          $ref: '#/components/responses/addRemoveGroupContacts202'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/contact404'
        '420':
          $ref: '#/components/responses/420PlanLimit'
        '429':
          $ref: '#/components/responses/429RateLimiting'
      requestBody:
        $ref: '#/components/requestBodies/addRemoveGroupContacts'
components:
  schemas:
    nullableInteger:
      type: integer
      nullable: true
    next:
      type: string
      nullable: true
    deleted:
      type: boolean
      readOnly: true
    groupSize:
      type: integer
      description: The number of contacts that are a memeber of this group
      nullable: true
    groupMediums:
      allOf:
      - $ref: '#/components/schemas/nullableString'
      - deprecated: true
        description: This is used internally and may be expanded upon or removed in the future
    localGateway:
      type: boolean
      description: True if the contact is a SendHub line
      readOnly: true
    contactIdBoth:
      type: string
      anyOf:
      - $ref: '#/components/schemas/contactId'
      - $ref: '#/components/schemas/contactIdInt'
    addRemoveGroupContacts202ResponseAdd:
      type: object
      properties:
        add:
          type: array
          items:
            type: string
          description: Contact ids that failed to be added to this group
    offset:
      type: integer
    nameErrorObject:
      type: object
      properties:
        name:
          type: array
          items:
            type: string
    listOfGroupResourceUris:
      type: array
      items:
        $ref: '#/components/schemas/groupResourceUri'
      description: List of group resource URIs
    contactName:
      type: string
      description: The contact's name
      minLength: 1
      maxLength: 128
    listContacts200Response:
      title: listContacts200Response
      type: object
      properties:
        meta:
          $ref: '#/components/schemas/meta'
          x-$ref: '#/components/schemas/meta'
        objects:
          type: array
          items:
            $ref: '#/components/schemas/contact'
            x-$ref: '#/components/schemas/contact'
    customField:
      type: string
      nullable: true
      description: 'Custom field(s)


        There''s no limit to the number or size of custom fields (this may be subject to change in the future) except for a total limit of 65,535 bytes for the string of the json object that they''re stored in


        **Note:** Custom fields may add *very* slight load time per contact. This is typically only noticable when listing many contacts that have a large amount of custom fields

        Note: Setting the value to `null` removes the custom field'
    landlineOverride:
      type: boolean
      description: 'TODO: '
    contactKeyword:
      type: string
      example: john
      description: 'The keyword must be unique and is generated by the contact''s name by default.

        [Learn more about how contact keywords are used here.](https://sendhub.force.com/support/s/article/contacts-faq)

        '
    errorObject:
      type: object
      properties:
        error:
          type: string
        status:
          type: number
    groupResourceUri:
      type: string
      pattern: ^\/v\d+(\.\d+)*\/groups\/\d+$
      description: Resource URI for this group
      example: /v1/groups/115999753870991332
    nullableString:
      type: string
      nullable: true
    landline:
      type: boolean
      description: Whether SendHub has determined the contact's number is a landline number
    idStr:
      type: string
      pattern: ^\d+$
      description: Same as id but always a string
    id:
      type: string
      pattern: ^\d+$
    addRemoveGroupContactsRequest:
      title: addRemoveGroupContactsRequest
      type: object
      oneOf:
      - allOf:
        - x-$ref: '#/components/schemas/addRemoveGroupContactsRequestAdd'
        - $ref: '#/components/schemas/addRemoveGroupContactsRequestAdd'
      - allOf:
        - x-$ref: '#/components/schemas/addRemoveGroupContactsRequestRemove'
        - $ref: '#/components/schemas/addRemoveGroupContactsRequestRemove'
      - allOf:
        - x-$ref: '#/components/schemas/addRemoveGroupContactsRequestBoth'
        - $ref: '#/components/schemas/addRemoveGroupContactsRequestBoth'
    timestamp:
      type: string
      description: 'A UTC timestamp


        `2021-08-01T03:48:55.350453` equals August 1st, 2021 at 3:48 and 55.350453 seconds AM (UTC)'
      example: '2021-08-01T03:48:55.350453'
      pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{6}$
    addRemoveGroupContacts202Response:
      type: object
      properties:
        add:
          type: array
          items:
            $ref: '#/components/schemas/contactIdBoth'
          description: Contact ids successfully added to this group
        errors:
          anyOf:
          - $ref: '#/components/schemas/addRemoveGroupContacts202ResponseAdd'
          - $ref: '#/components/schemas/addRemoveGroupContacts202ResponseRemove'
          - allOf:
            - $ref: '#/components/schemas/addRemoveGroupContacts202ResponseAdd'
            - $ref: '#/components/schemas/addRemoveGroupContacts202ResponseRemove'
        remove:
          type: array
          items:
            $ref: '#/components/schemas/contactIdBoth'
          description: Contact ids successfully removed from this group
    blocked:
      type: boolean
      description: Opt-out status (eg. if they texted `Stop`, `Cancel`, `Block`, `Quit` or `End` - [more info](https://sendhub.force.com/support/s/article/SendHub-Number-FAQ))
    previous:
      type: string
      nullable: true
    groupWithMediums:
      allOf:
      - $ref: '#/components/schemas/group'
      - properties:
          mediums:
            $ref: '#/components/schemas/groupMediums'
    addRemoveGroupContacts202ResponseRemove:
      type: object
      properties:
        remove:
          type: array
          items:
            type: string
          description: Contact ids that failed to be removed from this group
    addRemoveGroupContactsRequestRemove:
      title: addRemoveGroupContactsRequestRemove
      type: object
      required:
      - remove
      additionalProperties: false
      properties:
        remove:
          type: array
          items:
            $ref: '#/components/schemas/contactIdBoth'
          description: Contact ids that you want to remove from this group
    groupPermissions:
      allOf:
      - $ref: '#/components/schemas/nullableString'
      - default: write
        enum:
        - write
    contactResourceUri:
      type: string
      pattern: ^\/v\d+(\.\d+)*\/contacts\/\d+$
      description: Resource URI for this contact
      example: /v1/contacts/116006957938017590
    isShared:
      type: boolean
      description: Whether the group is shared between the lines
      deprecated: true
    ttjResponse:
      type: string
      maximum: 70
      default: You are now subscribed.
      description: A custom response sent when someone texts-to-join this group
    groupName:
      type: string
      description: The group's name
      minLength: 1
      maxLength: 128
    addRemoveGroupContactsRequestBoth:
      title: addRemoveGroupContactsRequestBoth
      type: object
      required:
      - add
      - remove
      properties:
        add:
          $ref: '#/components/schemas/addRemoveGroupContactsRequestAdd/properties/add'
        remove:
          $ref: '#/components/schemas/addRemoveGroupContactsRequestRemove/properties/remove'
    groupSlug:
      type: string
      description: 'The "keyword" used to text-to-join


        Defaults to the group name lowercased, without any spaces and not duplicate by appending an incrementing number if needed'
    limit:
      type: integer
    createGroupRequest:
      type: object
      properties:
        name:
          $ref: '#/components/schemas/groupName'
        is_shared:
          $ref: '#/components/schemas/isShared'
        slug:
          $ref: '#/components/schemas/groupSlug'
        mediums:
          $ref: '#/components/schemas/groupMediums'
        permissions:
          $ref: '#/components/schemas/groupPermissions'
        text_to_subscribe:
          $ref: '#/components/schemas/textToSubscribe'
        ttjResponse:
          $ref: '#/components/schemas/ttjResponse'
      required:
      - name
    addRemoveGroupContactsRequestAdd:
      title: addRemoveGroupContactsRequestAdd
      type: object
      required:
      - add
      additionalProperties: false
      properties:
        add:
          type: array
          items:
            $ref: '#/components/schemas/contactIdBoth'
          description: Contact ids that you want to add to this group
    textToSubscribe:
      type: boolean
      default: false
      description: Whether to enable text-to-join functionality for this group
    rateLimitingResponse:
      properties:
        message:
          type: string
          example: You have sent too many requests.
        code:
          type: string
          pattern: ^\d+$
          example: '429'
        error:
          type: string
          example: Too Many Requests
        devMessage:
          type: string
        moreInfo:
          type: string
        timeLeft:
          type: string
          pattern: ^\d:[0-5]\d:[0-5]\d$
    updateGroupRequest:
      allOf:
      - $ref: '#/components/schemas/createGroupRequest'
      - type: object
        properties:
          id:
            $ref: '#/components/schemas/contactId'
      required:
      - id
      - name
    groupId:
      type: string
      allOf:
      - $ref: '#/components/schemas/id'
      description: The group ID
    isOwned:
      type: boolean
      description: This is used internally and may be expanded upon or removed in the future
      readOnly: true
    contactNumber:
      type: string
      pattern: ^\+1\d{10}$
      description: The contact's phone number
    contact:
      title: Contact
      type: object
      additionalProperties:
        $ref: '#/components/schemas/customField'
      properties:
        blocked:
          $ref: '#/components/schemas/blocked'
        deleted:
          $ref: '#/components/schemas/deleted'
        id_str:
          $ref: '#/components/schemas/idStr'
        is_owned:
          $ref: '#/components/schemas/isOwned'
        keyword:
          $ref: '#/components/schemas/contactKeyword'
        name:
          $ref: '#/components/schemas/contactName'
        number:
          $ref: '#/components/schemas/contactNumber'
        screened:
          $ref: '#/components/schemas/screened'
        id:
          $ref: '#/components/schemas/contactId'
        date_created:
          $ref: '#/components/schemas/timestamp'
        date_modified:
          $ref: '#/components/schemas/timestamp'
        local_gateway:
          $ref: '#/components/schemas/localGateway'
        resource_uri:
          $ref: '#/components/schemas/contactResourceUri'
        groups:
          $ref: '#/components/schemas/listOfGroupResourceUris'
        landline:
          $ref: '#/components/schemas/landline'
        landline_override:
          $ref: '#/components/schemas/landlineOverride'
      required:
      - name
      - number
    group:
      type: object
      properties:
        date_created:
          $ref: '#/components/schemas/timestamp'
        date_modified:
          $ref: '#/components/schemas/timestamp'
        deleted:
          $ref: '#/components/schemas/deleted'
        id:
          $ref: '#/components/schemas/groupId'
        id_str:
          $ref: '#/components/schemas/idStr'
        is_shared:
          $ref: '#/components/schemas/isShared'
        name:
          $ref: '#/components/schemas/groupName'
        parent_id:
          $ref: '#/components/schemas/nullableString'
        parent_user_id:
          $ref: '#/components/schemas/nullableString'
        permissions:
          $ref: '#/components/schemas/groupPermissions'
        resource_uri:
          $ref: '#/components/schemas/groupResourceUri'
        share_invite_count:
          $ref: '#/components/schemas/nullableInteger'
        size:
          $ref: '#/components/schemas/groupSize'
        slug:
          $ref: '#/components/schemas/groupSlug'
        text_to_subscribe:
          $ref: '#/components/schemas/textToSubscribe'
        ttjResponse:
          $ref: '#/components/schemas/ttjResponse'
    contactIdInt:
      type: integer
      format: int64
      description: The contact ID
    contactId:
      allOf:
      - $ref: '#/components/schemas/id'
      description: The contact ID
    meta:
      type: object
      properties:
        offset:
          $ref: '#/components/schemas/offset'
        limit:
          $ref: '#/components/schemas/limit'
        previous:
          $ref: '#/components/schemas/previous'
        next:
          $ref: '#/components/schemas/next'
    screened:
      type: boolean
      description: Whether the contact has been blocked by you
    listGroups200Response:
      type: object
      properties:
        meta:
          $ref: '#/components/schemas/meta'
        objects:
          type: array
          items:
            $ref: '#/components/schemas/group'
  responses:
    listGroups200:
      description: Success
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/listGroups200Response'
          examples:
            success:
              $ref: '#/components/examples/listGroups200Response'
    420PlanLimit:
      description: You've reached your plan's API limit for this month or you're on a plan that doesn't include API access
      content:
        application/json:
          schema:
            properties:
              error:
                type: string
          examples:
            You've reached your plan's API limit for this month or you're on a plan that doesn't include API access:
              summary: You've reached your plan's API limit for this month or you're on a plan that doesn't include API access
              value:
                error: You have made too many requests and are being rate limited
    429RateLimiting:
      description: You've sent too many requests in a short amount of time and are being rate-limited
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/rateLimitingResponse'
          examples:
            Too Many Requests:
              summary: You've been rate-limited and can send again in 30-seconds
              value:
                message: You have sent too many requests.
                code: '429'
                error: Too Many Requests
                devMessage: ''
                moreInfo: ''
                timeLeft: 0:00:30
    updateGroup400:
      description: Bad Request
      content:
        application/json:
          schema:
            anyOf:
            - $ref: '#/components/schemas/errorObject'
            - $ref: '#/components/schemas/nameErrorObject'
          examples:
            Missing Name Field:
              $ref: '#/components/examples/errorResponseMissingNameField'
            Missing id field or incorrect id provided:
              summary: Missing id field or incorrect id provided
              value:
                name:
                - Duplicate group name.
            Text-to-join message is too long:
              $ref: '#/components/examples/errorResponseTtjTooLong'
    createGroup201:
      description: Created group
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/groupWithMediums'
          examples:
            Example group 1:
              $ref: '#/components/examples/createGroupResponse1'
            Example group 2:
              $ref: '#/components/examples/createGroupResponse2'
    contact404:
      description: Contact not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/errorObject'
          examples:
            Contact not found:
              summary: Contact not found
              value:
                error: Requested contact not found
                status: 404
    listGroupContacts200:
      description: Success
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/listContacts200Response'
          examples:
            success:
              $ref: '#/components/examples/listGroupContacts200Response'
    addRemoveGroupContacts202:
      description: Accepted
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/addRemoveGroupContacts202Response'
          examples:
            Successfully added 1 & removed 2 contacts:
              summary: Successfully added 1 & removed 2 contacts
              value:
                add:
                - '116006957938017580'
                errors: {}
                remove:
                - '116006957942993390'
                - '116006957943010580'
            Successfully added 2, but the 3rd was already in the group:
              summary: Successfully added 2, but the 3rd was already in the group
              value:
                add:
                - '116006957942993390'
                - '116006957943010580'
                errors:
                  add:
                  - 116006957938017590 is the id of a contact who is already in this group
                remove: []
            Failed to added 2 & remove 1 contacts:
              summary: Failed to added 2 & remove 1 contacts
              value:
                add: []
                errors:
                  add:
                  - 116006957942993398 is the id of a contact who is already in this group
                  - 116006957943010582 is the id of a contact who is already in this group
                  remove:
                  - 116006957938017590 is not an id of a contact in the group.
                remove: []
    updateGroup200:
      description: Updated group
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/groupWithMediums'
          examples:
            Example group 1:
              $ref: '#/components/examples/updateGroup1'
            Example group 2:
              $ref: '#/components/examples/updateGroup2'
    group404:
      description: Group not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/errorObject'
          examples:
            Group not found:
              summary: Group not found
              value:
                error: Requested group not found
                status: 404
    getGroup200:
      description: Found group
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/group'
          examples:
            Group 1:
              $ref: '#/components/examples/getGroup200Response1'
            Group 2:
              $ref: '#/components/examples/getGroup200Response2'
    '401':
      description: The credentials you supplied are invalid
  examples:
    createGroupResponse2:
      summary: Example group 2
      value:
        date_created: '2021-08-24T19:44:31.266590'
        date_modified: '2021-08-24T19:44:31.266590'
        deleted: false
        id: '115999753870990932'
        id_str: '115999753870990932'
        is_shared: false
        name: New Leads
        parent_id: null
        parent_user_id: null
        permissions: write
        resource_uri: /v1/groups/115999753870990932
        share_invite_count: null
        size: null
        slug: leads
        text_to_subscribe: false
        ttjResponse: You are now subscribed.
        mediums: null
    Updating_a_group:
      summary: Updating a group
      value:
        id: '115999753870990933'
        name: ACME Product Alerts
    listGroupContacts200Response:
      value:
        meta:
          limit: 20
          next: null
          offset: 0
          previous: null
        objects:
        - blocked: false
          date_created: '2021-08-24T19:44:31.266590'
          date_modified: '2021-08-24T19:44:31.266590'
          deleted: false
          groups: []
          id: '116006957938017590'
          id_str: '116006957938017590'
          is_owned: true
          keyword: bob
          local_gateway: false
          name: Bob Parker
          number: '+12015716227'
          resource_uri: /v1/contacts/116006957938017590
          screened: false
          landline: false
          landline_override: false
    getGroup200Response1:
      summary: Example group 1
      value:
        date_created: '2021-08-24T19:44:31.266590'
        date_modified: '2021-08-24T19:44:31.266590'
        deleted: false
        id: '115999753870990933'
        id_str: '115999753870990933'
        is_shared: false
        name: ACME Product Alerts
        parent_id: null
        parent_user_id: null
        permissions: write
        resource_uri: /v1/groups/115999753870990933
        share_invite_count: 0
        size: 1
        slug: alerts
        text_to_subscribe: true
        ttjResponse: 'Thanks for opting in!

          Opt-out anytime by replying UNSUBSCRIBE ALERTS'
    errorResponseTtjTooLong:
      summary: Text-to-join message is too long
      value:
        error: Join message can not be longer than 70 characters.
        status: 400
    Creating_a_group_with_more_options:
      summary: Creating a group with more options
      value:
        name: ACME Product Alerts
        slug: alerts
        text_to_subscribe: true
        ttjResponse: 'Thanks for opting in!

          Opt-out anytime by replying UNSUBSCRIBE ALERTS'
    updateGroup1:
      summary: Example group 1
      value:
        date_created: '2021-08-24T19:44:31.266590'
        date_modified: '2021-08-24T19:44:31.266590'
        deleted: false
        id: '115999753870990933'
        id_str: '115999753870990933'
        is_shared: false
        name: ACME Product Alerts
        parent_id: null
        parent_user_id: null
        permissions: write
        resource_uri: /v1/groups/115999753870990933
        share_invite_count: 0
        size: 1
        slug: alerts
        text_to_subscribe: true
        ttjResponse: 'Thanks for opting in!

          Opt-out anytime by replying UNSUBSCRIBE ALERTS'
        mediums: null
    getGroup200Response2:
      summary: Example group 2
      value:
        date_created: '2021-08-24T19:44:31.266590'
        date_modified: '2021-08-24T19:44:31.266590'
        deleted: false
        id: '115999753870990932'
        id_str: '115999753870990932'
        is_shared: false
        name: New Leads
        parent_id: null
        parent_user_id: null
        permissions: write
        resource_uri: /v1/groups/115999753870990932
        share_invite_count: 0
        size: 1
        slug: leads
        text_to_subscribe: false
        ttjResponse: You are now subscribed.
    errorResponseMissingNameField:
      summary: Missing name field
      value:
        name:
        - This field is required.
    updateGroup2:
      summary: Example group 2
      value:
        date_created: '2021-08-24T19:44:31.266590'
        date_modified: '2021-08-24T19:44:31.266590'
        deleted: false
        id: '115999753870990932'
        id_str: '115999753870990932'
        is_shared: false
        name: New Leads
        parent_id: null
        parent_user_id: null
        permissions: write
        resource_uri: /v1/groups/115999753870990932
        share_invite_count: 0
        size: 1
        slug: leads
        text_to_subscribe: false
        ttjResponse: You are now subscribed.
        mediums: null
    Creating_a_group:
      summary: Creating a group
      value:
        name: ACME Product Alerts
    Updating_a_group_with_more_options:
      summary: Updating a group with more options
      value:
        id: '115999753870990933'
        name: ACME Product Alerts
        slug: alerts
        text_to_subscribe: true
        ttjResponse: 'Thanks for opting in!

          Opt-out anytime by replying UNSUBSCRIBE ALERTS'
    listGroups200Response:
      value:
        meta:
          limit: 20
          next: null
          offset: 0
          previous: null
        objects:
        - date_created: '2021-08-24T19:44:31.266590'
          date_modified: '2021-08-24T19:44:31.266590'
          deleted: false
          id: '115999753870990933'
          id_str: '115999753870990933'
          is_shared: false
          name: ACME Product Alerts
          parent_id: null
          parent_user_id: null
          permissions: write
          resource_uri: /v1/groups/115999753870990933
          share_invite_count: 0
          size: 1
          slug: alerts
          text_to_subscribe: true
          ttjResponse: 'Thanks for opting in!

            Opt-out anytime by replying UNSUBSCRIBE ALERTS'
        - date_created: '2021-08-24T19:44:31.266590'
          date_modified: '2021-08-24T19:44:31.266590'
          deleted: false
          id: '115999753870990932'
          id_str: '115999753870990932'
          is_shared: false
          name: New Leads
          parent_id: null
          parent_user_id: null
          permissions: write
          resource_uri: /v1/groups/115999753870990932
          share_invite_count: 0
          size: 1
          slug: leads
          text_to_subscribe: false
          ttjResponse: You are now subscribed.
    createGroupResponse1:
      summary: Example group 1
      value:
        date_created: '2021-08-24T19:44:31.266590'
        date_modified: '2021-08-24T19:44:31.266590'
        deleted: false
        id: '115999753870990933'
        id_str: '115999753870990933'
        is_shared: false
        name: ACME Product Alerts
        parent_id: null
        parent_user_id: null
        permissions: write
        resource_uri: /v1/groups/115999753870990933
        share_invite_count: null
        size: null
        slug: alerts
        text_to_subscribe: true
        ttjResponse: 'Thanks for opting in!

          Opt-out anytime by replying UNSUBSCRIBE ALERTS'
        mediums: null
  parameters:
    ContactsListOrdering:
      name: ordering
      in: query
      description: 'Sort contacts by a specified field (prepend a hyphen to reverse order)


        **Must** be a built-in contact field, not a custom field'
      schema:
        type: string
        enum:
        - name
        - -name
        - date_created
        - -date_created
        - date_modified
        - -date_modified
        - id
        - -id
        - blocked
        - -blocked
        - screened
        - -screened
        - is_owned
        - -is_owned
        - keyword
        - -keyword
        - number

# --- truncated at 32 KB (37 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/sendhub/refs/heads/main/openapi/sendhub-group-api-openapi.yml