---
title: "Send multiple messages"
method: POST
path: "/v1/projects/{project_id}/send_multi"
tags: ["Message"]
---

# Send multiple messages

`POST /v1/projects/{project_id}/send_multi`

## Request

- Base URL: `https://api.telerivet.com`
- URL: `https://api.telerivet.com/v1/projects/{project_id}/send_multi`
- Auth: one of:
  - HTTP basic
  - OAuth 2 (authorization code, authorization URL `https://telerivet.com/oauth/authorize`, token URL `https://api.telerivet.com/oauth/token`)

Sends up to 100 different messages in a single API request. This method is significantly faster than sending a separate API request for each message.

 If Message Review is enabled for the project and the batch requires approval (because it exceeds the project's review threshold, or because the project requires approval for messages sent via AI tools), the messages will not be sent immediately; instead, each message will be submitted for review as a scheduled message, and will be sent when a reviewer approves it. In this case, the response will contain `status`=`pending_review`, `broadcast_id`, `count`, and `url` (a link to the approval page in the web app) properties instead of the `messages` array. The project's `message_review` property (returned by getProjectById) shows in advance whether sends will require approval.

## Path parameters

- `project_id` string, required

## Request body

- object
  - `messages` object[], required: Array of up to 100 objects with `content` and `to_number` properties. Each object may also contain the optional properties `status_url`, `status_secret`, `vars`, and/or `priority`, which override the parameters of the same name defined below, to allow passing different values for each message.
    - `content` string, required: Content of the message to send
    - `to_number` string, required: Phone number to send the message to
    - `status_url` string: Webhook callback URL for this message
    - `status_secret` string: POST parameter secret for status_url
    - `vars` object: Custom variables for this message
    - `priority` integer: Priority of this message (1 or 2)
  - `message_type` string: Type of message to send. If `text`, will use the default text message type for the selected route.
  - `route_id` string: ID of the phone or route to send the messages from
  - `broadcast_id` string: ID of an existing broadcast to associate the messages with
  - `broadcast_title` string: Title of broadcast to create (when `broadcast_id` is not provided). When sending more than 100 messages over multiple API requests, you can associate all messages with the same broadcast by providing a `broadcast_title` parameter in the first API request, then retrieving the `broadcast_id` property from the API response, and passing it as the `broadcast_id` parameter in subsequent API requests.
  - `status_url` string: Webhook callback URL to be notified when message status changes
  - `status_secret` string: POST parameter 'secret' passed to status_url
  - `label_ids` string: Array of IDs of labels to add to each message (maximum 5)
  - `replace_variables` boolean: Set to true to evaluate variables like [[contact.name]] in message content. (See available variables)
  - `track_clicks` boolean: If true, URLs in the message content will automatically be replaced with unique short URLs.
  - `short_link_params` object: If `track_clicks` is true, `short_link_params` may be used to specify custom parameters for each short link in the message. The following parameters are supported: `domain` (string): A custom short domain name to use for the short links. The domain name must already be registered for your project or organization. `expiration_sec` (integer): The number of seconds after the message is created (queued to send) when the short links will stop forwarding to the destination URL. If null, the short links will not expire.
  - `media` object[]: Array of media attachments for the text message. If sending a type of message that doesn't support attachments (e.g. SMS), short links to each media URL will be appended to the end of the content (separated by a new line). To attach the Contact Card (a `.vcf` file that the recipient can save to their address book) of the route that sends the message, include the media item `{"type": "route_vcard"}`. The card is attached when each message is sent, using the current card of the phone that actually sends it (see the `vcard` property of the Phone object). If that route's Contact Card is not enabled, the message is sent without it. Alternatively, you can use the `media_urls` parameter with an array of URL strings.
    - `url` string: URL of the media file. Required unless file_id is provided. Use a https:// or http:// URL for media files that are already accessible via the internet. For media files that are not already accessible via the internet or uploaded as a stored file, the URL may be a data URI with the file data encoded via Base64 (e.g. "data:image/png;base64,..."), with a maximum decoded file size of 5 MB. Telerivet will automatically store this file in your project.
    - `file_id` string: ID of a previously uploaded stored file (see [project.uploadFile](#Project.uploadFile)). If file_id is provided, url is not required.
    - `type` string: MIME type of the media file (e.g. image/png). if not provided, Telerivet will attempt to determine the MIME type automatically from the extension of the filename or URL path component. Ignored if file_id is provided. To attach the Contact Card of the route that sends the message, use a media item with only `type` set to `route_vcard`.
    - `filename` string: Original filename of the media. Ignored if file_id is provided.
  - `route_params` object: Route-specific parameters to apply to all messages. When sending messages via chat apps such as WhatsApp, the route_params parameter can be used to send messages with app-specific features such as quick replies and link buttons. For more details, see Route-Specific Parameters.
  - `vars` object: Custom variables to store with the message
  - `priority` 1 | 2: Priority of the message. Telerivet will attempt to send messages with higher priority numbers first (for example, so you can prioritize an auto-reply ahead of a bulk message to a large group).
  - `simulated` boolean: Set to true to test the Telerivet API without actually sending a message from the route

## Response `200`

Successful response

- object
  - `messages` object[]: List of objects representing each newly created message, with the same length and order as provided in the `messages` parameter in the API request. Each object has the `id` and `status` properties, and may have the property `error_message`. (Other properties of the Message object are omitted in order to reduce the amount of redundant data sent in each API response.) If the `messages` parameter in the API request contains items with `to_number` values that are associated with blocked contacts, the `id` and `status` properties corresponding to those items will be null, and no messages will be sent to those numbers.
    - `id` string: ID of the created message
    - `status` string: Status of the message
    - `error_message` string: Error message if the message failed
  - `broadcast_id` string: ID of broadcast that these messages are associated with, if `broadcast_id` or `broadcast_title` parameter is provided in the API request.

## Other responses

- `400`: Invalid request parameters
- `401`: Invalid or missing API key or Bearer token
- `404`: Resource not found

---

[API](https://skmtc.dev/telerivet/apis/telerivet-api.md) · [All operations](https://skmtc.dev/telerivet/apis/telerivet-api/llms.txt) · [OpenAPI document](https://skmtc.dev/telerivet/apis/telerivet-api/revisions/4e14b1c8d917?raw)
