Waveline API models

API reference · OpenAPI specification

These schemas are generated from the API contract. Keep record IDs as strings. Optional fields may be absent; nullable fields may be null.

RecordId

type: string
pattern: ^[1-9][0-9]*$
maxLength: 19
description: >-
  Stable existing Waveline record ID. Keep it as a string; it may exceed JavaScript's safe
  integer range.

RateLimit

type: object
properties:
  limit:
    type: integer
  remaining:
    type: integer
  reset_at:
    type: string
    format: date-time

Page

type: object
required:
  - data
  - next_cursor
properties:
  data:
    type: array
    items:
      type: object
  next_cursor:
    type:
      - string
      - 'null'
  rate_limit:
    $ref: '#/components/schemas/RateLimit'

Models: RateLimit.

Connection

type: object
required:
  - id
  - tenant_id
  - name
  - scopes
  - inbox_ids
  - status
  - connection_mode
  - subject_user_id
  - access_scope
  - workspace_access
properties:
  id:
    type: string
    format: uuid
  tenant_id:
    $ref: '#/components/schemas/RecordId'
  name:
    type: string
  workspace_name:
    type:
      - string
      - 'null'
    description: >-
      The workspace's display name. Use it, not tenant_id, when labeling a connection for
      people.
  connection_mode:
    type: string
    enum:
      - member
      - workspace
    description: >-
      Internal ownership field. Personal-inbox connections use member; Workspace and
      shared-inbox connections use workspace and are independent of the installer. This is
      not a creation input.
  access_scope:
    type: string
    enum:
      - workspace
      - inbox
      - inboxes
      - legacy
      - user
    description: >-
      Workspace covers calls and messages across all current and future shared and
      personal inboxes and syncs workspace-visible contacts; inbox covers one recorded
      inbox and inboxes covers an explicitly selected shared-inbox set. Legacy grants
      retain their original restricted selections. user is a personal assistant (OAuth)
      connection that follows the member's live app access.
  workspace_access:
    type: boolean
    description: >-
      True only for an explicitly authorized Workspace grant. Existing grants default to
      false.
  subject_user_id:
    type:
      - string
      - 'null'
    format: uuid
    description: >-
      The authenticated member bound to a Personal connection; null for Workspace
      connections. Clients cannot select or change this subject.
  key_prefix:
    type: string
  scopes:
    type: array
    items:
      type: string
      enum:
        - contacts.read
        - contacts.write
        - calls.read
        - messages.read
        - inboxes.read
        - phone_numbers.read
        - analytics.read
        - webhooks.read
        - webhooks.write
        - messages.write
  inbox_ids:
    type: array
    description: >-
      Recorded inbox allowlist. Empty for Workspace scope; GET /v1/inboxes returns the
      currently authorized inboxes.
    items:
      $ref: '#/components/schemas/RecordId'
  status:
    type: string
    enum:
      - active
      - revoked
  created_at:
    type: string
    format: date-time
  expires_at:
    type:
      - string
      - 'null'
    format: date-time
  revoked_at:
    type:
      - string
      - 'null'
    format: date-time
  default_inbox_id:
    type:
      - string
      - 'null'
    description: Personal assistant (OAuth) connections only. The member's default inbox.
  timezone:
    type:
      - string
      - 'null'
    description: >-
      Personal assistant (OAuth) connections only. IANA timezone from the member's default
      inbox business hours, otherwise from another accessible inbox; null when none is
      configured.
  timezone_source:
    type:
      - string
      - 'null'
    enum:
      - default_inbox
      - accessible_inbox
      - null

Models: RecordId.

ContactCreate

type: object
additionalProperties: false
required:
  - phone
properties:
  display_name:
    $ref: '#/components/schemas/ContactWrite/properties/display_name'
  first_name:
    $ref: '#/components/schemas/ContactWrite/properties/first_name'
  last_name:
    $ref: '#/components/schemas/ContactWrite/properties/last_name'
  company:
    $ref: '#/components/schemas/ContactWrite/properties/company'
  role:
    $ref: '#/components/schemas/ContactWrite/properties/role'
  phone:
    type: string
    pattern: ^\+[1-9][0-9]{1,14}$
    description: Required valid E.164 phone. Skip source records without a usable phone.
  email:
    $ref: '#/components/schemas/ContactWrite/properties/email'

Models: ContactWrite.

