> ## Documentation Index
> Fetch the complete documentation index at: https://docs.blujay.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Leave a group chat

> Removes one of your Blujay numbers from an active iMessage group chat. If more than one of your numbers is in the group, set `from_phone_number_id` to choose which one leaves; otherwise you can send an empty body.

Errors worth handling (all `409`):
- `LAST_PHONE_NUMBER_IN_GROUP`: this is your only number in the group, so it can't leave.
- `GROUP_MINIMUM_PARTICIPANTS`: leaving would leave the group with fewer than three members.
- `PHONE_NUMBER_HAS_SCHEDULED_MESSAGES`: the number has scheduled messages for this group.
- `PHONE_NUMBER_HAS_MESSAGES_SENDING`: the number still has messages sending in this group. Retry once they finish.




## OpenAPI

````yaml /api-reference/openapi.yaml post /v1/chats/{chat_id}/leave
openapi: 3.1.0
info:
  title: Blujay API
  version: 1.0.0
  description: >-
    The Blujay API lets you send and receive iMessage, RCS and SMS messages from
    your

    Blujay phone numbers, manage contacts, and receive real-time webhooks.


    Every response uses the same JSON envelope and carries a `trace_id` you can
    share

    with support. Authenticate with your workspace API key.
servers:
  - url: https://api.blujay.io
    description: Production
security:
  - PublicApiKey: []
tags:
  - name: Auth
    description: Check which workspace and credential a request is using.
  - name: Chats
    description: >-
      Direct and group conversations between your Blujay numbers and your
      contacts.
  - name: Messages
    description: Send, read, edit, unsend and retry messages.
  - name: Phone Numbers
    description: >-
      Your Blujay numbers, whether each can send right now, and their live
      sending limits.
  - name: Capability
    description: >-
      Check whether a phone number can be reached by iMessage, RCS or SMS before
      you send.
  - name: Contacts
    description: Create, find, update, tag, assign and opt out contacts.
  - name: vCards
    description: >-
      Saved contact cards that you can send in a message. Recipients get a
      native contact card over iMessage, SMS or RCS.
  - name: Team Members
    description: People in your workspace you can assign contacts to.
  - name: Workflows
    description: Enroll contacts in workflows you start manually.
  - name: Attachments
    description: >-
      Upload files once and reuse them in messages, or download files from
      messages.
  - name: Webhooks
    description: Subscribe to events, inspect delivery attempts and verify signatures.
