Skip to content
Get Started

Media Upload API

Upload files and media for sending via iMessage with the Sendblue API

Upload files to Sendblue’s CDN for use in iMessage. Uploaded files can be sent as attachments using the media_url parameter in the send message endpoint.

Upload a file directly via multipart form data.

POST https://api.sendblue.co/api/upload-file
  • Content-Type: multipart/form-data
  • Body: File as form field named file
  • Maximum file size: 100 MB
Terminal window
curl -X POST 'https://api.sendblue.co/api/upload-file' \
-H 'sb-api-key-id: YOUR_API_KEY' \
-H 'sb-api-secret-key: YOUR_API_SECRET' \
-F 'file=@/path/to/document.pdf'
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const form = new FormData();
form.append('file', fs.createReadStream('./document.pdf'));
const response = await axios.post(
'https://api.sendblue.co/api/upload-file',
form,
{
headers: {
...form.getHeaders(),
'sb-api-key-id': 'YOUR_API_KEY',
'sb-api-secret-key': 'YOUR_API_SECRET'
}
}
);
console.log(response.data.media_url);
// Use this URL in send-message endpoint
import requests
url = 'https://api.sendblue.co/api/upload-file'
files = {'file': open('document.pdf', 'rb')}
headers = {
'sb-api-key-id': 'YOUR_API_KEY',
'sb-api-secret-key': 'YOUR_API_SECRET'
}
response = requests.post(url, files=files, headers=headers)
print(response.json()['media_url'])
{
"status": "OK",
"message": "File uploaded successfully",
"media_url": "https://storage.googleapis.com/inbound-file-store/abc123_document.pdf",
"mediaObjectId": "abc123_document.pdf"
}

Download media from a URL and re-host it on Sendblue’s CDN. Useful for ensuring media persists and is accessible by iMessage.

POST https://api.sendblue.co/api/upload-media-object
ParameterTypeRequiredDescription
media_urlstringYesThe source URL to download from
Terminal window
curl -X POST 'https://api.sendblue.co/api/upload-media-object' \
-H 'sb-api-key-id: YOUR_API_KEY' \
-H 'sb-api-secret-key: YOUR_API_SECRET' \
-H 'Content-Type: application/json' \
-d '{
"media_url": "https://example.com/image.jpg"
}'
const axios = require('axios');
const response = await axios.post(
'https://api.sendblue.co/api/upload-media-object',
{
media_url: 'https://example.com/image.jpg'
},
{
headers: {
'sb-api-key-id': 'YOUR_API_KEY',
'sb-api-secret-key': 'YOUR_API_SECRET',
'Content-Type': 'application/json'
}
}
);
console.log(response.data.mediaObjectId);
{
"status": "OK",
"message": "File uploaded successfully",
"mediaObjectId": "xyz789.jpg"
}

{
"status": "ERROR",
"message": "No file uploaded"
}
{
"status": "ERROR",
"message": "No media url specified"
}
{
"status": "ERROR",
"message": "Invalid media url"
}
{
"status": "ERROR",
"message": "Failed to upload file to storage"
}

All file types are supported. Common types include:

TypeExtensions
ImagesJPG, PNG, GIF, HEIC, WebP
VideosMP4, MOV, M4V
AudioM4A, MP3, AAC, CAF
DocumentsPDF, VCF (contact cards)

After uploading, use the returned media_url in your send message request:

// 1. Upload the file
const uploadResponse = await axios.post(
'https://api.sendblue.co/api/upload-file',
formData,
{ headers: { ...form.getHeaders(), ...authHeaders } }
);
// 2. Send message with the uploaded media
await axios.post(
'https://api.sendblue.co/api/send-message',
{
number: '+14155551234',
from_number: '+19175551234',
content: 'Check out this document!',
media_url: uploadResponse.data.media_url
},
{ headers: authHeaders }
);