ContactWrite

type: object
additionalProperties: false
properties:
  display_name:
    type: string
    minLength: 1
    maxLength: 160
    description: >-
      Optional explicit label. Otherwise derived from first/last name, company, phone, or
      email, falling back to Unknown Contact.
  first_name:
    type:
      - string
      - 'null'
    maxLength: 320
  last_name:
    type:
      - string
      - 'null'
    maxLength: 320
  company:
    type:
      - string
      - 'null'
    maxLength: 320
  role:
    type:
      - string
      - 'null'
    maxLength: 320
  phone:
    type:
      - string
      - 'null'
    pattern: ^\+[1-9][0-9]{1,14}$
    description: >-
      Omit to preserve the saved phone. Null promotes another valid saved phone to primary
      while retaining the previous number, or returns CONTACT_PHONE_REQUIRED if no other
      phone remains.
  email:
    type:
      - string
      - 'null'
    maxLength: 320

ContactUpsert

type: object
additionalProperties: false
required:
  - external_source
  - external_id
description: >-
  A new external identity requires a nonnull valid phone. A known identity may omit phone
  when its contact already has a valid saved phone; null follows ContactWrite promotion
  rules. This depends on the saved mapping and is checked by the server.
properties:
  external_source:
    type: string
    minLength: 1
    maxLength: 160
    description: >-
      Stable source app/account identifier, such as hubspot:portal-123. Case-sensitive; no
      surrounding whitespace or control characters.
  external_id:
    type: string
    minLength: 1
    maxLength: 200
    description: >-
      Source contact record ID, preserved exactly as a string. Case-sensitive; no
      surrounding whitespace or control characters.
  display_name:
    $ref: '#/components/schemas/ContactWrite/properties/display_name'
  first_name:
    $ref: '#/components/schemas/ContactWrite/properties/first_name'
  last_name:
    $ref: '#/components/schemas/ContactWrite/properties/last_name'
  company:
    $ref: '#/components/schemas/ContactWrite/properties/company'
  role:
    $ref: '#/components/schemas/ContactWrite/properties/role'
  phone:
    $ref: '#/components/schemas/ContactWrite/properties/phone'
  email:
    $ref: '#/components/schemas/ContactWrite/properties/email'

Models: ContactWrite.

Contact

type: object
required:
  - id
  - display_name
  - first_name
  - last_name
  - company
  - role
  - phone
  - email
  - created_at
  - updated_at
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  display_name:
    type: string
  first_name:
    type:
      - string
      - 'null'
  last_name:
    type:
      - string
      - 'null'
  company:
    type:
      - string
      - 'null'
  role:
    type:
      - string
      - 'null'
  phone:
    type:
      - string
      - 'null'
  email:
    type:
      - string
      - 'null'
  created_at:
    type: string
    format: date-time
  updated_at:
    type: string
    format: date-time

Models: RecordId.

Call

