> Fetch clean Markdown by appending `.md` to any page URL under https://signalwire.com/docs or requesting it with the HTTP header `Accept: text/markdown`. The root index at https://signalwire.com/docs/llms.txt lists the available documentation indexes. # Retrieve a Recording GET https://YOUR_SPACE.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid} Retrieves one voice recording as audio or metadata, depending on the requested extension. Use this account-level route for saved call or conference media; Video Room recordings are separate resources. This endpoint supports two different access methods with different authentication requirements: ## Public Access (No Authentication Required) Recording audio files can be accessed directly without authentication. This is useful for external applications to embed recording URLs without exposing SignalWire API credentials. SignalWire recording URLs are long and random, making them difficult to guess or exploit unless you reveal the URL. **Retrieve WAV file** When a recording URI has no extension or a `.wav` extension, the request will return a binary WAV version of the recording file. `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}` `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}.wav` **Retrieve MP3 file** Setting an extension of ".mp3" on the URI returns a binary MP3 version of the recording. For example: `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}.mp3` ## Authenticated Access (Voice Scope Required) **Retrieve Metadata** A recording's metadata, such as duration, cost, time, can be returned by setting the Recording URI's extension to `.json`. This requires authentication with a Voice-scoped API token. `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}.json` #### Permissions The API token used to authenticate must have the following scopes enabled to make a successful request: *Voice*. This permission is only required for authenticated requests to retrieve recording metadata (.json extension). [Learn more about API scopes](/docs/platform/your-signalwire-api-space). Reference: https://signalwire.com/docs/compatibility-api/rest/recordings/retrieve-recording ## Authentication - `Authorization` header (basic auth, required) — SignalWire Basic Authentication using Project ID and API Token. The client sends HTTP requests with the Authorization header containing the word Basic followed by a space and a base64-encoded string of project_id:token. The project ID will be used as the username and the API token as the password. Example: ``` Authorization: Basic base64(project_id:token) ``` ## Request ### Path parameters - `AccountSid` (string, required) — The unique identifier for the account that is associated with this recording. - `Sid` (string, required) — The unique identifier for the recording. ## Response ### 200 The request has succeeded. - `sid` (string, required) — The unique identifier for the recording. - `account_sid` (string, required) — The unique identifier for the account that is associated with this recording. - `api_version` (string, required) — The version of the SignalWire API. - `call_sid` (string, required, nullable) — The unique identifier for the call that is associated with this recording. Null if this is a conference recording. - `conference_sid` (string, required, nullable) — The unique identifier for the conference that is associated with this recording. Null if this is a call recording. - `channel` (enum, required) — The number of channels in a recording (singular key). Returns '1' for mono or '2' for stereo. - Allowed values: `1`, `2` - `channels` (enum, required) — The number of channels in a recording. Returns '1' for mono or '2' for stereo. - Allowed values: `1`, `2` - `date_created` (string, required) — The date, in RFC 2822 format, this recording was created. - `date_updated` (string, required) — The date, in RFC 2822 format, this recording was updated. - `start_time` (string, required, nullable) — The time, in RFC 2822 format, this recording started. - `end_time` (string, required, nullable) — The time, in RFC 2822 format, this recording ended. - `duration` (integer, required) — The length, in seconds, of the recording. - `price` (string, required, nullable) — The cost for the recording. - `price_unit` (string, required) — The currency of the price of the recording. - `source` (enum, required) — How the recording was made. - Allowed values: `DialVerb`, `Conference`, `OutBoundApi`, `Trunking`, `RecordVerb`, `StartCallRecordingApi`, `StartConferenceRecording` - `status` (enum, required) — The status of the recording. - Allowed values: `queued`, `in-progress`, `paused`, `resumed`, `completed`, `absent`, `stopped` - `error_code` (string, required, nullable) — Further details about a failed recording. - `uri` (string, required) — The URI of the recording. - `subresource_uris` (RecordingSubresourceUris, required) — Subresource URIs. - `encryption_details` (string, required, nullable) — Encryption details. Always null. - `trim` (string, required) — Whether leading and trailing silence is trimmed from a recording. ## Errors ### 400 Bad Request Error The request was invalid or cannot be processed. Check the error details for more information. - `code` (integer, required) — Error code. - `message` (string, required) — Error message. - `more_info` (string, required) — URL for more information about the error. - `status` (integer, required) — HTTP status code. ### 401 Unauthorized Error Authentication failed. Please verify your credentials and try again. - `code` (integer, required) — Error code. - `message` (string, required) — Error message. - `more_info` (string, required) — URL for more information about the error. - `status` (integer, required) — HTTP status code. ### 404 Not Found Error The requested resource was not found. Please verify the resource identifier. - `code` (integer, required) — Error code. - `message` (string, required) — Error message. - `more_info` (string, required) — URL for more information about the error. - `status` (integer, required) — HTTP status code. ## Types ### RecordingSubresourceUris Recording subresource URIs. - `transcriptions` (string, required) — The URI for transcriptions. ## Examples **Response** ```json { "sid": "19e436af-5688-4307-b03b-bdb2b42b8142", "account_sid": "720796a0-8ee9-4350-83bd-2d07a3121f1e", "api_version": "2010-04-01", "call_sid": "43bb71ee-553f-4074-bb20-8e2747647cce", "conference_sid": null, "channel": "1", "channels": "1", "date_created": "Tue, 25 Sep 2018 23:00:00 +0000", "date_updated": "Wed, 26 Sep 2018 23:00:04 +0000", "start_time": "Tue, 25 Sep 2018 23:00:00 +0000", "end_time": "Wed, 26 Sep 2018 23:00:04 +0000", "duration": 4, "price": "-0.0025", "price_unit": "USD", "source": "DialVerb", "status": "queued", "error_code": null, "uri": "/api/laml/2010-04-01/Accounts/720796a0-8ee9-4350-83bd-2d07a3121f1e/Recordings/19e436af-5688-4307-b03b-bdb2b42b8142.json", "subresource_uris": { "transcriptions": "/api/laml/2010-04-01/Accounts/720796a0-8ee9-4350-83bd-2d07a3121f1e/Recordings/19e436af-5688-4307-b03b-bdb2b42b8142/Transcriptions.json" }, "encryption_details": null, "trim": "do-not-trim" } ``` **SDK Code** ```python import requests url = "https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid" response = requests.get(url, auth=("", "")) print(response.json()) ``` ```javascript const url = 'https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid'; const credentials = btoa(":"); const options = {method: 'GET', headers: {Authorization: `Basic ${credentials}`}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid" req, _ := http.NewRequest("GET", url, nil) req.SetBasicAuth("", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request.basic_auth("", "") response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid") .basicAuth("", "") .asString(); ``` ```php request('GET', 'https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid', [ 'headers' => [ ], 'auth' => ['', ''], ]); echo $response->getBody(); ``` ```csharp using RestSharp; using RestSharp.Authenticators; var client = new RestClient("https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid"); client.Authenticator = new HttpBasicAuthenticator("", ""); var request = new RestRequest(Method.GET); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let credentials = Data(":".utf8).base64EncodedString() let headers = ["Authorization": "Basic \(credentials)"] let request = NSMutableURLRequest(url: NSURL(string: "https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ```