Blink Chats API

Create, read, update and delete chats.

Operations 5

POST /chats Create a new chat #
GET /chats/inbox List the caller's inbox #
GET /chats/{chatId} Look up a single chat #
PATCH /chats/{chatId} Update a chat's metadata #
DELETE /chats/{chatId} Delete a chat #

Specifications

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/joinblink-com:joinblink-com-chats-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

joinblink-com-chats-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Blink Chat Chats API
  version: 1.1.0
  description: 'The Blink Chat API lets integrations create and manage chats, control who has access to them and who is in them, and send, read, edit, react to and delete messages on behalf of an app.

    ## Concepts

    All calls are made from an **app identity**; every endpoint acts on behalf of that app.

    A **chat** is a **private** thread of communication: the users and apps individually granted access to it take part, and nobody else.

    **Access and membership are separate.** *Access* is permission to be in a chat, given by a **grant** and listed in the chat''s **grants** collection. *Membership* is whether a principal has actually joined: members appear in the chat''s member listing and the chat reaches their inbox.

    The two usually move together — granting a user or app access also joins them, and revoking it removes them — but membership can change on its own: a member may leave, or be removed by an administrator, while keeping their grant, and may then rejoin with `:join`.

    A **member** is a user or app currently in a chat. Each member carries their `role` (`admin` or `member`), their `membership` state, and `access_via`, the grant giving them access. The caller''s own row comes back with an `@type` of `me` and carries the favourite flag and inbox state that belong to them alone.

    A **message** carries a structured **body** (Markdown, and other variants), an optional set of file **attachments**, a **sender**, and any **reactions** recorded against it.

    **Attachments** - message files and chat icons are referenced by the id of an existing attachment. This API does not yet expose a way to upload attachments.

    ## Pagination

    List endpoints return a page of results together with a `page` object. To fetch the next page, pass the returned `next_cursor` value back in the `cursor` query parameter.

    ## Errors

    Errors are returned as RFC 9457 problem documents (`application/problem+json`) using the `ProblemDetail` schema.'
servers:
- url: https://api.joinblink.com/api/platform
  description: Production API. Replace with the base URL for your environment.
security:
- bearerAuth: []
tags:
- name: Chats
  description: Create, read, update and delete chats.
paths:
  /chats:
    post:
      tags:
      - Chats
      summary: Create a new chat
      operationId: createChat
      description: 'Creates a new chat and returns it in full, exactly as a subsequent GET of the chat would.

        `members` states who is in the chat from creation: each named principal is joined outright, on an explicit grant recorded alongside. Nobody else is put in the chat, the creator included, so name the calling app here if it is to take part. At least one member is required.

        Private chats created without a title are unique per set of members: creating another untitled chat with the same members returns the existing chat rather than creating a duplicate. When a title is supplied a new chat is always created. The creator, attributed on the chat''s automatically generated header message, is always the caller''s authenticated identity and never anything in the request body.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateChat'
            examples:
              private:
                summary: Private chat between an app and a user
                value:
                  organisation_id: o-00000000-0000-0000-0000-000000000000
                  title: Shift, 10-14 Aug
                  access_rule:
                    '@type': private
                  members:
                  - '@type': app
                    app_identity_id: aid-00000000-0000-0000-0000-000000000000
                  - '@type': user
                    user_id: u-00000000-0000-0000-0000-000000000000
                  description: Conversation linked to our shifts
                  icon: a-00000000-0000-0000-0000-000000000000
      responses:
        '201':
          description: The chat was created (or the existing untitled chat was returned).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Chat'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
  /chats/inbox:
    get:
      tags:
      - Chats
      summary: List the caller's inbox
      operationId: listChatInbox
      description: 'Returns a page of inbox entries — each pairing a chat with a preview of its most recent message — most-recent-activity first. There is no parameter for whose inbox to read: it is always the caller''s. An app holds no inbox state, so every chat it has joined is in its inbox; a chat it has left is not.'
      parameters:
      - $ref: '#/components/parameters/Size'
      - $ref: '#/components/parameters/Cursor'
      responses:
        '200':
          description: A page of inbox entries.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CursorPageChatInboxEntry'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
  /chats/{chatId}:
    get:
      tags:
      - Chats
      summary: Look up a single chat
      operationId: getChat
      description: Looks up a single chat by its identifier and returns it in full.
      parameters:
      - $ref: '#/components/parameters/ChatId'
      responses:
        '200':
          description: The chat.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Chat'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
    patch:
      tags:
      - Chats
      summary: Update a chat's metadata
      operationId: updateChat
      description: 'Updates the mutable metadata (title, description, icon) of an existing chat, and returns the updated chat in full. Description and icon follow three-state PATCH semantics: omit a field to leave it unchanged, send `null` to clear it, or send a value to set it. The title cannot be cleared.'
      parameters:
      - $ref: '#/components/parameters/ChatId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateChat'
      responses:
        '200':
          description: The updated chat.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Chat'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
    delete:
      tags:
      - Chats
      summary: Delete a chat
      operationId: deleteChat
      description: Deletes a chat along with its members, grants and messages. After deletion the chat can no longer be looked up and will not be returned from any inbox query. For untitled chats the membership-based dedupe entry is also cleared, so a subsequent create call with the same members will produce a fresh chat.
      parameters:
      - $ref: '#/components/parameters/ChatId'
      responses:
        '204':
          description: The chat was deleted. The response body is empty.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
