Sends a photo or GIF to a user, group, or channel.
π‘ Upload the file to the nandbox media server first and use the returnedmedia_idas thephotovalue. You cannot send raw image bytes.
If the uploaded file is a GIF, it is delivered as an animated GIF and comes back with typegifrather thanphoto.
Request
method is "sendPhoto".Field | Type | Required | Description |
chat_id | String | Yes | The target chat or user. |
photo | String | Yes | The media_id returned when you uploaded the image. |
app_id | String | Yes | The app the message belongs to. |
reference | Long | Yes | Your local id for the message. Echoed back in messageAck so you can match them up. |
caption | String | Optional | Caption shown under the photo, 0β256 characters. |
to_user_id | String | Optional | Target a single user inside a group or channel. |
reply_to_message_id | String | Optional | Set this to send the photo as a reply to an existing message. |
echo | Integer | Optional | 1 returns a copy of the sent message to you. Default 0. |
web_page_preview | Integer | Optional | 1 disable preview Β· 2 hide the link Β· 3 instant view Β· 4 instant view without the link. |
disable_notification | Boolean | Optional | Deliver silently β the user gets no notification sound. |
menu_ref | String | Optional | Attach an existing predefined menu, shown inline beneath the message. |
inline_menu | Array of Menu | Optional | Attach a menu defined inline. Takes priority over menu_ref if both are set. |
chat_settings | Integer | Optional | 1 routes the message to the Bot Manager, used for admin-only communication. |
Preconditions
Your API needs the right permission, and the right standing in the chat.
Requirement | Needed for |
"Send Message" permission | Sending at all. |
"Reply to Message" permission | Only when using reply_to_message_id. |
Chat type | Your API must be |
--- | --- |
User chat | Already started by the user |
Group | A member |
Channel | An admin |
Response
When | Method | What it tells you |
Always | messageAck | The server accepted the message. Carries the new message_id and echoes your reference. |
If echo = 1 | message | A full copy of the message as it was sent. |
User chats only | messageDelivered | The user's device received it. |
User chats only | messageSeen | The user opened it. |
SDKs
SDK | Call | Callback |
Java | api.sendPhoto(chatId, photoFileId, reference, caption, appId); | onMessagAckCallback(MessageAck msgAck) |
JavaScript | api.sendPhoto(chatId, photoFileId, reference, caption, appId); | onMessagAckCallback(msgAck) |
Python | napi.send_photo(chat_id=chat_id, photo_file_id=photo_file_id, reference=reference, caption=caption, app_id=app_id) | on_message_ack_callback(self, msg_ack) |
Example
Request
json{ "method": "sendPhoto", "chat_id": "90089584764538542", "photo": "nullcd756bcfbd68a41b7eca73cf37c9cd02ce3b6780846f03e3c71a6fda3414b029.jpg", "reference": 111111130, "app_id": "90090684293000559", "echo": 1 }
javaString uploadedPhotoId = MediaTransfer.uploadFile(TOKEN, filePath); api.sendPhoto(chatId, uploadedPhotoId, reference, caption, appId);
javascriptMediaTransfer.uploadFile(TOKEN, filePath, config.UploadServer) .then((uploadedPhotoId) => { api.sendPhoto(chatId, uploadedPhotoId, reference, caption, appId); }) .catch((e) => console.log("Upload failed", e));
pythonnapi.send_photo(chat_id=chat_id, photo_file_id=uploaded_photo_id, reference=Utils.get_unique_id(), caption=caption, app_id=app_id)
Response
json{ "method": "messageAck", "ack": { "reference": 111111130, "date": 1741963530756, "gmid": null, "message_id": "d1_fpXqQBDa126191" } }
And, because
echo was 1:json{ "method": "message", "app_id": 90090684293000559, "message": { "message_id": "d1_fpXqQBDa126191", "reference": 111111130, "date": 1741963530756, "type": "photo", "photo": { "id": "nullcd756bcfbd68a41b7eca73cf37c9cd02ce3b6780846f03e3c71a6fda3414b029.jpg", "public_url": "https://m1.nandbox.ca/v1/AUTH_137b624a8e434c4e88e9be30fa5e7bed/g/nullcd756bcfbd68a41b7eca73cf37c9cd02ce3b6780846f03e3c71a6fda3414b029.jpg", "width": 1024, "height": 1024, "size": 39807, "thumbnail": { "id": "nullcd756bcfbd68a41b7eca73cf37c9cd02ce3b6780846f03e3c71a6fda3414b029.jpg.thumb.jpg", "width": 1024, "height": 1024 } }, "chat": { "id": "90091783822039252", "name": "My First API", "type": "Bot", "terminal": "API" }, "sent_to": { "id": "90089584764538542" }, "from": { "id": "90091783822039252", "name": "My First API", "type": "Bot", "terminal": "API" } } }
π‘ When the uploaded file is a GIF, the same request returns the media under agifkey with"type": "gif"instead ofphoto.