type: object
required:
  - id
  - session_call_sid
  - direction
  - start_time
  - end_time
  - duration_seconds
  - outcome
  - external_number
  - called_via_number
  - inbox_ids
  - view_scope
  - unhandled_inbox_ids
  - interactions
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  session_call_sid:
    type:
      - string
      - 'null'
  direction:
    type: string
    enum:
      - inbound
      - outbound
  start_time:
    type:
      - string
      - 'null'
    format: date-time
  end_time:
    type:
      - string
      - 'null'
    format: date-time
  duration_seconds:
    type:
      - integer
      - 'null'
    description: >-
      Workspace and legacy views use elapsed end_time minus start_time, rounded down to
      seconds. An inbox view uses the union of that inbox's completed interaction
      intervals: overlapping interactions are counted once and time in other inboxes is
      excluded. Neither measure is talk time. For inbox views this is null while any
      included interaction is in progress; Workspace and legacy duration is null until the
      parent call ends. Historical single-inbox calls without interaction facts retain
      their aggregate elapsed duration.
  outcome:
    type: string
    enum:
      - completed
      - voicemail
      - forwarded
      - transferred
      - missed
      - failed
      - unknown
    description: >-
      Workspace and legacy views derive this in the listed precedence from persisted
      interactions. An inbox view uses its final interaction's terminal disposition:
      transfers, voicemail and forwarding take precedence over an earlier answer. Missed
      includes abandoned/no-answer. Failed requires explicit carrier-root failure and is
      not inferred from another inbox. Unknown means insufficient facts or in progress.
  external_number:
    type:
      - string
      - 'null'
  called_via_number:
    type:
      - string
      - 'null'
    description: >-
      Waveline phone number used for the full call. Null for a partial single-inbox view
      of a multi-inbox call because the original number may belong to another inbox.
  inbox_ids:
    type: array
    items:
      $ref: '#/components/schemas/RecordId'
    description: Inboxes included in this view; an inbox view contains only its selected inbox.
  view_scope:
    type: string
    enum:
      - workspace
      - inbox
      - inboxes
      - legacy
    description: >-
      Determines whether timing, outcome and interactions cover the whole call or one
      inbox.
  unhandled_inbox_ids:
    type: array
    items:
      $ref: '#/components/schemas/RecordId'
    description: >-
      Accessible inboxes where this call still needs follow-up, as in Waveline's unhandled
      calls. Empty once it is answered or returned later, cleared by a teammate, or never
      needed follow-up.
  interactions:
    type: array
    items:
      $ref: '#/components/schemas/CallInteraction'
    description: >-
      Permitted external interactions ordered by entry time and ID. Multiple visits to the
      same inbox remain part of this one call entry. Historical calls can have no
      interaction facts.
  inbox_labels:
    type: object
    additionalProperties:
      type: string
    description: >-
      Only with include_labels=true. Labels of the accessible inboxes in this record,
      keyed by inbox ID.
  contacts:
    type: array
    items:
      $ref: '#/components/schemas/ContactMatch'
    description: >-
      Only with include_labels=true and contacts.read. Visible contacts saved with the
      external number. Several matches are alternatives, not additional participants.

Models: RecordId, CallInteraction, ContactMatch.

CallInteraction

type: object
required:
  - id
  - inbox_id
  - employee_id
  - employee_name
  - entry_mode
  - exit_mode
  - entry_at
  - ringing_at
  - bridged_at
  - resolved_at
  - bridged
  - duration_seconds
  - handoff_source_inbox_id
  - handoff_target_inbox_id
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  inbox_id:
    $ref: '#/components/schemas/RecordId'
  employee_id:
    type:
      - string
      - 'null'
    pattern: ^[0-9]+$
    description: >-
      Actual answering employee ID, when this interaction was bridged; never a ringing
      candidate.
  employee_name:
    type:
      - string
      - 'null'
    description: Display name of the actual answering employee, when available.
  entry_mode:
    type: string
    enum:
      - inbound
      - outbound
      - forward
      - blind_transfer
      - attended_transfer
  exit_mode:
    type:
      - string
      - 'null'
    enum:
      - abandoned
      - missed
      - no_answer
      - bridged
      - voicemail
      - forwarded
      - blind_transfer
      - attended_transfer
      - null
  entry_at:
    type: string
    format: date-time
  ringing_at:
    type:
      - string
      - 'null'
    format: date-time
  bridged_at:
    type:
      - string
      - 'null'
    format: date-time
  resolved_at:
    type:
      - string
      - 'null'
    format: date-time
  bridged:
    type: boolean
  duration_seconds:
    type:
      - integer
      - 'null'
    description: >-
      Elapsed entry-to-resolution time rounded down to seconds; not talk time. Null while
      unresolved.
  handoff_source_inbox_id:
    type:
      - string
      - 'null'
    pattern: ^[0-9]+$
    description: Source inbox only when it belongs to the current authorized scope; otherwise null.
  handoff_target_inbox_id:
    type:
      - string
      - 'null'
    pattern: ^[0-9]+$
    description: Target inbox only when it belongs to the current authorized scope; otherwise null.

Models: RecordId.

Message