components:
  schemas:
    App:
      type: object
      description: A message sent by an automated app.
      required:
      - '@type'
      properties:
        '@type':
          type: string
          enum:
          - app
          example: app
        app_identity_id:
          type: string
          description: The app that sent the message.
          example: aid-00000000-0000-0000-0000-000000000000
    Private:
      type: object
      description: Gives access only to those individually granted. All access to the chat is by a grant, listed in the chat's grants collection; granting one also joins the principal.
      required:
      - '@type'
      properties:
        '@type':
          type: string
          enum:
          - private
          example: private
    CursorPageChatInboxEntry:
      type: object
      description: A page of chat inbox entries.
      properties:
        content:
          type: array
          items:
            $ref: '#/components/schemas/ChatInboxEntry'
        page:
          $ref: '#/components/schemas/PageMetadata'
    Sender:
      description: The originator of a message. A message read back may have been sent by a user, by a user acting under an alias, by an app, or by the system itself (for membership changes, chat lifecycle events, etc.). Serialised with an `@type` discriminator. When sending a message only the authenticated app may be named as the sender — see `SendMessage`.
      oneOf:
      - $ref: '#/components/schemas/User'
      - $ref: '#/components/schemas/Alias'
      - $ref: '#/components/schemas/App'
      - $ref: '#/components/schemas/System'
      discriminator:
        propertyName: '@type'
        mapping:
          user: '#/components/schemas/User'
          alias: '#/components/schemas/Alias'
          app: '#/components/schemas/App'
          system: '#/components/schemas/System'
    CreateChat:
      type: object
      description: 'Parameters for creating a new chat. `members` states who is in the chat from creation: each named principal is joined outright, on a grant recorded alongside. Nobody else is put in the chat, the creator included, so name the calling app here if it is to take part. At least one member is required.'
      required:
      - organisation_id
      - access_rule
      - members
      properties:
        organisation_id:
          type: string
          description: The organisation that owns the chat.
          example: o-00000000-0000-0000-0000-000000000000
        title:
          type: string
          description: Optional display title for the chat; whitespace alone is not a title. An untitled chat is unique per set of members.
          example: Project Phoenix
        access_rule:
          $ref: '#/components/schemas/AccessRule'
        members:
          type: array
          description: The principals who are in the chat from creation; nobody else is put in the chat, the creator included. At least one is required.
          minItems: 1
          uniqueItems: true
          items:
            $ref: '#/components/schemas/ChatPrincipal'
        description:
          type: string
          description: Optional longer description.
          example: Coordination for the Phoenix rollout
        icon:
          type: string
          description: Optional icon for the chat, given as the id of an existing attachment.
          example: a-00000000-0000-0000-0000-000000000000
    ChatPrincipal:
      description: 'The ''who'' of a member: either a user or an automated app. Serialised with an `@type` discriminator.'
      oneOf:
      - $ref: '#/components/schemas/UserPrincipal'
      - $ref: '#/components/schemas/AppPrincipal'
      discriminator:
        propertyName: '@type'
        mapping:
          user: '#/components/schemas/UserPrincipal'
          app: '#/components/schemas/AppPrincipal'
    ChatInboxEntry:
      type: object
      description: 'An entry in a chat inbox: the chat plus a preview of its most recent message, if any.'
      properties:
        chat:
          $ref: '#/components/schemas/Chat'
        latest_message:
          $ref: '#/components/schemas/MessagePreview'
    Chat:
      type: object
      description: 'A Blink chat: a thread of communication between the users and apps granted access to it.'
      properties:
        chat_id:
          type: string
          description: Globally unique identifier for a chat; a `c-` prefixed string.
          example: c-00000000-0000-0000-0000-000000000000
        organisation_id:
          type: string
          description: The organisation that owns this chat.
          example: o-00000000-0000-0000-0000-000000000000
        access_rule:
          $ref: '#/components/schemas/AccessRule'
        members:
          $ref: '#/components/schemas/MembersPreview'
        title:
          type: string
          description: Optional human-readable title.
          example: Project Phoenix
        description:
          type: string
          description: Optional longer description.
          example: Coordination for the Phoenix rollout
        icon:
          type: string
          description: Optional icon for the chat, given as the id of an existing attachment.
          example: a-00000000-0000-0000-0000-000000000000
    UserPrincipal:
      type: object
      description: A principal backed by a regular user.
      required:
      - '@type'
      - user_id
      properties:
        '@type':
          type: string
          enum:
          - user
          example: user
        user_id:
          type: string
          description: The underlying user.
          example: u-00000000-0000-0000-0000-000000000000
    Alias:
      type: object
      description: A message sent by a user posting under an alias.
      required:
      - '@type'
      properties:
        '@type':
          type: string
          enum:
          - alias
          example: alias
        user_id:
          type: string
          description: The underlying user who sent the message.
          example: u-00000000-0000-0000-0000-000000000000
        alias_id:
          type: string
          description: The alias the user was posting as.
          example: al-00000000-0000-0000-0000-000000000000
    User:
      type: object
      description: A message sent by a regular user, posting under their own identity.
      required:
      - '@type'
      properties:
        '@type':
          type: string
          enum:
          - user
          example: user
        user_id:
          type: string
          description: The user who sent the message.
          example: u-00000000-0000-0000-0000-000000000000
    ProblemDetail:
      type: object
      additionalProperties: true
      description: An RFC 9457 problem document describing why the request failed.
      properties:
        type:
          type: string
          format: uri
          description: Identifies the problem type; `about:blank` when unclassified.
          example: about:blank
        title:
          type: string
          description: Short, human-readable summary of the problem type.
          example: Not Found
        status:
          type: integer
          format: int32
          description: The HTTP status code, repeated in the body.
          example: 404
        detail:
          type: string
          description: Human-readable explanation specific to this occurrence.
          example: Not Found
        instance:
          type: string
          format: uri
          description: The path of the request that failed.
    PageMetadata:
      type: object
      description: Metadata describing a page of a cursor-paginated listing.
      properties:
        size:
          type: integer
          format: int64
          description: The number of items in this page.
        total_elements:
          type:
          - integer
          - 'null'
          format: int64
          description: Total number of items across all pages, when known; otherwise null.
        total_pages:
          type:
          - integer
          - 'null'
          format: int64
          description: Total number of pages, when known; otherwise null.
        has_next:
          type: boolean
          description: Whether a further page is available.
        next_cursor:
          type:
          - string
          - 'null'
          description: Opaque, base64-encoded cursor for the next page; null if there is none.
        prev_cursor:
          type:
          - string
          - 'null'
          description: Opaque, base64-encoded cursor for the previous page; null if there is none.
    System:
      type: object
      description: A message generated by the chat system itself, rather than by any user or app. Used for system notices such as membership changes or chat lifecycle events.
      required:
      - '@type'
      properties:
        '@type':
          type: string
          enum:
          - system
          example: system
    MembersPreview:
      type: object
      description: A bounded sample of a chat's members, so that a listing can name an untitled chat without a call per row. Carries principal identifiers alone, ordered by id and capped at ten; the members listing remains the full answer.
      properties:
        preview:
          type: array
          description: Up to ten of the chat's members, ordered by principal id.
          items:
            $ref: '#/components/schemas/ChatPrincipal'
    MessageId:
      type: object
      description: Globally unique identifier for a message, composed of the owning chat id and the local message id that distinguishes the message within that chat.
      required:
      - chat_id
      - local_message_id
      properties:
        chat_id:
          type: string
          description: Globally unique identifier for a chat; a `c-` prefixed string.
          example: c-00000000-0000-0000-0000-000000000000
        local_message_id:
          type: string
          description: Identifies a message within its enclosing chat; an `m-` prefixed string. Only meaningful in combination with a chat id.
          example: m-00000000-0000-0000-0000-000000000000
    UpdateChat:
      type: object
      description: 'Parameters for updating an existing chat''s metadata. The description and icon follow three-state PATCH semantics: omit a field to leave it unchanged, send `null` to clear it, or send a value to set it. The title cannot be cleared.'
      properties:
        title:
          type: string
          description: New title, if it should be changed; cannot be cleared.
          example: Phoenix — Phase 2
        description:
          type:
          - string
          - 'null'
          description: 'Three-state update for the description: omit to leave unchanged, `null` to clear, value to set.'
          example: Coordination for the Phoenix Phase 2 rollout
        icon:
          type:
          - string
          - 'null'
          description: 'Three-state update for the icon, given as the id of an existing attachment: omit to leave unchanged, `null` to clear, value to set.'
          example: a-00000000-0000-0000-0000-000000000000
    AccessRule:
      description: 'States who *may* be in a chat — not who is. A rule names the predicate that governs the chat and carries nothing of its own: who is in the chat from creation travels beside it, on the create command''s `members`, and access given afterwards lives in the chat''s grants collection. Serialised with an `@type` discriminator.'
      oneOf:
      - $ref: '#/components/schemas/Private'
      discriminator:
        propertyName: '@type'
        mapping:
          private: '#/components/schemas/Private'
    AppPrincipal:
      type: object
      description: A principal backed by an automated app.
      required:
      - '@type'
      - app_identity_id
      properties:
        '@type':
          type: string
          enum:
          - app
          example: app
        app_identity_id:
          type: string
          description: The underlying app identity.
          example: aid-00000000-0000-0000-0000-000000000000
    MessagePreview:
      type: object
      description: A compact view of a message suitable for inbox listings and notifications.
      properties:
        message_id:
          $ref: '#/components/schemas/MessageId'
        sender:
          $ref: '#/components/schemas/Sender'
        created_at:
          type: string
          format: date-time
          description: The instant the message was originally sent.
          example: '2026-05-14T09:30:00Z'
        text:
          type: string
          description: Textual rendering of the message, suitable for previews and notifications.
          example: Hello, world!
  responses:
    Forbidden:
      description: The caller is not permitted to perform this action.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetail'
    Unauthorized:
      description: Authentication is missing or invalid.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetail'
    UnprocessableEntity:
      description: The request was well-formed but failed validation.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetail'
    NotFound:
      description: The requested resource does not exist.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetail'
    BadRequest:
      description: The request body or a parameter could not be read.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetail'
  parameters:
    ChatId:
      name: chatId
      in: path
      required: true
      description: Globally unique identifier for a chat; a `c-` prefixed string.
      schema:
        type: string
        example: c-00000000-0000-0000-0000-000000000000
    Cursor:
      name: cursor
      in: query
      required: false
      description: Pagination cursor token. Pass the `next_cursor` from a previous page to fetch the next one.
      schema:
        type: string
    Size:
      name: size
      in: query
      required: false
      description: The number of items to return per page, between 1 and 150.
      schema:
        type: integer
        format: int32
        default: 50
        minimum: 1
        maximum: 150
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'A bearer token supplied in the `Authorization` header as `Authorization: Bearer <token>`.'
x-provenance:
  method: searched
  source: https://developer.joinblink.com/reference
  harvested: '2026-10-28'
  tool: harvest-readme-openapi.py
  note: Assembled verbatim from the OpenAPI definition ReadMe embeds in each operation page of the provider's developer portal; paths and components merged by API title, nothing authored.
  assembled_from:
  - https://developer.joinblink.com/reference/createchat.md
  - https://developer.joinblink.com/reference/deletechat.md
  - https://developer.joinblink.com/reference/deletemessage.md
  - https://developer.joinblink.com/reference/getchat.md
  - https://developer.joinblink.com/reference/getmessage.md
  - https://developer.joinblink.com/reference/getmessagepermalink.md
  - https://developer.joinblink.com/reference/getmymembership.md
  - https://developer.joinblink.com/reference/grantaccess.md
  - https://developer.joinblink.com/reference/joinchat.md
  - https://developer.joinblink.com/reference/leavechat.md
  - https://developer.joinblink.com/reference/listchatinbox.md
  - https://developer.joinblink.com/reference/listgrants.md
  - https://developer.joinblink.com/reference/listmembers.md
  - https://developer.joinblink.com/reference/listmessages.md
  - https://developer.joinblink.com/reference/removeappmember.md
  - https://developer.joinblink.com/reference/removeusermember.md
  - https://developer.joinblink.com/reference/revokeappaccess.md
  - https://developer.joinblink.com/reference/revokeuseraccess.md
  - https://developer.joinblink.com/reference/sendmessage.md
  - https://developer.joinblink.com/reference/updateappmemberrole.md
  - https://developer.joinblink.com/reference/updatechat.md
  - https://developer.joinblink.com/reference/updatemessage.md
  - https://developer.joinblink.com/reference/updateusermemberrole.md
  merge:
    pages: 23
    deduped: 380
    conflicts_kept_first: 0