## Create a new chat

`client.Chats.New(ctx, body) (*ChatNewResponse, error)`

**post** `/v3/chats`

Create a new chat with specified participants and send an initial message.
The initial message is required when creating a chat.

## Message Effects

You can add iMessage effects to make your messages more expressive. Effects are
optional and can be either screen effects (full-screen animations) or bubble effects
(message bubble animations).

**Screen Effects:** `confetti`, `fireworks`, `lasers`, `sparkles`, `celebration`,
`hearts`, `love`, `balloons`, `happy_birthday`, `echo`, `spotlight`

**Bubble Effects:** `slam`, `loud`, `gentle`, `invisible`

Only one effect type can be applied per message.

## Inline Text Decorations (iMessage only)

Use the `text_decorations` array on a text part to apply styling and animations to character ranges.

Each decoration specifies a `range: [start, end)` and exactly one of `style` or `animation`.

**Styles:** `bold`, `italic`, `strikethrough`, `underline`
**Animations:** `big`, `small`, `shake`, `nod`, `explode`, `ripple`, `bloom`, `jitter`

```json
{
  "type": "text",
  "value": "Hello world",
  "text_decorations": [
    { "range": [0, 5], "style": "bold" },
    { "range": [6, 11], "animation": "shake" }
  ]
}
```

**Note:** Style ranges (bold, italic, etc.) may overlap, but animation ranges must not overlap with other animations or styles. Text decorations only render for iMessage recipients.
For SMS/RCS, text decorations are not applied.

## First-Message Link Restriction

To protect sender deliverability, the **first outbound message** of a new chat cannot be a link.
The request is rejected with `400` (error code `1005`) when:

- The message contains a `link` part (explicit rich-preview link), or
- Any `text` part contains a URL.

This rule applies only to `POST /v3/chats`. Follow-up messages on an existing chat
(`POST /v3/chats/{chatId}/messages`) are not subject to this restriction.

### Parameters

- `body ChatNewParams`

  - `From param.Field[string]`

    Sender phone number in E.164 format. Must be a phone number that the
    authenticated partner has permission to send from.

  - `Message param.Field[MessageContent]`

    Message content container. Groups all message-related fields together,
    separating the "what" (message content) from the "where" (routing fields like from/to).

  - `To param.Field[[]string]`

    Array of recipient handles (phone numbers in E.164 format or email addresses).
    For individual chats, provide one recipient. For group chats, provide multiple.

### Returns