type: object
required:
  - id
  - conversation_id
  - body
  - delivery_status
  - direction
  - from
  - external_numbers
  - inbox_ids
  - created_at
  - updated_at
  - origin_connection_id
  - origin_application_name
  - attachments
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  conversation_id:
    $ref: '#/components/schemas/RecordId'
  body:
    type:
      - string
      - 'null'
  delivery_status:
    type:
      - string
      - 'null'
    description: Existing Waveline transport status; consumers must tolerate additional values.
  direction:
    type: string
    enum:
      - inbound
      - outbound
  from:
    type:
      - string
      - 'null'
  external_numbers:
    type: array
    items:
      type: string
    description: >-
      Sorted distinct external phone participants in this authorized conversation. These
      identify conversation parties, not exact delivery recipients for a transport part.
  inbox_ids:
    type: array
    items:
      $ref: '#/components/schemas/RecordId'
  created_at:
    type: string
    format: date-time
  updated_at:
    type: string
    format: date-time
  origin_connection_id:
    type:
      - string
      - 'null'
    format: uuid
  origin_application_name:
    type:
      - string
      - 'null'
  attachments:
    type: array
    description: >-
      Completed attachments for this message. Storage paths and signed URLs are never
      included.
    items:
      $ref: '#/components/schemas/MessageAttachment'
  inbox_labels:
    type: object
    additionalProperties:
      type: string
    description: >-
      Only with include_labels=true. Labels of the accessible inboxes in this
      conversation, keyed by inbox ID.
  contacts:
    type: array
    items:
      $ref: '#/components/schemas/ContactMatch'
    description: >-
      Only with include_labels=true and contacts.read. Visible contacts saved with each
      external number.
  sender_name:
    type:
      - string
      - 'null'
    description: >-
      Only with include_labels=true. The teammate who sent the message; null for inbound
      or automated messages.

Models: RecordId, MessageAttachment, ContactMatch.

ContactMatch

type: object
required:
  - phone
  - contact_id
  - name
description: >-
  A visible contact saved with an external number, at most five per number. The same check
  as getContact applies; inaccessible contacts are never returned.
properties:
  phone:
    type: string
  contact_id:
    $ref: '#/components/schemas/RecordId'
  name:
    type:
      - string
      - 'null'
    description: Display name, else first and last name; null when no name is saved.

Models: RecordId.

Conversation

type: object
required:
  - id
  - name
  - transport
  - last_message_at
  - external_numbers
  - inbox_ids
  - last_message
  - awaiting_reply
  - unread
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  name:
    type:
      - string
      - 'null'
    description: Group conversation name, when set.
  transport:
    type: string
    description: >-
      internal, direct_sms or twilio_conversations_group; consumers must tolerate
      additional values.
  last_message_at:
    type: string
    format: date-time
  external_numbers:
    type: array
    items:
      type: string
  inbox_ids:
    type: array
    items:
      $ref: '#/components/schemas/RecordId'
  last_message:
    type:
      - object
      - 'null'
    required:
      - id
      - body_preview
      - direction
      - sender_name
      - sent_by_me
      - attachment_count
      - created_at
    properties:
      id:
        $ref: '#/components/schemas/RecordId'
      body_preview:
        type:
          - string
          - 'null'
        description: First 280 characters of the body.
      direction:
        type: string
        enum:
          - inbound
          - outbound
      sender_name:
        type:
          - string
          - 'null'
      sent_by_me:
        type:
          - boolean
          - 'null'
        description: Personal assistant connections only; null for API keys.
      attachment_count:
        type: integer
      created_at:
        type: string
        format: date-time
  awaiting_reply:
    type:
      - boolean
      - 'null'
    description: True when the external party sent the last message.
  unread:
    type:
      - boolean
      - 'null'
    description: The authenticated member's own read state; null for API keys.
  inbox_labels:
    type: object
    additionalProperties:
      type: string
    description: Only with include_labels=true.
  contacts:
    type: array
    items:
      $ref: '#/components/schemas/ContactMatch'
    description: Only with include_labels=true and contacts.read.

Models: RecordId, ContactMatch.

Member

type: object
required:
  - employee_id
  - user_id
  - name
  - is_me
  - inboxes
properties:
  employee_id:
    $ref: '#/components/schemas/RecordId'
  user_id:
    type: string
    format: uuid
    description: The ring-group user ID.
  name:
    type:
      - string
      - 'null'
  is_me:
    type: boolean
  inboxes:
    type: array
    description: Current memberships in accessible inboxes.
    items:
      type: object
      required:
        - id
        - label
        - availability
      properties:
        id:
          $ref: '#/components/schemas/RecordId'
        label:
          type: string
        availability:
          type: string
          enum:
            - available
            - unavailable

Models: RecordId.

PhoneNumber

