Ringover Messages API

Manage messages within conversations. List messages, archive and unarchive individual messages. **Permissions required:** - **Read** (`Conversations R`): List messages in a conversation. - **Write** (`Conversations W`): Archive/unarchive messages. **Monitoring impact:** - *OFF*: Returns non-archived messages from your own conversations. - *ON*: Returns all messages including archived ones. Enables level-2 archiving (permanent) for messages — requires Monitoring ON.

Operations 4

GET /conversations/{convId}/messages List messages from a conversation #
POST /conversations/{convId}/messages/{messageId}/archive Archive a message (level 1 — soft) #
DELETE /conversations/{convId}/messages/{messageId}/archive Permanently archive a message (level 2) #
POST /conversations/{convId}/messages/{messageId}/unarchive Unarchive a message #

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/ringover:ringover-messages-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

ringover-messages-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  license:
    name: Proprietary – Contact us for usage terms
    url: https://www.ringover.com/contact
  description: '# Ringover Public API


    Welcome to the Ringover Public API. This RESTful API lets you integrate Ringover telephony, messaging, contacts, and AI analytics into your applications. ## Base URL


    | Region | Base URL |

    |--------|----------|

    | Europe | `https://public-api.ringover.com/v2` |

    | United States | `https://public-api-us.ringover.com/v2` |


    ## Authentication


    All requests must include your API key in the `Authorization` header:


    ```

    Authorization: your-api-key-here

    ```


    To create an API key:

    1. Open the Ringover Dashboard. 2. Navigate to **Developer > API Keys**. 3. Click **Create an API key**, select a user, and set a label. 4. Configure the permissions for this key (see Permissions below). ## Permissions


    Each API key is associated with **7 permission categories**, each configurable as **None**, **Read**, **Write**, or **Read+Write**:


    | Category | Controls access to |

    |----------|-------------------|

    | **Calls** | Call history, archives, live call controls, callbacks |

    | **Contacts** | Contact CRUD and phone number management |

    | **Users** | User listing, plannings, presences, groups, user blacklists |

    | **Numbers** | Phone number listing, team blacklist |

    | **IVRs** | IVR/scenario listing, tag management |

    | **Conversations** | SMS/Chat conversations, messages, SMS sending |

    | **Empower** | AI call analysis, summaries, moments, analytics |


    ### The Monitoring flag (Supervision)


    In addition to R/W permissions, each API key has a **Monitoring** toggle that controls the **scope** of data returned:


    | Monitoring | Effect |

    |------------|--------|

    | **OFF** | Your permissions give access to **your own data only** (your calls, your numbers, your conversations…) |

    | **ON** | Your permissions give access to **the entire team''s data** (all users, all calls, all conversations…) |


    Monitoring does **not** grant additional permissions — it widens the scope of existing ones. Some routes **require** Monitoring to be enabled and will return `401` without it. Conversely, some routes may ignore the Monitoring flag entirely or apply it differently — unless stated otherwise in the endpoint documentation, the default behavior described above applies. > Each endpoint in this documentation specifies its exact permission and monitoring requirements. ### Special cases


    - **Campaigns, Tasks, WhatsApp**: These routes do not require specific token permissions. A valid API key is sufficient. - **Empower**: Uses its own role system (Admin / Supervisor / User) in addition to the Empower R/W permission. - **Transcriptions**: Access is controlled by a team-level setting, not by the token permissions. - **Conferences**: All conference routes require Monitoring enabled. ## Rate Limiting


    A **2-request-per-second** rate limit is applied per API key. Exceeding this limit returns `429 Too Many Requests`. ## Pagination


    List endpoints support offset-based pagination with two parameters:

    - `limit_count`: Maximum number of items to return (default: 100, max varies by endpoint). - `limit_offset`: Number of items to skip (default: 0). Some call-related endpoints also support cursor-based pagination via `last_id_returned`. ## Error Responses


    | HTTP Code | Meaning |

    |-----------|---------|

    | `400` | Bad request — invalid parameters or body |

    | `401` | Unauthorized — invalid/expired API key, or access denied by permission/monitoring checks on most endpoints |

    | `403` | Forbidden — authenticated request refused by specific endpoint logic (notably some Empower routes) or upstream forwarded services |

    | `402` | Payment required — feature not available on your plan |

    | `404` | Resource not found |

    | `429` | Rate limit exceeded |

    | `500` | Internal server error |


    ## SCIM 2.0 Provisioning


    Ringover exposes a **SCIM 2.0** server (RFC 7643 / RFC 7644) for automated user and group provisioning from your identity provider (Okta, Microsoft Entra ID, …). It reuses the **same API key** as the REST API (`Authorization` header).'
  version: 2.1.0
  title: Ringover Public Messages API
  x-logo:
    url: https://webcdn.ringover.com/app/img/misc/logo_app_redoc.png
    backgroundColor: '#FAFAFA'
    altText: Ringover Logo
  termsOfService: https://ringover.com/terms/
  contact:
    email: support@ringover.com