- `type ChatNewResponse struct{…}`

  Response for creating a new chat with an initial message

  - `Chat ChatNewResponseChat`

    - `ID string`

      Unique identifier for the created chat (UUID)

    - `DisplayName string`

      Display name for the chat. Defaults to a comma-separated list of recipient handles. Can be updated for group chats.

    - `Handles []ChatHandle`

      List of participants in the chat. Always contains at least two handles (your phone number and the other participant).

      - `ID string`

        Unique identifier for this handle

      - `Handle string`

        Phone number (E.164) or email address of the participant

      - `JoinedAt Time`

        When this participant joined the chat

      - `Service ServiceType`

        Messaging service type

        - `const ServiceTypeiMessage ServiceType = "iMessage"`

        - `const ServiceTypeSMS ServiceType = "SMS"`

        - `const ServiceTypeRCS ServiceType = "RCS"`

      - `IsMe bool`

        Whether this handle belongs to the sender (your phone number)

      - `LeftAt Time`

        When they left (if applicable)

      - `Status ChatHandleStatus`

        Participant status

        - `const ChatHandleStatusActive ChatHandleStatus = "active"`

        - `const ChatHandleStatusLeft ChatHandleStatus = "left"`

        - `const ChatHandleStatusRemoved ChatHandleStatus = "removed"`

    - `HealthStatus ChatNewResponseChatHealthStatus`

      **[BETA]** Current health for a chat. Always present — chats start at `HEALTHY` and may shift based on engagement and delivery signals on the conversation. Many `AT_RISK` or `CRITICAL` chats on a single line increase the risk of line flagging.

      Switch on `status` to gate sends or surface line health in your UI — the enum is the long-term contract. Each status carries a `doc_url` that deep-links to the relevant section of the Chat Health guide.

      See the [Chat Health guide](/guides/chats/chat-health) for what each status means and how to react.

      - `DocURL string`

        Deep-link to the relevant section of the Chat Health guide for this status.

      - `Status string`

        Current health bucket for the chat. See the [Chat Health guide](/guides/chats/chat-health) for what each value means and how to react. `doc_url` deep-links to the relevant section.

        - `const ChatNewResponseChatHealthStatusStatusHealthy ChatNewResponseChatHealthStatusStatus = "HEALTHY"`

        - `const ChatNewResponseChatHealthStatusStatusAtRisk ChatNewResponseChatHealthStatusStatus = "AT_RISK"`

        - `const ChatNewResponseChatHealthStatusStatusCritical ChatNewResponseChatHealthStatusStatus = "CRITICAL"`

        - `const ChatNewResponseChatHealthStatusStatusOptedOut ChatNewResponseChatHealthStatusStatus = "OPTED_OUT"`

      - `UpdatedAt Time`

        When this status last changed.

    - `IsGroup bool`

      Whether this is a group chat

    - `Message SentMessage`

      A message that was sent (used in CreateChat and SendMessage responses)

      - `ID string`

        Message identifier (UUID)

      - `CreatedAt Time`

        When the message was created

      - `DeliveryStatus SentMessageDeliveryStatus`

        Current delivery status of a message

        - `const SentMessageDeliveryStatusPending SentMessageDeliveryStatus = "pending"`

        - `const SentMessageDeliveryStatusQueued SentMessageDeliveryStatus = "queued"`

        - `const SentMessageDeliveryStatusSent SentMessageDeliveryStatus = "sent"`

        - `const SentMessageDeliveryStatusDelivered SentMessageDeliveryStatus = "delivered"`

        - `const SentMessageDeliveryStatusFailed SentMessageDeliveryStatus = "failed"`

      - `IsRead bool`

        Whether the message has been read

      - `Parts []SentMessagePartUnion`

        Message parts in order (text, media, and link)

        - `type TextPartResponse struct{…}`

          A text message part

          - `Reactions []Reaction`

            Reactions on this message part

            - `Handle ChatHandle`

              - `ID string`

                Unique identifier for this handle

              - `Handle string`

                Phone number (E.164) or email address of the participant

              - `JoinedAt Time`

                When this participant joined the chat

              - `Service ServiceType`

                Messaging service type

              - `IsMe bool`

                Whether this handle belongs to the sender (your phone number)

              - `LeftAt Time`

                When they left (if applicable)

              - `Status ChatHandleStatus`

                Participant status

            - `IsMe bool`

              Whether this reaction is from the current user

            - `Type ReactionType`

              Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
              Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
              Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

              - `const ReactionTypeLove ReactionType = "love"`

              - `const ReactionTypeLike ReactionType = "like"`

              - `const ReactionTypeDislike ReactionType = "dislike"`

              - `const ReactionTypeLaugh ReactionType = "laugh"`

              - `const ReactionTypeEmphasize ReactionType = "emphasize"`

              - `const ReactionTypeQuestion ReactionType = "question"`

              - `const ReactionTypeCustom ReactionType = "custom"`

              - `const ReactionTypeSticker ReactionType = "sticker"`

            - `CustomEmoji string`

              Custom emoji if type is "custom", null otherwise

            - `Sticker ReactionSticker`

              Sticker attachment details when reaction_type is "sticker". Null for non-sticker reactions.

              - `FileName string`

                Filename of the sticker

              - `Height int64`

                Sticker image height in pixels

              - `MimeType string`

                MIME type of the sticker image

              - `URL string`

                Presigned URL for downloading the sticker image (expires in 1 hour).

              - `Width int64`

                Sticker image width in pixels

          - `Type TextPartResponseType`

            Indicates this is a text message part

            - `const TextPartResponseTypeText TextPartResponseType = "text"`

          - `Value string`

            The text content

          - `TextDecorations []TextDecoration`

            Text decorations applied to character ranges in the value

            - `Range []int64`

              Character range `[start, end)` in the `value` string where the decoration applies.
              `start` is inclusive, `end` is exclusive.
              *Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.*

            - `Animation TextDecorationAnimation`

              Animated text effect to apply. Mutually exclusive with `style`.

              - `const TextDecorationAnimationBig TextDecorationAnimation = "big"`

              - `const TextDecorationAnimationSmall TextDecorationAnimation = "small"`

              - `const TextDecorationAnimationShake TextDecorationAnimation = "shake"`

              - `const TextDecorationAnimationNod TextDecorationAnimation = "nod"`

              - `const TextDecorationAnimationExplode TextDecorationAnimation = "explode"`

              - `const TextDecorationAnimationRipple TextDecorationAnimation = "ripple"`

              - `const TextDecorationAnimationBloom TextDecorationAnimation = "bloom"`

              - `const TextDecorationAnimationJitter TextDecorationAnimation = "jitter"`

            - `Style TextDecorationStyle`

              Text style to apply. Mutually exclusive with `animation`.

              - `const TextDecorationStyleBold TextDecorationStyle = "bold"`

              - `const TextDecorationStyleItalic TextDecorationStyle = "italic"`

              - `const TextDecorationStyleStrikethrough TextDecorationStyle = "strikethrough"`

              - `const TextDecorationStyleUnderline TextDecorationStyle = "underline"`

        - `type MediaPartResponse struct{…}`

          A media attachment part

          - `ID string`

            Unique attachment identifier

          - `Filename string`

            Original filename

          - `MimeType string`

            MIME type of the file

          - `Reactions []Reaction`

            Reactions on this message part

            - `Handle ChatHandle`

            - `IsMe bool`

              Whether this reaction is from the current user

            - `Type ReactionType`

              Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
              Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
              Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

            - `CustomEmoji string`

              Custom emoji if type is "custom", null otherwise

            - `Sticker ReactionSticker`

              Sticker attachment details when reaction_type is "sticker". Null for non-sticker reactions.

          - `SizeBytes int64`

            File size in bytes

          - `Type MediaPartResponseType`

            Indicates this is a media attachment part

            - `const MediaPartResponseTypeMedia MediaPartResponseType = "media"`

          - `URL string`

            Presigned URL for downloading the attachment (expires in 1 hour).

        - `type LinkPartResponse struct{…}`

          A rich link preview part

          - `Reactions []Reaction`

            Reactions on this message part

            - `Handle ChatHandle`

            - `IsMe bool`

              Whether this reaction is from the current user

            - `Type ReactionType`

              Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
              Custom emoji reactions have type "custom" with the actual emoji in the custom_emoji field.
              Sticker reactions have type "sticker" with sticker attachment details in the sticker field.

            - `CustomEmoji string`

              Custom emoji if type is "custom", null otherwise

            - `Sticker ReactionSticker`

              Sticker attachment details when reaction_type is "sticker". Null for non-sticker reactions.

          - `Type LinkPartResponseType`

            Indicates this is a rich link preview part

            - `const LinkPartResponseTypeLink LinkPartResponseType = "link"`

          - `Value string`

            The URL

      - `SentAt Time`

        When the message was actually sent (null if still queued)

      - `DeliveredAt Time`

        When the message was delivered

      - `Effect MessageEffect`

        iMessage effect applied to a message (screen or bubble effect)

        - `Name string`

          Name of the effect. Common values:

          - Screen effects: confetti, fireworks, lasers, sparkles, celebration, hearts, love, balloons, happy_birthday, echo, spotlight
          - Bubble effects: slam, loud, gentle, invisible

        - `Type MessageEffectType`

          Type of effect

          - `const MessageEffectTypeScreen MessageEffectType = "screen"`

          - `const MessageEffectTypeBubble MessageEffectType = "bubble"`

      - `FromHandle ChatHandle`

        The sender of this message as a full handle object

      - `PreferredService ServiceType`

        Messaging service type

      - `ReplyTo ReplyTo`

        Indicates this message is a threaded reply to another message

        - `MessageID string`

          The ID of the message to reply to

        - `PartIndex int64`

          The specific message part to reply to (0-based index).
          Defaults to 0 (first part) if not provided.
          Use this when replying to a specific part of a multipart message.

      - `Service ServiceType`

        Messaging service type

    - `Service ServiceType`

      Messaging service type