type: object
additionalProperties: false
required:
  - id
  - phone_number
  - label
  - description
  - inbox_id
  - is_primary
  - registered
  - registration_status
  - release_started_at
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  phone_number:
    type: string
    description: Number as stored in Waveline inventory; legacy values may use local formatting.
  label:
    type: string
  description:
    type:
      - string
      - 'null'
  inbox_id:
    type:
      - string
      - 'null'
    pattern: ^[1-9][0-9]{0,18}$
  is_primary:
    type: boolean
  registered:
    type: boolean
  registration_status:
    type:
      - string
      - 'null'
  release_started_at:
    type:
      - string
      - 'null'
    format: date-time
    description: Non-null while a number release is in progress. Never a release token.

Models: RecordId.

CallAnalytics

type: object
required:
  - start_date
  - end_date
  - timezone
  - group_by
  - inbox_id
  - call_type
  - counting_unit
  - summary
  - groups
properties:
  start_date:
    type: string
    format: date-time
  end_date:
    type: string
    format: date-time
  timezone:
    type: string
    const: UTC
  group_by:
    type: string
    enum:
      - day
      - hour
      - inbox
      - phone_number
      - employee
  inbox_id:
    type:
      - string
      - 'null'
  call_type:
    type: string
    const: external
  counting_unit:
    type: string
    const: inbox_interaction
  summary:
    $ref: '#/components/schemas/CallAnalyticsMetrics'
  groups:
    type: array
    maxItems: 1000
    items:
      type: object
      required:
        - key
        - label
        - metrics
      properties:
        key:
          type:
            - string
            - 'null'
          description: >-
            UTC date/hour, inbox/employee ID, or historical called-via number. Null
            represents unattributed interactions.
        label:
          type:
            - string
            - 'null'
        metrics:
          $ref: '#/components/schemas/CallAnalyticsMetrics'
  comparison:
    description: Present only when compare_to is supplied.
    type: object
    required:
      - compare_to
      - start_date
      - end_date
      - summary
      - groups
      - change
      - percent_change
    properties:
      compare_to:
        type: string
        const: previous_period
      start_date:
        type: string
        format: date-time
      end_date:
        type: string
        format: date-time
        description: Exclusive; equals the report start_date.
      summary:
        $ref: '#/components/schemas/CallAnalyticsMetrics'
      groups:
        type: array
        maxItems: 1000
        description: >-
          The previous window grouped the same way. Day and hour keys are that window's
          own buckets.
        items:
          type: object
          required:
            - key
            - label
            - metrics
          properties:
            key:
              type:
                - string
                - 'null'
            label:
              type:
                - string
                - 'null'
            metrics:
              $ref: '#/components/schemas/CallAnalyticsMetrics'
      change:
        type: object
        description: >-
          Current summary minus previous summary per metric (answer_rate in percentage
          points). Null when either side has no value.
        additionalProperties:
          type:
            - number
            - 'null'
      percent_change:
        type: object
        description: >-
          Relative change in percent per summary metric, rounded to one decimal. Null when
          the previous value is 0 or missing. answer_rate is omitted; use change for its
          percentage-point delta.
        additionalProperties:
          type:
            - number
            - 'null'

Models: CallAnalyticsMetrics.

CallAnalyticsMetrics

type: object
description: >-
  Counts use inbox interactions except unique_calls. Answer rate is the percentage of
  direct inbound interactions that reached ringing and were answered. Null rates and
  averages mean there are no eligible samples. Durations are seconds; totals sum visible
  interaction time.
properties:
  unique_calls:
    type: integer
    minimum: 0
  interaction_count:
    type: integer
    minimum: 0
  inbound_interactions:
    type: integer
    minimum: 0
  outbound_interactions:
    type: integer
    minimum: 0
  answered_interactions:
    type: integer
    minimum: 0
  missed_interactions:
    type: integer
    minimum: 0
  abandoned_interactions:
    type: integer
    minimum: 0
  voicemail_interactions:
    type: integer
    minimum: 0
  forwarded_interactions:
    type: integer
    minimum: 0
  transferred_interactions:
    type: integer
    minimum: 0
  transfer_in_interactions:
    type: integer
    minimum: 0
  transfer_in_answered_interactions:
    type: integer
    minimum: 0
  after_hours_interactions:
    type: integer
    minimum: 0
  answer_rate:
    type:
      - number
      - 'null'
    minimum: 0
    maximum: 100
  total_talk_seconds:
    type: number
  avg_talk_seconds:
    type:
      - number
      - 'null'
  avg_time_to_first_ring_seconds:
    type:
      - number
      - 'null'
  avg_ring_to_answer_seconds:
    type:
      - number
      - 'null'
  avg_entry_to_answer_seconds:
    type:
      - number
      - 'null'
  avg_time_to_abandon_seconds:
    type:
      - number
      - 'null'