servers:
- url: https://public-api.ringover.com/v2
  description: Production server (Europe)
- url: https://public-api-us.ringover.com/v2
  description: Production server (United States)
security:
- Authorization: []
tags:
- name: Messages
  description: 'Manage messages within conversations. List messages, archive and unarchive individual messages.


    **Permissions required:**

    - **Read** (`Conversations R`): List messages in a conversation.

    - **Write** (`Conversations W`): Archive/unarchive messages.


    **Monitoring impact:**

    - *OFF*: Returns non-archived messages from your own conversations.

    - *ON*: Returns all messages including archived ones. Enables level-2 archiving (permanent) for messages — requires Monitoring ON.'
paths:
  /conversations/{convId}/messages:
    get:
      operationId: getConversationsConvidMessages
      tags:
      - Messages
      summary: List messages from a conversation
      x-permissions:
        required: Conversations R
        monitoring: optional
        monitoring-off: Returns only non-archived messages.
        monitoring-on: Returns all messages, including archived ones.
      description: 'Returns the first 100 messages in a specific conversation by default. Use `limit_count` and `last_id_returned` to paginate through results.


        **Permission:** `Conversations Read` required.


        **Monitoring:** Optional. With Monitoring **OFF**, only non-archived messages are returned. With Monitoring **ON**, all messages are returned including archived ones (you can also use the `display_archived` parameter).'
      parameters:
      - name: limit_count
        in: query
        description: 'Maximum number of results to return per page. Default: server-defined.'
        schema:
          type: integer
          format: int64
          maximum: 1000
          example: 100
      - name: last_id_returned
        in: query
        description: Last id returned (To avoid duplicates we use it instead of limit_offset)
        schema:
          type: integer
          format: int64
          example: 0
      - name: display_archived
        in: query
        description: A boolean to enable the archive display
        schema:
          type: boolean
          example: false
      - name: convId
        in: path
        description: The conversation ID
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Successful operation — the message list is returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/conversation_message_list'
        '204':
          description: No messages found in this conversation.
        '400':
          description: Invalid query parameters or conversation ID.
        '401':
          description: Unauthorized — missing or invalid API token, or missing `Conversations Read` permission.
        '404':
          description: Conversation not found — no conversation matches the provided ID.
        '500':
          description: Internal server error.
  /conversations/{convId}/messages/{messageId}/archive:
    post:
      tags:
      - Messages
      operationId: conversationPostMessageArchive
      summary: Archive a message (level 1 — soft)
      x-permissions:
        required: Conversations W
        monitoring: none
      description: 'Performs a **level-1 (soft) archive** on a specific message within a conversation. This is a reversible operation — the message can be restored using the `/unarchive` endpoint.


        For permanent deletion, use `DELETE /conversations/{convId}/messages/{messageId}/archive` (level-2 archive), which requires Monitoring to be enabled.


        **Permission:** `Conversations Write` required.


        **Monitoring:** No impact.'
      parameters:
      - name: convId
        in: path
        description: The identifier of the conversation
        required: true
        schema:
          type: integer
          format: int64
          example: 123456
      - name: messageId
        in: path
        description: The identifier of the message
        required: true
        schema:
          type: integer
          format: int64
          example: 123456
      responses:
        '200':
          description: Message successfully archived (level 1 — reversible).
        '400':
          description: Invalid conversation or message ID format.
        '401':
          description: Unauthorized — missing or invalid API token, or missing `Conversations Write` permission.
        '404':
          description: Conversation or message not found.
        '500':
          description: Internal server error.
    delete:
      tags:
      - Messages
      operationId: conversationDeleteMessageArchive
      summary: Permanently archive a message (level 2)
      x-permissions:
        required: Conversations W
        monitoring: required
      description: 'Performs a **level-2 (permanent) archive** on a specific message within a conversation. This operation is **irreversible** and requires Monitoring to be enabled on your API key.


        Unlike level-1 archive (`POST .../archive`), which is soft and reversible via `/unarchive`, level-2 archive permanently removes the message. Returns `401` if Monitoring is OFF.


        **Permission:** `Conversations Write` required.


        **Monitoring:** **Required.** Returns `401` if Monitoring is OFF.'
      parameters:
      - name: convId
        in: path
        description: The conversation ID
        required: true
        schema:
          type: integer
      - name: messageId
        in: path
        description: The message ID
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Message permanently archived (level 2 — irreversible).
        '400':
          description: Invalid conversation or message ID format.
        '401':
          description: Unauthorized — missing or invalid API token, missing `Conversations Write` permission, or Monitoring is not enabled (required for level-2 archive).
        '404':
          description: Conversation or message not found.
  /conversations/{convId}/messages/{messageId}/unarchive:
    post:
      tags:
      - Messages
      operationId: conversationMessageUnarchive
      summary: Unarchive a message
      x-permissions:
        required: Conversations W
        monitoring: none
      description: 'Restores a previously level-1 archived message. Only messages archived with `POST .../archive` can be unarchived. Level-2 archived messages (via `DELETE`) are permanently removed and cannot be restored.


        **Permission:** `Conversations Write` required.


        **Monitoring:** No impact.'
      parameters:
      - name: convId
        in: path
        description: The identifier of the conversation
        required: true
        schema:
          type: integer
          format: int64
          example: 123456
      - name: messageId
        in: path
        description: The identifier of the message
        required: true
        schema:
          type: integer
          format: int64
          example: 123456
      responses:
        '200':
          description: Message successfully unarchived.
        '400':
          description: Invalid conversation or message ID format.
        '401':
          description: Unauthorized — missing or invalid API token, or missing `Conversations Write` permission.
        '404':
          description: Conversation or message not found, or the message was permanently archived (level 2).
        '500':
          description: Internal server error.
