---
title: "POST /copyMessage"
method: POST
path: "/copyMessage"
---

# POST /copyMessage

`POST /copyMessage`

Use this method to copy messages of any kind. The method is analogous to the method [forwardMessages](https://core.telegram.org/bots/api/#forwardmessages), but the copied message doesn't have a link to the original message. Returns the [MessageId](https://core.telegram.org/bots/api/#messageid) of the sent message on success.

## Request body

- object
  - `chat_id` union, required — Unique identifier for the target chat or username of the target channel (in the format `@channelusername`)
    - integer
    - string
  - `from_chat_id` union, required — Unique identifier for the chat where the original message was sent (or channel username in the format `@channelusername`)
    - integer
    - string
  - `message_id` integer, required — Message identifier in the chat specified in *from\_chat\_id*
  - `caption` string — New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept
  - `parse_mode` string — Mode for parsing entities in the new caption. See [formatting options](https://core.telegram.org/bots/api/#formatting-options) for more details.
  - `caption_entities` MessageEntity[] — List of special entities that appear in the new caption, which can be specified instead of *parse\_mode*
    - `type` 'mention' | 'hashtag' | 'cashtag' | 'bot_command' | 'url' | 'email' | 'phone_number' | 'bold' | 'italic' | 'underline' | 'strikethrough' | 'code' | 'pre' | 'text_link' | 'text_mention', required — Type of the entity. Can be “mention” (`@username`), “hashtag” (`#hashtag`), “cashtag” (`$USD`), “bot\_command” (`/start@jobs_bot`), “url” (`https://telegram.org`), “email” (`do-not-reply@telegram.org`), “phone\_number” (`+1-212-555-0123`), “bold” (**bold text**), “italic” (*italic text*), “underline” (underlined text), “strikethrough” (strikethrough text), “code” (monowidth string), “pre” (monowidth block), “text\_link” (for clickable text URLs), “text\_mention” (for users [without usernames](https://telegram.org/blog/edit#new-mentions))
    - `offset` integer, required — Offset in UTF-16 code units to the start of the entity
    - `length` integer, required — Length of the entity in UTF-16 code units
    - `url` string — *Optional*. For “text\_link” only, url that will be opened after user taps on the text
    - `user` User — This object represents a Telegram user or bot.
      - `id` integer, required — Unique identifier for this user or bot
      - `is_bot` boolean, required — True, if this user is a bot
      - `first_name` string, required — User's or bot's first name
      - `last_name` string — *Optional*. User's or bot's last name
      - `username` string — *Optional*. User's or bot's username
      - `language_code` string — *Optional*. [IETF language tag](https://en.wikipedia.org/wiki/IETF_language_tag) of the user's language
      - `can_join_groups` boolean — *Optional*. True, if the bot can be invited to groups. Returned only in [getMe](https://core.telegram.org/bots/api/#getme).
      - `can_read_all_group_messages` boolean — *Optional*. True, if [privacy mode](https://core.telegram.org/bots#privacy-mode) is disabled for the bot. Returned only in [getMe](https://core.telegram.org/bots/api/#getme).
      - `supports_inline_queries` boolean — *Optional*. True, if the bot supports inline queries. Returned only in [getMe](https://core.telegram.org/bots/api/#getme).
    - `language` string — *Optional*. For “pre” only, the programming language of the entity text
  - `disable_notification` boolean — Sends the message [silently](https://telegram.org/blog/channels-2-0#silent-messages). Users will receive a notification with no sound.
  - `reply_to_message_id` integer — If the message is a reply, ID of the original message
  - `allow_sending_without_reply` boolean — Pass *True*, if the message should be sent even if the specified replied-to message is not found
  - `reply_markup` union — Additional interface options. A JSON-serialized object for an [inline keyboard](https://core.telegram.org/bots#inline-keyboards-and-on-the-fly-updating), [custom reply keyboard](https://core.telegram.org/bots#keyboards), instructions to remove reply keyboard or to force a reply from the user.
    - InlineKeyboardMarkup — This object represents an [inline keyboard](https://core.telegram.org/bots#inline-keyboards-and-on-the-fly-updating) that appears right next to the message it belongs to.
      - `inline_keyboard` array[], required — Array of button rows, each represented by an Array of [InlineKeyboardButton](https://core.telegram.org/bots/api/#inlinekeyboardbutton) objects
        - InlineKeyboardButton[]
          - `text` string, required — Label text on the button
          - `url` string — *Optional*. HTTP or tg:// url to be opened when button is pressed
          - `login_url` LoginUrl — This object represents a parameter of the inline keyboard button used to automatically authorize a user. Serves as a great replacement for the [Telegram Login Widget](https://core.telegram.org/widgets/login) when the user is coming from Telegram. All the user needs to do is tap/click a button and confirm that they want to log in: Telegram apps support these buttons as of [version 5.7](https://telegram.org/blog/privacy-discussions-web-bots#meet-seamless-web-bots). Sample bot: [@discussbot](https://t.me/discussbot)
            - `url` string, required — An HTTP URL to be opened with user authorization data added to the query string when the button is pressed. If the user refuses to provide authorization data, the original URL without information about the user will be opened. The data added is the same as described in [Receiving authorization data](https://core.telegram.org/widgets/login#receiving-authorization-data). **NOTE:** You **must** always check the hash of the received data to verify the authentication and the integrity of the data as described in [Checking authorization](https://core.telegram.org/widgets/login#checking-authorization).
            - `forward_text` string — *Optional*. New text of the button in forwarded messages.
            - `bot_username` string — *Optional*. Username of a bot, which will be used for user authorization. See [Setting up a bot](https://core.telegram.org/widgets/login#setting-up-a-bot) for more details. If not specified, the current bot's username will be assumed. The *url*'s domain must be the same as the domain linked with the bot. See [Linking your domain to the bot](https://core.telegram.org/widgets/login#linking-your-domain-to-the-bot) for more details.
            - `request_write_access` boolean — *Optional*. Pass True to request the permission for your bot to send messages to the user.
          - `callback_data` string — *Optional*. Data to be sent in a [callback query](https://core.telegram.org/bots/api/#callbackquery) to the bot when button is pressed, 1-64 bytes
          - `switch_inline_query` string — *Optional*. If set, pressing the button will prompt the user to select one of their chats, open that chat and insert the bot's username and the specified inline query in the input field. Can be empty, in which case just the bot's username will be inserted. **Note:** This offers an easy way for users to start using your bot in [inline mode](/bots/inline) when they are currently in a private chat with it. Especially useful when combined with [*switch\_pm…*](https://core.telegram.org/bots/api/#answerinlinequery) actions – in this case the user will be automatically returned to the chat they switched from, skipping the chat selection screen.
          - `switch_inline_query_current_chat` string — *Optional*. If set, pressing the button will insert the bot's username and the specified inline query in the current chat's input field. Can be empty, in which case only the bot's username will be inserted. This offers a quick way for the user to open your bot in inline mode in the same chat – good for selecting something from multiple options.
          - `callback_game` unknown
          - `pay` boolean — *Optional*. Specify True, to send a [Pay button](https://core.telegram.org/bots/api/#payments). **NOTE:** This type of button **must** always be the first button in the first row.
    - ReplyKeyboardMarkup — This object represents a [custom keyboard](https://core.telegram.org/bots#keyboards) with reply options (see [Introduction to bots](https://core.telegram.org/bots#keyboards) for details and examples).
      - `keyboard` array[], required — Array of button rows, each represented by an Array of [KeyboardButton](https://core.telegram.org/bots/api/#keyboardbutton) objects
        - KeyboardButton[]
          - `text` string, required — Text of the button. If none of the optional fields are used, it will be sent as a message when the button is pressed
          - `request_contact` boolean — *Optional*. If *True*, the user's phone number will be sent as a contact when the button is pressed. Available in private chats only
          - `request_location` boolean — *Optional*. If *True*, the user's current location will be sent when the button is pressed. Available in private chats only
          - `request_poll` KeyboardButtonPollType — This object represents type of a poll, which is allowed to be created and sent when the corresponding button is pressed.
            - `type` string — *Optional*. If *quiz* is passed, the user will be allowed to create only polls in the quiz mode. If *regular* is passed, only regular polls will be allowed. Otherwise, the user will be allowed to create a poll of any type.
      - `resize_keyboard` boolean — *Optional*. Requests clients to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). Defaults to *false*, in which case the custom keyboard is always of the same height as the app's standard keyboard.
      - `one_time_keyboard` boolean — *Optional*. Requests clients to hide the keyboard as soon as it's been used. The keyboard will still be available, but clients will automatically display the usual letter-keyboard in the chat – the user can press a special button in the input field to see the custom keyboard again. Defaults to *false*.
      - `selective` boolean — *Optional*. Use this parameter if you want to show the keyboard to specific users only. Targets: 1) users that are @mentioned in the *text* of the [Message](https://core.telegram.org/bots/api/#message) object; 2) if the bot's message is a reply (has *reply\_to\_message\_id*), sender of the original message. *Example:* A user requests to change the bot's language, bot replies to the request with a keyboard to select the new language. Other users in the group don't see the keyboard.
    - ReplyKeyboardRemove — Upon receiving a message with this object, Telegram clients will remove the current custom keyboard and display the default letter-keyboard. By default, custom keyboards are displayed until a new keyboard is sent by a bot. An exception is made for one-time keyboards that are hidden immediately after the user presses a button (see [ReplyKeyboardMarkup](https://core.telegram.org/bots/api/#replykeyboardmarkup)).
      - `remove_keyboard` boolean, required — Requests clients to remove the custom keyboard (user will not be able to summon this keyboard; if you want to hide the keyboard from sight but keep it accessible, use *one\_time\_keyboard* in [ReplyKeyboardMarkup](https://core.telegram.org/bots/api/#replykeyboardmarkup))
      - `selective` boolean — *Optional*. Use this parameter if you want to remove the keyboard for specific users only. Targets: 1) users that are @mentioned in the *text* of the [Message](https://core.telegram.org/bots/api/#message) object; 2) if the bot's message is a reply (has *reply\_to\_message\_id*), sender of the original message. *Example:* A user votes in a poll, bot returns confirmation message in reply to the vote and removes the keyboard for that user, while still showing the keyboard with poll options to users who haven't voted yet.
    - ForceReply — Upon receiving a message with this object, Telegram clients will display a reply interface to the user (act as if the user has selected the bot's message and tapped 'Reply'). This can be extremely useful if you want to create user-friendly step-by-step interfaces without having to sacrifice [privacy mode](/bots#privacy-mode).
      - `force_reply` boolean, required — Shows reply interface to the user, as if they manually selected the bot's message and tapped 'Reply'
      - `selective` boolean — *Optional*. Use this parameter if you want to force reply from specific users only. Targets: 1) users that are @mentioned in the *text* of the [Message](https://core.telegram.org/bots/api/#message) object; 2) if the bot's message is a reply (has *reply\_to\_message\_id*), sender of the original message.

## Response `200`

- object
  - `ok` boolean, required
  - `result` MessageId, required — This object represents a unique message identifier.
    - `message_id` integer, required — Unique message identifier

## Other responses

- `default`

---

[API](https://skmtc.net/stoplight/apis/telegram-bot-api.md) · [All operations](https://skmtc.net/stoplight/apis/telegram-bot-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/stoplight/telegram-bot-api/versions/be4bbb34b64a/schema)