Inbox

type: object
required:
  - id
  - label
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  label:
    type: string
  inbox_type:
    type: string
    enum:
      - personal
      - shared
  owner_employee_id:
    type:
      - string
      - 'null'
    format: uuid
  timezone:
    type:
      - string
      - 'null'
    description: IANA timezone of the inbox business hours; null when no schedule is configured.
  primary_phone_number:
    type:
      - string
      - 'null'
  is_member:
    type:
      - boolean
      - 'null'
    description: Personal assistant connections only; null for API keys.
  is_my_default:
    type:
      - boolean
      - 'null'
    description: Personal assistant connections only; null for API keys.
  my_availability:
    type:
      - string
      - 'null'
    enum:
      - available
      - unavailable
      - null
    description: Personal assistant connections only; null for API keys or non-members.

Models: RecordId.

EventType

type: string
enum:
  - call.completed
  - call.recording.ready
  - call.transcript.ready
  - call.summary.ready
  - message.received
  - message.delivered
  - message.failed
  - contact.created
  - contact.updated

EventEnvelope

type: object
required:
  - id
  - type
  - created_at
  - connection_id
  - data
properties:
  origin:
    type: object
    description: >-
      Contact change provenance captured at write time. Absent on older deliveries and
      synthetic samples. The envelope connection_id is the destination;
      origin.connection_id is the writer.
    properties:
      type:
        type: string
        enum:
          - integration
          - api
          - employee
          - system
      provider:
        type: string
        example: hubspot
      connection_id:
        type: string
        format: uuid
      application_name:
        type: string
      initial_import:
        type: boolean
  id:
    type: string
    description: >-
      Logical event ID, stable across delivery retries and replay. Sample IDs begin
      sample_.
  type:
    $ref: '#/components/schemas/EventType'
  created_at:
    type: string
    format: date-time
  connection_id:
    type: string
    format: uuid
  data:
    oneOf:
      - $ref: '#/components/schemas/Contact'
      - $ref: '#/components/schemas/Call'
      - $ref: '#/components/schemas/Message'
      - $ref: '#/components/schemas/RecordingEvent'

Models: EventType, Contact, Call, Message, RecordingEvent.

Subscription

type: object
required:
  - id
  - connection_id
  - target_url
  - event_types
  - status
properties:
  id:
    type: string
    format: uuid
  connection_id:
    type: string
    format: uuid
  target_url:
    type: string
    format: uri
  event_types:
    type: array
    items:
      $ref: '#/components/schemas/EventType'
  status:
    type: string
    enum:
      - active
      - disabled
      - deleted
  created_at:
    type: string
    format: date-time
  deleted_at:
    type:
      - string
      - 'null'
    format: date-time
  activated_at:
    type: string
    format: date-time

Models: EventType.

Delivery

type: object
required:
  - id
  - event_id
  - subscription_id
  - status
  - attempt_count
properties:
  id:
    type: string
    format: uuid
  event_id:
    type: string
    format: uuid
  subscription_id:
    type: string
    format: uuid
  connection_id:
    type: string
    format: uuid
  event_type:
    $ref: '#/components/schemas/EventType'
  replay_of:
    type:
      - string
      - 'null'
    format: uuid
    description: Original delivery ID when this delivery is a manual replay.
  status:
    type: string
    enum:
      - pending
      - delivering
      - delivered
      - failed
      - canceled
  attempt_count:
    type: integer
  http_status:
    type:
      - integer
      - 'null'
  error_code:
    type:
      - string
      - 'null'
  created_at:
    type: string
    format: date-time
  delivered_at:
    type:
      - string
      - 'null'
    format: date-time
  next_attempt_at:
    type: string
    format: date-time

Models: EventType.

MessageFee

type: object
required:
  - amount_cents
  - currency
  - basis
  - status
properties:
  amount_cents:
    type: integer
    const: 1
  currency:
    type: string
    const: usd
  basis:
    type: string
    const: accepted_recipient_send
  status:
    type: string
    enum:
      - pending_invoice
      - invoiced

MessageSend

type: object
required:
  - message
  - message_ids
  - fee
