A valid request URL is required to generate request examples{
"success": true,
"data": {
"id": "5b0e7c1a-9d2f-4e83-a6b4-1c2d3e4f5a6b",
"contentType": "image/jpeg",
"bytes": 412337,
"filename": "after.jpg",
"direction": "out",
"expiresAt": "2026-10-04T16:12:45.000Z"
}
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"success": false,
"code": "media_too_large",
"message": "attachment exceeds the 1 MB limit"
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}Upload a picture or short video to send by text
Upload ONE picture or short video to attach to a text you send with sendSMSMessage (POST /sms/messages). The response’s id goes in that request’s mediaIds. Uploading is how you send a picture or video that is not on a public web address; for one that is, pass the address in mediaUrls on the send instead and skip this call. The body is multipart/form-data with the file in the file field. filename is optional; without it the name of the uploaded part is used. Either way it is only a label shown with the file — the content type is read from the file’s bytes, never from its name or a declared type. WHAT YOU CAN SEND. A JPEG, PNG or GIF picture, or an MP4, 3GP or MOV video, of at most 1 MiB (1,048,576 bytes) — larger files are not reliably delivered to handsets. Anything else is refused before it is stored. AN UPLOAD YOU NEVER SEND IS DELETED. Until a message carries it, the upload is held for 24 hours (expiresAt). From then on it can no longer be sent (422 media_not_found) or downloaded (404), and the stored copy is erased by a cleanup that runs no sooner than 10 minutes after expiresAt — usually within the following hour. Once a message carries it, it is kept with the conversation like any other attachment and stays downloadable with getSMSMedia. One upload can be attached to more than one message.
A valid request URL is required to generate request examples{
"success": true,
"data": {
"id": "5b0e7c1a-9d2f-4e83-a6b4-1c2d3e4f5a6b",
"contentType": "image/jpeg",
"bytes": 412337,
"filename": "after.jpg",
"direction": "out",
"expiresAt": "2026-10-04T16:12:45.000Z"
}
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"success": false,
"code": "media_too_large",
"message": "attachment exceeds the 1 MB limit"
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}Authorizations
Flowyte secret API key (Authorization: Bearer flowyte_sk_live_…). Scope-gated; is scoped to your organization — a key can never reach another tenant. The listed scopes in each operation's apiKey requirement are the scopes that key must hold. The tokenUrl is nominal: keys are minted in the dashboard.
- Token URL
- /api/v1/api-keys