### Example

```go
package main

import (
  "context"
  "fmt"

  "github.com/linq-team/linq-go"
  "github.com/linq-team/linq-go/option"
)

func main() {
  client := linqgo.NewClient(
    option.WithAPIKey("My API Key"),
  )
  chat, err := client.Chats.New(context.TODO(), linqgo.ChatNewParams{
    From: "+12052535597",
    Message: linqgo.MessageContentParam{
      Parts: []linqgo.MessageContentPartUnionParam{linqgo.MessageContentPartUnionParam{
        OfText: &linqgo.TextPartParam{
          Type: linqgo.TextPartTypeText,
          Value: "Hello! How can I help you today?",
        },
      }},
    },
    To: []string{"+12052532136"},
  })
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", chat.Chat)
}
```

#### Response

```json
{
  "chat": {
    "id": "94c6bf33-31d9-40e3-a0e9-f94250ecedb9",
    "display_name": "+14155551234, +14155559876",
    "handles": [
      {
        "id": "550e8400-e29b-41d4-a716-446655440010",
        "handle": "+14155551234",
        "joined_at": "2025-05-21T15:30:00.000Z",
        "service": "iMessage",
        "is_me": true,
        "left_at": "2019-12-27T18:11:19.117Z",
        "status": "active"
      },
      {
        "id": "550e8400-e29b-41d4-a716-446655440011",
        "handle": "+14155559876",
        "joined_at": "2025-05-21T15:30:00.000Z",
        "service": "iMessage",
        "is_me": false,
        "left_at": "2019-12-27T18:11:19.117Z",
        "status": "active"
      }
    ],
    "health_status": {
      "doc_url": "https://docs.linqapp.com/guides/chats/chat-health#at-risk",
      "status": "AT_RISK",
      "updated_at": "2026-05-01T18:28:25Z"
    },
    "is_group": false,
    "message": {
      "id": "69a37c7d-af4f-4b5e-af42-e28e98ce873a",
      "created_at": "2025-10-23T13:07:55.019-05:00",
      "delivery_status": "pending",
      "is_read": false,
      "parts": [
        {
          "reactions": [
            {
              "handle": {
                "id": "69a37c7d-af4f-4b5e-af42-e28e98ce873a",
                "handle": "+15551234567",
                "joined_at": "2025-05-21T15:30:00.000-05:00",
                "service": "iMessage",
                "is_me": false,
                "left_at": "2019-12-27T18:11:19.117Z",
                "status": "active"
              },
              "is_me": false,
              "type": "love",
              "custom_emoji": null,
              "sticker": {
                "file_name": "sticker.png",
                "height": 420,
                "mime_type": "image/png",
                "url": "https://cdn.linqapp.com/attachments/a1b2c3d4/sticker.png?signature=...",
                "width": 420
              }
            }
          ],
          "type": "text",
          "value": "Hello!",
          "text_decorations": [
            {
              "range": [
                0,
                5
              ],
              "animation": "shake",
              "style": "bold"
            }
          ]
        }
      ],
      "sent_at": null,
      "delivered_at": null,
      "effect": {
        "name": "confetti",
        "type": "screen"
      },
      "from_handle": {
        "id": "550e8400-e29b-41d4-a716-446655440000",
        "handle": "+15551234567",
        "joined_at": "2025-05-21T15:30:00.000-05:00",
        "service": "iMessage",
        "is_me": false,
        "left_at": "2019-12-27T18:11:19.117Z",
        "status": "active"
      },
      "preferred_service": "iMessage",
      "reply_to": {
        "message_id": "550e8400-e29b-41d4-a716-446655440000",
        "part_index": 0
      },
      "service": "iMessage"
    },
    "service": "iMessage"
  }
}
```