properties:
  message:
    $ref: '#/components/schemas/Message'
  message_ids:
    type: array
    items:
      $ref: '#/components/schemas/RecordId'
  fee:
    $ref: '#/components/schemas/MessageFee'

Models: Message, RecordId, MessageFee.

Note

type: object
required:
  - id
  - contact_id
  - body
  - created_at
  - updated_at
  - origin_connection_id
  - origin_application_name
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  contact_id:
    $ref: '#/components/schemas/RecordId'
  body:
    type: string
  created_at:
    type: string
    format: date-time
  updated_at:
    type: string
    format: date-time
  deleted_at:
    type:
      - string
      - 'null'
  origin_connection_id:
    type:
      - string
      - 'null'
    format: uuid
  origin_application_name:
    type:
      - string
      - 'null'
    description: >-
      Integration name saved when this note was created; null for employee-created or
      legacy notes.

Models: RecordId.

ContactPropertyDefinition

type: object
required:
  - id
  - key
  - label
  - data_type
  - options
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  key:
    type: string
  label:
    type: string
  data_type:
    type: string
    enum:
      - text
      - number
      - boolean
      - date
      - url
      - email
      - phone
      - address
      - multi_select
  options:
    type: object

Models: RecordId.

ContactPropertyValue

type: object
required:
  - id
  - key
  - data_type
  - value
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  key:
    type: string
  data_type:
    type: string
  value: {}
  updated_at:
    type:
      - string
      - 'null'

Models: RecordId.

Recording

type: object
required:
  - id
  - session_call_sid
  - recording_type
  - duration_seconds
  - recorded_at
  - created_at
  - has_transcript
  - has_summary
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  session_call_sid:
    type: string
  recording_type:
    type:
      - string
      - 'null'
  duration_seconds:
    type:
      - number
      - string
      - 'null'
  recorded_at:
    type:
      - string
      - 'null'
  created_at:
    type: string
  has_transcript:
    type: boolean
  has_summary:
    type: boolean
  sentiment:
    type:
      - string
      - 'null'
    enum:
      - positive
      - negative
      - neutral
      - mixed
      - null
  sentiment_status:
    type:
      - string
      - 'null'

Models: RecordId.

RecordingEvent

description: >-
  Metadata for ready recording, transcript, or summary content. Includes voicemail when
  content exists. data.id is the recording ID; call_id is the parent call ID. No media URL
  or transcript text is included. Fetch content through the recording endpoints, which
  recheck current access.
allOf:
  - $ref: '#/components/schemas/Recording'
  - type: object
    required:
      - call_id
      - direction
      - external_number
      - inbox_ids
      - has_audio
    properties:
      call_id:
        $ref: '#/components/schemas/RecordId'
      direction:
        type: string
        enum:
          - inbound
          - outbound
      external_number:
        type:
          - string
          - 'null'
      inbox_ids:
        type: array
        items:
          $ref: '#/components/schemas/RecordId'
      has_audio:
        type: boolean

Models: Recording, RecordId.

MediaText

type: object
required:
  - id
  - text
  - status
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  text:
    type:
      - string
      - 'null'
  status:
    type:
      - string
      - 'null'

Models: RecordId.

MediaDownload

type: object
required:
  - download_url
  - expires_at
properties:
  download_url:
    type: string
    format: uri
  expires_at:
    type: string
    format: date-time

MessageAttachment

type: object
required:
  - id
  - file_name
  - mime_type
  - size_bytes
  - created_at
properties:
  id:
    $ref: '#/components/schemas/RecordId'
  file_name:
    type:
      - string
      - 'null'
  mime_type:
    type:
      - string
      - 'null'
  size_bytes:
    type:
      - integer
      - 'null'
  created_at:
    type: string

Models: RecordId.

MessageUpload

type: object
required:
  - id
  - inbox_id
  - file_name
  - mime_type
  - size_bytes
  - attachment_id
  - expires_at
  - status
  - upload_path
properties:
  id:
    type: string
    format: uuid
  inbox_id:
    $ref: '#/components/schemas/RecordId'
  file_name:
    type: string
  mime_type:
    type: string
  size_bytes:
    type: integer
  attachment_id:
    type:
      - string
      - 'null'
  expires_at:
    type: string
  status:
    type: string
    enum:
      - awaiting_upload
      - ready
  upload_path:
    type: string

Models: RecordId.