paths:
  /v1/chats/{chat_id}/leave:
    post:
      tags:
        - Chats
      summary: Leave a group chat
      description: >
        Removes one of your Blujay numbers from an active iMessage group chat.
        If more than one of your numbers is in the group, set
        `from_phone_number_id` to choose which one leaves; otherwise you can
        send an empty body.


        Errors worth handling (all `409`):

        - `LAST_PHONE_NUMBER_IN_GROUP`: this is your only number in the group,
        so it can't leave.

        - `GROUP_MINIMUM_PARTICIPANTS`: leaving would leave the group with fewer
        than three members.

        - `PHONE_NUMBER_HAS_SCHEDULED_MESSAGES`: the number has scheduled
        messages for this group.

        - `PHONE_NUMBER_HAS_MESSAGES_SENDING`: the number still has messages
        sending in this group. Retry once they finish.
      operationId: leavePublicGroupChat
      parameters:
        - $ref: '#/components/parameters/ChatId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicGroupLeaveInput'
            examples:
              selectedLine:
                value:
                  from_phone_number_id: phone_abc123
              inferOnlyActiveLine:
                value: {}
      responses:
        '202':
          description: The leave was accepted.
          headers:
            X-Trace-ID:
              $ref: '#/components/headers/XTraceID'
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/SuccessEnvelope'
                  - type: object
                    required:
                      - data
                    properties:
                      data:
                        $ref: '#/components/schemas/AcceptedChatLeave'
              examples:
                accepted:
                  value:
                    status: success
                    data:
                      chat_id: chat_abc123
                      operation: chat_leave
                      status: accepted
                      from_phone_number_id: phone_abc123
                    trace_id: trc_8f2a1c0e4b7d
                    timestamp: '2026-10-14T22:00:00.000Z'
        '400':
          description: >-
            The request is invalid, more than one of your numbers is in the
            group and `from_phone_number_id` is missing
            (`PHONE_NUMBER_REQUIRED`), or the chat isn't an active iMessage
            group (`UNSUPPORTED_CHAT_OPERATION`).
          headers:
            X-Trace-ID:
              $ref: '#/components/headers/XTraceID'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: The number can't leave the group right now. See the error `code`.
          headers:
            X-Trace-ID:
              $ref: '#/components/headers/XTraceID'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                lastPhoneNumberInGroup:
                  value:
                    status: error
                    error:
                      code: LAST_PHONE_NUMBER_IN_GROUP
                      message: >-
                        Cannot leave this group because it has only one Blujay
                        phone number
                      type: validation
                      http_status: 409
                      retryable: false
                      doc_url: https://docs.blujay.io/errors/last-phone-number-in-group
                      details: []
                    trace_id: trc_8f2a1c0e4b7d
                    timestamp: '2026-10-14T22:00:00.000Z'
                groupMinimumParticipants:
                  value:
                    status: error
                    error:
                      code: GROUP_MINIMUM_PARTICIPANTS
                      message: >-
                        Cannot leave this group because it would fall below
                        three participants
                      type: validation
                      http_status: 409
                      retryable: false
                      doc_url: https://docs.blujay.io/errors/group-minimum-participants
                      details: []
                    trace_id: trc_8f2a1c0e4b7d
                    timestamp: '2026-10-14T22:00:00.000Z'
                phoneNumberHasMessagesSending:
                  value:
                    status: error
                    error:
                      code: PHONE_NUMBER_HAS_MESSAGES_SENDING
                      message: >-
                        Cannot leave this group while outbound messages are
                        still sending from this phone number
                      type: validation
                      http_status: 409
                      retryable: true
                      doc_url: >-
                        https://docs.blujay.io/errors/phone-number-has-messages-sending
                      details: []
                    trace_id: trc_8f2a1c0e4b7d
                    timestamp: '2026-10-14T22:00:00.000Z'
        '503':
          $ref: '#/components/responses/PhoneNumberUnavailable'
      security:
        - PublicApiKey: []