components:
  schemas:
    user_light:
      type: object
      properties:
        user_id:
          type: integer
          format: int64
          description: The user identifier
          example: 123456
        team_id:
          type: integer
          format: int64
          description: The team identifier of the user
          example: 123456
        initial:
          type: string
          description: The initials of the user
          example: PM
        color:
          type: string
          example: 3CC8C8
        firstname:
          type: string
          description: The firstname of the user
          example: Pauline
        lastname:
          type: string
          description: The lastname of the user
          example: Martin
        company:
          type: string
          description: The company of the user
          example: Ringover
        email:
          type: string
          description: The email of the user
          example: pauline.martin@ringover.com
        picture:
          type: string
          description: The picture of the user
          example: https://cdn77.ringover.com/img/users/default.jpg
        concat_name:
          type: string
          example: Pauline Martin
    contact:
      type: object
      properties:
        contact_id:
          type: integer
          format: int64
          example: 654321
        is_shared:
          type: boolean
          example: true
        im_owner:
          type: string
        social_service:
          type:
          - string
          - 'null'
          example: null
        social_service_id:
          type: string
          example: 00P7U000015Ei75YBX
        social_profile_url:
          type:
          - string
          - 'null'
          example: null
        social_data:
          type:
          - string
          - 'null'
          example: null
        firstname:
          type: string
          example: John
        lastname:
          type: string
          example: Do
        company:
          type: string
          example: DoeCompany
        concat_name:
          type: string
          example: John Doe
        color:
          type: string
          example: 3CC8C8
        initial:
          type: string
          example: JD
        profile_picture:
          type:
          - string
          - 'null'
          example: null
        creation_date:
          type: string
          format: date-time
          example: '2018-08-12T12:12:40.53Z'
        numbers:
          type:
          - array
          - 'null'
          items:
            type: integer
            format: uint64
            example: 331797500010
    message:
      type: object
      properties:
        message_id:
          type: integer
          format: int64
          example: 11223344
        mdr_uuid:
          type: string
          description: is displayed for external conversations
        thread:
          type: object
          properties:
            thread_uuid:
              type: string
            conversation_id_linked:
              type: integer
            conversation_sms_id_linked:
              type: integer
            nb_response:
              type: integer
            buffer_section:
              type: integer
        conversation_id:
          type: integer
        conversation_user_id:
          type: integer
        user:
          $ref: '#/components/schemas/user_light'
        contact:
          $ref: '#/components/schemas/contact'
        number:
          $ref: '#/components/schemas/format_number'
        buffer:
          type: string
          example: Hello World
          description: Content of the message
        total_price:
          type: integer
          description: Is `null` if the conversation is internal
        total_plan:
          type: integer
          description: Is `null` if the conversation is internal
        is_failed:
          type: boolean
          example: false
        nb_fragments:
          type: integer
          description: Depends on the number of characters sent
        direction:
          type:
          - string
          - 'null'
          enum:
          - IN
          - OUT
          example: IN
        is_archived:
          type: boolean
          example: false
        archive_date:
          type: string
          format: date-time
          example: '2019-03-11T12:20:50.52Z'
        creation_date:
          type: string
          format: date-time
          example: '2018-12-21T12:20:50.52Z'
        update_date:
          type: string
          format: date-time
          example: '2018-12-21T12:20:50.52Z'
    conversation_message_list:
      type: object
      properties:
        conversation_id:
          type: integer
          format: int64
          example: 222111
        is_sms_write:
          type: boolean
          example: false
          description: Allows to send SMS
        type:
          type: string
          enum:
          - INTERNAL
          - EXTERNAL
          - COLLABORATIVE
          example: INTERNAL
        name:
          type: string
          example: My favorite conversation
        purpose:
          type: string
          example: Description of my favorite conversation
        unread_messages_count:
          type: integer
          format: int64
        last_id_returned_setted:
          type: integer
          format: int64
          example: 0
        limit_count_setted:
          type: integer
          format: int64
          example: 1
        total_messages_count:
          type: integer
          format: int64
          example: 8
        message_list_count:
          type: integer
          format: int64
          example: 54
        message_list:
          type: array
          items:
            $ref: '#/components/schemas/message'
        is_archived:
          type: boolean
          example: false
          description: Archived flag
        creation_date:
          type: string
          format: date-time
          example: '2018-06-12T23:23:40.99Z'
        update_date:
          type: string
          format: date-time
          example: '2019-02-12T12:20:50.52Z'
    format_number:
      type: object
      properties:
        raw:
          type: integer
          format: int64
          example: 184800000
        country_code:
          type: string
          example: '33'
        country:
          type: string
          example: FR
        e164:
          type: string
          example: '+33184800000'
        international:
          type: string
          example: +33 1 84 80 00 00
        international_alt:
          type: string
          example: '33184800000'
        national:
          type: string
          example: 01 84 80 00 00
        national_alt:
          type: string
          example: 0184800000
        rfc3966:
          type: string
          example: tel:+33-1-84-80-00-00
        is_short_code:
          type: boolean
          example: false
  securitySchemes:
    Authorization:
      description: "We use API keys for authentication to authorize API requests. First, you need to create a public access token (API key) and select the appropriate rights for each user. To do so:\n  1. Open the Ringover Dashboard.\n  2. Go to the **Developer** section.\n  3. Click the **Create an API key** button.\n  4. Select a user in the drop-down menu and enter a label for the key and click the **Create** button.\n  5. Click the **Edit** button corresponding to the API key and select the appropriate rights.\n\nOnce you've created a public access token, you can use it in the `Authorization` header to authenticate your HTTP request.\n\n```\nAuthorization: <your-public-token>\n```\n\nThis is the **recommended authentication method** and the only one supported by the REST and SCIM endpoints.\n"
      type: apiKey
      name: Authorization
      in: header
    AuthorizationQuery:
      description: '**Alternative authentication method, only available on the MCP endpoint (`/mcp`).**


        Pass your Public API token via the `token` query string parameter:


        ```

        POST /mcp?token=<your-public-token>

        ```


        Useful for clients (no-code platforms, browser tools, etc.) that cannot set custom HTTP headers.


        See the **mcp** tag for details on the three accepted authentication sources and their precedence.

        '
      type: apiKey
      name: token
      in: query
    AuthorizationPath:
      description: '**Alternative authentication method, only available on the MCP endpoint (`/mcp/{token}`).**


        Pass your Public API token directly inside the URL path:


        ```

        POST /mcp/<your-public-token>

        ```


        Most permissive variant — works with any HTTP client, including those that strip custom headers and query strings.


        > ⚠️ The token appears in URLs and is therefore likely to be logged by proxies, browsers and access logs. Prefer the `Authorization` header whenever your client supports it, and rotate any token that may have leaked.


        OpenAPI 3.0 does not support `apiKey` in `path`, so this scheme is declared in `query` for tooling compatibility — the actual transport is the URL path. See the **mcp** tag for details.

        '
      type: apiKey
      name: token
      in: query
x-tagGroups:
- name: Ringover Public API
  tags:
  - How to paginate?
  - teams
  - groups
  - users
  - numbers
  - ivrs
  - tags
  - conferences
  - calls
  - campaigns
  - channels
  - contacts
  - conversations
  - messages
  - sms
  - profiles
  - presences
  - blacklist
  - webhook
  - callbacks
  - surveys
  - snoozes
  - transcriptions
  - cdn
  - empower
  - whatsapp
  - task
  - mcp
- name: SCIM 2.0 Provisioning
  tags:
  - scim