How to Upload & Store Media with the Telnyx API

Our Media Storage API allows Telnyx users to handle media in their communications easier than ever before. Users can upload files directly to Telnyx via simple API commands, store them securely in our cloud environment, and serve them quickly and reliably in other Telnyx API actions. Files can be uploaded from your local machine, or from a publicly-accessible URL.

1. Upload Media

You can upload media by either specifying a publicly accessible Media URL or by using a multiport / data-form upload.

Method 1: Specify a publicly accessible Media URL in the API

Copy
Copied
curl -X POST \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YOUR_API_KEY" \
  --data '{
  "media_url": YOUR_MEDIA_URL
  }' \
  https://api.telnyx.com/v2/media

Note: After pasting the above content, Kindly check and remove any new line added

Method 2: Multipart / form-data upload

Copy
Copied
curl -X POST \
  --header "Content-Type: multipart/form-data" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YOUR_API_KEY" \
  -F media=@YOUR_LOCAL_FILE_PATH \
  https://api.telnyx.com/v2/media

Note: After pasting the above content, Kindly check and remove any new line added

Response:

Copy
Copied
{
  "data": {
	  "created_at": "2021-06-29T08:47:39.765087Z",
	  "expires_at": "2021-07-01T08:47:37.173452Z",
	  "media_name": "ae6b8755-0543-4366-85aa-c28261d9174d",
	  "updated_at": "2021-06-29T08:47:39.765087Z"
  }
}

Note: After pasting the above content, Kindly check and remove any new line added

Both of the above methods support the ability to provide your custom, unique media_name in the request:

Copy
Copied
curl -X POST \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YOUR_API_KEY" \
  --data '{     	
    "media_url": YOUR_MEDIA_URL,
    “media_name”: “my-custom-unique-media-name”
  }' \
  https://api.telnyx.com/v2/media

Note: After pasting the above content, Kindly check and remove any new line added

Response:

Copy
Copied
{
  "data": {
    ...
	  "media_name": "my-custom-unique-media-name"
  }
}

Note: After pasting the above content, Kindly check and remove any new line added

2. Using the uploaded media

You can now use the uploaded media in the Fax, Call Control REST API or TeXML scenarios.

Fax

The uploaded media can be used in fax API by following:

Copy
Copied
curl -X POST \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YOUR_API_KEY" \
  --data '{ 
    "media_name": "my-stored-media-name",
    "connection_id": "...",
    "from": “...”,
    “to”: “...”
    }' \
  https://api.telnyx.com/v2/faxes

Note: After pasting the above content, Kindly check and remove any new line added

If the media name given is invalid, then users will get an asynchronous webhook after they try to download the file:

Copy
Copied
{
  "event_type":"fax.failed",
  ... 
  "payload": {..., "failure_reason": "file_download_failed", ...}
}

Note: After pasting the above content, Kindly check and remove any new line added

Call Control REST API

The uploaded media can be used in the playback_start command in the following way:

Copy
Copied
curl -X POST \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YOUR_API_KEY" \
  --data '{"media_name": "my-stored-media-name"}' \
https://api.telnyx.com/v2/calls/{call_control_id}/actions/playback_start

Note: After pasting the above content, Kindly check and remove any new line added

If the media name given is invalid, the error is synchronous, returned as a reply to the HTTP request:

Copy
Copied
HTTP status: 422
Error: 90039 “Invalid media name”

Note: After pasting the above content, Kindly check and remove any new line added

TeXML

The following TeXML is returned when an inbound call is made:

Copy
Copied
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Play mediaStorage="true">my-stored-media-name</Play>
</Response>

Note: After pasting the above content, Kindly check and remove any new line added

If the media name given is invalid, there will be no error handling.