components:
  parameters:
    ChatId:
      name: chat_id
      in: path
      required: true
      schema:
        $ref: '#/components/schemas/ChatId'
  schemas:
    PublicGroupLeaveInput:
      type: object
      additionalProperties: false
      properties:
        from_phone_number_id:
          $ref: '#/components/schemas/PhoneNumberId'
      description: >-
        `from_phone_number_id` picks which of your numbers leaves. It is
        optional when only one of your numbers is in the group, and required
        when more than one is.
    SuccessEnvelope:
      type: object
      description: Wraps every successful response. The result is in `data`.
      required:
        - status
        - trace_id
        - timestamp
      properties:
        status:
          type: string
          enum:
            - success
        trace_id:
          $ref: '#/components/schemas/TraceId'
        timestamp:
          type: string
          examples:
            - '2026-10-14T17:01:00.000Z'
          format: date-time
        client_request_id:
          type: string
          description: >-
            Your `X-Request-ID` header value, echoed back when you send one. Not
            included on the send responses (`POST /v1/chats`, `POST
            /v1/chats/{chat_id}/messages`, `POST
            /v1/messages/{message_id}/retry`); keep your own mapping from your
            request ID to the returned message ID there.
    AcceptedChatLeave:
      type: object
      additionalProperties: false
      required:
        - chat_id
        - operation
        - status
        - from_phone_number_id
      properties:
        chat_id:
          $ref: '#/components/schemas/ChatId'
        operation:
          type: string
          enum:
            - chat_leave
        status:
          const: accepted
        from_phone_number_id:
          $ref: '#/components/schemas/PhoneNumberId'
    ErrorEnvelope:
      type: object
      description: >-
        Wraps every error response. Branch on `error.code`, and include
        `trace_id` when you contact support.
      required:
        - status
        - error
        - trace_id
        - timestamp
      properties:
        status:
          const: error
        error:
          $ref: '#/components/schemas/PublicError'
        trace_id:
          $ref: '#/components/schemas/TraceId'
        timestamp:
          type: string
          examples:
            - '2026-10-14T17:01:00.000Z'
          format: date-time
        client_request_id:
          type: string
          description: Your `X-Request-ID` header value, echoed back when you send one.
    ChatId:
      type: string
      examples:
        - chat_abc123
      pattern: ^chat_[A-Za-z0-9_-]+$
    PhoneNumberId:
      type: string
      examples:
        - phone_abc123
      pattern: ^phone_[A-Za-z0-9_-]+$
    TraceId:
      type: string
      examples:
        - trc_8f2a1c0e4b7d
      pattern: ^trc_[A-Za-z0-9_-]+$
    PublicError:
      type: object
      required:
        - code
        - message
        - type
        - http_status
        - retryable
        - doc_url
        - details
      properties:
        code:
          type: string
          description: Stable, machine-readable error code. Branch on this value.
          examples:
            - RATE_LIMIT_EXCEEDED
            - QUEUE_UNAVAILABLE
            - FEATURE_NOT_ENABLED
        message:
          type: string
          description: Human-readable explanation. It can change, so don't parse it.
        type:
          type: string
          description: Broad error category.
          examples:
            - validation
            - auth
            - idempotency
            - rate_limit
            - queue
            - feature_gate
        http_status:
          type: integer
          description: The HTTP status code of the response.
          enum:
            - 400
            - 401
            - 403
            - 404
            - 409
            - 413
            - 415
            - 422
            - 429
            - 500
            - 502
            - 503
        retryable:
          type: boolean
          description: Whether sending the same request again later can succeed.
        doc_url:
          type: string
          format: uri
          description: Link to documentation for this error code.
        details:
          type: array
          description: >-
            Extra structured context, such as the fields that failed validation
            or the limit you hit.
          items:
            type: object
            additionalProperties: true
        retry_after:
          type: integer
          minimum: 1
          description: >-
            Seconds to wait before retrying. Also sent as the `Retry-After`
            header.
        reset_at:
          type: string
          examples:
            - '2026-10-14T17:01:00.000Z'
          format: date-time
          description: When the limit you hit resets.
  headers:
    XTraceID:
      description: >-
        Unique ID for this request. It matches `trace_id` in the body. Include
        it when you contact Blujay support.
      schema:
        $ref: '#/components/schemas/TraceId'
    RetryAfter:
      description: Seconds to wait before retrying.
      schema:
        type: integer
        minimum: 1
  responses:
    NotFound:
      description: The resource doesn't exist or isn't in your workspace.
      headers:
        X-Trace-ID:
          $ref: '#/components/headers/XTraceID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    PhoneNumberUnavailable:
      description: >-
        The messaging network couldn't accept the request right now
        (`PHONE_NUMBER_UNAVAILABLE`). Nothing was changed. Retry after
        `Retry-After` seconds.
      headers:
        X-Trace-ID:
          $ref: '#/components/headers/XTraceID'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          examples:
            phoneNumberUnavailable:
              value:
                status: error
                error:
                  code: PHONE_NUMBER_UNAVAILABLE
                  message: This service is temporarily unavailable
                  type: phone_number
                  http_status: 503
                  retryable: true
                  doc_url: https://docs.blujay.io/errors/phone-number-unavailable
                  details: []
                  retry_after: 30
                trace_id: trc_8f2a1c0e4b7d
                timestamp: '2026-10-14T00:00:00.000Z'
  securitySchemes:
    PublicApiKey:
      type: http
      scheme: bearer
      bearerFormat: blu_...
      description: >
        Your workspace API key, sent as `Authorization: Bearer blu_...`.
        Workspace admins can find it in the Blujay app under **API**.


        An API key has full access to your workspace and works on every
        endpoint. There is no test mode: every key sends real messages and
        changes real data, so keep it secret and use it only from your server.


        Each API key can make 600 read requests and 120 write requests per
        minute, plus 60 attachment requests per minute. Over a limit you get
        `429 RATE_LIMIT_EXCEEDED` with `Retry-After`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.