SendHub Contact API

Create and manage contacts.

OpenAPI Specification

sendhub-contact-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: SendHub Authentication Contact 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: Contact
  x-displayName: Contacts
  description: Create and manage contacts.
paths:
  /v1/contacts:
    x-testConfig:
      enabled: true
    get:
      x-testConfig:
        params:
          limit: 1
      tags:
      - Contact
      summary: List Contacts
      operationId: listContacts
      description: 'Gets a list of contacts


        See also: [List Group Contacts](#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'
      security:
      - username: []
        api_key: []
      - basic_auth: []
      responses:
        '200':
          $ref: '#/components/responses/listContacts200'
          x-$ref: '#/components/responses/listContacts200'
        '400':
          $ref: '#/components/responses/list400BadFiltering'
        '401':
          $ref: '#/components/responses/401'
        '403':
          $ref: '#/components/responses/listContacts403'
        '420':
          $ref: '#/components/responses/420PlanLimit'
        '429':
          $ref: '#/components/responses/429RateLimiting'
    post:
      tags:
      - Contact
      summary: Create/Update Contact
      description: 'Creates or updates a contact


        You can add arbitrary custom fields to a contact (see [Custom Fields](#todo: add link here))


        **Note:** the contact''s `id` is required in the request payload if the supplied `number` already exists in your contacts


        This operation _doesn''t_ remove properties that aren''t specified when updating an existing contact


        [Use PUT to remove custom fields or groups](#operation/upsertContact)'
      operationId: upsertContact
      responses:
        '201':
          $ref: '#/components/responses/upsertContact201'
        '400':
          $ref: '#/components/responses/upsertContact400'
        '401':
          $ref: '#/components/responses/401'
        '420':
          $ref: '#/components/responses/420PlanLimit'
        '429':
          $ref: '#/components/responses/429RateLimiting'
      requestBody:
        $ref: '#/components/requestBodies/upsertContact'
        x-$ref: '#/components/requestBodies/upsertContact'
      x-testConfig:
        body:
          id: '116006957938017590'
          name: Bob Parker
          number: '+12015716227'
    patch:
      tags:
      - Contact
      summary: Creates, updates, or deletes multiple contacts in one request
      description: Creates, updates, or deletes multiple contacts in one request
      operationId: bulkUpsertContacts
      responses:
        '202':
          $ref: '#/components/responses/bulkUpsertContacts202'
      requestBody:
        $ref: '#/components/requestBodies/bulkUpsertContact'
        x-$ref: '#/components/requestBodies/bulkUpsertContact'
      x-testConfig:
        enabled: false
  /v1/contacts/{contact_id}:
    x-testConfig:
      enabled: true
      pathParameters:
        contact_id: '{{contact_id}}'
    parameters:
    - $ref: '#/components/parameters/contact_id'
    get:
      tags:
      - Contact
      summary: Get Contact
      description: Retrieves a contact by its id
      operationId: getContact
      responses:
        '200':
          $ref: '#/components/responses/getContact200'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/contact404'
        '420':
          $ref: '#/components/responses/420PlanLimit'
        '429':
          $ref: '#/components/responses/429RateLimiting'
    put:
      x-testConfig:
        body:
          id: '116006957938017590'
          name: John Smithy
          number: '+12015716227'
          landline: false
      tags:
      - Contact
      summary: Update Contact
      description: 'Updates an individual contact referenced by its id


        You can add arbitrary custom fields to a contact (see [Custom Fields](#todo: ))


        **Note:** this is a _replace_ operation; any properties the contact already has that you don''t specify in your request will be removed


        [Use POST for _upsert_ functionality](#operation/upsertContact)'
      operationId: updateContact
      responses:
        '200':
          $ref: '#/components/responses/updateContact200'
        '400':
          $ref: '#/components/responses/updateContact400'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/contact404'
        '420':
          $ref: '#/components/responses/420PlanLimit'
        '429':
          $ref: '#/components/responses/429RateLimiting'
      requestBody:
        $ref: '#/components/requestBodies/updateContact'
    delete:
      x-testConfig:
        enabled: false
      tags:
      - Contact
      summary: Delete Contact
      description: Deletes a contact
      operationId: deleteContact
      responses:
        '204':
          description: Deleted contact
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/contact404'
        '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:
      - Contact
      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'
components:
  schemas:
    bulkUpsertContactRequest:
      type: object
      properties:
        objects:
          type: array
          items:
            $ref: '#/components/schemas/upsertContactRequest'
    contactWithContactId:
      allOf:
      - $ref: '#/components/schemas/contact'
      - properties:
          contact_id:
            $ref: '#/components/schemas/contactIdBoth'
    next:
      type: string
      nullable: true
    deleted:
      type: boolean
      readOnly: true
    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'
    offset:
      type: integer
    nameErrorObject:
      type: object
      properties:
        name:
          type: array
          items:
            type: string
    upsertContactRequestWithId:
      allOf:
      - $ref: '#/components/schemas/upsertContactRequestWithoutId'
      - type: object
        title: upsertContactRequestWithId
        required:
        - id
    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: '
    upsertContactRequestWithoutId:
      title: upsertContactRequestWithoutId
      type: object
      additionalProperties:
        $ref: '#/components/schemas/customField'
        x-$ref: '#/components/schemas/customField'
      properties:
        blocked:
          $ref: '#/components/schemas/blocked'
          x-$ref: '#/components/schemas/blocked'
        deleted:
          $ref: '#/components/schemas/deleted'
          x-$ref: '#/components/schemas/deleted'
        id:
          $ref: '#/components/schemas/contactIdBoth'
          x-$ref: '#/components/schemas/contactIdBoth'
        keyword:
          $ref: '#/components/schemas/contactKeyword'
          x-$ref: '#/components/schemas/contactKeyword'
        name:
          $ref: '#/components/schemas/contactName'
          x-$ref: '#/components/schemas/contactName'
        number:
          $ref: '#/components/schemas/contactNumber'
          x-$ref: '#/components/schemas/contactNumber'
        screened:
          $ref: '#/components/schemas/screened'
          x-$ref: '#/components/schemas/screened'
        groups:
          $ref: '#/components/schemas/listOfGroupIds'
          x-$ref: '#/components/schemas/listOfGroupIds'
      required:
      - name
      - number
    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
    updateContactRequest:
      $ref: '#/components/schemas/upsertContactRequestWithId'
      x-$ref: '#/components/schemas/upsertContactRequestWithId'
    groupResourceUri:
      type: string
      pattern: ^\/v\d+(\.\d+)*\/groups\/\d+$
      description: Resource URI for this group
      example: /v1/groups/115999753870991332
    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+$
    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}$
    updateContactResponse:
      $ref: '#/components/schemas/contactWithContactId'
    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
    contactResourceUri:
      type: string
      pattern: ^\/v\d+(\.\d+)*\/contacts\/\d+$
      description: Resource URI for this contact
      example: /v1/contacts/116006957938017590
    limit:
      type: integer
    listOfGroupIds:
      type: array
      items:
        anyOf:
        - allOf:
          - $ref: '#/components/schemas/groupId'
          - writeOnly: true
        - $ref: '#/components/schemas/groupIdInt'
        - $ref: '#/components/schemas/groupResourceUri'
      description: List of group resource URIs and/or IDs
    groupIdInt:
      type: integer
      format: int64
      description: The group ID
    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$
    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
    numberErrorObject:
      type: object
      properties:
        name:
          type: array
          items:
            type: string
    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'
    upsertContactResponse:
      anyOf:
      - $ref: '#/components/schemas/contact'
      - $ref: '#/components/schemas/contactWithContactId'
    upsertContactRequest:
      anyOf:
      - $ref: '#/components/schemas/upsertContactRequestWithoutId'
        x-$ref: '#/components/schemas/upsertContactRequestWithoutId'
      - $ref: '#/components/schemas/upsertContactRequestWithId'
        x-$ref: '#/components/schemas/upsertContactRequestWithId'
    screened:
      type: boolean
      description: Whether the contact has been blocked by you
    nameOrNumberError:
      anyOf:
      - $ref: '#/components/schemas/nameErrorObject'
      - $ref: '#/components/schemas/numberErrorObject'
  responses:
    upsertContact201:
      description: Created or updated contact
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/upsertContactResponse'
          examples:
            Example contact 1:
              $ref: '#/components/examples/johnWithContactId'
            Example contact 2:
              $ref: '#/components/examples/bobWithContactId'
    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
    list400BadFiltering:
      description: Bad Request
      content:
        text/html; charset=utf-8:
          schema:
            type: string
          examples:
            Invalid filter parameter:
              summary: Invalid filter parameter
              value: The 'resource_uri' field does not allow filtering.
    bulkUpsertContacts202:
      description: Created or updated contacts
      content:
        application/json:
          schema:
            type: array
            items:
              $ref: '#/components/schemas/upsertContactResponse'
    upsertContact400:
      $ref: '#/components/responses/updateContact400'
    getContact200:
      description: Found contact
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/contact'
            x-$ref: '#/components/schemas/contact'
          examples:
            Example contact 1:
              $ref: '#/components/examples/john'
            Example contact 2:
              $ref: '#/components/examples/bob'
    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'
    listContacts403:
      description: Forbidden
    updateContact400:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/nameOrNumberError'
          examples:
            Missing name and number fields:
              summary: Missing name and number fields
              value:
                name:
                - This field is required.
                number:
                - This field is required.
            Missing id field or incorrect id provided:
              summary: Missing id field or incorrect id provided
              value:
                number:
                - That number is already in your contacts.
    listContacts200:
      description: Success
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/listContacts200Response'
            x-$ref: '#/components/schemas/listContacts200Response'
          examples:
            success:
              $ref: '#/components/examples/listContacts200Response-2'
    updateContact200:
      description: Updated contact
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/updateContactResponse'
          examples:
            Example contact 1:
              $ref: '#/components/examples/johnWithContactId'
            Example contact 2:
              $ref: '#/components/examples/bobWithContactId'
    '401':
      description: The credentials you supplied are invalid
  examples:
    bobWithContactId:
      value:
        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
        contact_id: '116006957938017590'
    Updating_a_contacts_custom_fields:
      summary: Updating a contact's custom field(s)
      value:
        id: '116006957938283973'
        name: John Smith
        number: '+19198915828'
        my-custom-field: My custom value
    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
    Updating_a_contacts_custom_fields_without_removing_them_from_any_groups_theyre_in:
      summary: Updating a contact's custom field(s) without removing them from any groups they're in
      value:
        id: '116006957938283973'
        name: John Smith
        number: '+19198915828'
        my-custom-field: My custom value
        groups:
        - '115999753870990933'
        - '115999753870990932'
    Create_non-existing_contact:
      summary: Create a non-existing contact
      value:
        name: Bob Parker
        number: '+12015716227'
    johnWithContactId:
      value:
        blocked: false
        date_created: '2021-08-24T19:44:31.266590'
        date_modified: '2021-08-24T19:44:31.266590'
        deleted: false
        groups: []
        id: '116006957938283973'
        id_str: '116006957938283973'
        is_owned: true
        keyword: john
        local_gateway: false
        name: John Smith
        number: '+19198915828'
        resource_uri: /v1/contacts/116006957938283973
        screened: false
        landline: false
        landline_override: false
        contact_id: '116006957938283973'
    Update_my-custom-field-2_without_modifying_or_removing_my-custom-field:
      summary: Update my-custom-field-2 without modifying or removing my-custom-field
      value:
        id: '116006957938283973'
        name: John Smith
        number: '+19198915828'
        my-custom-field-2: My custom value 2
    Updating_a_contacts_name:
      summary: Updating a contact's name
      value:
        id: '116006957938283973'
        name: John Smith
        number: '+19198915828'
    Updating_a_contacts_groups:
      summary: Updating a contact's groups
      value:
        id: '116006957938283973'
        name: John Smith
        number: '+19198915828'
        groups:
        - '115999753870990933'
        - '115999753870990932'
    listContacts200Response-2:
      summary: Success
      value:
        meta:
          limit: 1
          next: /v1/contacts?limit=1&offset=1
          offset: 0
          previous: null
        objects:
        - blocked: false
          date_created: '2022-03-03T14:30:43.434051'
          date_modified: '2022-03-09T17:00:32.795897'
          deleted: false
          groups: []
          id: '116006957944371848'
          id_str: '116006957944371848'
          is_owned: true
          keyword: acme
          landline: false
          local_gateway: false
          my-custom-field-2: my-custom-field-2
          name: ACME Alerts
          number: '+18002222228'
          resource_uri: /v1/contacts/116006957944371848
          screened: false
    bob:
      value:
        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
    john:
      value:
        blocked: false
        date_created: '2021-08-24T19:44:31.266590'
        date_modified: '2021-08-24T19:44:31.266590'
        deleted: false
        groups: []
        id: '116006957938283973'
        id_str: '116006957938283973'
        is_owned: true
        keyword: john
        local_gateway: false
        name: John Smith
        number: '+19198915828'
        resource_uri: /v1/contacts/116006957938283973
        screened: false
        landline: false
        landline_override: false
  requestBodies:
    upsertContact:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/upsertContactRequest'
            x-$ref: '#/components/schemas/upsertContactRequest'
          examples:
            Updating_a_contact's_name:
              $ref: '#/components/examples/Updating_a_contacts_name'
            Updating_a_contact's_groups:
              $ref: '#/components/examples/Updating_a_contacts_groups'
            Updating_a_contact's_custom_field(s):
              $ref: '#/components/examples/Updating_a_contacts_custom_fields'
            Create_non-existing_contact:
              $ref: '#/components/examples/Create_non-existing_contact'
            Update_my-custom-field-2_without_modifying_or_removing_my-custom-field:
              $ref: '#/components/examples/Update_my-custom-field-2_without_modifying_or_removing_my-custom-field'
    bulkUpsertContact:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/bulkUpsertContactRequest'
            x-$ref: '#/components/schemas/bulkUpsertContactRequest'
    updateContact:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/updateContactRequest'
            x-$ref: '#/components/schemas/updateContactRequest'
          examples:
            Updating_a_contact's_name:
              $ref: '#/components/examples/Updating_a_contacts_name'
            Updating_a_contact's_groups:
              $ref: '#/components/examples/Updating_a_contacts_groups'
            Updating_a_contact's_custom_field(s):
              $ref: '#/components/examples/Updating_a_contacts_custom_fields'
            Updating_a_contact's_custom_field(s)_without_removing_them_from_any_groups_they're_in:
              $ref: '#/components/examples/Updating_a_contacts_custom_fields_without_removing_them_from_any_groups_theyre_in'
  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
        - -number
      examples:
        Sort contacts by date_created last-to-first:
          summary: Sort contacts by date_created last-to-first
          value: -date_created
        Sort contacts by date_created first-to-last:
          summary: Sort contacts by date_created first-to-last
          value: date_created
        Sort contacts by date_modified last-to-first:
          summary: Sort contacts by date_modified last-to-first
          value: -date_modified
        Sort contacts by date_modified first-to-last:
          summary: Sort contacts by date_modified first-to-last
          value: date_modified
        Sort contacts by their name Z-to-A:
          summary: Sort contacts by their name Z-to-A
          value: -name
        Sort contacts by their name A-to-Z:
          summary: Sort contacts by their name A-to-Z
          value: name
    ContactsListFilterByBlocked:
      name: blocked
      in: query
      description: Filters the contacts by 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))
      schema:
        type: boolean
      examples:
        Only show contacts that have opted-out:
          summary: Only show contacts that have opted-out
          value: true
        Only show contacts that haven't opted-out:
          summary: Only show contacts that haven't opted-out
          value: false
    contact_id:
      name: contact_id
      in: path
      required: true
      schema:
        anyOf:
        - type: integer
          format: int64
          minimum: 1
        - type: string
          pattern: ^\d+$
          minLength: 1
      description: The contact ID
    PageLimit:
      name: limit
      in: query
      description: (Pagination) How many records to return
      schema:
        type: integer
        maximum: 1000
        minimum: 1
        default: 20
    ContactsListFilterByName:
      name: name
      in: query
      description: Filters contacts by their `name` (Will only return contacts whose name matches **exactly**)
      schema:
        type: string
      examples:
        John Smith:
          value: John Smith
        Bob Parker:
          value: Bob Parker
    ContactsListFilterByNumber:
      name: number
      in: query
      description: "Filters contacts by their phone `number`\n  \nThe value _**must**_ be in the E.164 format and URI-encoded (eg. `+18004445555` would become `%2B18004445555`)"
      schema:
        type: string
      examples:
        Only show contacts with a `number` matching +18004445555:
          summary: Only show contacts with a `number` matching +18004445555
          value: '%2B18004445555'
        Only show contacts with a `number` matching +12015716227:
          summary: Only show contacts with a `number` matching +12015716227
          value: '%2B12015716227'
    ContactsListFilterByScreened:
      name: screened
      in: query
      description: Filters the contacts by their `screened` status (eg. if _**you**_ blocked them)
      schema:
        type: boolean
      examples:
        Only show contacts that you have blocked:
          summary: Only show contacts that you have blocked
          value: true
        Only show contacts that you haven't blocked:
          summary: Only show contacts that you haven't blocked
  

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